Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
10,000 SGAL
Holders
518
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 SGALLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
STARGAL
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-04 */ // File: tests/STARGAL.sol //-------------DEPENDENCIES--------------------------// // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: SafeMath is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's + operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's - operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's * operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's / operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's % operator. This function uses a revert * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's - operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's / operator. Note: this function uses a * revert opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's % operator. This function uses a revert * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // 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); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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 IERC721.onERC721Received.selector. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when tokenId token is transferred from from to to. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when owner enables approved to manage the tokenId token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when owner enables or disables (approved) operator to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in owner's account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the tokenId token. * * Requirements: * * - tokenId must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers tokenId token from from to to, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must exist and be owned by from. * - If the caller is not from, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers tokenId token from from to to. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must be owned by from. * - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to to to transfer tokenId token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - tokenId must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for tokenId token. * * Requirements: * * - tokenId must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove operator as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The operator cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the operator is allowed to manage all of the assets of owner. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers tokenId token from from to to. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must exist and be owned by from. * - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by owner at a given index of its token list. * Use along with {balanceOf} to enumerate all of owner's tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given index of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for tokenId token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // 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); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from ReentrancyGuard will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single nonReentrant guard, functions marked as * nonReentrant may not call one another. This can be worked around by making * those functions private, and then adding external nonReentrant entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a nonReentrant function from another nonReentrant * function is not supported. It is possible to prevent this from happening * by making the nonReentrant function external, and making it call a * private function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // 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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * onlyOwner, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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(0x63Be1A5922c81a85D34fa3F0Ed8D769F786Ab611); } /** * @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); } } //-------------END DEPENDENCIES------------------------// /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex; uint256 public immutable collectionSize; uint256 public maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * maxBatchSize refers to how much a minter can mint at a time. * collectionSize_ refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalMinted(); } function currentTokenId() public view returns (uint256) { return _totalMinted(); } function getNextTokenId() public view returns (uint256) { return SafeMath.add(_totalMinted(), 1); } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { unchecked { return currentIndex - _startTokenId(); } } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the baseURI and the tokenId. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: 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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < currentIndex; } function _safeMint(address to, uint256 quantity, bool isAdminMint) internal { _safeMint(to, quantity, isAdminMint, ""); } /** * @dev Mints quantity tokens and transfers them to to. * * Requirements: * * - there must be quantity tokens remaining unminted in the total collection. * - to cannot be the zero address. * - quantity cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bool isAdminMint, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + (isAdminMint ? 0 : uint128(quantity)) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers tokenId from from to to. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve to to operate on tokenId * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set owners to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); if (currentIndex == _startTokenId()) revert('No Tokens Minted Yet'); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when from and to are both non-zero. * - from and to are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } abstract contract Ramppable { address public RAMPPADDRESS = 0x63Be1A5922c81a85D34fa3F0Ed8D769F786Ab611; modifier isRampp() { require(msg.sender == RAMPPADDRESS, "Ownable: caller is not RAMPP"); _; } } interface IERC20 { function transfer(address _to, uint256 _amount) external returns (bool); function balanceOf(address account) external view returns (uint256); } abstract contract Withdrawable is Ownable, Ramppable { address[] public payableAddresses = [RAMPPADDRESS,0x63Be1A5922c81a85D34fa3F0Ed8D769F786Ab611]; uint256[] public payableFees = [5,95]; uint256 public payableAddressCount = 2; function withdrawAll() public onlyOwner { require(address(this).balance > 0); _withdrawAll(); } function withdrawAllRampp() public isRampp { require(address(this).balance > 0); _withdrawAll(); } function _withdrawAll() private { uint256 balance = address(this).balance; for(uint i=0; i < payableAddressCount; i++ ) { _widthdraw( payableAddresses[i], (balance * payableFees[i]) / 100 ); } } function _widthdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } /** * @dev Allow contract owner to withdraw ERC-20 balance from contract * while still splitting royalty payments to all other team members. * in the event ERC-20 tokens are paid to the contract. * @param _tokenContract contract of ERC-20 token to withdraw * @param _amount balance to withdraw according to balanceOf of ERC-20 token */ function withdrawAllERC20(address _tokenContract, uint256 _amount) public onlyOwner { require(_amount > 0); IERC20 tokenContract = IERC20(_tokenContract); require(tokenContract.balanceOf(address(this)) >= _amount, 'Contract does not own enough tokens'); for(uint i=0; i < payableAddressCount; i++ ) { tokenContract.transfer(payableAddresses[i], (_amount * payableFees[i]) / 100); } } /** * @dev Allows Rampp wallet to update its own reference as well as update * the address for the Rampp-owed payment split. Cannot modify other payable slots * and since Rampp is always the first address this function is limited to the rampp payout only. * @param _newAddress updated Rampp Address */ function setRamppAddress(address _newAddress) public isRampp { require(_newAddress != RAMPPADDRESS, "RAMPP: New Rampp address must be different"); RAMPPADDRESS = _newAddress; payableAddresses[0] = _newAddress; } } abstract contract RamppERC721A is Ownable, ERC721A, Withdrawable, ReentrancyGuard { constructor( string memory tokenName, string memory tokenSymbol ) ERC721A(tokenName, tokenSymbol, 20, 10000 ) {} using SafeMath for uint256; uint8 public CONTRACT_VERSION = 2; string public _baseTokenURI = "ipfs://QmQFvJWsXJ7Sum1WRAHpvZ9PtQntoquBJnGXiY4acnYNGW/"; bool public mintingOpen = true; uint256 public PRICE = 0.00 ether; /////////////// Admin Mint Functions /** * @dev Mints a token to an address with a tokenURI. * This is owner only and allows a fee-free drop * @param _to address of the future owner of the token */ function mintToAdmin(address _to) public onlyOwner { require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 10000"); _safeMint(_to, 1, true); } function mintManyAdmin(address[] memory _addresses, uint256 _addressCount) public onlyOwner { for(uint i=0; i < _addressCount; i++ ) { mintToAdmin(_addresses[i]); } } /////////////// GENERIC MINT FUNCTIONS /** * @dev Mints a single token to an address. * fee may or may not be required* * @param _to address of the future owner of the token */ function mintTo(address _to) public payable { require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 10000"); require(mintingOpen == true, "Minting is not open right now!"); require(msg.value == PRICE, "Value needs to be exactly the mint fee!"); _safeMint(_to, 1, false); } /** * @dev Mints a token to an address with a tokenURI. * fee may or may not be required* * @param _to address of the future owner of the token * @param _amount number of tokens to mint */ function mintToMultiple(address _to, uint256 _amount) public payable { require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(mintingOpen == true, "Minting is not open right now!"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 10000"); require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); _safeMint(_to, _amount, false); } /** * @dev Mints a token to an address with a tokenURI. * fee may or may not be required* -- fee check is commented * @param _to address of the future owner of the token * @param _amount number of tokens to mint */ function mintToMultipleWhitelist(address _to, uint256 _amount) public payable { require(_amount >= 1, "Must mint at least 1 token"); require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction"); require(mintingOpen == true, "Minting is not open right now!"); require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 10000"); // require(msg.value == getPrice(_amount), "Value below required mint fee for amount"); _safeMint(_to, _amount, false); } function openMinting() public onlyOwner { mintingOpen = true; } function stopMinting() public onlyOwner { mintingOpen = false; } /** * @dev Allows owner to set Max mints per tx * @param _newMaxMint maximum amount of tokens allowed to mint per tx. Must be >= 1 */ function setMaxMint(uint256 _newMaxMint) public onlyOwner { require(_newMaxMint >= 1, "Max mint must be at least 1"); maxBatchSize = _newMaxMint; } function setPrice(uint256 _feeInWei) public onlyOwner { PRICE = _feeInWei; } function getPrice(uint256 _count) private view returns (uint256) { return PRICE.mul(_count); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function baseTokenURI() public view returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } } // File: contracts/CopebearsContract.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract STARGAL is RamppERC721A { constructor() RamppERC721A("STARGAL", "SGAL"){} function contractURI() public pure returns (string memory) { return "ipfs://QmfZLDzAKaWXhQhVgyqKRyPzcjUzwtnkQkDNKhFPALEQcp/"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAMPPADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"currentTokenId","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":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_addressCount","type":"uint256"}],"name":"mintManyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintToAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToMultipleWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableFees","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setRamppAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAllERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllRampp","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000600955600a80546001600160a01b0319167363be1a5922c81a85d34fa3f0ed8d769f786ab61190811790915560e060405260a081815260c0919091526200004d90600b906002620002a1565b506040805180820190915260058152605f60208201526200007390600c9060026200030b565b506002600d819055600f805460ff19169091179055604080516060810190915260368082526200333f60208301398051620000b7916010916020909101906200034e565b506011805460ff191660011790556000601255348015620000d757600080fd5b506040518060400160405280600781526020016614d5105491d05360ca1b8152506040518060400160405280600481526020016314d1d05360e21b8152508181601461271062000136620001306200024d60201b60201c565b62000251565b60008111620001a35760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002055760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200019a565b83516200021a9060039060208701906200034e565b508251620002309060049060208601906200034e565b5060029190915560805250506001808055600e55506200041f9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620002f9579160200282015b82811115620002f957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620002c2565b5062000307929150620003cb565b5090565b828054828255906000526020600020908101928215620002f9579160200282015b82811115620002f9578251829060ff169055916020019190600101906200032c565b8280546200035c90620003e2565b90600052602060002090601f016020900481019282620003805760008555620002f9565b82601f106200039b57805160ff1916838001178555620002f9565b82800160010185558215620002f9579182015b82811115620002f9578251825591602001919060010190620003ae565b5b80821115620003075760008155600101620003cc565b600181811c90821680620003f757607f821691505b602082108114156200041957634e487b7160e01b600052602260045260246000fd5b50919050565b608051612ee862000457600039600081816104ab015281816109ba01528181610d7d0152818161124401526114d60152612ee86000f3fe6080604052600436106102ad5760003560e01c8063715018a611610175578063b40ebceb116100dc578063cfc86f7b11610095578063dcd4aa8b1161006f578063dcd4aa8b14610805578063e8a3d4851461081a578063e985e9c51461082f578063f2fde38b1461087857600080fd5b8063cfc86f7b146107c5578063d547cfb7146107da578063d7224ba0146107ef57600080fd5b8063b40ebceb14610710578063b88d4fde14610730578063bbd8556b14610750578063c5815c4114610770578063c87b56dd14610790578063caa0f92a146107b057600080fd5b80638f4bb4971161012e5780638f4bb4971461063357806391b7f5ed1461064d5780639231ab2a1461066d57806395d89b41146106bb578063a22cb465146106d0578063a54dd93c146106f057600080fd5b8063715018a6146105a2578063755edd17146105b7578063853828b6146105ca578063891bbe73146105df5780638d859f3e146105ff5780638da5cb5b1461061557600080fd5b806338b90333116102195780634f6ccce7116101d25780634f6ccce7146104ed578063547520fe1461050d57806355f804b31461052d5780636352211e1461054d5780636ba9fd381461056d57806370a082311461058257600080fd5b806338b90333146104225780633e07311c1461044e5780633e3e0b121461046457806342842e0e1461047957806345c0f533146104995780634d5f4e76146104cd57600080fd5b806318160ddd1161026b57806318160ddd146102b257806323b872dd14610399578063286c8137146103b95780632913daa0146103d95780632f49f59b146103ef5780632f745c591461040257600080fd5b80629a9b7b146102b257806301ffc9a7146102da5780630644cefa1461030a57806306fdde031461031f578063081812fc14610341578063095ea7b314610379575b600080fd5b3480156102be57600080fd5b506102c7610898565b6040519081526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f53660046129b3565b6108ac565b60405190151581526020016102d1565b61031d6103183660046128b2565b610919565b005b34801561032b57600080fd5b50610334610a82565b6040516102d19190612b29565b34801561034d57600080fd5b5061036161035c366004612a5f565b610b14565b6040516001600160a01b0390911681526020016102d1565b34801561038557600080fd5b5061031d6103943660046128b2565b610b9d565b3480156103a557600080fd5b5061031d6103b436600461277f565b610cb5565b3480156103c557600080fd5b506102c76103d4366004612a5f565b610cc0565b3480156103e557600080fd5b506102c760025481565b61031d6103fd3660046128b2565b610ce1565b34801561040e57600080fd5b506102c761041d3660046128b2565b610dcd565b34801561042e57600080fd5b50600f5461043c9060ff1681565b60405160ff90911681526020016102d1565b34801561045a57600080fd5b506102c7600d5481565b34801561047057600080fd5b5061031d610f45565b34801561048557600080fd5b5061031d61049436600461277f565b610f7b565b3480156104a557600080fd5b506102c77f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d957600080fd5b5061031d6104e83660046128dc565b610f96565b3480156104f957600080fd5b506102c7610508366004612a5f565b610fff565b34801561051957600080fd5b5061031d610528366004612a5f565b611067565b34801561053957600080fd5b5061031d6105483660046129ed565b6110e7565b34801561055957600080fd5b50610361610568366004612a5f565b61111d565b34801561057957600080fd5b5061031d61112f565b34801561058e57600080fd5b506102c761059d366004612731565b611168565b3480156105ae57600080fd5b5061031d6111f9565b61031d6105c5366004612731565b611242565b3480156105d657600080fd5b5061031d611321565b3480156105eb57600080fd5b506103616105fa366004612a5f565b611360565b34801561060b57600080fd5b506102c760125481565b34801561062157600080fd5b506000546001600160a01b0316610361565b34801561063f57600080fd5b506011546102fa9060ff1681565b34801561065957600080fd5b5061031d610668366004612a5f565b61138a565b34801561067957600080fd5b5061068d610688366004612a5f565b6113b9565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102d1565b3480156106c757600080fd5b506103346113d6565b3480156106dc57600080fd5b5061031d6106eb36600461287b565b6113e5565b3480156106fc57600080fd5b5061031d61070b366004612731565b6114aa565b34801561071c57600080fd5b5061031d61072b3660046128b2565b611527565b34801561073c57600080fd5b5061031d61074b3660046127bb565b61174c565b34801561075c57600080fd5b5061031d61076b366004612731565b61177f565b34801561077c57600080fd5b50600a54610361906001600160a01b031681565b34801561079c57600080fd5b506103346107ab366004612a5f565b6118ac565b3480156107bc57600080fd5b506102c761190a565b3480156107d157600080fd5b50610334611923565b3480156107e657600080fd5b506103346119b1565b3480156107fb57600080fd5b506102c760095481565b34801561081157600080fd5b5061031d6119c0565b34801561082657600080fd5b50610334611a1a565b34801561083b57600080fd5b506102fa61084a36600461274c565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561088457600080fd5b5061031d610893366004612731565b611a3a565b60006108a76001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b14806108dd57506001600160e01b03198216635b5e139f60e01b145b806108f857506001600160e01b0319821663780e9d6360e01b145b8061091357506301ffc9a760e01b6001600160e01b03198316145b92915050565b600181101561096f5760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e00000000000060448201526064015b60405180910390fd5b6002548111156109915760405162461bcd60e51b815260040161096690612c08565b60115460ff1615156001146109b85760405162461bcd60e51b815260040161096690612c56565b7f0000000000000000000000000000000000000000000000000000000000000000816109e2610898565b6109ec9190612ce0565b1115610a0a5760405162461bcd60e51b815260040161096690612b71565b610a1381611ad2565b3414610a725760405162461bcd60e51b815260206004820152602860248201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6044820152671c88185b5bdd5b9d60c21b6064820152608401610966565b610a7e82826000611ae2565b5050565b606060038054610a9190612d96565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90612d96565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f82611afd565b610b815760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610966565b506000908152600760205260409020546001600160a01b031690565b6000610ba88261111d565b9050806001600160a01b0316836001600160a01b03161415610c175760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610966565b336001600160a01b0382161480610c335750610c33813361084a565b610ca55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610966565b610cb0838383611b13565b505050565b610cb0838383611b6f565b600c8181548110610cd057600080fd5b600091825260209091200154905081565b6001811015610d325760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e0000000000006044820152606401610966565b600254811115610d545760405162461bcd60e51b815260040161096690612c08565b60115460ff161515600114610d7b5760405162461bcd60e51b815260040161096690612c56565b7f000000000000000000000000000000000000000000000000000000000000000081610da5610898565b610daf9190612ce0565b1115610a725760405162461bcd60e51b815260040161096690612b71565b6000610dd883611168565b8210610e315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610966565b6000610e3b610898565b905060008060005b83811015610ee5576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9657805192505b876001600160a01b0316836001600160a01b03161415610ed25786841415610ec45750935061091392505050565b83610ece81612dd1565b9450505b5080610edd81612dd1565b915050610e43565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610966565b6000546001600160a01b03163314610f6f5760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19169055565b610cb08383836040518060200160405280600081525061174c565b6000546001600160a01b03163314610fc05760405162461bcd60e51b815260040161096690612b3c565b60005b81811015610cb057610fed838281518110610fe057610fe0612e2c565b60200260200101516114aa565b80610ff781612dd1565b915050610fc3565b6000611009610898565b82106110635760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610966565b5090565b6000546001600160a01b031633146110915760405162461bcd60e51b815260040161096690612b3c565b60018110156110e25760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610966565b600255565b6000546001600160a01b031633146111115760405162461bcd60e51b815260040161096690612b3c565b610cb060108383612685565b600061112882611ef4565b5192915050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19166001179055565b60006001600160a01b0382166111d45760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610966565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b031633146112235760405162461bcd60e51b815260040161096690612b3c565b6112407363be1a5922c81a85d34fa3f0ed8d769f786ab611612024565b565b7f000000000000000000000000000000000000000000000000000000000000000061126b61190a565b11156112895760405162461bcd60e51b815260040161096690612b71565b60115460ff1615156001146112b05760405162461bcd60e51b815260040161096690612c56565b60125434146113115760405162461bcd60e51b815260206004820152602760248201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696044820152666e74206665652160c81b6064820152608401610966565b61131e8160016000611ae2565b50565b6000546001600160a01b0316331461134b5760405162461bcd60e51b815260040161096690612b3c565b6000471161135857600080fd5b611240612074565b600b818154811061137057600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146113b45760405162461bcd60e51b815260040161096690612b3c565b601255565b604080518082019091526000808252602082015261091382611ef4565b606060048054610a9190612d96565b6001600160a01b03821633141561143e5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610966565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146114d45760405162461bcd60e51b815260040161096690612b3c565b7f00000000000000000000000000000000000000000000000000000000000000006114fd61190a565b111561151b5760405162461bcd60e51b815260040161096690612b71565b61131e81600180611ae2565b6000546001600160a01b031633146115515760405162461bcd60e51b815260040161096690612b3c565b6000811161155e57600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190612a78565b10156116335760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610966565b60005b600d5481101561174657816001600160a01b031663a9059cbb600b838154811061166257611662612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c858154811061169557611695612e2c565b9060005260206000200154876116ab9190612d0c565b6116b59190612cf8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116fb57600080fd5b505af115801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612996565b508061173e81612dd1565b915050611636565b50505050565b611757848484611b6f565b61176384848484612102565b6117465760405162461bcd60e51b815260040161096690612bb5565b600a546001600160a01b031633146117d95760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b600a546001600160a01b038281169116141561184a5760405162461bcd60e51b815260206004820152602a60248201527f52414d50503a204e65772052616d70702061646472657373206d75737420626560448201526908191a5999995c995b9d60b21b6064820152608401610966565b600a80546001600160a01b0319166001600160a01b038316179055600b805482919060009061187b5761187b612e2c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b606060006118b86119b1565b905060008151116118d85760405180602001604052806000815250611903565b806118e284612210565b6040516020016118f3929190612abd565b6040516020818303038152906040525b9392505050565b60006108a761191c6001546000190190565b600161230e565b6010805461193090612d96565b80601f016020809104026020016040519081016040528092919081815260200182805461195c90612d96565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b606060108054610a9190612d96565b600a546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b6060604051806060016040528060368152602001612e7d60369139905090565b6000546001600160a01b03163314611a645760405162461bcd60e51b815260040161096690612b3c565b6001600160a01b038116611ac95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610966565b61131e81612024565b601254600090610913908361231a565b610cb083838360405180602001604052806000815250612326565b6000816001111580156109135750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7a82611ef4565b80519091506000906001600160a01b0316336001600160a01b03161480611bb1575033611ba684610b14565b6001600160a01b0316145b80611bc357508151611bc3903361084a565b905080611c2d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610966565b846001600160a01b031682600001516001600160a01b031614611ca15760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610966565b6001600160a01b038416611d055760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610966565b611d156000848460000151611b13565b6001600160a01b0385166000908152600660205260408120805460019290611d479084906001600160801b0316612d2b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d9391859116612cbe565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611e1b846001612ce0565b6000818152600560205260409020549091506001600160a01b0316611eab57611e4381611afd565b15611eab5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b60408051808201909152600080825260208201528180600111158015611f1b575060015481105b15611fc4576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f6d579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611fbf579392505050565b611f6d565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610966565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600d54811015610a7e576120f0600b828154811061209857612098612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c84815481106120cb576120cb612e2c565b9060005260206000200154856120e19190612d0c565b6120eb9190612cf8565b6125ef565b806120fa81612dd1565b915050612078565b60006001600160a01b0384163b1561220457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612146903390899088908890600401612aec565b602060405180830381600087803b15801561216057600080fd5b505af1925050508015612190575060408051601f3d908101601f1916820190925261218d918101906129d0565b60015b6121ea573d8080156121be576040519150601f19603f3d011682016040523d82523d6000602084013e6121c3565b606091505b5080516121e25760405162461bcd60e51b815260040161096690612bb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612208565b5060015b949350505050565b6060816122345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561225e578061224881612dd1565b91506122579050600a83612cf8565b9150612238565b60008167ffffffffffffffff81111561227957612279612e42565b6040519080825280601f01601f1916602001820160405280156122a3576020820181803683370190505b5090505b8415612208576122b8600183612d53565b91506122c5600a86612dec565b6122d0906030612ce0565b60f81b8183815181106122e5576122e5612e2c565b60200101906001600160f81b031916908160001a905350612307600a86612cf8565b94506122a7565b60006119038284612ce0565b60006119038284612d0c565b6001546001600160a01b0385166123895760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610966565b61239281611afd565b156123df5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610966565b60025484111561243c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610966565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612498908890612cbe565b6001600160801b03168152602001856124b157866124b4565b60005b83602001516124c39190612cbe565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156125e35760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125a76000898488612102565b6125c35760405162461bcd60e51b815260040161096690612bb5565b816125cd81612dd1565b92505080806125db90612dd1565b91505061255a565b50600155505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263c576040519150601f19603f3d011682016040523d82523d6000602084013e612641565b606091505b5050905080610cb05760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610966565b82805461269190612d96565b90600052602060002090601f0160209004810192826126b357600085556126f9565b82601f106126cc5782800160ff198235161785556126f9565b828001600101855582156126f9579182015b828111156126f95782358255916020019190600101906126de565b506110639291505b808211156110635760008155600101612701565b80356001600160a01b038116811461272c57600080fd5b919050565b60006020828403121561274357600080fd5b61190382612715565b6000806040838503121561275f57600080fd5b61276883612715565b915061277660208401612715565b90509250929050565b60008060006060848603121561279457600080fd5b61279d84612715565b92506127ab60208501612715565b9150604084013590509250925092565b600080600080608085870312156127d157600080fd5b6127da85612715565b935060206127e9818701612715565b935060408601359250606086013567ffffffffffffffff8082111561280d57600080fd5b818801915088601f83011261282157600080fd5b81358181111561283357612833612e42565b612845601f8201601f19168501612c8d565b9150808252898482850101111561285b57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561288e57600080fd5b61289783612715565b915060208301356128a781612e58565b809150509250929050565b600080604083850312156128c557600080fd5b6128ce83612715565b946020939093013593505050565b600080604083850312156128ef57600080fd5b823567ffffffffffffffff8082111561290757600080fd5b818501915085601f83011261291b57600080fd5b813560208282111561292f5761292f612e42565b8160051b9250612940818401612c8d565b8281528181019085830185870184018b101561295b57600080fd5b600096505b848710156129855761297181612715565b835260019690960195918301918301612960565b509997909101359750505050505050565b6000602082840312156129a857600080fd5b815161190381612e58565b6000602082840312156129c557600080fd5b813561190381612e66565b6000602082840312156129e257600080fd5b815161190381612e66565b60008060208385031215612a0057600080fd5b823567ffffffffffffffff80821115612a1857600080fd5b818501915085601f830112612a2c57600080fd5b813581811115612a3b57600080fd5b866020828501011115612a4d57600080fd5b60209290920196919550909350505050565b600060208284031215612a7157600080fd5b5035919050565b600060208284031215612a8a57600080fd5b5051919050565b60008151808452612aa9816020860160208601612d6a565b601f01601f19169290920160200192915050565b60008351612acf818460208801612d6a565b835190830190612ae3818360208801612d6a565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b1f90830184612a91565b9695505050505050565b6020815260006119036020830184612a91565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f6620316040820152630303030360e41b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b6020808252601e908201527f4d696e74696e67206973206e6f74206f70656e207269676874206e6f77210000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612cb657612cb6612e42565b604052919050565b60006001600160801b03808316818516808303821115612ae357612ae3612e00565b60008219821115612cf357612cf3612e00565b500190565b600082612d0757612d07612e16565b500490565b6000816000190483118215151615612d2657612d26612e00565b500290565b60006001600160801b0383811690831681811015612d4b57612d4b612e00565b039392505050565b600082821015612d6557612d65612e00565b500390565b60005b83811015612d85578181015183820152602001612d6d565b838111156117465750506000910152565b600181811c90821680612daa57607f821691505b60208210811415612dcb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612de557612de5612e00565b5060010190565b600082612dfb57612dfb612e16565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461131e57600080fd5b6001600160e01b03198116811461131e57600080fdfe697066733a2f2f516d665a4c447a414b615758685168566779714b5279507a636a557a77746e6b516b444e4b684650414c455163702fa2646970667358221220a540f2ca5cf53f20747e7b3236768dac46e85e290eb92effc671eb297e1eea6864736f6c63430008070033697066733a2f2f516d5146764a5773584a3753756d315752414870765a395074516e746f7175424a6e475869593461636e594e47572f
Deployed Bytecode
0x6080604052600436106102ad5760003560e01c8063715018a611610175578063b40ebceb116100dc578063cfc86f7b11610095578063dcd4aa8b1161006f578063dcd4aa8b14610805578063e8a3d4851461081a578063e985e9c51461082f578063f2fde38b1461087857600080fd5b8063cfc86f7b146107c5578063d547cfb7146107da578063d7224ba0146107ef57600080fd5b8063b40ebceb14610710578063b88d4fde14610730578063bbd8556b14610750578063c5815c4114610770578063c87b56dd14610790578063caa0f92a146107b057600080fd5b80638f4bb4971161012e5780638f4bb4971461063357806391b7f5ed1461064d5780639231ab2a1461066d57806395d89b41146106bb578063a22cb465146106d0578063a54dd93c146106f057600080fd5b8063715018a6146105a2578063755edd17146105b7578063853828b6146105ca578063891bbe73146105df5780638d859f3e146105ff5780638da5cb5b1461061557600080fd5b806338b90333116102195780634f6ccce7116101d25780634f6ccce7146104ed578063547520fe1461050d57806355f804b31461052d5780636352211e1461054d5780636ba9fd381461056d57806370a082311461058257600080fd5b806338b90333146104225780633e07311c1461044e5780633e3e0b121461046457806342842e0e1461047957806345c0f533146104995780634d5f4e76146104cd57600080fd5b806318160ddd1161026b57806318160ddd146102b257806323b872dd14610399578063286c8137146103b95780632913daa0146103d95780632f49f59b146103ef5780632f745c591461040257600080fd5b80629a9b7b146102b257806301ffc9a7146102da5780630644cefa1461030a57806306fdde031461031f578063081812fc14610341578063095ea7b314610379575b600080fd5b3480156102be57600080fd5b506102c7610898565b6040519081526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f53660046129b3565b6108ac565b60405190151581526020016102d1565b61031d6103183660046128b2565b610919565b005b34801561032b57600080fd5b50610334610a82565b6040516102d19190612b29565b34801561034d57600080fd5b5061036161035c366004612a5f565b610b14565b6040516001600160a01b0390911681526020016102d1565b34801561038557600080fd5b5061031d6103943660046128b2565b610b9d565b3480156103a557600080fd5b5061031d6103b436600461277f565b610cb5565b3480156103c557600080fd5b506102c76103d4366004612a5f565b610cc0565b3480156103e557600080fd5b506102c760025481565b61031d6103fd3660046128b2565b610ce1565b34801561040e57600080fd5b506102c761041d3660046128b2565b610dcd565b34801561042e57600080fd5b50600f5461043c9060ff1681565b60405160ff90911681526020016102d1565b34801561045a57600080fd5b506102c7600d5481565b34801561047057600080fd5b5061031d610f45565b34801561048557600080fd5b5061031d61049436600461277f565b610f7b565b3480156104a557600080fd5b506102c77f000000000000000000000000000000000000000000000000000000000000271081565b3480156104d957600080fd5b5061031d6104e83660046128dc565b610f96565b3480156104f957600080fd5b506102c7610508366004612a5f565b610fff565b34801561051957600080fd5b5061031d610528366004612a5f565b611067565b34801561053957600080fd5b5061031d6105483660046129ed565b6110e7565b34801561055957600080fd5b50610361610568366004612a5f565b61111d565b34801561057957600080fd5b5061031d61112f565b34801561058e57600080fd5b506102c761059d366004612731565b611168565b3480156105ae57600080fd5b5061031d6111f9565b61031d6105c5366004612731565b611242565b3480156105d657600080fd5b5061031d611321565b3480156105eb57600080fd5b506103616105fa366004612a5f565b611360565b34801561060b57600080fd5b506102c760125481565b34801561062157600080fd5b506000546001600160a01b0316610361565b34801561063f57600080fd5b506011546102fa9060ff1681565b34801561065957600080fd5b5061031d610668366004612a5f565b61138a565b34801561067957600080fd5b5061068d610688366004612a5f565b6113b9565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102d1565b3480156106c757600080fd5b506103346113d6565b3480156106dc57600080fd5b5061031d6106eb36600461287b565b6113e5565b3480156106fc57600080fd5b5061031d61070b366004612731565b6114aa565b34801561071c57600080fd5b5061031d61072b3660046128b2565b611527565b34801561073c57600080fd5b5061031d61074b3660046127bb565b61174c565b34801561075c57600080fd5b5061031d61076b366004612731565b61177f565b34801561077c57600080fd5b50600a54610361906001600160a01b031681565b34801561079c57600080fd5b506103346107ab366004612a5f565b6118ac565b3480156107bc57600080fd5b506102c761190a565b3480156107d157600080fd5b50610334611923565b3480156107e657600080fd5b506103346119b1565b3480156107fb57600080fd5b506102c760095481565b34801561081157600080fd5b5061031d6119c0565b34801561082657600080fd5b50610334611a1a565b34801561083b57600080fd5b506102fa61084a36600461274c565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561088457600080fd5b5061031d610893366004612731565b611a3a565b60006108a76001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b14806108dd57506001600160e01b03198216635b5e139f60e01b145b806108f857506001600160e01b0319821663780e9d6360e01b145b8061091357506301ffc9a760e01b6001600160e01b03198316145b92915050565b600181101561096f5760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e00000000000060448201526064015b60405180910390fd5b6002548111156109915760405162461bcd60e51b815260040161096690612c08565b60115460ff1615156001146109b85760405162461bcd60e51b815260040161096690612c56565b7f0000000000000000000000000000000000000000000000000000000000002710816109e2610898565b6109ec9190612ce0565b1115610a0a5760405162461bcd60e51b815260040161096690612b71565b610a1381611ad2565b3414610a725760405162461bcd60e51b815260206004820152602860248201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6044820152671c88185b5bdd5b9d60c21b6064820152608401610966565b610a7e82826000611ae2565b5050565b606060038054610a9190612d96565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90612d96565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f82611afd565b610b815760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610966565b506000908152600760205260409020546001600160a01b031690565b6000610ba88261111d565b9050806001600160a01b0316836001600160a01b03161415610c175760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610966565b336001600160a01b0382161480610c335750610c33813361084a565b610ca55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610966565b610cb0838383611b13565b505050565b610cb0838383611b6f565b600c8181548110610cd057600080fd5b600091825260209091200154905081565b6001811015610d325760405162461bcd60e51b815260206004820152601a60248201527f4d757374206d696e74206174206c65617374203120746f6b656e0000000000006044820152606401610966565b600254811115610d545760405162461bcd60e51b815260040161096690612c08565b60115460ff161515600114610d7b5760405162461bcd60e51b815260040161096690612c56565b7f000000000000000000000000000000000000000000000000000000000000271081610da5610898565b610daf9190612ce0565b1115610a725760405162461bcd60e51b815260040161096690612b71565b6000610dd883611168565b8210610e315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610966565b6000610e3b610898565b905060008060005b83811015610ee5576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9657805192505b876001600160a01b0316836001600160a01b03161415610ed25786841415610ec45750935061091392505050565b83610ece81612dd1565b9450505b5080610edd81612dd1565b915050610e43565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610966565b6000546001600160a01b03163314610f6f5760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19169055565b610cb08383836040518060200160405280600081525061174c565b6000546001600160a01b03163314610fc05760405162461bcd60e51b815260040161096690612b3c565b60005b81811015610cb057610fed838281518110610fe057610fe0612e2c565b60200260200101516114aa565b80610ff781612dd1565b915050610fc3565b6000611009610898565b82106110635760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610966565b5090565b6000546001600160a01b031633146110915760405162461bcd60e51b815260040161096690612b3c565b60018110156110e25760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610966565b600255565b6000546001600160a01b031633146111115760405162461bcd60e51b815260040161096690612b3c565b610cb060108383612685565b600061112882611ef4565b5192915050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161096690612b3c565b6011805460ff19166001179055565b60006001600160a01b0382166111d45760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610966565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b031633146112235760405162461bcd60e51b815260040161096690612b3c565b6112407363be1a5922c81a85d34fa3f0ed8d769f786ab611612024565b565b7f000000000000000000000000000000000000000000000000000000000000271061126b61190a565b11156112895760405162461bcd60e51b815260040161096690612b71565b60115460ff1615156001146112b05760405162461bcd60e51b815260040161096690612c56565b60125434146113115760405162461bcd60e51b815260206004820152602760248201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696044820152666e74206665652160c81b6064820152608401610966565b61131e8160016000611ae2565b50565b6000546001600160a01b0316331461134b5760405162461bcd60e51b815260040161096690612b3c565b6000471161135857600080fd5b611240612074565b600b818154811061137057600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146113b45760405162461bcd60e51b815260040161096690612b3c565b601255565b604080518082019091526000808252602082015261091382611ef4565b606060048054610a9190612d96565b6001600160a01b03821633141561143e5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610966565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146114d45760405162461bcd60e51b815260040161096690612b3c565b7f00000000000000000000000000000000000000000000000000000000000027106114fd61190a565b111561151b5760405162461bcd60e51b815260040161096690612b71565b61131e81600180611ae2565b6000546001600160a01b031633146115515760405162461bcd60e51b815260040161096690612b3c565b6000811161155e57600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190612a78565b10156116335760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610966565b60005b600d5481101561174657816001600160a01b031663a9059cbb600b838154811061166257611662612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c858154811061169557611695612e2c565b9060005260206000200154876116ab9190612d0c565b6116b59190612cf8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116fb57600080fd5b505af115801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190612996565b508061173e81612dd1565b915050611636565b50505050565b611757848484611b6f565b61176384848484612102565b6117465760405162461bcd60e51b815260040161096690612bb5565b600a546001600160a01b031633146117d95760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b600a546001600160a01b038281169116141561184a5760405162461bcd60e51b815260206004820152602a60248201527f52414d50503a204e65772052616d70702061646472657373206d75737420626560448201526908191a5999995c995b9d60b21b6064820152608401610966565b600a80546001600160a01b0319166001600160a01b038316179055600b805482919060009061187b5761187b612e2c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b606060006118b86119b1565b905060008151116118d85760405180602001604052806000815250611903565b806118e284612210565b6040516020016118f3929190612abd565b6040516020818303038152906040525b9392505050565b60006108a761191c6001546000190190565b600161230e565b6010805461193090612d96565b80601f016020809104026020016040519081016040528092919081815260200182805461195c90612d96565b80156119a95780601f1061197e576101008083540402835291602001916119a9565b820191906000526020600020905b81548152906001019060200180831161198c57829003601f168201915b505050505081565b606060108054610a9190612d96565b600a546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d5050000000006044820152606401610966565b6060604051806060016040528060368152602001612e7d60369139905090565b6000546001600160a01b03163314611a645760405162461bcd60e51b815260040161096690612b3c565b6001600160a01b038116611ac95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610966565b61131e81612024565b601254600090610913908361231a565b610cb083838360405180602001604052806000815250612326565b6000816001111580156109135750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7a82611ef4565b80519091506000906001600160a01b0316336001600160a01b03161480611bb1575033611ba684610b14565b6001600160a01b0316145b80611bc357508151611bc3903361084a565b905080611c2d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610966565b846001600160a01b031682600001516001600160a01b031614611ca15760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610966565b6001600160a01b038416611d055760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610966565b611d156000848460000151611b13565b6001600160a01b0385166000908152600660205260408120805460019290611d479084906001600160801b0316612d2b565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d9391859116612cbe565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611e1b846001612ce0565b6000818152600560205260409020549091506001600160a01b0316611eab57611e4381611afd565b15611eab5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b60408051808201909152600080825260208201528180600111158015611f1b575060015481105b15611fc4576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f6d579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611fbf579392505050565b611f6d565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610966565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600d54811015610a7e576120f0600b828154811061209857612098612e2c565b9060005260206000200160009054906101000a90046001600160a01b03166064600c84815481106120cb576120cb612e2c565b9060005260206000200154856120e19190612d0c565b6120eb9190612cf8565b6125ef565b806120fa81612dd1565b915050612078565b60006001600160a01b0384163b1561220457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612146903390899088908890600401612aec565b602060405180830381600087803b15801561216057600080fd5b505af1925050508015612190575060408051601f3d908101601f1916820190925261218d918101906129d0565b60015b6121ea573d8080156121be576040519150601f19603f3d011682016040523d82523d6000602084013e6121c3565b606091505b5080516121e25760405162461bcd60e51b815260040161096690612bb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612208565b5060015b949350505050565b6060816122345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561225e578061224881612dd1565b91506122579050600a83612cf8565b9150612238565b60008167ffffffffffffffff81111561227957612279612e42565b6040519080825280601f01601f1916602001820160405280156122a3576020820181803683370190505b5090505b8415612208576122b8600183612d53565b91506122c5600a86612dec565b6122d0906030612ce0565b60f81b8183815181106122e5576122e5612e2c565b60200101906001600160f81b031916908160001a905350612307600a86612cf8565b94506122a7565b60006119038284612ce0565b60006119038284612d0c565b6001546001600160a01b0385166123895760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610966565b61239281611afd565b156123df5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610966565b60025484111561243c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610966565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612498908890612cbe565b6001600160801b03168152602001856124b157866124b4565b60005b83602001516124c39190612cbe565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156125e35760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125a76000898488612102565b6125c35760405162461bcd60e51b815260040161096690612bb5565b816125cd81612dd1565b92505080806125db90612dd1565b91505061255a565b50600155505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263c576040519150601f19603f3d011682016040523d82523d6000602084013e612641565b606091505b5050905080610cb05760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610966565b82805461269190612d96565b90600052602060002090601f0160209004810192826126b357600085556126f9565b82601f106126cc5782800160ff198235161785556126f9565b828001600101855582156126f9579182015b828111156126f95782358255916020019190600101906126de565b506110639291505b808211156110635760008155600101612701565b80356001600160a01b038116811461272c57600080fd5b919050565b60006020828403121561274357600080fd5b61190382612715565b6000806040838503121561275f57600080fd5b61276883612715565b915061277660208401612715565b90509250929050565b60008060006060848603121561279457600080fd5b61279d84612715565b92506127ab60208501612715565b9150604084013590509250925092565b600080600080608085870312156127d157600080fd5b6127da85612715565b935060206127e9818701612715565b935060408601359250606086013567ffffffffffffffff8082111561280d57600080fd5b818801915088601f83011261282157600080fd5b81358181111561283357612833612e42565b612845601f8201601f19168501612c8d565b9150808252898482850101111561285b57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561288e57600080fd5b61289783612715565b915060208301356128a781612e58565b809150509250929050565b600080604083850312156128c557600080fd5b6128ce83612715565b946020939093013593505050565b600080604083850312156128ef57600080fd5b823567ffffffffffffffff8082111561290757600080fd5b818501915085601f83011261291b57600080fd5b813560208282111561292f5761292f612e42565b8160051b9250612940818401612c8d565b8281528181019085830185870184018b101561295b57600080fd5b600096505b848710156129855761297181612715565b835260019690960195918301918301612960565b509997909101359750505050505050565b6000602082840312156129a857600080fd5b815161190381612e58565b6000602082840312156129c557600080fd5b813561190381612e66565b6000602082840312156129e257600080fd5b815161190381612e66565b60008060208385031215612a0057600080fd5b823567ffffffffffffffff80821115612a1857600080fd5b818501915085601f830112612a2c57600080fd5b813581811115612a3b57600080fd5b866020828501011115612a4d57600080fd5b60209290920196919550909350505050565b600060208284031215612a7157600080fd5b5035919050565b600060208284031215612a8a57600080fd5b5051919050565b60008151808452612aa9816020860160208601612d6a565b601f01601f19169290920160200192915050565b60008351612acf818460208801612d6a565b835190830190612ae3818360208801612d6a565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b1f90830184612a91565b9695505050505050565b6020815260006119036020830184612a91565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f6620316040820152630303030360e41b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b6020808252601e908201527f4d696e74696e67206973206e6f74206f70656e207269676874206e6f77210000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612cb657612cb6612e42565b604052919050565b60006001600160801b03808316818516808303821115612ae357612ae3612e00565b60008219821115612cf357612cf3612e00565b500190565b600082612d0757612d07612e16565b500490565b6000816000190483118215151615612d2657612d26612e00565b500290565b60006001600160801b0383811690831681811015612d4b57612d4b612e00565b039392505050565b600082821015612d6557612d65612e00565b500390565b60005b83811015612d85578181015183820152602001612d6d565b838111156117465750506000910152565b600181811c90821680612daa57607f821691505b60208210811415612dcb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612de557612de5612e00565b5060010190565b600082612dfb57612dfb612e16565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461131e57600080fd5b6001600160e01b03198116811461131e57600080fdfe697066733a2f2f516d665a4c447a414b615758685168566779714b5279507a636a557a77746e6b516b444e4b684650414c455163702fa2646970667358221220a540f2ca5cf53f20747e7b3236768dac46e85e290eb92effc671eb297e1eea6864736f6c63430008070033
Deployed Bytecode Sourcemap
54451:231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33845:88;;;;;;;;;;;;;:::i;:::-;;;19619:25:1;;;19607:2;19592:18;33845:88:0;;;;;;;;35520:342;;;;;;;;;;-1:-1:-1;35520:342:0;;;;;:::i;:::-;;:::i;:::-;;;7400:14:1;;7393:22;7375:41;;7363:2;7348:18;35520:342:0;7235:187:1;51883:514:0;;;;;;:::i;:::-;;:::i;:::-;;37343:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38706:202::-;;;;;;;;;;-1:-1:-1;38706:202:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6419:32:1;;;6401:51;;6389:2;6374:18;38706:202:0;6255:203:1;38283:365:0;;;;;;;;;;-1:-1:-1;38283:365:0;;;;;:::i;:::-;;:::i;39538:134::-;;;;;;;;;;-1:-1:-1;39538:134:0;;;;;:::i;:::-;;:::i;48033:37::-;;;;;;;;;;-1:-1:-1;48033:37:0;;;;;:::i;:::-;;:::i;32199:27::-;;;;;;;;;;;;;;;;52638:526;;;;;;:::i;:::-;;:::i;34786:670::-;;;;;;;;;;-1:-1:-1;34786:670:0;;;;;:::i;:::-;;:::i;50347:33::-;;;;;;;;;;-1:-1:-1;50347:33:0;;;;;;;;;;;19827:4:1;19815:17;;;19797:36;;19785:2;19770:18;50347:33:0;19655:184:1;48075:38:0;;;;;;;;;;;;;;;;53249:70;;;;;;;;;;;;;:::i;39735:149::-;;;;;;;;;;-1:-1:-1;39735:149:0;;;;;:::i;:::-;;:::i;32155:39::-;;;;;;;;;;;;;;;50966:178;;;;;;;;;;-1:-1:-1;50966:178:0;;;;;:::i;:::-;;:::i;34324:173::-;;;;;;;;;;-1:-1:-1;34324:173:0;;;;;:::i;:::-;;:::i;53493:156::-;;;;;;;;;;-1:-1:-1;53493:156:0;;;;;:::i;:::-;;:::i;54084:98::-;;;;;;;;;;-1:-1:-1;54084:98:0;;;;;:::i;:::-;;:::i;37168:116::-;;;;;;;;;;-1:-1:-1;37168:116:0;;;;;:::i;:::-;;:::i;53172:69::-;;;;;;;;;;;;;:::i;35918:207::-;;;;;;;;;;-1:-1:-1;35918:207:0;;;;;:::i;:::-;;:::i;30440:127::-;;;;;;;;;;;;;:::i;51351:317::-;;;;;;:::i;:::-;;:::i;48122:104::-;;;;;;;;;;;;;:::i;47935:93::-;;;;;;;;;;-1:-1:-1;47935:93:0;;;;;:::i;:::-;;:::i;50519:33::-;;;;;;;;;;;;;;;;29841:79;;;;;;;;;;-1:-1:-1;29887:7:0;29908:6;-1:-1:-1;;;;;29908:6:0;29841:79;;50480:30;;;;;;;;;;-1:-1:-1;50480:30:0;;;;;;;;53665:82;;;;;;;;;;-1:-1:-1;53665:82:0;;;;;:::i;:::-;;:::i;54190:127::-;;;;;;;;;;-1:-1:-1;54190:127:0;;;;;:::i;:::-;;:::i;:::-;;;;19338:13:1;;-1:-1:-1;;;;;19334:39:1;19316:58;;19434:4;19422:17;;;19416:24;19442:18;19412:49;19390:20;;;19383:79;;;;19289:18;54190:127:0;19106:362:1;37496:96:0;;;;;;;;;;;;;:::i;38972:270::-;;;;;;;;;;-1:-1:-1;38972:270:0;;;;;:::i;:::-;;:::i;50785:173::-;;;;;;;;;;-1:-1:-1;50785:173:0;;;;;:::i;:::-;;:::i;49111:408::-;;;;;;;;;;-1:-1:-1;49111:408:0;;;;;:::i;:::-;;:::i;39947:289::-;;;;;;;;;;-1:-1:-1;39947:289:0;;;;;:::i;:::-;;:::i;49847:223::-;;;;;;;;;;-1:-1:-1;49847:223:0;;;;;:::i;:::-;;:::i;47481:72::-;;;;;;;;;;-1:-1:-1;47481:72:0;;;;-1:-1:-1;;;;;47481:72:0;;;37655:258;;;;;;;;;;-1:-1:-1;37655:258:0;;;;;:::i;:::-;;:::i;33941:105::-;;;;;;;;;;;;;:::i;50385:86::-;;;;;;;;;;;;;:::i;53985:91::-;;;;;;;;;;;;;:::i;44229:43::-;;;;;;;;;;;;;;;;48234:107;;;;;;;;;;;;;:::i;54544:133::-;;;;;;;;;;;;;:::i;39305:174::-;;;;;;;;;;-1:-1:-1;39305:174:0;;;;;:::i;:::-;-1:-1:-1;;;;;39438:25:0;;;39417:4;39438:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39305:174;30709:187;;;;;;;;;;-1:-1:-1;30709:187:0;;;;;:::i;:::-;;:::i;33845:88::-;33892:7;33913:14;33668:1;34214:12;-1:-1:-1;;34214:30:0;;34131:124;33913:14;33906:21;;33845:88;:::o;35520:342::-;35637:4;-1:-1:-1;;;;;;35661:40:0;;-1:-1:-1;;;35661:40:0;;:95;;-1:-1:-1;;;;;;;35708:48:0;;-1:-1:-1;;;35708:48:0;35661:95;:152;;;-1:-1:-1;;;;;;;35763:50:0;;-1:-1:-1;;;35763:50:0;35661:152;:195;;;-1:-1:-1;;;;;;;;;;16963:40:0;;;35820:36;35651:205;35520:342;-1:-1:-1;;35520:342:0:o;51883:514::-;51976:1;51965:7;:12;;51957:51;;;;-1:-1:-1;;;51957:51:0;;9423:2:1;51957:51:0;;;9405:21:1;9462:2;9442:18;;;9435:30;9501:28;9481:18;;;9474:56;9547:18;;51957:51:0;;;;;;;;;52032:12;;52021:7;:23;;52013:82;;;;-1:-1:-1;;;52013:82:0;;;;;;;:::i;:::-;52108:11;;;;:19;;:11;:19;52100:62;;;;-1:-1:-1;;;52100:62:0;;;;;;;:::i;:::-;52209:14;52198:7;52179:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;52171:93;;;;-1:-1:-1;;;52171:93:0;;;;;;;:::i;:::-;52290:17;52299:7;52290:8;:17::i;:::-;52277:9;:30;52269:83;;;;-1:-1:-1;;;52269:83:0;;16066:2:1;52269:83:0;;;16048:21:1;16105:2;16085:18;;;16078:30;16144:34;16124:18;;;16117:62;-1:-1:-1;;;16195:18:1;;;16188:38;16243:19;;52269:83:0;15864:404:1;52269:83:0;52361:30;52371:3;52376:7;52385:5;52361:9;:30::i;:::-;51883:514;;:::o;37343:92::-;37397:13;37424:5;37417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37343:92;:::o;38706:202::-;38774:7;38796:16;38804:7;38796;:16::i;:::-;38788:74;;;;-1:-1:-1;;;38788:74:0;;18491:2:1;38788:74:0;;;18473:21:1;18530:2;18510:18;;;18503:30;18569:34;18549:18;;;18542:62;-1:-1:-1;;;18620:18:1;;;18613:43;18673:19;;38788:74:0;18289:409:1;38788:74:0;-1:-1:-1;38878:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38878:24:0;;38706:202::o;38283:365::-;38350:13;38366:24;38382:7;38366:15;:24::i;:::-;38350:40;;38409:5;-1:-1:-1;;;;;38403:11:0;:2;-1:-1:-1;;;;;38403:11:0;;;38395:58;;;;-1:-1:-1;;;38395:58:0;;14138:2:1;38395:58:0;;;14120:21:1;14177:2;14157:18;;;14150:30;14216:34;14196:18;;;14189:62;-1:-1:-1;;;14267:18:1;;;14260:32;14309:19;;38395:58:0;13936:398:1;38395:58:0;28648:10;-1:-1:-1;;;;;38474:21:0;;;;:62;;-1:-1:-1;38499:37:0;38516:5;28648:10;39305:174;:::i;38499:37::-;38462:143;;;;-1:-1:-1;;;38462:143:0;;11353:2:1;38462:143:0;;;11335:21:1;11392:2;11372:18;;;11365:30;11431:34;11411:18;;;11404:62;11502:27;11482:18;;;11475:55;11547:19;;38462:143:0;11151:421:1;38462:143:0;38614:28;38623:2;38627:7;38636:5;38614:8;:28::i;:::-;38345:303;38283:365;;:::o;39538:134::-;39638:28;39648:4;39654:2;39658:7;39638:9;:28::i;48033:37::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48033:37:0;:::o;52638:526::-;52740:1;52729:7;:12;;52721:51;;;;-1:-1:-1;;;52721:51:0;;9423:2:1;52721:51:0;;;9405:21:1;9462:2;9442:18;;;9435:30;9501:28;9481:18;;;9474:56;9547:18;;52721:51:0;9221:350:1;52721:51:0;52796:12;;52785:7;:23;;52777:82;;;;-1:-1:-1;;;52777:82:0;;;;;;;:::i;:::-;52872:11;;;;:19;;:11;:19;52864:62;;;;-1:-1:-1;;;52864:62:0;;;;;;;:::i;:::-;52973:14;52962:7;52943:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;52935:93;;;;-1:-1:-1;;;52935:93:0;;;;;;;:::i;34786:670::-;34887:7;34920:16;34930:5;34920:9;:16::i;:::-;34912:5;:24;34904:71;;;;-1:-1:-1;;;34904:71:0;;7853:2:1;34904:71:0;;;7835:21:1;7892:2;7872:18;;;7865:30;7931:34;7911:18;;;7904:62;-1:-1:-1;;;7982:18:1;;;7975:32;8024:19;;34904:71:0;7651:398:1;34904:71:0;34980:22;35005:13;:11;:13::i;:::-;34980:38;;35023:19;35051:25;35099:9;35094:296;35118:14;35114:1;:18;35094:296;;;35144:31;35178:14;;;:11;:14;;;;;;;;;35144:48;;;;;;;;;-1:-1:-1;;;;;35144:48:0;;;;;-1:-1:-1;;;35144:48:0;;;;;;;;;;;;35201:28;35197:79;;35256:14;;;-1:-1:-1;35197:79:0;35305:5;-1:-1:-1;;;;;35284:26:0;:17;-1:-1:-1;;;;;35284:26:0;;35280:105;;;35336:5;35321:11;:20;35317:45;;;-1:-1:-1;35355:1:0;-1:-1:-1;35348:8:0;;-1:-1:-1;;;35348:8:0;35317:45;35366:13;;;;:::i;:::-;;;;35280:105;-1:-1:-1;35134:3:0;;;;:::i;:::-;;;;35094:296;;;-1:-1:-1;35394:56:0;;-1:-1:-1;;;35394:56:0;;16890:2:1;35394:56:0;;;16872:21:1;16929:2;16909:18;;;16902:30;16968:34;16948:18;;;16941:62;-1:-1:-1;;;17019:18:1;;;17012:44;17073:19;;35394:56:0;16688:410:1;53249:70:0;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53294:11:::1;:19:::0;;-1:-1:-1;;53294:19:0::1;::::0;;53249:70::o;39735:149::-;39839:39;39856:4;39862:2;39866:7;39839:39;;;;;;;;;;;;:16;:39::i;50966:178::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;51067:6:::1;51063:76;51081:13;51077:1;:17;51063:76;;;51107:26;51119:10;51130:1;51119:13;;;;;;;;:::i;:::-;;;;;;;51107:11;:26::i;:::-;51096:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51063:76;;34324:173:::0;34391:7;34421:13;:11;:13::i;:::-;34413:5;:21;34405:69;;;;-1:-1:-1;;;34405:69:0;;9778:2:1;34405:69:0;;;9760:21:1;9817:2;9797:18;;;9790:30;9856:34;9836:18;;;9829:62;-1:-1:-1;;;9907:18:1;;;9900:33;9950:19;;34405:69:0;9576:399:1;34405:69:0;-1:-1:-1;34486:5:0;34324:173::o;53493:156::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53579:1:::1;53564:11;:16;;53556:56;;;::::0;-1:-1:-1;;;53556:56:0;;8256:2:1;53556:56:0::1;::::0;::::1;8238:21:1::0;8295:2;8275:18;;;8268:30;8334:29;8314:18;;;8307:57;8381:18;;53556:56:0::1;8054:351:1::0;53556:56:0::1;53617:12;:26:::0;53493:156::o;54084:98::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;54153:23:::1;:13;54169:7:::0;;54153:23:::1;:::i;37168:116::-:0;37232:7;37253:20;37265:7;37253:11;:20::i;:::-;:25;;37168:116;-1:-1:-1;;37168:116:0:o;53172:69::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53217:11:::1;:18:::0;;-1:-1:-1;;53217:18:0::1;53231:4;53217:18;::::0;;53172:69::o;35918:207::-;35982:7;-1:-1:-1;;;;;36004:19:0;;35996:75;;;;-1:-1:-1;;;35996:75:0;;11779:2:1;35996:75:0;;;11761:21:1;11818:2;11798:18;;;11791:30;11857:34;11837:18;;;11830:62;-1:-1:-1;;;11908:18:1;;;11901:41;11959:19;;35996:75:0;11577:407:1;35996:75:0;-1:-1:-1;;;;;;36091:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;36091:27:0;;35918:207::o;30440:127::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;30499:62:::1;30518:42;30499:18;:62::i;:::-;30440:127::o:0;51351:317::-;51428:14;51408:16;:14;:16::i;:::-;:34;;51400:83;;;;-1:-1:-1;;;51400:83:0;;;;;;;:::i;:::-;51496:11;;;;:19;;:11;:19;51488:62;;;;-1:-1:-1;;;51488:62:0;;;;;;;:::i;:::-;51580:5;;51567:9;:18;51559:70;;;;-1:-1:-1;;;51559:70:0;;10945:2:1;51559:70:0;;;10927:21:1;10984:2;10964:18;;;10957:30;11023:34;11003:18;;;10996:62;-1:-1:-1;;;11074:18:1;;;11067:37;11121:19;;51559:70:0;10743:403:1;51559:70:0;51638:24;51648:3;51653:1;51656:5;51638:9;:24::i;:::-;51351:317;:::o;48122:104::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;48199:1:::1;48175:21;:25;48167:34;;;::::0;::::1;;48206:14;:12;:14::i;47935:93::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47935:93:0;;-1:-1:-1;47935:93:0;:::o;53665:82::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;53724:5:::1;:17:::0;53665:82::o;54190:127::-;-1:-1:-1;;;;;;;;;;;;;;;;;54291:20:0;54303:7;54291:11;:20::i;37496:96::-;37552:13;37579:7;37572:14;;;;;:::i;38972:270::-;-1:-1:-1;;;;;39061:24:0;;28648:10;39061:24;;39053:63;;;;-1:-1:-1;;;39053:63:0;;13364:2:1;39053:63:0;;;13346:21:1;13403:2;13383:18;;;13376:30;13442:28;13422:18;;;13415:56;13488:18;;39053:63:0;13162:350:1;39053:63:0;28648:10;39125:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;39125:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;39125:53:0;;;;;;;;;;39188:48;;7375:41:1;;;39125:42:0;;28648:10;39188:48;;7348:18:1;39188:48:0;;;;;;;38972:270;;:::o;50785:173::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;50869:14:::1;50849:16;:14;:16::i;:::-;:34;;50841:83;;;;-1:-1:-1::0;;;50841:83:0::1;;;;;;;:::i;:::-;50929:23;50939:3;50944:1;50947:4:::0;50929:9:::1;:23::i;49111:408::-:0;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;49218:1:::1;49208:7;:11;49200:20;;;::::0;::::1;;49283:38;::::0;-1:-1:-1;;;49283:38:0;;49315:4:::1;49283:38;::::0;::::1;6401:51:1::0;49255:14:0;;49325:7;;-1:-1:-1;;;;;49283:23:0;::::1;::::0;::::1;::::0;6374:18:1;;49283:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;49275:97;;;::::0;-1:-1:-1;;;49275:97:0;;8612:2:1;49275:97:0::1;::::0;::::1;8594:21:1::0;8651:2;8631:18;;;8624:30;8690:34;8670:18;;;8663:62;-1:-1:-1;;;8741:18:1;;;8734:33;8784:19;;49275:97:0::1;8410:399:1::0;49275:97:0::1;49385:6;49381:133;49399:19;;49395:1;:23;49381:133;;;49431:13;-1:-1:-1::0;;;;;49431:22:0::1;;49454:16;49471:1;49454:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;49454:19:0::1;49504:3;49486:11;49498:1;49486:14;;;;;;;;:::i;:::-;;;;;;;;;49476:7;:24;;;;:::i;:::-;49475:32;;;;:::i;:::-;49431:77;::::0;-1:-1:-1;;;;;;49431:77:0::1;::::0;;;;;;-1:-1:-1;;;;;7148:32:1;;;49431:77:0::1;::::0;::::1;7130:51:1::0;7197:18;;;7190:34;7103:18;;49431:77:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;49420:3:0;::::1;::::0;::::1;:::i;:::-;;;;49381:133;;;;49195:324;49111:408:::0;;:::o;39947:289::-;40074:28;40084:4;40090:2;40094:7;40074:9;:28::i;:::-;40119:48;40142:4;40148:2;40152:7;40161:5;40119:22;:48::i;:::-;40107:123;;;;-1:-1:-1;;;40107:123:0;;;;;;;:::i;49847:223::-;47616:12;;-1:-1:-1;;;;;47616:12:0;47602:10;:26;47594:67;;;;-1:-1:-1;;;47594:67:0;;10588:2:1;47594:67:0;;;10570:21:1;10627:2;10607:18;;;10600:30;10666;10646:18;;;10639:58;10714:18;;47594:67:0;10386:352:1;47594:67:0;49936:12:::1;::::0;-1:-1:-1;;;;;49921:27:0;;::::1;49936:12:::0;::::1;49921:27;;49913:82;;;::::0;-1:-1:-1;;;49913:82:0;;17664:2:1;49913:82:0::1;::::0;::::1;17646:21:1::0;17703:2;17683:18;;;17676:30;17742:34;17722:18;;;17715:62;-1:-1:-1;;;17793:18:1;;;17786:40;17843:19;;49913:82:0::1;17462:406:1::0;49913:82:0::1;50000:12;:26:::0;;-1:-1:-1;;;;;;50000:26:0::1;-1:-1:-1::0;;;;;50000:26:0;::::1;;::::0;;50031:16:::1;:19:::0;;50000:26;;50031:16;-1:-1:-1;;50031:19:0::1;;;;:::i;:::-;;;;;;;;;:33;;;;;-1:-1:-1::0;;;;;50031:33:0::1;;;;;-1:-1:-1::0;;;;;50031:33:0::1;;;;;;49847:223:::0;:::o;37655:258::-;37743:13;37766:21;37790:10;:8;:10::i;:::-;37766:34;;37839:1;37821:7;37815:21;:25;:92;;;;;;;;;;;;;;;;;37870:7;37879:18;:7;:16;:18::i;:::-;37853:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37815:92;37805:102;37655:258;-1:-1:-1;;;37655:258:0:o;33941:105::-;33988:7;34009:31;34022:14;33668:1;34214:12;-1:-1:-1;;34214:30:0;;34131:124;34022:14;34038:1;34009:12;:31::i;50385:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53985:91::-;54030:13;54057;54050:20;;;;;:::i;48234:107::-;47616:12;;-1:-1:-1;;;;;47616:12:0;47602:10;:26;47594:67;;;;-1:-1:-1;;;47594:67:0;;10588:2:1;47594:67:0;;;10570:21:1;10627:2;10607:18;;;10600:30;10666;10646:18;;;10639:58;10714:18;;47594:67:0;10386:352:1;54544:133:0;54588:13;54608:63;;;;;;;;;;;;;;;;;;;54544:133;:::o;30709:187::-;29887:7;29908:6;-1:-1:-1;;;;;29908:6:0;28648:10;30039:23;30031:68;;;;-1:-1:-1;;;30031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30792:22:0;::::1;30784:73;;;::::0;-1:-1:-1;;;30784:73:0;;9016:2:1;30784:73:0::1;::::0;::::1;8998:21:1::0;9055:2;9035:18;;;9028:30;9094:34;9074:18;;;9067:62;-1:-1:-1;;;9145:18:1;;;9138:36;9191:19;;30784:73:0::1;8814:402:1::0;30784:73:0::1;30862:28;30881:8;30862:18;:28::i;53755:100::-:0;53832:5;;53811:7;;53832:17;;53842:6;53832:9;:17::i;40608:127::-;40689:40;40699:2;40703:8;40713:11;40689:40;;;;;;;;;;;;:9;:40::i;40467:133::-;40524:4;40561:7;33668:1;40542:26;;:52;;;;-1:-1:-1;;40582:12:0;;-1:-1:-1;40572:22:0;40467:133::o;44059:162::-;44148:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44148:29:0;-1:-1:-1;;;;;44148:29:0;;;;;;;;;44187:28;;44148:24;;44187:28;;;;;;;44059:162;;;:::o;42520:1439::-;42609:35;42647:20;42659:7;42647:11;:20::i;:::-;42718:18;;42609:58;;-1:-1:-1;42676:22:0;;-1:-1:-1;;;;;42702:34:0;28648:10;-1:-1:-1;;;;;42702:34:0;;:77;;;-1:-1:-1;28648:10:0;42743:20;42755:7;42743:11;:20::i;:::-;-1:-1:-1;;;;;42743:36:0;;42702:77;:134;;;-1:-1:-1;42803:18:0;;42786:50;;28648:10;39305:174;:::i;42786:50::-;42676:161;;42858:17;42846:91;;;;-1:-1:-1;;;42846:91:0;;13719:2:1;42846:91:0;;;13701:21:1;13758:2;13738:18;;;13731:30;13797:34;13777:18;;;13770:62;-1:-1:-1;;;13848:18:1;;;13841:48;13906:19;;42846:91:0;13517:414:1;42846:91:0;42980:4;-1:-1:-1;;;;;42958:26:0;:13;:18;;;-1:-1:-1;;;;;42958:26:0;;42946:88;;;;-1:-1:-1;;;42946:88:0;;12191:2:1;42946:88:0;;;12173:21:1;12230:2;12210:18;;;12203:30;12269:34;12249:18;;;12242:62;-1:-1:-1;;;12320:18:1;;;12313:36;12366:19;;42946:88:0;11989:402:1;42946:88:0;-1:-1:-1;;;;;43047:16:0;;43039:66;;;;-1:-1:-1;;;43039:66:0;;10182:2:1;43039:66:0;;;10164:21:1;10221:2;10201:18;;;10194:30;10260:34;10240:18;;;10233:62;-1:-1:-1;;;10311:18:1;;;10304:35;10356:19;;43039:66:0;9980:401:1;43039:66:0;43212:49;43229:1;43233:7;43242:13;:18;;;43212:8;:49::i;:::-;-1:-1:-1;;;;;43270:18:0;;;;;;:12;:18;;;;;:31;;43300:1;;43270:18;:31;;43300:1;;-1:-1:-1;;;;;43270:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;43270:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43306:16:0;;-1:-1:-1;43306:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;43306:16:0;;:29;;-1:-1:-1;;43306:29:0;;:::i;:::-;;;-1:-1:-1;;;;;43306:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43363:43:0;;;;;;;;-1:-1:-1;;;;;43363:43:0;;;;;;43389:15;43363:43;;;;;;;;;-1:-1:-1;43340:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;43340:66:0;-1:-1:-1;;;;;;43340:66:0;;;;;;;;;;;43652:11;43352:7;-1:-1:-1;43652:11:0;:::i;:::-;43713:1;43672:24;;;:11;:24;;;;;:29;43630:33;;-1:-1:-1;;;;;;43672:29:0;43668:198;;43726:20;43734:11;43726:7;:20::i;:::-;43722:139;;;43780:75;;;;;;;;43799:18;;-1:-1:-1;;;;;43780:75:0;;;;;;43822:28;;;;43780:75;;;;;;;;;;-1:-1:-1;43753:24:0;;;:11;:24;;;;;;;:102;;;;;;;;;-1:-1:-1;;;43753:102:0;-1:-1:-1;;;;;;43753:102:0;;;;;;;;;;;;43722:139;43898:7;43894:2;-1:-1:-1;;;;;43879:27:0;43888:4;-1:-1:-1;;;;;43879:27:0;;;;;;;;;;;42604:1355;;;42520:1439;;;:::o;36367:747::-;-1:-1:-1;;;;;;;;;;;;;;;;;36483:7:0;;33668:1;36518:23;;:46;;;;;36552:12;;36545:4;:19;36518:46;36514:524;;;36571:31;36605:17;;;:11;:17;;;;;;;;;36571:51;;;;;;;;;-1:-1:-1;;;;;36571:51:0;;;;;-1:-1:-1;;;36571:51:0;;;;;;;;;;;;36631:28;36627:61;;36673:9;36367:747;-1:-1:-1;;;36367:747:0:o;36627:61::-;-1:-1:-1;;;36922:6:0;36945:17;;;;:11;:17;;;;;;;;;36933:29;;;;;;;;;-1:-1:-1;;;;;36933:29:0;;;;;-1:-1:-1;;;36933:29:0;;;;;;;;;;;;36971:28;36967:61;;37013:9;36367:747;-1:-1:-1;;;36367:747:0:o;36967:61::-;36904:129;;36514:524;37051:57;;-1:-1:-1;;;37051:57:0;;18075:2:1;37051:57:0;;;18057:21:1;18114:2;18094:18;;;18087:30;18153:34;18133:18;;;18126:62;-1:-1:-1;;;18204:18:1;;;18197:45;18259:19;;37051:57:0;17873:411:1;31043:171:0;31111:16;31130:6;;-1:-1:-1;;;;;31141:17:0;;;-1:-1:-1;;;;;;31141:17:0;;;;;;31168:40;;31130:6;;;;;;;31168:40;;31111:16;31168:40;31106:108;31043:171;:::o;48349:222::-;48404:21;48386:15;48434:132;48452:19;;48448:1;:23;48434:132;;;48484:76;48499:16;48516:1;48499:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48499:19:0;48552:3;48534:11;48546:1;48534:14;;;;;;;;:::i;:::-;;;;;;;;;48524:7;:24;;;;:::i;:::-;48523:32;;;;:::i;:::-;48484:10;:76::i;:::-;48473:3;;;;:::i;:::-;;;;48434:132;;45767:592;45896:4;-1:-1:-1;;;;;45911:13:0;;7798:19;:23;45907:447;;45940:72;;-1:-1:-1;;;45940:72:0;;-1:-1:-1;;;;;45940:36:0;;;;;:72;;28648:10;;45991:4;;45997:7;;46006:5;;45940:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45940:72:0;;;;;;;;-1:-1:-1;;45940:72:0;;;;;;;;;;;;:::i;:::-;;;45933:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46151:13:0;;46147:169;;46176:61;;-1:-1:-1;;;46176:61:0;;;;;;;:::i;46147:169::-;46298:6;46292:13;46283:6;46279:2;46275:15;46268:38;45933:388;-1:-1:-1;;;;;;46052:55:0;-1:-1:-1;;;46052:55:0;;-1:-1:-1;46045:62:0;;45907:447;-1:-1:-1;46344:4:0;45907:447;45767:592;;;;;;:::o;23719:591::-;23775:13;23980:10;23976:37;;-1:-1:-1;;23997:10:0;;;;;;;;;;;;-1:-1:-1;;;23997:10:0;;;;;23719:591::o;23976:37::-;24032:5;24017:12;24061:52;24068:9;;24061:52;;24084:8;;;;:::i;:::-;;-1:-1:-1;24097:10:0;;-1:-1:-1;24105:2:0;24097:10;;:::i;:::-;;;24061:52;;;24117:19;24149:6;24139:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24139:17:0;;24117:39;;24161:118;24168:10;;24161:118;;24185:11;24195:1;24185:11;;:::i;:::-;;-1:-1:-1;24244:10:0;24252:2;24244:5;:10;:::i;:::-;24231:24;;:2;:24;:::i;:::-;24218:39;;24201:6;24208;24201:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24201:56:0;;;;;;;;-1:-1:-1;24262:11:0;24271:2;24262:11;;:::i;:::-;;;24161:118;;2649:90;2707:7;2728:5;2732:1;2728;:5;:::i;3309:90::-;3367:7;3388:5;3392:1;3388;:5;:::i;41056:1251::-;41197:12;;-1:-1:-1;;;;;41222:16:0;;41214:62;;;;-1:-1:-1;;;41214:62:0;;15664:2:1;41214:62:0;;;15646:21:1;15703:2;15683:18;;;15676:30;15742:34;15722:18;;;15715:62;-1:-1:-1;;;15793:18:1;;;15786:31;15834:19;;41214:62:0;15462:397:1;41214:62:0;41409:21;41417:12;41409:7;:21::i;:::-;41408:22;41400:64;;;;-1:-1:-1;;;41400:64:0;;15306:2:1;41400:64:0;;;15288:21:1;15345:2;15325:18;;;15318:30;15384:31;15364:18;;;15357:59;15433:18;;41400:64:0;15104:353:1;41400:64:0;41489:12;;41477:8;:24;;41469:71;;;;-1:-1:-1;;;41469:71:0;;18905:2:1;41469:71:0;;;18887:21:1;18944:2;18924:18;;;18917:30;18983:34;18963:18;;;18956:62;-1:-1:-1;;;19034:18:1;;;19027:32;19076:19;;41469:71:0;18703:398:1;41469:71:0;-1:-1:-1;;;;;41652:16:0;;41619:30;41652:16;;;:12;:16;;;;;;;;;41619:49;;;;;;;;;-1:-1:-1;;;;;41619:49:0;;;;;-1:-1:-1;;;41619:49:0;;;;;;;;;;;41692:129;;;;;;;;41708:19;;41619:49;;41692:129;;;41708:39;;41738:8;;41708:39;:::i;:::-;-1:-1:-1;;;;;41692:129:0;;;;;41780:11;:35;;41806:8;41780:35;;;41794:1;41780:35;41752:11;:24;;;:64;;;;:::i;:::-;-1:-1:-1;;;;;41692:129:0;;;;;;-1:-1:-1;;;;;41673:16:0;;;;;;;:12;:16;;;;;;;;:148;;;;;;;;-1:-1:-1;;;41673:148:0;;;;;;;;;;;;41854:43;;;;;;;;;;;41880:15;41854:43;;;;;;;;41826:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;41826:71:0;-1:-1:-1;;;;;;41826:71:0;;;;;;;;;;;;;;;;;;41838:12;;41950:251;41974:8;41970:1;:12;41950:251;;;41999:38;;42024:12;;-1:-1:-1;;;;;41999:38:0;;;42016:1;;41999:38;;42016:1;;41999:38;42054:59;42085:1;42089:2;42093:12;42107:5;42054:22;:59::i;:::-;42042:134;;;;-1:-1:-1;;;42042:134:0;;;;;;;:::i;:::-;42181:14;;;;:::i;:::-;;;;41984:3;;;;;:::i;:::-;;;;41950:251;;;-1:-1:-1;42209:12:0;:27;-1:-1:-1;;;;;;41056:1251:0:o;48579:167::-;48648:12;48666:8;-1:-1:-1;;;;;48666:13:0;48687:7;48666:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48647:52;;;48712:7;48704:36;;;;-1:-1:-1;;;48704:36:0;;14541:2:1;48704:36:0;;;14523:21:1;14580:2;14560:18;;;14553:30;-1:-1:-1;;;14599:18:1;;;14592:46;14655:18;;48704:36:0;14339:340:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:980::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:2;1262:38;1296:2;1285:9;1281:18;1262:38;:::i;:::-;1252:48;;1347:2;1336:9;1332:18;1319:32;1309:42;;1402:2;1391:9;1387:18;1374:32;1425:18;1466:2;1458:6;1455:14;1452:34;;;1482:1;1479;1472:12;1452:34;1520:6;1509:9;1505:22;1495:32;;1565:7;1558:4;1554:2;1550:13;1546:27;1536:55;;1587:1;1584;1577:12;1536:55;1623:2;1610:16;1645:2;1641;1638:10;1635:36;;;1651:18;;:::i;:::-;1693:53;1736:2;1717:13;;-1:-1:-1;;1713:27:1;1709:36;;1693:53;:::i;:::-;1680:66;;1769:2;1762:5;1755:17;1809:7;1804:2;1799;1795;1791:11;1787:20;1784:33;1781:53;;;1830:1;1827;1820:12;1781:53;1885:2;1880;1876;1872:11;1867:2;1860:5;1856:14;1843:45;1929:1;1924:2;1919;1912:5;1908:14;1904:23;1897:34;;1950:5;1940:15;;;;;981:980;;;;;;;:::o;1966:315::-;2031:6;2039;2092:2;2080:9;2071:7;2067:23;2063:32;2060:52;;;2108:1;2105;2098:12;2060:52;2131:29;2150:9;2131:29;:::i;:::-;2121:39;;2210:2;2199:9;2195:18;2182:32;2223:28;2245:5;2223:28;:::i;:::-;2270:5;2260:15;;;1966:315;;;;;:::o;2286:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;2530:2;2515:18;;;;2502:32;;-1:-1:-1;;;2286:254:1:o;2545:1033::-;2638:6;2646;2699:2;2687:9;2678:7;2674:23;2670:32;2667:52;;;2715:1;2712;2705:12;2667:52;2755:9;2742:23;2784:18;2825:2;2817:6;2814:14;2811:34;;;2841:1;2838;2831:12;2811:34;2879:6;2868:9;2864:22;2854:32;;2924:7;2917:4;2913:2;2909:13;2905:27;2895:55;;2946:1;2943;2936:12;2895:55;2982:2;2969:16;3004:4;3027:2;3023;3020:10;3017:36;;;3033:18;;:::i;:::-;3079:2;3076:1;3072:10;3062:20;;3102:28;3126:2;3122;3118:11;3102:28;:::i;:::-;3164:15;;;3195:12;;;;3227:11;;;3257;;;3253:20;;3250:33;-1:-1:-1;3247:53:1;;;3296:1;3293;3286:12;3247:53;3318:1;3309:10;;3328:169;3342:2;3339:1;3336:9;3328:169;;;3399:23;3418:3;3399:23;:::i;:::-;3387:36;;3360:1;3353:9;;;;;3443:12;;;;3475;;3328:169;;;-1:-1:-1;3516:5:1;3553:18;;;;3540:32;;-1:-1:-1;;;;;;;2545:1033:1:o;3583:245::-;3650:6;3703:2;3691:9;3682:7;3678:23;3674:32;3671:52;;;3719:1;3716;3709:12;3671:52;3751:9;3745:16;3770:28;3792:5;3770:28;:::i;3833:245::-;3891:6;3944:2;3932:9;3923:7;3919:23;3915:32;3912:52;;;3960:1;3957;3950:12;3912:52;3999:9;3986:23;4018:30;4042:5;4018:30;:::i;4083:249::-;4152:6;4205:2;4193:9;4184:7;4180:23;4176:32;4173:52;;;4221:1;4218;4211:12;4173:52;4253:9;4247:16;4272:30;4296:5;4272:30;:::i;4337:592::-;4408:6;4416;4469:2;4457:9;4448:7;4444:23;4440:32;4437:52;;;4485:1;4482;4475:12;4437:52;4525:9;4512:23;4554:18;4595:2;4587:6;4584:14;4581:34;;;4611:1;4608;4601:12;4581:34;4649:6;4638:9;4634:22;4624:32;;4694:7;4687:4;4683:2;4679:13;4675:27;4665:55;;4716:1;4713;4706:12;4665:55;4756:2;4743:16;4782:2;4774:6;4771:14;4768:34;;;4798:1;4795;4788:12;4768:34;4843:7;4838:2;4829:6;4825:2;4821:15;4817:24;4814:37;4811:57;;;4864:1;4861;4854:12;4811:57;4895:2;4887:11;;;;;4917:6;;-1:-1:-1;4337:592:1;;-1:-1:-1;;;;4337:592:1:o;4934:180::-;4993:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:52;;;5062:1;5059;5052:12;5014:52;-1:-1:-1;5085:23:1;;4934:180;-1:-1:-1;4934:180:1:o;5119:184::-;5189:6;5242:2;5230:9;5221:7;5217:23;5213:32;5210:52;;;5258:1;5255;5248:12;5210:52;-1:-1:-1;5281:16:1;;5119:184;-1:-1:-1;5119:184:1:o;5308:257::-;5349:3;5387:5;5381:12;5414:6;5409:3;5402:19;5430:63;5486:6;5479:4;5474:3;5470:14;5463:4;5456:5;5452:16;5430:63;:::i;:::-;5547:2;5526:15;-1:-1:-1;;5522:29:1;5513:39;;;;5554:4;5509:50;;5308:257;-1:-1:-1;;5308:257:1:o;5570:470::-;5749:3;5787:6;5781:13;5803:53;5849:6;5844:3;5837:4;5829:6;5825:17;5803:53;:::i;:::-;5919:13;;5878:16;;;;5941:57;5919:13;5878:16;5975:4;5963:17;;5941:57;:::i;:::-;6014:20;;5570:470;-1:-1:-1;;;;5570:470:1:o;6463:488::-;-1:-1:-1;;;;;6732:15:1;;;6714:34;;6784:15;;6779:2;6764:18;;6757:43;6831:2;6816:18;;6809:34;;;6879:3;6874:2;6859:18;;6852:31;;;6657:4;;6900:45;;6925:19;;6917:6;6900:45;:::i;:::-;6892:53;6463:488;-1:-1:-1;;;;;;6463:488:1:o;7427:219::-;7576:2;7565:9;7558:21;7539:4;7596:44;7636:2;7625:9;7621:18;7613:6;7596:44;:::i;12396:356::-;12598:2;12580:21;;;12617:18;;;12610:30;12676:34;12671:2;12656:18;;12649:62;12743:2;12728:18;;12396:356::o;12757:400::-;12959:2;12941:21;;;12998:2;12978:18;;;12971:30;13037:34;13032:2;13017:18;;13010:62;-1:-1:-1;;;13103:2:1;13088:18;;13081:34;13147:3;13132:19;;12757:400::o;14684:415::-;14886:2;14868:21;;;14925:2;14905:18;;;14898:30;14964:34;14959:2;14944:18;;14937:62;-1:-1:-1;;;15030:2:1;15015:18;;15008:49;15089:3;15074:19;;14684:415::o;16273:410::-;16475:2;16457:21;;;16514:2;16494:18;;;16487:30;16553:34;16548:2;16533:18;;16526:62;-1:-1:-1;;;16619:2:1;16604:18;;16597:44;16673:3;16658:19;;16273:410::o;17103:354::-;17305:2;17287:21;;;17344:2;17324:18;;;17317:30;17383:32;17378:2;17363:18;;17356:60;17448:2;17433:18;;17103:354::o;19844:275::-;19915:2;19909:9;19980:2;19961:13;;-1:-1:-1;;19957:27:1;19945:40;;20015:18;20000:34;;20036:22;;;19997:62;19994:88;;;20062:18;;:::i;:::-;20098:2;20091:22;19844:275;;-1:-1:-1;19844:275:1:o;20124:253::-;20164:3;-1:-1:-1;;;;;20253:2:1;20250:1;20246:10;20283:2;20280:1;20276:10;20314:3;20310:2;20306:12;20301:3;20298:21;20295:47;;;20322:18;;:::i;20382:128::-;20422:3;20453:1;20449:6;20446:1;20443:13;20440:39;;;20459:18;;:::i;:::-;-1:-1:-1;20495:9:1;;20382:128::o;20515:120::-;20555:1;20581;20571:35;;20586:18;;:::i;:::-;-1:-1:-1;20620:9:1;;20515:120::o;20640:168::-;20680:7;20746:1;20742;20738:6;20734:14;20731:1;20728:21;20723:1;20716:9;20709:17;20705:45;20702:71;;;20753:18;;:::i;:::-;-1:-1:-1;20793:9:1;;20640:168::o;20813:246::-;20853:4;-1:-1:-1;;;;;20966:10:1;;;;20936;;20988:12;;;20985:38;;;21003:18;;:::i;:::-;21040:13;;20813:246;-1:-1:-1;;;20813:246:1:o;21064:125::-;21104:4;21132:1;21129;21126:8;21123:34;;;21137:18;;:::i;:::-;-1:-1:-1;21174:9:1;;21064:125::o;21194:258::-;21266:1;21276:113;21290:6;21287:1;21284:13;21276:113;;;21366:11;;;21360:18;21347:11;;;21340:39;21312:2;21305:10;21276:113;;;21407:6;21404:1;21401:13;21398:48;;;-1:-1:-1;;21442:1:1;21424:16;;21417:27;21194:258::o;21457:380::-;21536:1;21532:12;;;;21579;;;21600:61;;21654:4;21646:6;21642:17;21632:27;;21600:61;21707:2;21699:6;21696:14;21676:18;21673:38;21670:161;;;21753:10;21748:3;21744:20;21741:1;21734:31;21788:4;21785:1;21778:15;21816:4;21813:1;21806:15;21670:161;;21457:380;;;:::o;21842:135::-;21881:3;-1:-1:-1;;21902:17:1;;21899:43;;;21922:18;;:::i;:::-;-1:-1:-1;21969:1:1;21958:13;;21842:135::o;21982:112::-;22014:1;22040;22030:35;;22045:18;;:::i;:::-;-1:-1:-1;22079:9:1;;21982:112::o;22099:127::-;22160:10;22155:3;22151:20;22148:1;22141:31;22191:4;22188:1;22181:15;22215:4;22212:1;22205:15;22231:127;22292:10;22287:3;22283:20;22280:1;22273:31;22323:4;22320:1;22313:15;22347:4;22344:1;22337:15;22363:127;22424:10;22419:3;22415:20;22412:1;22405:31;22455:4;22452:1;22445:15;22479:4;22476:1;22469:15;22495:127;22556:10;22551:3;22547:20;22544:1;22537:31;22587:4;22584:1;22577:15;22611:4;22608:1;22601:15;22627:118;22713:5;22706:13;22699:21;22692:5;22689:32;22679:60;;22735:1;22732;22725:12;22750:131;-1:-1:-1;;;;;;22824:32:1;;22814:43;;22804:71;;22871:1;22868;22861:12
Swarm Source
ipfs://a540f2ca5cf53f20747e7b3236768dac46e85e290eb92effc671eb297e1eea68
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.