ERC-721
Overview
Max Total Supply
4,444 DSB
Holders
1,771
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 DSBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DEGENSPACEBOMBS
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-10 */ // SPDX-License-Identifier: GPL-3.0 /* ###### ######## ### ###### ######## ######## ####### ## ## ######## ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ### ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### #### ## ## ## ###### ######## ## ## ## ###### ######## ## ## ## ### ## ######## ###### ## ## ######### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ###### ######## ######## ####### ## ## ######## ###### */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } 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; _; _status = _NOT_ENTERED; } } // 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"; function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; 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 pragma solidity ^0.8.0; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // 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 { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } 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"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } 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"); } 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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; interface IERC721Receiver { 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 { 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; 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 (last updated v4.6.0) (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); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; function safeTransferFrom( address from, address to, uint256 tokenId ) external; function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // 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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata 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 that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // 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) internal _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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { 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 OwnerQueryForNonexistentToken(); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = 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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @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); } function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/DegenSpaceBombs.sol pragma solidity >= 0.8.0 < 0.9.0; contract DEGENSPACEBOMBS is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; address public signerAddress; address public parentAddress; string public uriPrefix; string public uriSuffix = ".json"; uint256 public cost = 0 ether; uint256 public maxSupply = 4444; uint256 public MaxperTx = 2; uint256 public nftPerAddressLimit = 2; uint256 public HoldersMaxperTx = 5; uint256 public HoldersNftPerAddressLimit = 5; bool public pause = false; mapping(address => uint256) public addressMintedBalance; constructor() ERC721A ( "DEGENSPACEBOMBS", "DSB" ) { setParentAddress(0x0fBE8351825c588d69a04a7791316eaC4c49f8A4); } // ~~~~~~~~~~~~~~~~~~~~ URI's ~~~~~~~~~~~~~~~~~~~~ function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } // ~~~~~~~~~~~~~~~~~~~~ Modifiers ~~~~~~~~~~~~~~~~~~~~ modifier mintCompliance(uint256 _quantity) { if (msg.sender != owner()) { require(!pause, "DEGENSPACEBOMBS : The contract is paused!"); } require(_quantity > 0, "DEGENSPACEBOMBS : Mint amount can't be zero."); require(tx.origin == msg.sender, "DEGENSPACEBOMBS : The caller is another contract"); require(totalSupply() + _quantity <= maxSupply, "DEGENSPACEBOMBS : Beyond Max Supply"); _; } // ~~~~~~~~~~~~~~~~~~~~ Mint Functions ~~~~~~~~~~~~~~~~~~~~ // MINT PHASE function mint(uint256 _quantity, bytes memory sig) public payable mintCompliance(_quantity) { ERC721A token = ERC721A(parentAddress); uint256 addressbalance = token.balanceOf(msg.sender); if (addressbalance == 0) { require(isValidData(msg.sender, sig) == true, "DEGENSPACEBOMBS : User is not whitelisted!."); require(_quantity <= MaxperTx, "DEGENSPACEBOMBS : Max of 2 mints for non-holders."); require(addressMintedBalance[msg.sender] + _quantity <= nftPerAddressLimit, "DEGENSPACEBOMBS : Max amount per address exceeded!"); } if (addressbalance > 0) { require(_quantity <= HoldersMaxperTx, "DEGENSPACEBOMBS : Max mint per transaction exceeded!"); require(addressMintedBalance[msg.sender] + _quantity <= HoldersNftPerAddressLimit, "DEGENSPACEBOMBS : Max amount per address exceeded!"); } require(msg.value >= cost * _quantity, "DEGENSPACEBOMBS : Insufficient funds!"); addressMintedBalance[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } // MINT for address function mintToAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxSupply, "DEGENSPACEBOMBS : Mint amount exceeds max supply!"); _safeMint(_receiver, _mintAmount); } // ~~~~~~~~~~~~~~~~~~~~ SIGNATURES ~~~~~~~~~~~~~~~~~~~~ function isValidData(address _user, bytes memory sig) public view returns (bool) { bytes32 message = keccak256(abi.encodePacked(_user)); return (recoverSigner(message, sig) == signerAddress); } function recoverSigner(bytes32 message, bytes memory sig) public pure returns (address) { uint8 v; bytes32 r; bytes32 s; (v, r, s) = splitSignature(sig); return ecrecover(message, v, r, s); } function splitSignature(bytes memory sig) public pure returns (uint8, bytes32, bytes32) { require(sig.length == 65); bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } return (v, r, s); } // ~~~~~~~~~~~~~~~~~~~~ Checks ~~~~~~~~~~~~~~~~~~~~ // Check Wallet assets function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = _startTokenId(); uint256 ownedTokenIndex = 0; address latestOwnerAddress; while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) { TokenOwnership memory ownership = _ownershipOf(currentTokenId); if (!ownership.burned) { if (ownership.addr != address(0)) { latestOwnerAddress = ownership.addr; } if (latestOwnerAddress == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } } currentTokenId++; } return ownedTokenIds; } // Start Token function _startTokenId() internal view virtual override returns (uint256) { return 1; } // TOKEN URI => If you are reading this you are awesome!! function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token."); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } // ~~~~~~~~~~~~~~~~~~~~ onlyOwner Functions ~~~~~~~~~~~~~~~~~~~~ // SIGNER ADDRESS function setSigner(address _newSigner) public onlyOwner { signerAddress = _newSigner; } // SET PARENT ADDRESS function setParentAddress(address _Address) public onlyOwner { parentAddress = _Address; } // SET COST function setCost(uint256 _cost) public onlyOwner { cost = _cost; } // SET MAX SUPPLY function setMaxSupply(uint256 _MaxSupply) public onlyOwner { maxSupply = _MaxSupply; } // SET MAX PER TRX function setMaxperTx(uint256 _maxMintperTx) public onlyOwner { MaxperTx = _maxMintperTx; } // SET MAX PER ADDRESS LIMIT function setMaxPerAddLimit(uint256 _maxPerAddLimit) public onlyOwner { nftPerAddressLimit = _maxPerAddLimit; } // BaseURI function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } // SET PAUSE STATE function setPause(bool _state) public onlyOwner { pause = _state; } function withdraw() external onlyOwner nonReentrant { (bool success, ) = payable(owner()).call{value: address(this).balance}(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"HoldersMaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HoldersNftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"isValidData","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerAddLimit","type":"uint256"}],"name":"setMaxPerAddLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintperTx","type":"uint256"}],"name":"setMaxperTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Address","type":"address"}],"name":"setParentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"_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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526005608081905264173539b7b760d91b60a09081526200002891600d9190620001d8565b506000600e5561115c600f5560026010819055601155600560128190556013556014805460ff191690553480156200005f57600080fd5b50604080518082018252600f81526e444547454e5350414345424f4d425360881b6020808301918252835180850190945260038452622229a160e91b908401528151919291620000b291600291620001d8565b508051620000c8906003906020840190620001d8565b5050600160005550620000db3362000105565b6001600955620000ff730fbe8351825c588d69a04a7791316eac4c49f8a462000157565b620002bb565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620001b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b828054620001e6906200027e565b90600052602060002090601f0160209004810192826200020a576000855562000255565b82601f106200022557805160ff191683800117855562000255565b8280016001018555821562000255579182015b828111156200025557825182559160200191906001019062000238565b506200026392915062000267565b5090565b5b8082111562000263576000815560010162000268565b600181811c908216806200029357607f821691505b60208210811415620002b557634e487b7160e01b600052602260045260246000fd5b50919050565b61278280620002cb6000396000f3fe6080604052600436106102665760003560e01c80636f8b44b011610144578063b88d4fde116100b6578063d5abeb011161007a578063d5abeb0114610739578063db7fd4081461074f578063e985e9c514610762578063f2fde38b146107ab578063fa5afe40146107cb578063ff645691146107eb57600080fd5b8063b88d4fde146106ad578063ba7d2c76146106cd578063bedb86fb146106e3578063c87b56dd14610703578063ce2d7cf31461072357600080fd5b80638da5cb5b116101085780638da5cb5b146105db57806395d89b41146105f957806397aba7f91461060e578063a22cb4651461062e578063a7bb58031461064e578063b0940d451461068d57600080fd5b80636f8b44b01461054c57806370a082311461056c578063715018a61461058c5780637ec4a659146105a15780638456cb59146105c157600080fd5b806342842e0e116101dd5780635503a0e8116101a15780635503a0e8146104a25780635b7633d0146104b75780635ef9ff37146104d757806362b99ad4146104f75780636352211e1461050c5780636c19e7831461052c57600080fd5b806342842e0e146103f5578063438b63001461041557806344a0d68a14610442578063489f2bcd14610462578063512b658d1461048257600080fd5b806313faede61161022f57806313faede61461033c57806318160ddd1461036057806318cae2691461037d578063216a98d8146103aa57806323b872dd146103c05780633ccfd60b146103e057600080fd5b8062821de31461026b57806301ffc9a7146102a857806306fdde03146102d8578063081812fc146102fa578063095ea7b31461031a575b600080fd5b34801561027757600080fd5b50600b5461028b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b457600080fd5b506102c86102c33660046122d0565b610801565b604051901515815260200161029f565b3480156102e457600080fd5b506102ed610853565b60405161029f919061254c565b34801561030657600080fd5b5061028b610315366004612386565b6108e5565b34801561032657600080fd5b5061033a61033536600461225b565b610929565b005b34801561034857600080fd5b50610352600e5481565b60405190815260200161029f565b34801561036c57600080fd5b506001546000540360001901610352565b34801561038957600080fd5b506103526103983660046120f3565b60156020526000908152604090205481565b3480156103b657600080fd5b5061035260125481565b3480156103cc57600080fd5b5061033a6103db366004612141565b6109b0565b3480156103ec57600080fd5b5061033a6109bb565b34801561040157600080fd5b5061033a610410366004612141565b610abf565b34801561042157600080fd5b506104356104303660046120f3565b610ada565b60405161029f9190612508565b34801561044e57600080fd5b5061033a61045d366004612386565b610bd9565b34801561046e57600080fd5b5061033a61047d366004612386565b610c08565b34801561048e57600080fd5b5061033a61049d3660046123b8565b610c37565b3480156104ae57600080fd5b506102ed610cf2565b3480156104c357600080fd5b50600a5461028b906001600160a01b031681565b3480156104e357600080fd5b5061033a6104f2366004612386565b610d80565b34801561050357600080fd5b506102ed610daf565b34801561051857600080fd5b5061028b610527366004612386565b610dbc565b34801561053857600080fd5b5061033a6105473660046120f3565b610dce565b34801561055857600080fd5b5061033a610567366004612386565b610e1a565b34801561057857600080fd5b506103526105873660046120f3565b610e49565b34801561059857600080fd5b5061033a610e97565b3480156105ad57600080fd5b5061033a6105bc36600461233e565b610ecd565b3480156105cd57600080fd5b506014546102c89060ff1681565b3480156105e757600080fd5b506008546001600160a01b031661028b565b34801561060557600080fd5b506102ed610f0a565b34801561061a57600080fd5b5061028b6106293660046122a0565b610f19565b34801561063a57600080fd5b5061033a6106493660046121e4565b610f98565b34801561065a57600080fd5b5061066e61066936600461230a565b61102e565b6040805160ff909416845260208401929092529082015260600161029f565b34801561069957600080fd5b506102c86106a836600461220e565b61105d565b3480156106b957600080fd5b5061033a6106c836600461217d565b6110c4565b3480156106d957600080fd5b5061035260115481565b3480156106ef57600080fd5b5061033a6106fe366004612285565b61110e565b34801561070f57600080fd5b506102ed61071e366004612386565b61114b565b34801561072f57600080fd5b5061035260135481565b34801561074557600080fd5b50610352600f5481565b61033a61075d3660046122a0565b61121a565b34801561076e57600080fd5b506102c861077d36600461210e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107b757600080fd5b5061033a6107c63660046120f3565b6116dc565b3480156107d757600080fd5b5061033a6107e63660046120f3565b611777565b3480156107f757600080fd5b5061035260105481565b60006001600160e01b031982166380ac58cd60e01b148061083257506001600160e01b03198216635b5e139f60e01b145b8061084d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461086290612674565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612674565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b60006108f0826117c3565b61090d576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061093482610dbc565b9050806001600160a01b0316836001600160a01b031614156109695760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146109a057610983813361077d565b6109a0576040516367d9dca160e11b815260040160405180910390fd5b6109ab8383836117fc565b505050565b6109ab838383611858565b6008546001600160a01b031633146109ee5760405162461bcd60e51b81526004016109e5906125b1565b60405180910390fd5b60026009541415610a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109e5565b60026009556000610a5a6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610aa4576040519150601f19603f3d011682016040523d82523d6000602084013e610aa9565b606091505b5050905080610ab757600080fd5b506001600955565b6109ab838383604051806020016040528060008152506110c4565b60606000610ae783610e49565b90506000816001600160401b03811115610b0357610b03612720565b604051908082528060200260200182016040528015610b2c578160200160208202803683370190505b50905060016000805b8482108015610b45575060005483105b15610bce576000610b5584611a43565b90508060400151610bbb5780516001600160a01b031615610b7557805191505b876001600160a01b0316826001600160a01b03161415610bbb5783858481518110610ba257610ba261270a565b602090810291909101015282610bb7816126af565b9350505b83610bc5816126af565b94505050610b35565b509195945050505050565b6008546001600160a01b03163314610c035760405162461bcd60e51b81526004016109e5906125b1565b600e55565b6008546001600160a01b03163314610c325760405162461bcd60e51b81526004016109e5906125b1565b601155565b6008546001600160a01b03163314610c615760405162461bcd60e51b81526004016109e5906125b1565b600f546001546000548491900360001901610c7c91906125e6565b1115610ce45760405162461bcd60e51b815260206004820152603160248201527f444547454e5350414345424f4d4253203a204d696e7420616d6f756e742065786044820152706365656473206d617820737570706c792160781b60648201526084016109e5565b610cee8183611b65565b5050565b600d8054610cff90612674565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b90612674565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b505050505081565b6008546001600160a01b03163314610daa5760405162461bcd60e51b81526004016109e5906125b1565b601055565b600c8054610cff90612674565b6000610dc782611a43565b5192915050565b6008546001600160a01b03163314610df85760405162461bcd60e51b81526004016109e5906125b1565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610e445760405162461bcd60e51b81526004016109e5906125b1565b600f55565b60006001600160a01b038216610e72576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610ec15760405162461bcd60e51b81526004016109e5906125b1565b610ecb6000611b7f565b565b6008546001600160a01b03163314610ef75760405162461bcd60e51b81526004016109e5906125b1565b8051610cee90600c906020840190611f99565b60606003805461086290612674565b600080600080610f288561102e565b6040805160008152602081018083528b905260ff8516918101919091526060810183905260808101829052929550909350915060019060a0016020604051602081039080840390855afa158015610f83573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6001600160a01b038216331415610fc25760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000806000835160411461104157600080fd5b5050506020810151604082015160609092015160001a92909190565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160408051601f198184030181529190528051602090910120600a549091506001600160a01b03166110b28285610f19565b6001600160a01b031614949350505050565b6110cf848484611858565b6001600160a01b0383163b15611108576110eb84848484611bd1565b611108576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146111385760405162461bcd60e51b81526004016109e5906125b1565b6014805460ff1916911515919091179055565b6060611156826117c3565b6111bb5760405162461bcd60e51b815260206004820152603060248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526f3732bc34b9ba32b73a103a37b5b2b71760811b60648201526084016109e5565b60006111c5611cc9565b905060008151116111e55760405180602001604052806000815250611213565b806111ef84611cd8565b600d60405160200161120393929190612407565b6040516020818303038152906040525b9392505050565b8161122d6008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146112aa5760145460ff16156112aa5760405162461bcd60e51b815260206004820152602960248201527f444547454e5350414345424f4d4253203a2054686520636f6e7472616374206960448201526873207061757365642160b81b60648201526084016109e5565b6000811161130f5760405162461bcd60e51b815260206004820152602c60248201527f444547454e5350414345424f4d4253203a204d696e7420616d6f756e7420636160448201526b3713ba103132903d32b9379760a11b60648201526084016109e5565b3233146113775760405162461bcd60e51b815260206004820152603060248201527f444547454e5350414345424f4d4253203a205468652063616c6c65722069732060448201526f185b9bdd1a195c8818dbdb9d1c9858dd60821b60648201526084016109e5565b600f54600154600054839190036000190161139291906125e6565b11156113ec5760405162461bcd60e51b815260206004820152602360248201527f444547454e5350414345424f4d4253203a204265796f6e64204d617820537570604482015262706c7960e81b60648201526084016109e5565b600b546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561143457600080fd5b505afa158015611448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146c919061239f565b90508061158a5761147d338561105d565b15156001146114e25760405162461bcd60e51b815260206004820152602b60248201527f444547454e5350414345424f4d4253203a2055736572206973206e6f7420776860448201526a34ba32b634b9ba32b2109760a91b60648201526084016109e5565b60105485111561154e5760405162461bcd60e51b815260206004820152603160248201527f444547454e5350414345424f4d4253203a204d6178206f662032206d696e7473604482015270103337b9103737b716b437b63232b9399760791b60648201526084016109e5565b6011543360009081526015602052604090205461156c9087906125e6565b111561158a5760405162461bcd60e51b81526004016109e59061255f565b801561163b576012548511156115ff5760405162461bcd60e51b815260206004820152603460248201527f444547454e5350414345424f4d4253203a204d6178206d696e7420706572207460448201527372616e73616374696f6e2065786365656465642160601b60648201526084016109e5565b6013543360009081526015602052604090205461161d9087906125e6565b111561163b5760405162461bcd60e51b81526004016109e59061255f565b84600e546116499190612612565b3410156116a65760405162461bcd60e51b815260206004820152602560248201527f444547454e5350414345424f4d4253203a20496e73756666696369656e742066604482015264756e64732160d81b60648201526084016109e5565b33600090815260156020526040812080548792906116c59084906125e6565b909155506116d590503386611b65565b5050505050565b6008546001600160a01b031633146117065760405162461bcd60e51b81526004016109e5906125b1565b6001600160a01b03811661176b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e5565b61177481611b7f565b50565b6008546001600160a01b031633146117a15760405162461bcd60e51b81526004016109e5906125b1565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000816001111580156117d7575060005482105b801561084d575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061186382611a43565b9050836001600160a01b031681600001516001600160a01b03161461189a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806118b857506118b8853361077d565b806118d35750336118c8846108e5565b6001600160a01b0316145b9050806118f357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661191a57604051633a954ecd60e21b815260040160405180910390fd5b611926600084876117fc565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166119fa5760005482146119fa57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116d5565b60408051606081018252600080825260208201819052918101919091528180600111611b4c57600054811015611b4c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611b4a5780516001600160a01b031615611ae1579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611b45579392505050565b611ae1565b505b604051636f96cda160e11b815260040160405180910390fd5b610cee828260405180602001604052806000815250611dd5565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611c069033908990889088906004016124cb565b602060405180830381600087803b158015611c2057600080fd5b505af1925050508015611c50575060408051601f3d908101601f19168201909252611c4d918101906122ed565b60015b611cab573d808015611c7e576040519150601f19603f3d011682016040523d82523d6000602084013e611c83565b606091505b508051611ca3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c805461086290612674565b606081611cfc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d265780611d10816126af565b9150611d1f9050600a836125fe565b9150611d00565b6000816001600160401b03811115611d4057611d40612720565b6040519080825280601f01601f191660200182016040528015611d6a576020820181803683370190505b5090505b8415611cc157611d7f600183612631565b9150611d8c600a866126ca565b611d979060306125e6565b60f81b818381518110611dac57611dac61270a565b60200101906001600160f81b031916908160001a905350611dce600a866125fe565b9450611d6e565b6000546001600160a01b038416611dfe57604051622e076360e81b815260040160405180910390fd5b82611e1c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611f44575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f0d6000878480600101955087611bd1565b611f2a576040516368d2bf6b60e11b815260040160405180910390fd5b808210611ec2578260005414611f3f57600080fd5b611f89565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611f45575b5060009081556111089085838684565b828054611fa590612674565b90600052602060002090601f016020900481019282611fc7576000855561200d565b82601f10611fe057805160ff191683800117855561200d565b8280016001018555821561200d579182015b8281111561200d578251825591602001919060010190611ff2565b5061201992915061201d565b5090565b5b80821115612019576000815560010161201e565b60006001600160401b038084111561204c5761204c612720565b604051601f8501601f19908116603f0116810190828211818310171561207457612074612720565b8160405280935085815286868601111561208d57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146120be57600080fd5b919050565b803580151581146120be57600080fd5b600082601f8301126120e457600080fd5b61121383833560208501612032565b60006020828403121561210557600080fd5b611213826120a7565b6000806040838503121561212157600080fd5b61212a836120a7565b9150612138602084016120a7565b90509250929050565b60008060006060848603121561215657600080fd5b61215f846120a7565b925061216d602085016120a7565b9150604084013590509250925092565b6000806000806080858703121561219357600080fd5b61219c856120a7565b93506121aa602086016120a7565b92506040850135915060608501356001600160401b038111156121cc57600080fd5b6121d8878288016120d3565b91505092959194509250565b600080604083850312156121f757600080fd5b612200836120a7565b9150612138602084016120c3565b6000806040838503121561222157600080fd5b61222a836120a7565b915060208301356001600160401b0381111561224557600080fd5b612251858286016120d3565b9150509250929050565b6000806040838503121561226e57600080fd5b612277836120a7565b946020939093013593505050565b60006020828403121561229757600080fd5b611213826120c3565b600080604083850312156122b357600080fd5b8235915060208301356001600160401b0381111561224557600080fd5b6000602082840312156122e257600080fd5b813561121381612736565b6000602082840312156122ff57600080fd5b815161121381612736565b60006020828403121561231c57600080fd5b81356001600160401b0381111561233257600080fd5b611cc1848285016120d3565b60006020828403121561235057600080fd5b81356001600160401b0381111561236657600080fd5b8201601f8101841361237757600080fd5b611cc184823560208401612032565b60006020828403121561239857600080fd5b5035919050565b6000602082840312156123b157600080fd5b5051919050565b600080604083850312156123cb57600080fd5b82359150612138602084016120a7565b600081518084526123f3816020860160208601612648565b601f01601f19169290920160200192915050565b60008451602061241a8285838a01612648565b85519184019161242d8184848a01612648565b8554920191600090600181811c908083168061244a57607f831692505b85831081141561246857634e487b7160e01b85526022600452602485fd5b80801561247c576001811461248d576124ba565b60ff198516885283880195506124ba565b60008b81526020902060005b858110156124b25781548a820152908401908801612499565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124fe908301846123db565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561254057835183529284019291840191600101612524565b50909695505050505050565b60208152600061121360208301846123db565b60208082526032908201527f444547454e5350414345424f4d4253203a204d617820616d6f756e742070657260408201527120616464726573732065786365656465642160701b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156125f9576125f96126de565b500190565b60008261260d5761260d6126f4565b500490565b600081600019048311821515161561262c5761262c6126de565b500290565b600082821015612643576126436126de565b500390565b60005b8381101561266357818101518382015260200161264b565b838111156111085750506000910152565b600181811c9082168061268857607f821691505b602082108114156126a957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126c3576126c36126de565b5060010190565b6000826126d9576126d96126f4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461177457600080fdfea2646970667358221220e1667f0a3c301d83bbadd178ce31522a7a66ffb666809918fcbab8e77e8d90cb64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102665760003560e01c80636f8b44b011610144578063b88d4fde116100b6578063d5abeb011161007a578063d5abeb0114610739578063db7fd4081461074f578063e985e9c514610762578063f2fde38b146107ab578063fa5afe40146107cb578063ff645691146107eb57600080fd5b8063b88d4fde146106ad578063ba7d2c76146106cd578063bedb86fb146106e3578063c87b56dd14610703578063ce2d7cf31461072357600080fd5b80638da5cb5b116101085780638da5cb5b146105db57806395d89b41146105f957806397aba7f91461060e578063a22cb4651461062e578063a7bb58031461064e578063b0940d451461068d57600080fd5b80636f8b44b01461054c57806370a082311461056c578063715018a61461058c5780637ec4a659146105a15780638456cb59146105c157600080fd5b806342842e0e116101dd5780635503a0e8116101a15780635503a0e8146104a25780635b7633d0146104b75780635ef9ff37146104d757806362b99ad4146104f75780636352211e1461050c5780636c19e7831461052c57600080fd5b806342842e0e146103f5578063438b63001461041557806344a0d68a14610442578063489f2bcd14610462578063512b658d1461048257600080fd5b806313faede61161022f57806313faede61461033c57806318160ddd1461036057806318cae2691461037d578063216a98d8146103aa57806323b872dd146103c05780633ccfd60b146103e057600080fd5b8062821de31461026b57806301ffc9a7146102a857806306fdde03146102d8578063081812fc146102fa578063095ea7b31461031a575b600080fd5b34801561027757600080fd5b50600b5461028b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102b457600080fd5b506102c86102c33660046122d0565b610801565b604051901515815260200161029f565b3480156102e457600080fd5b506102ed610853565b60405161029f919061254c565b34801561030657600080fd5b5061028b610315366004612386565b6108e5565b34801561032657600080fd5b5061033a61033536600461225b565b610929565b005b34801561034857600080fd5b50610352600e5481565b60405190815260200161029f565b34801561036c57600080fd5b506001546000540360001901610352565b34801561038957600080fd5b506103526103983660046120f3565b60156020526000908152604090205481565b3480156103b657600080fd5b5061035260125481565b3480156103cc57600080fd5b5061033a6103db366004612141565b6109b0565b3480156103ec57600080fd5b5061033a6109bb565b34801561040157600080fd5b5061033a610410366004612141565b610abf565b34801561042157600080fd5b506104356104303660046120f3565b610ada565b60405161029f9190612508565b34801561044e57600080fd5b5061033a61045d366004612386565b610bd9565b34801561046e57600080fd5b5061033a61047d366004612386565b610c08565b34801561048e57600080fd5b5061033a61049d3660046123b8565b610c37565b3480156104ae57600080fd5b506102ed610cf2565b3480156104c357600080fd5b50600a5461028b906001600160a01b031681565b3480156104e357600080fd5b5061033a6104f2366004612386565b610d80565b34801561050357600080fd5b506102ed610daf565b34801561051857600080fd5b5061028b610527366004612386565b610dbc565b34801561053857600080fd5b5061033a6105473660046120f3565b610dce565b34801561055857600080fd5b5061033a610567366004612386565b610e1a565b34801561057857600080fd5b506103526105873660046120f3565b610e49565b34801561059857600080fd5b5061033a610e97565b3480156105ad57600080fd5b5061033a6105bc36600461233e565b610ecd565b3480156105cd57600080fd5b506014546102c89060ff1681565b3480156105e757600080fd5b506008546001600160a01b031661028b565b34801561060557600080fd5b506102ed610f0a565b34801561061a57600080fd5b5061028b6106293660046122a0565b610f19565b34801561063a57600080fd5b5061033a6106493660046121e4565b610f98565b34801561065a57600080fd5b5061066e61066936600461230a565b61102e565b6040805160ff909416845260208401929092529082015260600161029f565b34801561069957600080fd5b506102c86106a836600461220e565b61105d565b3480156106b957600080fd5b5061033a6106c836600461217d565b6110c4565b3480156106d957600080fd5b5061035260115481565b3480156106ef57600080fd5b5061033a6106fe366004612285565b61110e565b34801561070f57600080fd5b506102ed61071e366004612386565b61114b565b34801561072f57600080fd5b5061035260135481565b34801561074557600080fd5b50610352600f5481565b61033a61075d3660046122a0565b61121a565b34801561076e57600080fd5b506102c861077d36600461210e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107b757600080fd5b5061033a6107c63660046120f3565b6116dc565b3480156107d757600080fd5b5061033a6107e63660046120f3565b611777565b3480156107f757600080fd5b5061035260105481565b60006001600160e01b031982166380ac58cd60e01b148061083257506001600160e01b03198216635b5e139f60e01b145b8061084d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461086290612674565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612674565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b60006108f0826117c3565b61090d576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061093482610dbc565b9050806001600160a01b0316836001600160a01b031614156109695760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146109a057610983813361077d565b6109a0576040516367d9dca160e11b815260040160405180910390fd5b6109ab8383836117fc565b505050565b6109ab838383611858565b6008546001600160a01b031633146109ee5760405162461bcd60e51b81526004016109e5906125b1565b60405180910390fd5b60026009541415610a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109e5565b60026009556000610a5a6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610aa4576040519150601f19603f3d011682016040523d82523d6000602084013e610aa9565b606091505b5050905080610ab757600080fd5b506001600955565b6109ab838383604051806020016040528060008152506110c4565b60606000610ae783610e49565b90506000816001600160401b03811115610b0357610b03612720565b604051908082528060200260200182016040528015610b2c578160200160208202803683370190505b50905060016000805b8482108015610b45575060005483105b15610bce576000610b5584611a43565b90508060400151610bbb5780516001600160a01b031615610b7557805191505b876001600160a01b0316826001600160a01b03161415610bbb5783858481518110610ba257610ba261270a565b602090810291909101015282610bb7816126af565b9350505b83610bc5816126af565b94505050610b35565b509195945050505050565b6008546001600160a01b03163314610c035760405162461bcd60e51b81526004016109e5906125b1565b600e55565b6008546001600160a01b03163314610c325760405162461bcd60e51b81526004016109e5906125b1565b601155565b6008546001600160a01b03163314610c615760405162461bcd60e51b81526004016109e5906125b1565b600f546001546000548491900360001901610c7c91906125e6565b1115610ce45760405162461bcd60e51b815260206004820152603160248201527f444547454e5350414345424f4d4253203a204d696e7420616d6f756e742065786044820152706365656473206d617820737570706c792160781b60648201526084016109e5565b610cee8183611b65565b5050565b600d8054610cff90612674565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b90612674565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b505050505081565b6008546001600160a01b03163314610daa5760405162461bcd60e51b81526004016109e5906125b1565b601055565b600c8054610cff90612674565b6000610dc782611a43565b5192915050565b6008546001600160a01b03163314610df85760405162461bcd60e51b81526004016109e5906125b1565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610e445760405162461bcd60e51b81526004016109e5906125b1565b600f55565b60006001600160a01b038216610e72576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610ec15760405162461bcd60e51b81526004016109e5906125b1565b610ecb6000611b7f565b565b6008546001600160a01b03163314610ef75760405162461bcd60e51b81526004016109e5906125b1565b8051610cee90600c906020840190611f99565b60606003805461086290612674565b600080600080610f288561102e565b6040805160008152602081018083528b905260ff8516918101919091526060810183905260808101829052929550909350915060019060a0016020604051602081039080840390855afa158015610f83573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6001600160a01b038216331415610fc25760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000806000835160411461104157600080fd5b5050506020810151604082015160609092015160001a92909190565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160408051601f198184030181529190528051602090910120600a549091506001600160a01b03166110b28285610f19565b6001600160a01b031614949350505050565b6110cf848484611858565b6001600160a01b0383163b15611108576110eb84848484611bd1565b611108576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146111385760405162461bcd60e51b81526004016109e5906125b1565b6014805460ff1916911515919091179055565b6060611156826117c3565b6111bb5760405162461bcd60e51b815260206004820152603060248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526f3732bc34b9ba32b73a103a37b5b2b71760811b60648201526084016109e5565b60006111c5611cc9565b905060008151116111e55760405180602001604052806000815250611213565b806111ef84611cd8565b600d60405160200161120393929190612407565b6040516020818303038152906040525b9392505050565b8161122d6008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146112aa5760145460ff16156112aa5760405162461bcd60e51b815260206004820152602960248201527f444547454e5350414345424f4d4253203a2054686520636f6e7472616374206960448201526873207061757365642160b81b60648201526084016109e5565b6000811161130f5760405162461bcd60e51b815260206004820152602c60248201527f444547454e5350414345424f4d4253203a204d696e7420616d6f756e7420636160448201526b3713ba103132903d32b9379760a11b60648201526084016109e5565b3233146113775760405162461bcd60e51b815260206004820152603060248201527f444547454e5350414345424f4d4253203a205468652063616c6c65722069732060448201526f185b9bdd1a195c8818dbdb9d1c9858dd60821b60648201526084016109e5565b600f54600154600054839190036000190161139291906125e6565b11156113ec5760405162461bcd60e51b815260206004820152602360248201527f444547454e5350414345424f4d4253203a204265796f6e64204d617820537570604482015262706c7960e81b60648201526084016109e5565b600b546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561143457600080fd5b505afa158015611448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146c919061239f565b90508061158a5761147d338561105d565b15156001146114e25760405162461bcd60e51b815260206004820152602b60248201527f444547454e5350414345424f4d4253203a2055736572206973206e6f7420776860448201526a34ba32b634b9ba32b2109760a91b60648201526084016109e5565b60105485111561154e5760405162461bcd60e51b815260206004820152603160248201527f444547454e5350414345424f4d4253203a204d6178206f662032206d696e7473604482015270103337b9103737b716b437b63232b9399760791b60648201526084016109e5565b6011543360009081526015602052604090205461156c9087906125e6565b111561158a5760405162461bcd60e51b81526004016109e59061255f565b801561163b576012548511156115ff5760405162461bcd60e51b815260206004820152603460248201527f444547454e5350414345424f4d4253203a204d6178206d696e7420706572207460448201527372616e73616374696f6e2065786365656465642160601b60648201526084016109e5565b6013543360009081526015602052604090205461161d9087906125e6565b111561163b5760405162461bcd60e51b81526004016109e59061255f565b84600e546116499190612612565b3410156116a65760405162461bcd60e51b815260206004820152602560248201527f444547454e5350414345424f4d4253203a20496e73756666696369656e742066604482015264756e64732160d81b60648201526084016109e5565b33600090815260156020526040812080548792906116c59084906125e6565b909155506116d590503386611b65565b5050505050565b6008546001600160a01b031633146117065760405162461bcd60e51b81526004016109e5906125b1565b6001600160a01b03811661176b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e5565b61177481611b7f565b50565b6008546001600160a01b031633146117a15760405162461bcd60e51b81526004016109e5906125b1565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000816001111580156117d7575060005482105b801561084d575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061186382611a43565b9050836001600160a01b031681600001516001600160a01b03161461189a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806118b857506118b8853361077d565b806118d35750336118c8846108e5565b6001600160a01b0316145b9050806118f357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661191a57604051633a954ecd60e21b815260040160405180910390fd5b611926600084876117fc565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166119fa5760005482146119fa57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116d5565b60408051606081018252600080825260208201819052918101919091528180600111611b4c57600054811015611b4c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611b4a5780516001600160a01b031615611ae1579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611b45579392505050565b611ae1565b505b604051636f96cda160e11b815260040160405180910390fd5b610cee828260405180602001604052806000815250611dd5565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611c069033908990889088906004016124cb565b602060405180830381600087803b158015611c2057600080fd5b505af1925050508015611c50575060408051601f3d908101601f19168201909252611c4d918101906122ed565b60015b611cab573d808015611c7e576040519150601f19603f3d011682016040523d82523d6000602084013e611c83565b606091505b508051611ca3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c805461086290612674565b606081611cfc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d265780611d10816126af565b9150611d1f9050600a836125fe565b9150611d00565b6000816001600160401b03811115611d4057611d40612720565b6040519080825280601f01601f191660200182016040528015611d6a576020820181803683370190505b5090505b8415611cc157611d7f600183612631565b9150611d8c600a866126ca565b611d979060306125e6565b60f81b818381518110611dac57611dac61270a565b60200101906001600160f81b031916908160001a905350611dce600a866125fe565b9450611d6e565b6000546001600160a01b038416611dfe57604051622e076360e81b815260040160405180910390fd5b82611e1c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611f44575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f0d6000878480600101955087611bd1565b611f2a576040516368d2bf6b60e11b815260040160405180910390fd5b808210611ec2578260005414611f3f57600080fd5b611f89565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611f45575b5060009081556111089085838684565b828054611fa590612674565b90600052602060002090601f016020900481019282611fc7576000855561200d565b82601f10611fe057805160ff191683800117855561200d565b8280016001018555821561200d579182015b8281111561200d578251825591602001919060010190611ff2565b5061201992915061201d565b5090565b5b80821115612019576000815560010161201e565b60006001600160401b038084111561204c5761204c612720565b604051601f8501601f19908116603f0116810190828211818310171561207457612074612720565b8160405280935085815286868601111561208d57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146120be57600080fd5b919050565b803580151581146120be57600080fd5b600082601f8301126120e457600080fd5b61121383833560208501612032565b60006020828403121561210557600080fd5b611213826120a7565b6000806040838503121561212157600080fd5b61212a836120a7565b9150612138602084016120a7565b90509250929050565b60008060006060848603121561215657600080fd5b61215f846120a7565b925061216d602085016120a7565b9150604084013590509250925092565b6000806000806080858703121561219357600080fd5b61219c856120a7565b93506121aa602086016120a7565b92506040850135915060608501356001600160401b038111156121cc57600080fd5b6121d8878288016120d3565b91505092959194509250565b600080604083850312156121f757600080fd5b612200836120a7565b9150612138602084016120c3565b6000806040838503121561222157600080fd5b61222a836120a7565b915060208301356001600160401b0381111561224557600080fd5b612251858286016120d3565b9150509250929050565b6000806040838503121561226e57600080fd5b612277836120a7565b946020939093013593505050565b60006020828403121561229757600080fd5b611213826120c3565b600080604083850312156122b357600080fd5b8235915060208301356001600160401b0381111561224557600080fd5b6000602082840312156122e257600080fd5b813561121381612736565b6000602082840312156122ff57600080fd5b815161121381612736565b60006020828403121561231c57600080fd5b81356001600160401b0381111561233257600080fd5b611cc1848285016120d3565b60006020828403121561235057600080fd5b81356001600160401b0381111561236657600080fd5b8201601f8101841361237757600080fd5b611cc184823560208401612032565b60006020828403121561239857600080fd5b5035919050565b6000602082840312156123b157600080fd5b5051919050565b600080604083850312156123cb57600080fd5b82359150612138602084016120a7565b600081518084526123f3816020860160208601612648565b601f01601f19169290920160200192915050565b60008451602061241a8285838a01612648565b85519184019161242d8184848a01612648565b8554920191600090600181811c908083168061244a57607f831692505b85831081141561246857634e487b7160e01b85526022600452602485fd5b80801561247c576001811461248d576124ba565b60ff198516885283880195506124ba565b60008b81526020902060005b858110156124b25781548a820152908401908801612499565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124fe908301846123db565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561254057835183529284019291840191600101612524565b50909695505050505050565b60208152600061121360208301846123db565b60208082526032908201527f444547454e5350414345424f4d4253203a204d617820616d6f756e742070657260408201527120616464726573732065786365656465642160701b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156125f9576125f96126de565b500190565b60008261260d5761260d6126f4565b500490565b600081600019048311821515161561262c5761262c6126de565b500290565b600082821015612643576126436126de565b500390565b60005b8381101561266357818101518382015260200161264b565b838111156111085750506000910152565b600181811c9082168061268857607f821691505b602082108114156126a957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126c3576126c36126de565b5060010190565b6000826126d9576126d96126f4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461177457600080fdfea2646970667358221220e1667f0a3c301d83bbadd178ce31522a7a66ffb666809918fcbab8e77e8d90cb64736f6c63430008070033
Deployed Bytecode Sourcemap
37530:6316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37662:28;;;;;;;;;;-1:-1:-1;37662:28:0;;;;-1:-1:-1;;;;;37662:28:0;;;;;;-1:-1:-1;;;;;8756:32:1;;;8738:51;;8726:2;8711:18;37662:28:0;;;;;;;;20403:305;;;;;;;;;;-1:-1:-1;20403:305:0;;;;;:::i;:::-;;:::i;:::-;;;10095:14:1;;10088:22;10070:41;;10058:2;10043:18;20403:305:0;9930:187:1;23518:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25022:204::-;;;;;;;;;;-1:-1:-1;25022:204:0;;;;;:::i;:::-;;:::i;24584:372::-;;;;;;;;;;-1:-1:-1;24584:372:0;;;;;:::i;:::-;;:::i;:::-;;37767:29;;;;;;;;;;;;;;;;;;;16578:25:1;;;16566:2;16551:18;37767:29:0;16432:177:1;19643:312:0;;;;;;;;;;-1:-1:-1;42192:1:0;19906:12;19696:7;19890:13;:28;-1:-1:-1;;19890:46:0;19643:312;;38039:55;;;;;;;;;;-1:-1:-1;38039:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;37915:34;;;;;;;;;;;;;;;;25887:170;;;;;;;;;;-1:-1:-1;25887:170:0;;;;;:::i;:::-;;:::i;43681:162::-;;;;;;;;;;;;;:::i;26128:185::-;;;;;;;;;;-1:-1:-1;26128:185:0;;;;;:::i;:::-;;:::i;41252:828::-;;;;;;;;;;-1:-1:-1;41252:828:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42973:74::-;;;;;;;;;;-1:-1:-1;42973:74:0;;;;;:::i;:::-;;:::i;43334:118::-;;;;;;;;;;-1:-1:-1;43334:118:0;;;;;:::i;:::-;;:::i;40145:245::-;;;;;;;;;;-1:-1:-1;40145:245:0;;;;;:::i;:::-;;:::i;37725:33::-;;;;;;;;;;;;;:::i;37629:28::-;;;;;;;;;;-1:-1:-1;37629:28:0;;;;-1:-1:-1;;;;;37629:28:0;;;43198:98;;;;;;;;;;-1:-1:-1;43198:98:0;;;;;:::i;:::-;;:::i;37697:23::-;;;;;;;;;;;;;:::i;23326:125::-;;;;;;;;;;-1:-1:-1;23326:125:0;;;;;:::i;:::-;;:::i;42728:95::-;;;;;;;;;;-1:-1:-1;42728:95:0;;;;;:::i;:::-;;:::i;43076:94::-;;;;;;;;;;-1:-1:-1;43076:94:0;;;;;:::i;:::-;;:::i;20772:206::-;;;;;;;;;;-1:-1:-1;20772:206:0;;;;;:::i;:::-;;:::i;4790:103::-;;;;;;;;;;;;;:::i;43472:100::-;;;;;;;;;;-1:-1:-1;43472:100:0;;;;;:::i;:::-;;:::i;38005:25::-;;;;;;;;;;-1:-1:-1;38005:25:0;;;;;;;;4139:87;;;;;;;;;;-1:-1:-1;4212:6:0;;-1:-1:-1;;;;;4212:6:0;4139:87;;23687:104;;;;;;;;;;;;;:::i;40665:209::-;;;;;;;;;;-1:-1:-1;40665:209:0;;;;;:::i;:::-;;:::i;25298:287::-;;;;;;;;;;-1:-1:-1;25298:287:0;;;;;:::i;:::-;;:::i;40880:::-;;;;;;;;;;-1:-1:-1;40880:287:0;;;;;:::i;:::-;;:::i;:::-;;;;16842:4:1;16830:17;;;16812:36;;16879:2;16864:18;;16857:34;;;;16907:18;;;16900:34;16800:2;16785:18;40880:287:0;16614:326:1;40453:206:0;;;;;;;;;;-1:-1:-1;40453:206:0;;;;;:::i;:::-;;:::i;26384:370::-;;;;;;;;;;-1:-1:-1;26384:370:0;;;;;:::i;:::-;;:::i;37871:37::-;;;;;;;;;;;;;;;;43600:75;;;;;;;;;;-1:-1:-1;43600:75:0;;;;;:::i;:::-;;:::i;42266:367::-;;;;;;;;;;-1:-1:-1;42266:367:0;;;;;:::i;:::-;;:::i;37954:44::-;;;;;;;;;;;;;;;;37803:31;;;;;;;;;;;;;;;;38975:1139;;;;;;:::i;:::-;;:::i;25656:164::-;;;;;;;;;;-1:-1:-1;25656:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25777:25:0;;;25753:4;25777:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25656:164;5048:201;;;;;;;;;;-1:-1:-1;5048:201:0;;;;;:::i;:::-;;:::i;42854:98::-;;;;;;;;;;-1:-1:-1;42854:98:0;;;;;:::i;:::-;;:::i;37839:27::-;;;;;;;;;;;;;;;;20403:305;20505:4;-1:-1:-1;;;;;;20542:40:0;;-1:-1:-1;;;20542:40:0;;:105;;-1:-1:-1;;;;;;;20599:48:0;;-1:-1:-1;;;20599:48:0;20542:105;:158;;;-1:-1:-1;;;;;;;;;;11740:40:0;;;20664:36;20522:178;20403:305;-1:-1:-1;;20403:305:0:o;23518:100::-;23572:13;23605:5;23598:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23518:100;:::o;25022:204::-;25090:7;25115:16;25123:7;25115;:16::i;:::-;25110:64;;25140:34;;-1:-1:-1;;;25140:34:0;;;;;;;;;;;25110:64;-1:-1:-1;25194:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25194:24:0;;25022:204::o;24584:372::-;24657:13;24673:24;24689:7;24673:15;:24::i;:::-;24657:40;;24718:5;-1:-1:-1;;;;;24712:11:0;:2;-1:-1:-1;;;;;24712:11:0;;24708:48;;;24732:24;;-1:-1:-1;;;24732:24:0;;;;;;;;;;;24708:48;3509:10;-1:-1:-1;;;;;24773:21:0;;;24769:139;;24800:37;24817:5;3509:10;25656:164;:::i;24800:37::-;24796:112;;24861:35;;-1:-1:-1;;;24861:35:0;;;;;;;;;;;24796:112;24920:28;24929:2;24933:7;24942:5;24920:8;:28::i;:::-;24646:310;24584:372;;:::o;25887:170::-;26021:28;26031:4;26037:2;26041:7;26021:9;:28::i;43681:162::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;;;;;;;;;983:1:::1;1203:7;;:19;;1195:63;;;::::0;-1:-1:-1;;;1195:63:0;;15857:2:1;1195:63:0::1;::::0;::::1;15839:21:1::0;15896:2;15876:18;;;15869:30;15935:33;15915:18;;;15908:61;15986:18;;1195:63:0::1;15655:355:1::0;1195:63:0::1;983:1;1336:7;:18:::0;43741:12:::2;43767:7;4212:6:::0;;-1:-1:-1;;;;;4212:6:0;;4139:87;43767:7:::2;-1:-1:-1::0;;;;;43759:21:0::2;43788;43759:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43740:74;;;43829:7;43821:16;;;::::0;::::2;;-1:-1:-1::0;939:1:0::1;1381:7;:22:::0;43681:162::o;26128:185::-;26266:39;26283:4;26289:2;26293:7;26266:39;;;;;;;;;;;;:16;:39::i;41252:828::-;41312:16;41337:23;41363:17;41373:6;41363:9;:17::i;:::-;41337:43;;41387:30;41434:15;-1:-1:-1;;;;;41420:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41420:30:0;-1:-1:-1;41387:63:0;-1:-1:-1;42192:1:0;41457:22;;41573:475;41598:15;41580;:33;:67;;;;;41634:13;;41617:14;:30;41580:67;41573:475;;;41658:31;41692:28;41705:14;41692:12;:28::i;:::-;41658:62;;41736:9;:16;;;41731:285;;41769:14;;-1:-1:-1;;;;;41769:28:0;;41765:94;;41833:14;;;-1:-1:-1;41765:94:0;41897:6;-1:-1:-1;;;;;41875:28:0;:18;-1:-1:-1;;;;;41875:28:0;;41871:136;;;41951:14;41918:13;41932:15;41918:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;41978:17;;;;:::i;:::-;;;;41871:136;42024:16;;;;:::i;:::-;;;;41649:399;41573:475;;;-1:-1:-1;42061:13:0;;41252:828;-1:-1:-1;;;;;41252:828:0:o;42973:74::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;43029:4:::1;:12:::0;42973:74::o;43334:118::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;43410:18:::1;:36:::0;43334:118::o;40145:245::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;40275:9:::1;::::0;42192:1;19906:12;19696:7;19890:13;40260:11;;19890:28;;-1:-1:-1;;19890:46:0;40244:27:::1;;;;:::i;:::-;:40;;40236:102;;;::::0;-1:-1:-1;;;40236:102:0;;11361:2:1;40236:102:0::1;::::0;::::1;11343:21:1::0;11400:2;11380:18;;;11373:30;11439:34;11419:18;;;11412:62;-1:-1:-1;;;11490:18:1;;;11483:47;11547:19;;40236:102:0::1;11159:413:1::0;40236:102:0::1;40349:33;40359:9;40370:11;40349:9;:33::i;:::-;40145:245:::0;;:::o;37725:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43198:98::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;43266:8:::1;:24:::0;43198:98::o;37697:23::-;;;;;;;:::i;23326:125::-;23390:7;23417:21;23430:7;23417:12;:21::i;:::-;:26;;23326:125;-1:-1:-1;;23326:125:0:o;42728:95::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;42791:13:::1;:26:::0;;-1:-1:-1;;;;;;42791:26:0::1;-1:-1:-1::0;;;;;42791:26:0;;;::::1;::::0;;;::::1;::::0;;42728:95::o;43076:94::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;43142:9:::1;:22:::0;43076:94::o;20772:206::-;20836:7;-1:-1:-1;;;;;20860:19:0;;20856:60;;20888:28;;-1:-1:-1;;;20888:28:0;;;;;;;;;;;20856:60;-1:-1:-1;;;;;;20942:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;20942:27:0;;20772:206::o;4790:103::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;4855:30:::1;4882:1;4855:18;:30::i;:::-;4790:103::o:0;43472:100::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;43544:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;23687:104::-:0;23743:13;23776:7;23769:14;;;;;:::i;40665:209::-;40744:7;40760;40769:9;40780;40808:19;40823:3;40808:14;:19::i;:::-;40841:27;;;;;;;;;;;;10349:25:1;;;10422:4;10410:17;;10390:18;;;10383:45;;;;10444:18;;;10437:34;;;10487:18;;;10480:34;;;40796:31:0;;-1:-1:-1;40796:31:0;;-1:-1:-1;40796:31:0;-1:-1:-1;40841:27:0;;10321:19:1;;40841:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40841:27:0;;-1:-1:-1;;40841:27:0;;;40665:209;-1:-1:-1;;;;;;;40665:209:0:o;25298:287::-;-1:-1:-1;;;;;25397:24:0;;3509:10;25397:24;25393:54;;;25430:17;;-1:-1:-1;;;25430:17:0;;;;;;;;;;;25393:54;3509:10;25460:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25460:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25460:53:0;;;;;;;;;;25529:48;;10070:41:1;;;25460:42:0;;3509:10;25529:48;;10043:18:1;25529:48:0;;;;;;;25298:287;;:::o;40880:::-;40943:5;40950:7;40959;40983:3;:10;40997:2;40983:16;40975:25;;;;;;-1:-1:-1;;;41074:2:0;41065:12;;41059:19;41099:2;41090:12;;41084:19;41132:2;41123:12;;;41117:19;41007:9;41109:28;;41059:19;;41084;40880:287::o;40453:206::-;40569:23;;-1:-1:-1;;6765:2:1;6761:15;;;6757:53;40569:23:0;;;6745:66:1;40528:4:0;;;;6827:12:1;;40569:23:0;;;-1:-1:-1;;40569:23:0;;;;;;;;;40559:34;;40569:23;40559:34;;;;40639:13;;40559:34;;-1:-1:-1;;;;;;40639:13:0;40608:27;40559:34;40631:3;40608:13;:27::i;:::-;-1:-1:-1;;;;;40608:44:0;;;40453:206;-1:-1:-1;;;;40453:206:0:o;26384:370::-;26551:28;26561:4;26567:2;26571:7;26551:9;:28::i;:::-;-1:-1:-1;;;;;26594:13:0;;5945:19;:23;26590:157;;26615:56;26646:4;26652:2;26656:7;26665:5;26615:30;:56::i;:::-;26611:136;;26695:40;;-1:-1:-1;;;26695:40:0;;;;;;;;;;;26611:136;26384:370;;;;:::o;43600:75::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;43655:5:::1;:14:::0;;-1:-1:-1;;43655:14:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43600:75::o;42266:367::-;42340:13;42370:17;42378:8;42370:7;:17::i;:::-;42362:77;;;;-1:-1:-1;;;42362:77:0;;16217:2:1;42362:77:0;;;16199:21:1;16256:2;16236:18;;;16229:30;16295:34;16275:18;;;16268:62;-1:-1:-1;;;16346:18:1;;;16339:46;16402:19;;42362:77:0;16015:412:1;42362:77:0;42448:28;42479:10;:8;:10::i;:::-;42448:41;;42534:1;42509:14;42503:28;:32;:122;;;;;;;;;;;;;;;;;42567:14;42583:19;:8;:17;:19::i;:::-;42604:9;42550:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42503:122;42496:129;42266:367;-1:-1:-1;;;42266:367:0:o;38975:1139::-;39056:9;38521:7;4212:6;;-1:-1:-1;;;;;4212:6:0;;4139:87;38521:7;-1:-1:-1;;;;;38507:21:0;:10;-1:-1:-1;;;;;38507:21:0;;38503:110;;38550:5;;;;38549:6;38541:60;;;;-1:-1:-1;;;38541:60:0;;10951:2:1;38541:60:0;;;10933:21:1;10990:2;10970:18;;;10963:30;11029:34;11009:18;;;11002:62;-1:-1:-1;;;11080:18:1;;;11073:39;11129:19;;38541:60:0;10749:405:1;38541:60:0;38639:1;38627:9;:13;38619:70;;;;-1:-1:-1;;;38619:70:0;;14207:2:1;38619:70:0;;;14189:21:1;14246:2;14226:18;;;14219:30;14285:34;14265:18;;;14258:62;-1:-1:-1;;;14336:18:1;;;14329:42;14388:19;;38619:70:0;14005:408:1;38619:70:0;38704:9;38717:10;38704:23;38696:84;;;;-1:-1:-1;;;38696:84:0;;13011:2:1;38696:84:0;;;12993:21:1;13050:2;13030:18;;;13023:30;13089:34;13069:18;;;13062:62;-1:-1:-1;;;13140:18:1;;;13133:46;13196:19;;38696:84:0;12809:412:1;38696:84:0;38824:9;;42192:1;19906:12;19696:7;19890:13;38811:9;;19890:28;;-1:-1:-1;;19890:46:0;38795:25;;;;:::i;:::-;:38;;38787:86;;;;-1:-1:-1;;;38787:86:0;;15041:2:1;38787:86:0;;;15023:21:1;15080:2;15060:18;;;15053:30;15119:34;15099:18;;;15092:62;-1:-1:-1;;;15170:18:1;;;15163:33;15213:19;;38787:86:0;14839:399:1;38787:86:0;39102:13:::1;::::0;39152:27:::1;::::0;-1:-1:-1;;;39152:27:0;;39168:10:::1;39152:27;::::0;::::1;8738:51:1::0;-1:-1:-1;;;;;39102:13:0;;::::1;::::0;39078::::1;::::0;39102;;39152:15:::1;::::0;8711:18:1;;39152:27:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39127:52:::0;-1:-1:-1;39196:19:0;39192:390:::1;;39240:28;39252:10;39264:3;39240:11;:28::i;:::-;:36;;39272:4;39240:36;39232:92;;;::::0;-1:-1:-1;;;39232:92:0;;15445:2:1;39232:92:0::1;::::0;::::1;15427:21:1::0;15484:2;15464:18;;;15457:30;15523:34;15503:18;;;15496:62;-1:-1:-1;;;15574:18:1;;;15567:41;15625:19;;39232:92:0::1;15243:407:1::0;39232:92:0::1;39360:8;;39347:9;:21;;39339:83;;;::::0;-1:-1:-1;;;39339:83:0;;13789:2:1;39339:83:0::1;::::0;::::1;13771:21:1::0;13828:2;13808:18;;;13801:30;13867:34;13847:18;;;13840:62;-1:-1:-1;;;13918:18:1;;;13911:47;13975:19;;39339:83:0::1;13587:413:1::0;39339:83:0::1;39493:18;::::0;39466:10:::1;39445:32;::::0;;;:20:::1;:32;::::0;;;;;:44:::1;::::0;39480:9;;39445:44:::1;:::i;:::-;:66;;39437:129;;;;-1:-1:-1::0;;;39437:129:0::1;;;;;;;:::i;:::-;39606:18:::0;;39602:312:::1;;39675:15;;39662:9;:28;;39654:93;;;::::0;-1:-1:-1;;;39654:93:0;;14620:2:1;39654:93:0::1;::::0;::::1;14602:21:1::0;14659:2;14639:18;;;14632:30;14698:34;14678:18;;;14671:62;-1:-1:-1;;;14749:18:1;;;14742:50;14809:19;;39654:93:0::1;14418:416:1::0;39654:93:0::1;39818:25;::::0;39791:10:::1;39770:32;::::0;;;:20:::1;:32;::::0;;;;;:44:::1;::::0;39805:9;;39770:44:::1;:::i;:::-;:73;;39762:136;;;;-1:-1:-1::0;;;39762:136:0::1;;;;;;;:::i;:::-;39954:9;39947:4;;:16;;;;:::i;:::-;39934:9;:29;;39926:79;;;::::0;-1:-1:-1;;;39926:79:0;;12186:2:1;39926:79:0::1;::::0;::::1;12168:21:1::0;12225:2;12205:18;;;12198:30;12264:34;12244:18;;;12237:62;-1:-1:-1;;;12315:18:1;;;12308:35;12360:19;;39926:79:0::1;11984:401:1::0;39926:79:0::1;40039:10;40018:32;::::0;;;:20:::1;:32;::::0;;;;:45;;40054:9;;40018:32;:45:::1;::::0;40054:9;;40018:45:::1;:::i;:::-;::::0;;;-1:-1:-1;40074:32:0::1;::::0;-1:-1:-1;40084:10:0::1;40096:9:::0;40074::::1;:32::i;:::-;39067:1047;;38975:1139:::0;;;:::o;5048:201::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5137:22:0;::::1;5129:73;;;::::0;-1:-1:-1;;;5129:73:0;;11779:2:1;5129:73:0::1;::::0;::::1;11761:21:1::0;11818:2;11798:18;;;11791:30;11857:34;11837:18;;;11830:62;-1:-1:-1;;;11908:18:1;;;11901:36;11954:19;;5129:73:0::1;11577:402:1::0;5129:73:0::1;5213:28;5232:8;5213:18;:28::i;:::-;5048:201:::0;:::o;42854:98::-;4212:6;;-1:-1:-1;;;;;4212:6:0;3509:10;4359:23;4351:68;;;;-1:-1:-1;;;4351:68:0;;;;;;;:::i;:::-;42922:13:::1;:24:::0;;-1:-1:-1;;;;;;42922:24:0::1;-1:-1:-1::0;;;;;42922:24:0;;;::::1;::::0;;;::::1;::::0;;42854:98::o;27009:174::-;27066:4;27109:7;42192:1;27090:26;;:53;;;;;27130:13;;27120:7;:23;27090:53;:85;;;;-1:-1:-1;;27148:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;27148:27:0;;;;27147:28;;27009:174::o;36231:196::-;36346:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;36346:29:0;-1:-1:-1;;;;;36346:29:0;;;;;;;;;36391:28;;36346:24;;36391:28;;;;;;;36231:196;;;:::o;31179:2130::-;31294:35;31332:21;31345:7;31332:12;:21::i;:::-;31294:59;;31392:4;-1:-1:-1;;;;;31370:26:0;:13;:18;;;-1:-1:-1;;;;;31370:26:0;;31366:67;;31405:28;;-1:-1:-1;;;31405:28:0;;;;;;;;;;;31366:67;31446:22;3509:10;-1:-1:-1;;;;;31472:20:0;;;;:73;;-1:-1:-1;31509:36:0;31526:4;3509:10;25656:164;:::i;31509:36::-;31472:126;;;-1:-1:-1;3509:10:0;31562:20;31574:7;31562:11;:20::i;:::-;-1:-1:-1;;;;;31562:36:0;;31472:126;31446:153;;31617:17;31612:66;;31643:35;;-1:-1:-1;;;31643:35:0;;;;;;;;;;;31612:66;-1:-1:-1;;;;;31693:16:0;;31689:52;;31718:23;;-1:-1:-1;;;31718:23:0;;;;;;;;;;;31689:52;31862:35;31879:1;31883:7;31892:4;31862:8;:35::i;:::-;-1:-1:-1;;;;;32193:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;32193:31:0;;;-1:-1:-1;;;;;32193:31:0;;;-1:-1:-1;;32193:31:0;;;;;;;32239:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;32239:29:0;;;;;;;;;;;32319:20;;;:11;:20;;;;;;32354:18;;-1:-1:-1;;;;;;32387:49:0;;;;-1:-1:-1;;;32420:15:0;32387:49;;;;;;;;;;32710:11;;32770:24;;;;;32813:13;;32319:20;;32770:24;;32813:13;32809:384;;33023:13;;33008:11;:28;33004:174;;33061:20;;33130:28;;;;-1:-1:-1;;;;;33104:54:0;-1:-1:-1;;;33104:54:0;-1:-1:-1;;;;;;33104:54:0;;;-1:-1:-1;;;;;33061:20:0;;33104:54;;;;33004:174;32168:1036;;;33240:7;33236:2;-1:-1:-1;;;;;33221:27:0;33230:4;-1:-1:-1;;;;;33221:27:0;;;;;;;;;;;33259:42;26384:370;22153:1111;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;22264:7:0;;42192:1;22313:23;22309:888;;22349:13;;22342:4;:20;22338:859;;;22383:31;22417:17;;;:11;:17;;;;;;;;;22383:51;;;;;;;;;-1:-1:-1;;;;;22383:51:0;;;;-1:-1:-1;;;22383:51:0;;-1:-1:-1;;;;;22383:51:0;;;;;;;;-1:-1:-1;;;22383:51:0;;;;;;;;;;;;;;22453:729;;22503:14;;-1:-1:-1;;;;;22503:28:0;;22499:101;;22567:9;22153:1111;-1:-1:-1;;;22153:1111:0:o;22499:101::-;-1:-1:-1;;;22942:6:0;22987:17;;;;:11;:17;;;;;;;;;22975:29;;;;;;;;;-1:-1:-1;;;;;22975:29:0;;;;;-1:-1:-1;;;22975:29:0;;-1:-1:-1;;;;;22975:29:0;;;;;;;;-1:-1:-1;;;22975:29:0;;;;;;;;;;;;;23035:28;23031:109;;23103:9;22153:1111;-1:-1:-1;;;22153:1111:0:o;23031:109::-;22902:261;;;22364:833;22338:859;23225:31;;-1:-1:-1;;;23225:31:0;;;;;;;;;;;27267:104;27336:27;27346:2;27350:8;27336:27;;;;;;;;;;;;:9;:27::i;5409:191::-;5502:6;;;-1:-1:-1;;;;;5519:17:0;;;-1:-1:-1;;;;;;5519:17:0;;;;;;;5552:40;;5502:6;;;5519:17;5502:6;;5552:40;;5483:16;;5552:40;5472:128;5409:191;:::o;36437:667::-;36621:72;;-1:-1:-1;;;36621:72:0;;36600:4;;-1:-1:-1;;;;;36621:36:0;;;;;:72;;3509:10;;36672:4;;36678:7;;36687:5;;36621:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36621:72:0;;;;;;;;-1:-1:-1;;36621:72:0;;;;;;;;;;;;:::i;:::-;;;36617:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36855:13:0;;36851:235;;36901:40;;-1:-1:-1;;;36901:40:0;;;;;;;;;;;36851:235;37044:6;37038:13;37029:6;37025:2;37021:15;37014:38;36617:480;-1:-1:-1;;;;;;36740:55:0;-1:-1:-1;;;36740:55:0;;-1:-1:-1;36617:480:0;36437:667;;;;;;:::o;38285:104::-;38345:13;38374:9;38367:16;;;;;:::i;1687:534::-;1743:13;1775:10;1771:53;;-1:-1:-1;;1802:10:0;;;;;;;;;;;;-1:-1:-1;;;1802:10:0;;;;;1687:534::o;1771:53::-;1849:5;1834:12;1890:78;1897:9;;1890:78;;1923:8;;;;:::i;:::-;;-1:-1:-1;1946:10:0;;-1:-1:-1;1954:2:0;1946:10;;:::i;:::-;;;1890:78;;;1978:19;2010:6;-1:-1:-1;;;;;2000:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2000:17:0;;1978:39;;2028:154;2035:10;;2028:154;;2062:11;2072:1;2062:11;;:::i;:::-;;-1:-1:-1;2131:10:0;2139:2;2131:5;:10;:::i;:::-;2118:24;;:2;:24;:::i;:::-;2105:39;;2088:6;2095;2088:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2088:56:0;;;;;;;;-1:-1:-1;2159:11:0;2168:2;2159:11;;:::i;:::-;;;2028:154;;27744:1749;27867:20;27890:13;-1:-1:-1;;;;;27918:16:0;;27914:48;;27943:19;;-1:-1:-1;;;27943:19:0;;;;;;;;;;;27914:48;27977:13;27973:44;;27999:18;;-1:-1:-1;;;27999:18:0;;;;;;;;;;;27973:44;-1:-1:-1;;;;;28368:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;28427:49:0;;-1:-1:-1;;;;;28368:44:0;;;;;;;28427:49;;;;-1:-1:-1;;28368:44:0;;;;;;28427:49;;;;;;;;;;;;;;;;28493:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;28543:66:0;;;-1:-1:-1;;;28593:15:0;28543:66;;;;;;;;;;;;;28493:25;;28690:23;;;;5945:19;:23;28730:631;;28770:313;28801:38;;28826:12;;-1:-1:-1;;;;;28801:38:0;;;28818:1;;28801:38;;28818:1;;28801:38;28867:69;28906:1;28910:2;28914:14;;;;;;28930:5;28867:30;:69::i;:::-;28862:174;;28972:40;;-1:-1:-1;;;28972:40:0;;;;;;;;;;;28862:174;29078:3;29063:12;:18;28770:313;;29164:12;29147:13;;:29;29143:43;;29178:8;;;29143:43;28730:631;;;29227:119;29258:40;;29283:14;;;;;-1:-1:-1;;;;;29258:40:0;;;29275:1;;29258:40;;29275:1;;29258:40;29341:3;29326:12;:18;29227:119;;28730:631;-1:-1:-1;29375:13:0;:28;;;29425:60;;29458:2;29462:12;29476:8;29425:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:220;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:55;;1106:1;1103;1096:12;1055:55;1128:79;1203:3;1194:6;1181:20;1174:4;1166:6;1162:17;1128:79;:::i;1218:186::-;1277:6;1330:2;1318:9;1309:7;1305:23;1301:32;1298:52;;;1346:1;1343;1336:12;1298:52;1369:29;1388:9;1369:29;:::i;1409:260::-;1477:6;1485;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:29;1596:9;1577:29;:::i;:::-;1567:39;;1625:38;1659:2;1648:9;1644:18;1625:38;:::i;:::-;1615:48;;1409:260;;;;;:::o;1674:328::-;1751:6;1759;1767;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1859:29;1878:9;1859:29;:::i;:::-;1849:39;;1907:38;1941:2;1930:9;1926:18;1907:38;:::i;:::-;1897:48;;1992:2;1981:9;1977:18;1964:32;1954:42;;1674:328;;;;;:::o;2007:537::-;2102:6;2110;2118;2126;2179:3;2167:9;2158:7;2154:23;2150:33;2147:53;;;2196:1;2193;2186:12;2147:53;2219:29;2238:9;2219:29;:::i;:::-;2209:39;;2267:38;2301:2;2290:9;2286:18;2267:38;:::i;:::-;2257:48;;2352:2;2341:9;2337:18;2324:32;2314:42;;2407:2;2396:9;2392:18;2379:32;-1:-1:-1;;;;;2426:6:1;2423:30;2420:50;;;2466:1;2463;2456:12;2420:50;2489:49;2530:7;2521:6;2510:9;2506:22;2489:49;:::i;:::-;2479:59;;;2007:537;;;;;;;:::o;2549:254::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2714:29;2733:9;2714:29;:::i;:::-;2704:39;;2762:35;2793:2;2782:9;2778:18;2762:35;:::i;2808:394::-;2885:6;2893;2946:2;2934:9;2925:7;2921:23;2917:32;2914:52;;;2962:1;2959;2952:12;2914:52;2985:29;3004:9;2985:29;:::i;:::-;2975:39;;3065:2;3054:9;3050:18;3037:32;-1:-1:-1;;;;;3084:6:1;3081:30;3078:50;;;3124:1;3121;3114:12;3078:50;3147:49;3188:7;3179:6;3168:9;3164:22;3147:49;:::i;:::-;3137:59;;;2808:394;;;;;:::o;3207:254::-;3275:6;3283;3336:2;3324:9;3315:7;3311:23;3307:32;3304:52;;;3352:1;3349;3342:12;3304:52;3375:29;3394:9;3375:29;:::i;:::-;3365:39;3451:2;3436:18;;;;3423:32;;-1:-1:-1;;;3207:254:1:o;3466:180::-;3522:6;3575:2;3563:9;3554:7;3550:23;3546:32;3543:52;;;3591:1;3588;3581:12;3543:52;3614:26;3630:9;3614:26;:::i;3651:388::-;3728:6;3736;3789:2;3777:9;3768:7;3764:23;3760:32;3757:52;;;3805:1;3802;3795:12;3757:52;3841:9;3828:23;3818:33;;3902:2;3891:9;3887:18;3874:32;-1:-1:-1;;;;;3921:6:1;3918:30;3915:50;;;3961:1;3958;3951:12;4044:245;4102:6;4155:2;4143:9;4134:7;4130:23;4126:32;4123:52;;;4171:1;4168;4161:12;4123:52;4210:9;4197:23;4229:30;4253:5;4229:30;:::i;4294:249::-;4363:6;4416:2;4404:9;4395:7;4391:23;4387:32;4384:52;;;4432:1;4429;4422:12;4384:52;4464:9;4458:16;4483:30;4507:5;4483:30;:::i;4548:320::-;4616:6;4669:2;4657:9;4648:7;4644:23;4640:32;4637:52;;;4685:1;4682;4675:12;4637:52;4725:9;4712:23;-1:-1:-1;;;;;4750:6:1;4747:30;4744:50;;;4790:1;4787;4780:12;4744:50;4813:49;4854:7;4845:6;4834:9;4830:22;4813:49;:::i;4873:450::-;4942:6;4995:2;4983:9;4974:7;4970:23;4966:32;4963:52;;;5011:1;5008;5001:12;4963:52;5051:9;5038:23;-1:-1:-1;;;;;5076:6:1;5073:30;5070:50;;;5116:1;5113;5106:12;5070:50;5139:22;;5192:4;5184:13;;5180:27;-1:-1:-1;5170:55:1;;5221:1;5218;5211:12;5170:55;5244:73;5309:7;5304:2;5291:16;5286:2;5282;5278:11;5244:73;:::i;5328:180::-;5387:6;5440:2;5428:9;5419:7;5415:23;5411:32;5408:52;;;5456:1;5453;5446:12;5408:52;-1:-1:-1;5479:23:1;;5328:180;-1:-1:-1;5328:180:1:o;5513:184::-;5583:6;5636:2;5624:9;5615:7;5611:23;5607:32;5604:52;;;5652:1;5649;5642:12;5604:52;-1:-1:-1;5675:16:1;;5513:184;-1:-1:-1;5513:184:1:o;5702:254::-;5770:6;5778;5831:2;5819:9;5810:7;5806:23;5802:32;5799:52;;;5847:1;5844;5837:12;5799:52;5883:9;5870:23;5860:33;;5912:38;5946:2;5935:9;5931:18;5912:38;:::i;6354:257::-;6395:3;6433:5;6427:12;6460:6;6455:3;6448:19;6476:63;6532:6;6525:4;6520:3;6516:14;6509:4;6502:5;6498:16;6476:63;:::i;:::-;6593:2;6572:15;-1:-1:-1;;6568:29:1;6559:39;;;;6600:4;6555:50;;6354:257;-1:-1:-1;;6354:257:1:o;6850:1527::-;7074:3;7112:6;7106:13;7138:4;7151:51;7195:6;7190:3;7185:2;7177:6;7173:15;7151:51;:::i;:::-;7265:13;;7224:16;;;;7287:55;7265:13;7224:16;7309:15;;;7287:55;:::i;:::-;7431:13;;7364:20;;;7404:1;;7491;7513:18;;;;7566;;;;7593:93;;7671:4;7661:8;7657:19;7645:31;;7593:93;7734:2;7724:8;7721:16;7701:18;7698:40;7695:167;;;-1:-1:-1;;;7761:33:1;;7817:4;7814:1;7807:15;7847:4;7768:3;7835:17;7695:167;7878:18;7905:110;;;;8029:1;8024:328;;;;7871:481;;7905:110;-1:-1:-1;;7940:24:1;;7926:39;;7985:20;;;;-1:-1:-1;7905:110:1;;8024:328;17018:1;17011:14;;;17055:4;17042:18;;8119:1;8133:169;8147:8;8144:1;8141:15;8133:169;;;8229:14;;8214:13;;;8207:37;8272:16;;;;8164:10;;8133:169;;;8137:3;;8333:8;8326:5;8322:20;8315:27;;7871:481;-1:-1:-1;8368:3:1;;6850:1527;-1:-1:-1;;;;;;;;;;;6850:1527:1:o;8800:488::-;-1:-1:-1;;;;;9069:15:1;;;9051:34;;9121:15;;9116:2;9101:18;;9094:43;9168:2;9153:18;;9146:34;;;9216:3;9211:2;9196:18;;9189:31;;;8994:4;;9237:45;;9262:19;;9254:6;9237:45;:::i;:::-;9229:53;8800:488;-1:-1:-1;;;;;;8800:488:1:o;9293:632::-;9464:2;9516:21;;;9586:13;;9489:18;;;9608:22;;;9435:4;;9464:2;9687:15;;;;9661:2;9646:18;;;9435:4;9730:169;9744:6;9741:1;9738:13;9730:169;;;9805:13;;9793:26;;9874:15;;;;9839:12;;;;9766:1;9759:9;9730:169;;;-1:-1:-1;9916:3:1;;9293:632;-1:-1:-1;;;;;;9293:632:1:o;10525:219::-;10674:2;10663:9;10656:21;10637:4;10694:44;10734:2;10723:9;10719:18;10711:6;10694:44;:::i;12390:414::-;12592:2;12574:21;;;12631:2;12611:18;;;12604:30;12670:34;12665:2;12650:18;;12643:62;-1:-1:-1;;;12736:2:1;12721:18;;12714:48;12794:3;12779:19;;12390:414::o;13226:356::-;13428:2;13410:21;;;13447:18;;;13440:30;13506:34;13501:2;13486:18;;13479:62;13573:2;13558:18;;13226:356::o;17071:128::-;17111:3;17142:1;17138:6;17135:1;17132:13;17129:39;;;17148:18;;:::i;:::-;-1:-1:-1;17184:9:1;;17071:128::o;17204:120::-;17244:1;17270;17260:35;;17275:18;;:::i;:::-;-1:-1:-1;17309:9:1;;17204:120::o;17329:168::-;17369:7;17435:1;17431;17427:6;17423:14;17420:1;17417:21;17412:1;17405:9;17398:17;17394:45;17391:71;;;17442:18;;:::i;:::-;-1:-1:-1;17482:9:1;;17329:168::o;17502:125::-;17542:4;17570:1;17567;17564:8;17561:34;;;17575:18;;:::i;:::-;-1:-1:-1;17612:9:1;;17502:125::o;17632:258::-;17704:1;17714:113;17728:6;17725:1;17722:13;17714:113;;;17804:11;;;17798:18;17785:11;;;17778:39;17750:2;17743:10;17714:113;;;17845:6;17842:1;17839:13;17836:48;;;-1:-1:-1;;17880:1:1;17862:16;;17855:27;17632:258::o;17895:380::-;17974:1;17970:12;;;;18017;;;18038:61;;18092:4;18084:6;18080:17;18070:27;;18038:61;18145:2;18137:6;18134:14;18114:18;18111:38;18108:161;;;18191:10;18186:3;18182:20;18179:1;18172:31;18226:4;18223:1;18216:15;18254:4;18251:1;18244:15;18108:161;;17895:380;;;:::o;18280:135::-;18319:3;-1:-1:-1;;18340:17:1;;18337:43;;;18360:18;;:::i;:::-;-1:-1:-1;18407:1:1;18396:13;;18280:135::o;18420:112::-;18452:1;18478;18468:35;;18483:18;;:::i;:::-;-1:-1:-1;18517:9:1;;18420:112::o;18537:127::-;18598:10;18593:3;18589:20;18586:1;18579:31;18629:4;18626:1;18619:15;18653:4;18650:1;18643:15;18669:127;18730:10;18725:3;18721:20;18718:1;18711:31;18761:4;18758:1;18751:15;18785:4;18782:1;18775:15;18801:127;18862:10;18857:3;18853:20;18850:1;18843:31;18893:4;18890:1;18883:15;18917:4;18914:1;18907:15;18933:127;18994:10;18989:3;18985:20;18982:1;18975:31;19025:4;19022:1;19015:15;19049:4;19046:1;19039:15;19065:131;-1:-1:-1;;;;;;19139:32:1;;19129:43;;19119:71;;19186:1;19183;19176:12
Swarm Source
ipfs://e1667f0a3c301d83bbadd178ce31522a7a66ffb666809918fcbab8e77e8d90cb
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.