More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 657 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 58630083 | 165 days ago | IN | 0 POL | 0.00138234 | ||||
Approve | 58289074 | 173 days ago | IN | 0 POL | 0.00156217 | ||||
Approve | 58157623 | 176 days ago | IN | 0 POL | 0.00361253 | ||||
Set Approval For... | 54910074 | 262 days ago | IN | 0 POL | 0.00461548 | ||||
Set Approval For... | 54019839 | 285 days ago | IN | 0 POL | 0.0021825 | ||||
Set Approval For... | 53739044 | 292 days ago | IN | 0 POL | 0.00637035 | ||||
Safe Transfer Fr... | 49253284 | 407 days ago | IN | 0 POL | 0.00764443 | ||||
Safe Transfer Fr... | 48454572 | 427 days ago | IN | 0 POL | 0.00554767 | ||||
Transfer | 47716034 | 446 days ago | IN | 1.3 POL | 0.00176843 | ||||
Transfer | 47716007 | 446 days ago | IN | 1.3 POL | 0.00180073 | ||||
Transfer | 47715656 | 446 days ago | IN | 1.3 POL | 0.0017945 | ||||
Set Approval For... | 46741336 | 471 days ago | IN | 0 POL | 0.00446898 | ||||
Transfer From | 44589723 | 525 days ago | IN | 0 POL | 0.0116318 | ||||
Mint | 44321101 | 532 days ago | IN | 65 POL | 0.03043781 | ||||
Safe Transfer Fr... | 44009363 | 540 days ago | IN | 0 POL | 0.01506788 | ||||
Mint | 44006482 | 540 days ago | IN | 163 POL | 0.03336331 | ||||
Set Approval For... | 43918286 | 542 days ago | IN | 0 POL | 0.00902756 | ||||
Set Approval For... | 43616780 | 550 days ago | IN | 0 POL | 0.00740121 | ||||
Set Approval For... | 42535721 | 578 days ago | IN | 0 POL | 0.0122697 | ||||
Set Approval For... | 41709865 | 599 days ago | IN | 0 POL | 0.01913457 | ||||
Set Approval For... | 41415467 | 606 days ago | IN | 0 POL | 0.00553944 | ||||
Set Approval For... | 41321753 | 609 days ago | IN | 0 POL | 0.00365453 | ||||
Set Approval For... | 41090304 | 615 days ago | IN | 0 POL | 0.00593937 | ||||
Set Approval For... | 40802344 | 622 days ago | IN | 0 POL | 0.00350254 | ||||
Transfer From | 40726856 | 624 days ago | IN | 0 POL | 0.00903038 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
44321101 | 532 days ago | 65 POL | ||||
44006482 | 540 days ago | 163 POL | ||||
40479769 | 631 days ago | 1.3 POL | ||||
40254678 | 637 days ago | 65 POL | ||||
39592050 | 655 days ago | 19 POL | ||||
39539640 | 656 days ago | 5.2 POL | ||||
38823493 | 675 days ago | 19 POL | ||||
38821618 | 675 days ago | 5.2 POL | ||||
37856540 | 699 days ago | 6.5 POL | ||||
36339310 | 737 days ago | 6.5 POL | ||||
36339174 | 737 days ago | 19 POL | ||||
36334475 | 737 days ago | 32 POL | ||||
36334059 | 737 days ago | 65 POL | ||||
36260073 | 739 days ago | 1.3 POL | ||||
36260068 | 739 days ago | 1.3 POL | ||||
35715319 | 752 days ago | 1.3 POL | ||||
35672339 | 753 days ago | 38 POL | ||||
35469540 | 758 days ago | 32 POL | ||||
31796947 | 849 days ago | 3.9 POL | ||||
31796767 | 849 days ago | 65 POL | ||||
30670853 | 879 days ago | 32.00000032 POL | ||||
30670820 | 879 days ago | 38.00000037 POL | ||||
30670784 | 879 days ago | 3.90000003 POL | ||||
30594923 | 881 days ago | 32.00000032 POL | ||||
30594846 | 881 days ago | 19.00000018 POL |
Loading...
Loading
Contract Name:
MOONCARD
Compiler Version
v0.8.8+commit.dddeac2f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-02-18 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } 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); } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.2; enum Tier { Guardian, // default Magician, Consul, Vizier, Enclave, Regent, SupremeRuler } // Adapted from World of Women: https://etherscan.io/token/0xe785e82358879f061bc3dcac6f0444462d4b5330#readContract pragma solidity ^0.8.2; // Want to launch your own collection ? Check out https://buildship.dev contract AvatarNFT is ERC721, ERC721Enumerable, Ownable { uint256 internal _price; // = 0.03 ether; uint256 internal _reserved; // = 200; uint256 public MAX_SUPPLY; // = 10000; uint256 public MAX_TOKENS_PER_MINT; // = 20; uint256 public startingIndex; address payable beneficiary; bool private _saleStarted; string public PROVENANCE_HASH = ""; string public baseURI; constructor( uint256 _startPrice, uint256 _maxSupply, uint256 _nReserved, uint256 _maxTokensPerMint, string memory _uri, string memory _name, string memory _symbol ) ERC721(_name, _symbol) { _price = _startPrice; _reserved = _nReserved; MAX_SUPPLY = _maxSupply; MAX_TOKENS_PER_MINT = _maxTokensPerMint; baseURI = _uri; } function _baseURI() internal view override returns (string memory) { return baseURI; } function contractURI() public view returns (string memory) { return baseURI; } function setBaseURI(string calldata uri) public onlyOwner { baseURI = uri; } function setBeneficiary(address payable _beneficiary) public virtual onlyOwner { // require non set require(beneficiary == address(0)); beneficiary = _beneficiary; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } modifier whenSaleStarted() { require(_saleStarted, "Sale not started"); _; } function mint(uint256 _nbTokens) whenSaleStarted public payable virtual { uint256 supply = totalSupply(); require(_nbTokens <= MAX_TOKENS_PER_MINT, "You cannot mint more than MAX_TOKENS_PER_MINT tokens at once!"); require(supply + _nbTokens <= MAX_SUPPLY - _reserved, "Not enough Tokens left."); require(_nbTokens * _price <= msg.value, "Inconsistent amount sent!"); for (uint256 i; i < _nbTokens; i++) { _safeMint(msg.sender, supply + i); } } function flipSaleStarted() external onlyOwner { require(beneficiary != address(0), "Beneficiary not set"); _saleStarted = !_saleStarted; if (_saleStarted && startingIndex == 0) { setStartingIndex(); } } function saleStarted() public view returns(bool) { return _saleStarted; } // Make it possible to change the price: just in case function setPrice(uint256 _newPrice) external virtual onlyOwner { _price = _newPrice; } function getPrice() public view virtual returns (uint256){ return _price; } function getReservedLeft() public view virtual returns (uint256) { return _reserved; } // This should be set before sales open. function setProvenanceHash(string memory provenanceHash) public onlyOwner { PROVENANCE_HASH = provenanceHash; } // Helper to list all the tokens of a wallet function walletOfOwner(address _owner) public view returns(uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for(uint256 i; i < tokenCount; i++){ tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } function claimReserved(uint256 _number, address _receiver) external onlyOwner virtual { require(_number <= _reserved, "That would exceed the max reserved."); uint256 _tokenId = totalSupply(); for (uint256 i; i < _number; i++) { _safeMint(_receiver, _tokenId + i); } _reserved = _reserved - _number; } function setStartingIndex() public virtual { require(startingIndex == 0, "Starting index is already set"); // BlockHash only works for the most 256 recent blocks. uint256 _block_shift = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp))); _block_shift = 1 + (_block_shift % 255); // This shouldn't happen, but just in case the blockchain gets a reboot? if (block.number < _block_shift) { _block_shift = 1; } uint256 _block_ref = block.number - _block_shift; startingIndex = uint(blockhash(_block_ref)) % MAX_SUPPLY; // Prevent default sequence if (startingIndex == 0) { startingIndex = startingIndex + 1; } } function withdraw() public virtual onlyOwner { require(beneficiary != address(0), "Beneficiary not set"); uint256 _balance = address(this).balance; require(payable(beneficiary).send(_balance)); } function DEVELOPER() public pure returns (string memory _url) { _url = "https://buildship.dev"; } function DEVELOPER_ADDRESS() public pure returns (address payable _dev) { _dev = payable(0x704C043CeB93bD6cBE570C6A2708c3E1C0310587); } } pragma solidity ^0.8.8; type TierId is uint8; struct Range { // @notice is inclusive of both start and end! uint128 start; uint128 end; } abstract contract TierNFT is AvatarNFT { mapping (TierId => uint256) internal _supplyByTier; // IMPORTANT: must be set in initTiers! mapping (TierId => Range) internal _tierRanges; mapping (TierId => uint256) internal _priceByTier; mapping (TierId => uint256) internal _reservedByTier; TierId immutable FIRST_TIER; TierId immutable LAST_TIER; constructor (uint8 tierLength) { initTiers(tierLength); require(_reserved == 0, "Reserved must be 0 because it tracks separately"); require(tierLength > 0, "Tier length must be greater than 0"); FIRST_TIER = TierId.wrap(0); LAST_TIER = TierId.wrap(tierLength - 1); for (uint8 i = TierId.unwrap(FIRST_TIER); i < TierId.unwrap(LAST_TIER); i++) { TierId nextTier = TierId.wrap(i + 1); TierId tier = TierId.wrap(i); Range memory next = _tierRanges[nextTier]; Range memory current = _tierRanges[tier]; // check that the tier ranges are sorted // but keep in mind they go backwards require(next.start < current.start, "Tier ranges must be sorted"); // check that the tier ranges are connected and not overlapping require(next.end + 1 == current.start, "Tier ranges must not overlap and should connect seamlessly"); } for (uint8 i = TierId.unwrap(FIRST_TIER); i <= TierId.unwrap(LAST_TIER); i++) { TierId tier = TierId.wrap(i); Range memory current = _tierRanges[tier]; // check that the tier ranges are non-empty, ranges are inclusive of both ids require(current.start < current.end + 1, "Tier ranges must not be empty"); } // check that reserved is less than supply for (uint8 i = TierId.unwrap(FIRST_TIER); i <= TierId.unwrap(LAST_TIER); i++) { TierId tier = TierId.wrap(i); require(_reservedByTier[tier] <= _tierRanges[tier].end + 1 - _tierRanges[tier].start, "Tier reserved must be less than or equal to max supply"); } // check that prices aren't zero for (uint8 i = TierId.unwrap(FIRST_TIER); i <= TierId.unwrap(LAST_TIER); i++) { TierId tier = TierId.wrap(i); require(_priceByTier[tier] > 0, "Tier prices must be greater than zero"); } } function initTiers(uint8 tierLength) internal virtual; function getTier(uint256 tokenId) public view returns (TierId) { for (uint8 i = TierId.unwrap(FIRST_TIER); i <= TierId.unwrap(LAST_TIER); i++) { TierId tier = TierId.wrap(i); if (tokenId >= _tierRanges[tier].start && tokenId <= _tierRanges[tier].end) { return tier; } } revert("TokenId not found in any tier"); } function getPrice() public view override virtual returns (uint256) { return getPrice(FIRST_TIER); } function getPrice(TierId tier) public view returns (uint256) { require(TierId.unwrap(tier) >= TierId.unwrap(FIRST_TIER) && TierId.unwrap(tier) <= TierId.unwrap(LAST_TIER), "Invalid tier."); return _priceByTier[tier]; } function getRange(TierId tier) public view returns (uint256, uint256) { return (_tierRanges[tier].start, _tierRanges[tier].end); } function getSupply(TierId tier) public view returns(uint256) { return _supplyByTier[tier]; } function getMaxSupply(TierId tier) public view returns(uint256) { (uint256 start, uint256 end) = getRange(tier); return end - start + 1; // to include range start } function getReservedLeft() public view override virtual returns(uint256) { // total of reserved left uint256 total = 0; for (uint8 i = TierId.unwrap(FIRST_TIER); i <= TierId.unwrap(LAST_TIER); i++) { total += _reservedByTier[ TierId.wrap(i) ]; } return total; } function getReservedLeft(TierId tier) public view returns(uint256) { return _reservedByTier[tier]; } // IMPORTANT to remove this functionality, otherwise it will mess up tier system function setStartingIndex() public override virtual { startingIndex = 0; } function claimReserved(uint256, address) public pure override virtual { revert("Not implemented"); } function claimReserved(TierId tier, uint256 _number, address _receiver) public onlyOwner virtual { require(TierId.unwrap(tier) >= TierId.unwrap(FIRST_TIER) && TierId.unwrap(tier) <= TierId.unwrap(LAST_TIER), "Invalid tier."); require(_number <= _reservedByTier[tier], "That would exceed the max reserved."); uint256 start; (start, ) = getRange(tier); uint256 supply = getSupply(tier); for (uint256 i; i < _number; i++) { // Be careful! Should always update _supplyByTier when minting! _supplyByTier[tier] += 1; _safeMint(_receiver, start + supply + i); } _reservedByTier[tier] -= _number; } function mint(uint256) public payable override virtual { revert("Not implemented"); } function mint(TierId tier, uint256 nTokens) whenSaleStarted public payable virtual { require(TierId.unwrap(tier) >= TierId.unwrap(FIRST_TIER) && TierId.unwrap(tier) <= TierId.unwrap(LAST_TIER), "Invalid tier."); uint256 supply = getSupply(tier); uint256 price = getPrice(tier); uint256 start; (start, ) = getRange(tier); require(nTokens <= MAX_TOKENS_PER_MINT, "You cannot mint more than MAX_TOKENS_PER_MINT tokens at once!"); require(supply + nTokens <= getMaxSupply(tier) - getReservedLeft(tier), "Not enough Tokens left."); require(nTokens * price <= msg.value, "Inconsistent amount sent!"); for (uint256 i; i < nTokens; i++) { // Be careful! Should always update _supplyByTier when minting! _supplyByTier[tier] += 1; _safeMint(msg.sender, start + supply + i); } } } pragma solidity ^0.8.2; abstract contract ReferralNFT is AvatarNFT { // Bonus system uint256 public immutable REFERRAL_PERCENT; // of 10000, = 10% mapping (address => uint256) public userTotalReferrals; mapping (address => uint256) public pendingWithdrawals; event ReferralMinted ( address indexed referral, address buyer, uint256 timestamp, uint256 nTokens, uint256 referralFee, bytes data ); constructor( uint256 _referralPercent ) { REFERRAL_PERCENT = _referralPercent; } /** * Mint tokens with referral info */ function mint(uint256 nTokens, address payable referral) whenSaleStarted external payable virtual { super.mint(nTokens); _updateReferral(nTokens, referral); } function _updateReferral(uint256 nTokens, address payable referral) internal { // Verify its correct referral // Save referral amount for later use if (referral != address(0) && referral != msg.sender && referral != owner() && referral != beneficiary) { userTotalReferrals[referral] += nTokens; pendingWithdrawals[referral] += msg.value * REFERRAL_PERCENT / 10000; emit ReferralMinted( referral, msg.sender, block.timestamp, nTokens, msg.value * REFERRAL_PERCENT / 10000, msg.data ); } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract MOONCARD is ReferralNFT, TierNFT { constructor() AvatarNFT( 1.3 ether, //0.08 ether, // starting price 15111, // total 0, // reserved 20, // max tokens per mint "ipfs://", "NNFT MOON IDCARD", "MOONCARD" ) ReferralNFT(3000 /* referral fee in 0.01% */) TierNFT(7) {} function initTiers(uint8) internal override { // This is in MATIC _priceByTier[TierId.wrap(uint8(Tier.Guardian))] = 1.3 ether; _priceByTier[TierId.wrap(uint8(Tier.Magician))] = 19 ether; _priceByTier[TierId.wrap(uint8(Tier.Consul))] = 32 ether; _priceByTier[TierId.wrap(uint8(Tier.Vizier))] = 65 ether; _priceByTier[TierId.wrap(uint8(Tier.Enclave))] = 163 ether; _priceByTier[TierId.wrap(uint8(Tier.Regent))] = 980 ether; // isn't used, because only 1 and it's reserved _priceByTier[TierId.wrap(uint8(Tier.SupremeRuler))] = 47059 ether; // inverted! _tierRanges[TierId.wrap(uint8(Tier.SupremeRuler))] = Range(0, 0); _tierRanges[TierId.wrap(uint8(Tier.Regent))] = Range(1, 10); _tierRanges[TierId.wrap(uint8(Tier.Enclave))] = Range(11, 510); _tierRanges[TierId.wrap(uint8(Tier.Vizier))] = Range(511, 3110); _tierRanges[TierId.wrap(uint8(Tier.Consul))] = Range(3111, 7110); _tierRanges[TierId.wrap(uint8(Tier.Magician))] = Range(7111, 12110); _tierRanges[TierId.wrap(uint8(Tier.Guardian))] = Range(12111, 15110); } function setTierPrice(TierId tier, uint256 _newPrice) external onlyOwner { _priceByTier[tier] = _newPrice; } function mint(uint256, address payable) public payable override { revert("Not implemented"); } function mint(TierId tier, uint256 nTokens) public payable override { super.mint(tier, nTokens); // Balance is transferred right away at purchase require(payable(beneficiary).send(msg.value)); } function mint(TierId tier, uint256 nTokens, address payable referral) whenSaleStarted public payable { super.mint(tier, nTokens); _updateReferral(nTokens, referral); // Balance is transferred right away at purchase require(payable(beneficiary).send(msg.value)); } // ------ Overrides FOR TierNFT // Override works right-to-left, https://solidity-by-example.org/inheritance/ function getReservedLeft() public view override(AvatarNFT, TierNFT) returns(uint256) { return super.getReservedLeft(); } function getPrice() public view override(AvatarNFT, TierNFT) returns(uint256 price) { return super.getPrice(); } function claimReserved(uint256 nTokens, address receiver) public pure override(AvatarNFT, TierNFT) { // revert("Not implemented"); super.claimReserved(nTokens, receiver); } function setStartingIndex() public override(AvatarNFT, TierNFT) { super.setStartingIndex(); } function mint(uint256 nTokens) public payable override(AvatarNFT, TierNFT) { super.mint(nTokens); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralFee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ReferralMinted","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":"DEVELOPER","outputs":[{"internalType":"string","name":"_url","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"DEVELOPER_ADDRESS","outputs":[{"internalType":"address payable","name":"_dev","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFERRAL_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"},{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"claimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nTokens","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"claimReserved","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"}],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"}],"name":"getRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"}],"name":"getReservedLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReservedLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"}],"name":"getSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTier","outputs":[{"internalType":"TierId","name":"","type":"uint8"}],"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":"TierId","name":"tier","type":"uint8"},{"internalType":"uint256","name":"nTokens","type":"uint256"},{"internalType":"address payable","name":"referral","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address payable","name":"","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"},{"internalType":"uint256","name":"nTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"TierId","name":"tier","type":"uint8"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setTierPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalReferrals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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
6101006040819052600060e08190526200001c9160119162000a18565b503480156200002a57600080fd5b506007610bb867120a871cc0020000613b076000601460405180604001604052806007815260200166697066733a2f2f60c81b8152506040518060400160405280601081526020016f13939195081353d3d388125110d0549160821b815250604051806040016040528060088152602001671353d3d390d0549160c21b81525081818160009080519060200190620000c492919062000a18565b508051620000da90600190602084019062000a18565b505050620000f7620000f16200067060201b60201c565b62000674565b600b879055600c859055600d869055600e84905582516200012090601290602086019062000a18565b505050608095909552506200013c935084925050620006c69050565b600c5415620001aa5760405162461bcd60e51b815260206004820152602f60248201527f5265736572766564206d7573742062652030206265636175736520697420747260448201526e61636b732073657061726174656c7960881b60648201526084015b60405180910390fd5b60008160ff16116200020a5760405162461bcd60e51b815260206004820152602260248201527f54696572206c656e677468206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608401620001a1565b600060a0526200021c60018262000ad4565b7fff0000000000000000000000000000000000000000000000000000000000000060f891821b1660c05260a051901c5b60c05160f81c60ff82161015620003e25760006200026c82600162000afa565b60ff80821660009081526016602081815260408084208151808301835290546001600160801b038082168352600160801b91829004811683860152968a1686529383529381902081518083019092525480861680835293900485169181019190915282519495508694929390921610620003295760405162461bcd60e51b815260206004820152601a60248201527f546965722072616e676573206d75737420626520736f727465640000000000006044820152606401620001a1565b80600001516001600160801b0316826020015160016200034a919062000b22565b6001600160801b031614620003c85760405162461bcd60e51b815260206004820152603a60248201527f546965722072616e676573206d757374206e6f74206f7665726c617020616e6460448201527f2073686f756c6420636f6e6e656374207365616d6c6573736c790000000000006064820152608401620001a1565b505050508080620003d99062000b50565b9150506200024c565b5060a05160f81c5b60c05160f81c60ff821611620004c35760ff81166000908152601660209081526040918290208251808401909352546001600160801b038082168452600160801b909104169082018190528291906200044590600162000b22565b6001600160801b031681600001516001600160801b031610620004ab5760405162461bcd60e51b815260206004820152601d60248201527f546965722072616e676573206d757374206e6f7420626520656d7074790000006044820152606401620001a1565b50508080620004ba9062000b50565b915050620003ea565b5060a05160f81c5b60c05160f81c60ff821611620005c95760ff811660009081526016602052604090205481906001600160801b03808216916200051291600160801b90910416600162000b22565b6200051e919062000b73565b60ff82166000908152601860205260409020546001600160801b03919091161015620005b35760405162461bcd60e51b815260206004820152603660248201527f54696572207265736572766564206d757374206265206c657373207468616e2060448201527f6f7220657175616c20746f206d617820737570706c79000000000000000000006064820152608401620001a1565b5080620005c08162000b50565b915050620004cb565b5060a05160f81c5b60c05160f81c60ff821611620006685760ff81166000908152601760205260409020548190620006525760405162461bcd60e51b815260206004820152602560248201527f5469657220707269636573206d7573742062652067726561746572207468616e604482015264207a65726f60d81b6064820152608401620001a1565b50806200065f8162000b50565b915050620005d1565b505062000bdb565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5067120a871cc00200007fd840e16649f6b9a295d95876f4633d3a6b10b55e8162971cf78afd886d5ec89b55680107ad8f556c6c00007ff36d6bc9642eb6fb6ee9998b09ce990566df752ab06e11f8de7ab633bbd57b8f556801bc16d674ec8000007fc52df653038b2ad477d8d97f1ddd63cfd138847b628ad8a7b89c109c3f8782ca556803860e639d806400007fd8b2bced50346359af71f91110b86cdf684b6ab1c6ca64a7583c044d5c24de5c556808d614546394ac00007f68052a315987b3c92fe6f7df77391bc5a825cabe4950d34f36f8f4e8a6abcb4d556835203b67bccad000007f70266c3d5b8b2375fded59c72bf5f0d74bbb12fdf645a4c8630629f0191fb317556909f712d102bb736c00007fdba639bd458ad7aa817aa5e381ad7ed79ea3aeac2e3d9b2d7c51df9a9229709d5560408051808201825260008082526020828101828152600683526016808352935190516001600160801b03918216600160801b9183168202177fc6a239f207aea309a1b4879cb5411b8facfc2bc1e4cc4717ff2598676c399b5f55855180870187526001808252600a82860190815260058752878652915191519184169184168302919091177f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf05586518088018852600b81526101fe81860190815260048752878652905190519084169084168302177fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5955865180880188526101ff8152610c2681860190815260038752878652905190519084169084168302177ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae5586518088018852610c278152611bc681860190815260028752878652905190519084169084168302177fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485586518088018852611bc78152612f4e8186019081529186528685525190519083169083168202177f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49558551808701909652612f4f8652613b068684019081529380529390915292519051908316921602177f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153dd55565b82805462000a269062000b9e565b90600052602060002090601f01602090048101928262000a4a576000855562000a95565b82601f1062000a6557805160ff191683800117855562000a95565b8280016001018555821562000a95579182015b8281111562000a9557825182559160200191906001019062000a78565b5062000aa392915062000aa7565b5090565b5b8082111562000aa3576000815560010162000aa8565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff84168082101562000af15762000af162000abe565b90039392505050565b600060ff821660ff84168060ff0382111562000b1a5762000b1a62000abe565b019392505050565b60006001600160801b0382811684821680830382111562000b475762000b4762000abe565b01949350505050565b600060ff821660ff81141562000b6a5762000b6a62000abe565b60010192915050565b60006001600160801b038381169083168181101562000b965762000b9662000abe565b039392505050565b600181811c9082168062000bb357607f821691505b6020821081141562000bd557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160f81c60c05160f81c61324562000c5e60003960008181610ce701528181611088015281816112b301528181611e7101526123d7015260008181610cb6015281816110570152818161129101528181611e400152818161225b01526123b50152600081816104fb0152818161212001526121b201526132456000f3fe6080604052600436106103355760003560e01c80636352211e116101ab578063a22cb465116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b146109b5578063f3f43703146109d5578063f5f2ab1414610a02578063ff1b655614610a2257600080fd5b8063e985e9c514610944578063e98665501461098d578063f26748e2146109a257600080fd5b8063c87b56dd116100d1578063c87b56dd146108e4578063cb774d4714610904578063daa023aa1461091a578063e8a3d4851461092f57600080fd5b8063a22cb46514610884578063b0e1d7f3146108a4578063b88d4fde146108c457600080fd5b8063899d7b381161016457806394bf804d1161013e57806394bf804d1461083457806395d89b411461084757806398d5fdca1461085c578063a0712d681461087157600080fd5b8063899d7b38146107e15780638da5cb5b146107f657806391b7f5ed1461081457600080fd5b80636352211e146107125780636c0360eb146107325780636d511e581461074757806370a0823114610777578063715018a6146107975780638505aa77146107ac57600080fd5b806333a8915a116102855780634a5c6f8c116102235780634f6ccce7116101fd5780634f6ccce71461068657806355f804b3146106a65780635a80eb6c146106c65780635c474f9e146106f357600080fd5b80634a5c6f8c146106045780634ef23cad146106245780634f062c5a1461065457600080fd5b80633ccfd60b1161025f5780633ccfd60b1461057b57806342842e0e14610590578063438b6300146105b0578063454e66c8146105dd57600080fd5b806333a8915a146104e957806337f1e7f21461051d5780633c934ab31461053d57600080fd5b806318160ddd116102f25780632715eb15116102cc5780632715eb151461048a5780632f745c591461049d57806332cb6b0c146104bd5780633377cd66146104d357600080fd5b806318160ddd1461042b5780631c31f7101461044a57806323b872dd1461046a57600080fd5b806301ffc9a71461033a57806306fdde031461036f578063081812fc14610391578063095ea7b3146103c95780630bcb0ef1146103eb578063109695231461040b575b600080fd5b34801561034657600080fd5b5061035a610355366004612a8d565b610a37565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b50610384610a48565b6040516103669190612b02565b34801561039d57600080fd5b506103b16103ac366004612b15565b610ada565b6040516001600160a01b039091168152602001610366565b3480156103d557600080fd5b506103e96103e4366004612b43565b610b74565b005b3480156103f757600080fd5b506103e9610406366004612b85565b610c8a565b34801561041757600080fd5b506103e9610426366004612c51565b610e58565b34801561043757600080fd5b506008545b604051908152602001610366565b34801561045657600080fd5b506103e9610465366004612c9a565b610e99565b34801561047657600080fd5b506103e9610485366004612cb7565b610efb565b6103e9610498366004612b85565b610f2c565b3480156104a957600080fd5b5061043c6104b8366004612b43565b610fbd565b3480156104c957600080fd5b5061043c600d5481565b3480156104df57600080fd5b5061043c600e5481565b3480156104f557600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561052957600080fd5b5061043c610538366004612cf8565b611053565b34801561054957600080fd5b50604080518082019091526015815274343a3a38399d1797b13ab4b63239b434b8173232bb60591b6020820152610384565b34801561058757600080fd5b506103e96110e3565b34801561059c57600080fd5b506103e96105ab366004612cb7565b611190565b3480156105bc57600080fd5b506105d06105cb366004612c9a565b6111ab565b6040516103669190612d13565b3480156105e957600080fd5b5073704c043ceb93bd6cbe570c6a2708c3e1c03105876103b1565b34801561061057600080fd5b506103e961061f366004612d57565b61124d565b34801561063057600080fd5b5061043c61063f366004612cf8565b60ff1660009081526018602052604090205490565b34801561066057600080fd5b5061067461066f366004612b15565b61128d565b60405160ff9091168152602001610366565b34801561069257600080fd5b5061043c6106a1366004612b15565b611395565b3480156106b257600080fd5b506103e96106c1366004612d73565b611428565b3480156106d257600080fd5b5061043c6106e1366004612c9a565b60136020526000908152604090205481565b3480156106ff57600080fd5b50601054600160a01b900460ff1661035a565b34801561071e57600080fd5b506103b161072d366004612b15565b61145e565b34801561073e57600080fd5b506103846114d5565b34801561075357600080fd5b5061043c610762366004612cf8565b60ff1660009081526015602052604090205490565b34801561078357600080fd5b5061043c610792366004612c9a565b611563565b3480156107a357600080fd5b506103e96115ea565b3480156107b857600080fd5b506107cc6107c7366004612cf8565b611620565b60408051928352602083019190915201610366565b3480156107ed57600080fd5b506103e961164a565b34801561080257600080fd5b50600a546001600160a01b03166103b1565b34801561082057600080fd5b506103e961082f366004612b15565b611702565b6103e9610842366004612de5565b611731565b34801561085357600080fd5b5061038461176b565b34801561086857600080fd5b5061043c61177a565b6103e961087f366004612b15565b611789565b34801561089057600080fd5b506103e961089f366004612e15565b611792565b3480156108b057600080fd5b506103e96108bf366004612de5565b611857565b3480156108d057600080fd5b506103e96108df366004612e48565b611861565b3480156108f057600080fd5b506103846108ff366004612b15565b611899565b34801561091057600080fd5b5061043c600f5481565b34801561092657600080fd5b5061043c611974565b34801561093b57600080fd5b5061038461197e565b34801561095057600080fd5b5061035a61095f366004612ec8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561099957600080fd5b506103e961198d565b6103e96109b0366004612d57565b611997565b3480156109c157600080fd5b506103e96109d0366004612c9a565b6119d2565b3480156109e157600080fd5b5061043c6109f0366004612c9a565b60146020526000908152604090205481565b348015610a0e57600080fd5b5061043c610a1d366004612cf8565b611a6a565b348015610a2e57600080fd5b50610384611a9a565b6000610a4282611aa7565b92915050565b606060008054610a5790612ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8390612ef6565b8015610ad05780601f10610aa557610100808354040283529160200191610ad0565b820191906000526020600020905b815481529060010190602001808311610ab357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b7f8261145e565b9050806001600160a01b0316836001600160a01b03161415610bed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b4f565b336001600160a01b0382161480610c095750610c09813361095f565b610c7b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b4f565b610c858383611acc565b505050565b600a546001600160a01b03163314610cb45760405162461bcd60e51b8152600401610b4f90612f2b565b7f000000000000000000000000000000000000000000000000000000000000000060ff168360ff1610158015610d1057507f000000000000000000000000000000000000000000000000000000000000000060ff168360ff1611155b610d2c5760405162461bcd60e51b8152600401610b4f90612f60565b60ff8316600090815260186020526040902054821115610d9a5760405162461bcd60e51b815260206004820152602360248201527f5468617420776f756c642065786365656420746865206d61782072657365727660448201526232b21760e91b6064820152608401610b4f565b6000610da584611620565b5090506000610dc38560ff1660009081526015602052604090205490565b905060005b84811015610e295760ff86166000908152601560205260408120805460019290610df3908490612f9d565b90915550610e1790508482610e088587612f9d565b610e129190612f9d565b611b3a565b80610e2181612fb5565b915050610dc8565b5060ff851660009081526018602052604081208054869290610e4c908490612fd0565b90915550505050505050565b600a546001600160a01b03163314610e825760405162461bcd60e51b8152600401610b4f90612f2b565b8051610e9590601190602084019061296a565b5050565b600a546001600160a01b03163314610ec35760405162461bcd60e51b8152600401610b4f90612f2b565b6010546001600160a01b031615610ed957600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b610f053382611b54565b610f215760405162461bcd60e51b8152600401610b4f90612fe7565b610c85838383611c47565b601054600160a01b900460ff16610f785760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610b4f565b610f828383611df2565b610f8c8282612090565b6010546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050610c8557600080fd5b6000610fc883611563565b821061102a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b4f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff16101580156110b157507f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1611155b6110cd5760405162461bcd60e51b8152600401610b4f90612f60565b5060ff1660009081526017602052604090205490565b600a546001600160a01b0316331461110d5760405162461bcd60e51b8152600401610b4f90612f2b565b6010546001600160a01b031661115b5760405162461bcd60e51b815260206004820152601360248201527210995b99599a58da585c9e481b9bdd081cd95d606a1b6044820152606401610b4f565b60105460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505061118d57600080fd5b50565b610c8583838360405180602001604052806000815250611861565b606060006111b883611563565b905060008167ffffffffffffffff8111156111d5576111d5612bc5565b6040519080825280602002602001820160405280156111fe578160200160208202803683370190505b50905060005b82811015611245576112168582610fbd565b82828151811061122857611228613038565b60209081029190910101528061123d81612fb5565b915050611204565b509392505050565b600a546001600160a01b031633146112775760405162461bcd60e51b8152600401610b4f90612f2b565b60ff909116600090815260176020526040902055565b60007f00000000000000000000000000000000000000000000000000000000000000005b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff161161134c5760ff811660009081526016602052604090205481906001600160801b0316841080159061132d575060ff8116600090815260166020526040902054600160801b90046001600160801b03168411155b15611339579392505050565b50806113448161304e565b9150506112b1565b5060405162461bcd60e51b815260206004820152601d60248201527f546f6b656e4964206e6f7420666f756e6420696e20616e7920746965720000006044820152606401610b4f565b60006113a060085490565b82106114035760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b4f565b6008828154811061141657611416613038565b90600052602060002001549050919050565b600a546001600160a01b031633146114525760405162461bcd60e51b8152600401610b4f90612f2b565b610c85601283836129ee565b6000818152600260205260408120546001600160a01b031680610a425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b4f565b601280546114e290612ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461150e90612ef6565b801561155b5780601f106115305761010080835404028352916020019161155b565b820191906000526020600020905b81548152906001019060200180831161153e57829003601f168201915b505050505081565b60006001600160a01b0382166115ce5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b4f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146116145760405162461bcd60e51b8152600401610b4f90612f2b565b61161e6000612202565b565b60ff166000908152601660205260409020546001600160801b0380821692600160801b9092041690565b600a546001600160a01b031633146116745760405162461bcd60e51b8152600401610b4f90612f2b565b6010546001600160a01b03166116c25760405162461bcd60e51b815260206004820152601360248201527210995b99599a58da585c9e481b9bdd081cd95d606a1b6044820152606401610b4f565b6010805460ff600160a01b808304821615810260ff60a01b19909316929092179283905591041680156116f55750600f54155b1561161e5761161e61198d565b600a546001600160a01b0316331461172c5760405162461bcd60e51b8152600401610b4f90612f2b565b600b55565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b5c1b195b595b9d1959608a1b6044820152606401610b4f565b606060018054610a5790612ef6565b6000611784612254565b905090565b61118d81611731565b6001600160a01b0382163314156117eb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b4f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e958282611731565b61186b3383611b54565b6118875760405162461bcd60e51b8152600401610b4f90612fe7565b6118938484848461227f565b50505050565b6000818152600260205260409020546060906001600160a01b03166119185760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b4f565b600061192261197e565b90506000815111611942576040518060200160405280600081525061196d565b8061194c846122b2565b60405160200161195d92919061306e565b6040516020818303038152906040525b9392505050565b60006117846123b0565b606060128054610a5790612ef6565b61161e6000600f55565b6119a18282611df2565b6010546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050610e9557600080fd5b600a546001600160a01b031633146119fc5760405162461bcd60e51b8152600401610b4f90612f2b565b6001600160a01b038116611a615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4f565b61118d81612202565b6000806000611a7884611620565b9092509050611a878282612fd0565b611a92906001612f9d565b949350505050565b601180546114e290612ef6565b60006001600160e01b0319821663780e9d6360e01b1480610a425750610a4282612439565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b018261145e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610e95828260405180602001604052806000815250612489565b6000818152600260205260408120546001600160a01b0316611bcd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b4f565b6000611bd88361145e565b9050806001600160a01b0316846001600160a01b03161480611c135750836001600160a01b0316611c0884610ada565b6001600160a01b0316145b80611a9257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a92565b826001600160a01b0316611c5a8261145e565b6001600160a01b031614611cc25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b4f565b6001600160a01b038216611d245760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b4f565b611d2f8383836124bc565b611d3a600082611acc565b6001600160a01b0383166000908152600360205260408120805460019290611d63908490612fd0565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d91908490612f9d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b601054600160a01b900460ff16611e3e5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610b4f565b7f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1610158015611e9a57507f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1611155b611eb65760405162461bcd60e51b8152600401610b4f90612f60565b60ff821660009081526015602052604081205490611ed384611053565b90506000611ee085611620565b50600e54909150841115611f5c5760405162461bcd60e51b815260206004820152603d60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e204d41585f544f60448201527f4b454e535f5045525f4d494e5420746f6b656e73206174206f6e6365210000006064820152608401610b4f565b60ff8516600090815260186020526040902054611f7886611a6a565b611f829190612fd0565b611f8c8585612f9d565b1115611fda5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f75676820546f6b656e73206c6566742e0000000000000000006044820152606401610b4f565b34611fe5838661309d565b11156120335760405162461bcd60e51b815260206004820152601960248201527f496e636f6e73697374656e7420616d6f756e742073656e7421000000000000006044820152606401610b4f565b60005b848110156120885760ff86166000908152601560205260408120805460019290612061908490612f9d565b9091555061207690503382610e088786612f9d565b8061208081612fb5565b915050612036565b505050505050565b6001600160a01b038116158015906120b157506001600160a01b0381163314155b80156120cb5750600a546001600160a01b03828116911614155b80156120e557506010546001600160a01b03828116911614155b15610e95576001600160a01b03811660009081526013602052604081208054849290612112908490612f9d565b9091555061271090506121457f00000000000000000000000000000000000000000000000000000000000000003461309d565b61214f91906130d2565b6001600160a01b03821660009081526014602052604081208054909190612177908490612f9d565b90915550506001600160a01b0381167f834bb885e56c0e90e3c986b36f9fcdf80a6a6204b6a94b2c31c216b93df7485f3342856127106121d77f00000000000000000000000000000000000000000000000000000000000000003461309d565b6121e191906130d2565b6000366040516121f6969594939291906130e6565b60405180910390a25050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006117847f0000000000000000000000000000000000000000000000000000000000000000611053565b61228a848484611c47565b612296848484846124c7565b6118935760405162461bcd60e51b8152600401610b4f90613139565b6060816122d65750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230057806122ea81612fb5565b91506122f99050600a836130d2565b91506122da565b60008167ffffffffffffffff81111561231b5761231b612bc5565b6040519080825280601f01601f191660200182016040528015612345576020820181803683370190505b5090505b8415611a925761235a600183612fd0565b9150612367600a8661318b565b612372906030612f9d565b60f81b81838151811061238757612387613038565b60200101906001600160f81b031916908160001a9053506123a9600a866130d2565b9450612349565b6000807f00000000000000000000000000000000000000000000000000000000000000005b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff16116124335760ff811660009081526018602052604090205461241f9083612f9d565b91508061242b8161304e565b9150506123d5565b50919050565b60006001600160e01b031982166380ac58cd60e01b148061246a57506001600160e01b03198216635b5e139f60e01b145b80610a4257506301ffc9a760e01b6001600160e01b0319831614610a42565b61249383836125d4565b6124a060008484846124c7565b610c855760405162461bcd60e51b8152600401610b4f90613139565b610c85838383612722565b60006001600160a01b0384163b156125c957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061250b90339089908890889060040161319f565b602060405180830381600087803b15801561252557600080fd5b505af1925050508015612555575060408051601f3d908101601f19168201909252612552918101906131dc565b60015b6125af573d808015612583576040519150601f19603f3d011682016040523d82523d6000602084013e612588565b606091505b5080516125a75760405162461bcd60e51b8152600401610b4f90613139565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a92565b506001949350505050565b6001600160a01b03821661262a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b4f565b6000818152600260205260409020546001600160a01b03161561268f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b4f565b61269b600083836124bc565b6001600160a01b03821660009081526003602052604081208054600192906126c4908490612f9d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831661277d5761277881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127a0565b816001600160a01b0316836001600160a01b0316146127a0576127a083826127da565b6001600160a01b0382166127b757610c8581612877565b826001600160a01b0316826001600160a01b031614610c8557610c858282612926565b600060016127e784611563565b6127f19190612fd0565b600083815260076020526040902054909150808214612844576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061288990600190612fd0565b600083815260096020526040812054600880549394509092849081106128b1576128b1613038565b9060005260206000200154905080600883815481106128d2576128d2613038565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061290a5761290a6131f9565b6001900381819060005260206000200160009055905550505050565b600061293183611563565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461297690612ef6565b90600052602060002090601f01602090048101928261299857600085556129de565b82601f106129b157805160ff19168380011785556129de565b828001600101855582156129de579182015b828111156129de5782518255916020019190600101906129c3565b506129ea929150612a62565b5090565b8280546129fa90612ef6565b90600052602060002090601f016020900481019282612a1c57600085556129de565b82601f10612a355782800160ff198235161785556129de565b828001600101855582156129de579182015b828111156129de578235825591602001919060010190612a47565b5b808211156129ea5760008155600101612a63565b6001600160e01b03198116811461118d57600080fd5b600060208284031215612a9f57600080fd5b813561196d81612a77565b60005b83811015612ac5578181015183820152602001612aad565b838111156118935750506000910152565b60008151808452612aee816020860160208601612aaa565b601f01601f19169290920160200192915050565b60208152600061196d6020830184612ad6565b600060208284031215612b2757600080fd5b5035919050565b6001600160a01b038116811461118d57600080fd5b60008060408385031215612b5657600080fd5b8235612b6181612b2e565b946020939093013593505050565b803560ff81168114612b8057600080fd5b919050565b600080600060608486031215612b9a57600080fd5b612ba384612b6f565b9250602084013591506040840135612bba81612b2e565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612bf657612bf6612bc5565b604051601f8501601f19908116603f01168101908282118183101715612c1e57612c1e612bc5565b81604052809350858152868686011115612c3757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c6357600080fd5b813567ffffffffffffffff811115612c7a57600080fd5b8201601f81018413612c8b57600080fd5b611a9284823560208401612bdb565b600060208284031215612cac57600080fd5b813561196d81612b2e565b600080600060608486031215612ccc57600080fd5b8335612cd781612b2e565b92506020840135612ce781612b2e565b929592945050506040919091013590565b600060208284031215612d0a57600080fd5b61196d82612b6f565b6020808252825182820181905260009190848201906040850190845b81811015612d4b57835183529284019291840191600101612d2f565b50909695505050505050565b60008060408385031215612d6a57600080fd5b612b6183612b6f565b60008060208385031215612d8657600080fd5b823567ffffffffffffffff80821115612d9e57600080fd5b818501915085601f830112612db257600080fd5b813581811115612dc157600080fd5b866020828501011115612dd357600080fd5b60209290920196919550909350505050565b60008060408385031215612df857600080fd5b823591506020830135612e0a81612b2e565b809150509250929050565b60008060408385031215612e2857600080fd5b8235612e3381612b2e565b915060208301358015158114612e0a57600080fd5b60008060008060808587031215612e5e57600080fd5b8435612e6981612b2e565b93506020850135612e7981612b2e565b925060408501359150606085013567ffffffffffffffff811115612e9c57600080fd5b8501601f81018713612ead57600080fd5b612ebc87823560208401612bdb565b91505092959194509250565b60008060408385031215612edb57600080fd5b8235612ee681612b2e565b91506020830135612e0a81612b2e565b600181811c90821680612f0a57607f821691505b6020821081141561243357634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c24b73b30b634b2103a34b2b91760991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612fb057612fb0612f87565b500190565b6000600019821415612fc957612fc9612f87565b5060010190565b600082821015612fe257612fe2612f87565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff81141561306557613065612f87565b60010192915050565b60008351613080818460208801612aaa565b835190830190613094818360208801612aaa565b01949350505050565b60008160001904831182151516156130b7576130b7612f87565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826130e1576130e16130bc565b500490565b60018060a01b038716815285602082015284604082015283606082015260a060808201528160a0820152818360c0830137600081830160c090810191909152601f909201601f1916010195945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261319a5761319a6130bc565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131d290830184612ad6565b9695505050505050565b6000602082840312156131ee57600080fd5b815161196d81612a77565b634e487b7160e01b600052603160045260246000fdfea26469706673582212209c755c8241b579027b3e4653a431beee7bf67dfd2ace2d37ccd5fbe109b3fc7e64736f6c63430008080033
Deployed Bytecode
0x6080604052600436106103355760003560e01c80636352211e116101ab578063a22cb465116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b146109b5578063f3f43703146109d5578063f5f2ab1414610a02578063ff1b655614610a2257600080fd5b8063e985e9c514610944578063e98665501461098d578063f26748e2146109a257600080fd5b8063c87b56dd116100d1578063c87b56dd146108e4578063cb774d4714610904578063daa023aa1461091a578063e8a3d4851461092f57600080fd5b8063a22cb46514610884578063b0e1d7f3146108a4578063b88d4fde146108c457600080fd5b8063899d7b381161016457806394bf804d1161013e57806394bf804d1461083457806395d89b411461084757806398d5fdca1461085c578063a0712d681461087157600080fd5b8063899d7b38146107e15780638da5cb5b146107f657806391b7f5ed1461081457600080fd5b80636352211e146107125780636c0360eb146107325780636d511e581461074757806370a0823114610777578063715018a6146107975780638505aa77146107ac57600080fd5b806333a8915a116102855780634a5c6f8c116102235780634f6ccce7116101fd5780634f6ccce71461068657806355f804b3146106a65780635a80eb6c146106c65780635c474f9e146106f357600080fd5b80634a5c6f8c146106045780634ef23cad146106245780634f062c5a1461065457600080fd5b80633ccfd60b1161025f5780633ccfd60b1461057b57806342842e0e14610590578063438b6300146105b0578063454e66c8146105dd57600080fd5b806333a8915a146104e957806337f1e7f21461051d5780633c934ab31461053d57600080fd5b806318160ddd116102f25780632715eb15116102cc5780632715eb151461048a5780632f745c591461049d57806332cb6b0c146104bd5780633377cd66146104d357600080fd5b806318160ddd1461042b5780631c31f7101461044a57806323b872dd1461046a57600080fd5b806301ffc9a71461033a57806306fdde031461036f578063081812fc14610391578063095ea7b3146103c95780630bcb0ef1146103eb578063109695231461040b575b600080fd5b34801561034657600080fd5b5061035a610355366004612a8d565b610a37565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b50610384610a48565b6040516103669190612b02565b34801561039d57600080fd5b506103b16103ac366004612b15565b610ada565b6040516001600160a01b039091168152602001610366565b3480156103d557600080fd5b506103e96103e4366004612b43565b610b74565b005b3480156103f757600080fd5b506103e9610406366004612b85565b610c8a565b34801561041757600080fd5b506103e9610426366004612c51565b610e58565b34801561043757600080fd5b506008545b604051908152602001610366565b34801561045657600080fd5b506103e9610465366004612c9a565b610e99565b34801561047657600080fd5b506103e9610485366004612cb7565b610efb565b6103e9610498366004612b85565b610f2c565b3480156104a957600080fd5b5061043c6104b8366004612b43565b610fbd565b3480156104c957600080fd5b5061043c600d5481565b3480156104df57600080fd5b5061043c600e5481565b3480156104f557600080fd5b5061043c7f0000000000000000000000000000000000000000000000000000000000000bb881565b34801561052957600080fd5b5061043c610538366004612cf8565b611053565b34801561054957600080fd5b50604080518082019091526015815274343a3a38399d1797b13ab4b63239b434b8173232bb60591b6020820152610384565b34801561058757600080fd5b506103e96110e3565b34801561059c57600080fd5b506103e96105ab366004612cb7565b611190565b3480156105bc57600080fd5b506105d06105cb366004612c9a565b6111ab565b6040516103669190612d13565b3480156105e957600080fd5b5073704c043ceb93bd6cbe570c6a2708c3e1c03105876103b1565b34801561061057600080fd5b506103e961061f366004612d57565b61124d565b34801561063057600080fd5b5061043c61063f366004612cf8565b60ff1660009081526018602052604090205490565b34801561066057600080fd5b5061067461066f366004612b15565b61128d565b60405160ff9091168152602001610366565b34801561069257600080fd5b5061043c6106a1366004612b15565b611395565b3480156106b257600080fd5b506103e96106c1366004612d73565b611428565b3480156106d257600080fd5b5061043c6106e1366004612c9a565b60136020526000908152604090205481565b3480156106ff57600080fd5b50601054600160a01b900460ff1661035a565b34801561071e57600080fd5b506103b161072d366004612b15565b61145e565b34801561073e57600080fd5b506103846114d5565b34801561075357600080fd5b5061043c610762366004612cf8565b60ff1660009081526015602052604090205490565b34801561078357600080fd5b5061043c610792366004612c9a565b611563565b3480156107a357600080fd5b506103e96115ea565b3480156107b857600080fd5b506107cc6107c7366004612cf8565b611620565b60408051928352602083019190915201610366565b3480156107ed57600080fd5b506103e961164a565b34801561080257600080fd5b50600a546001600160a01b03166103b1565b34801561082057600080fd5b506103e961082f366004612b15565b611702565b6103e9610842366004612de5565b611731565b34801561085357600080fd5b5061038461176b565b34801561086857600080fd5b5061043c61177a565b6103e961087f366004612b15565b611789565b34801561089057600080fd5b506103e961089f366004612e15565b611792565b3480156108b057600080fd5b506103e96108bf366004612de5565b611857565b3480156108d057600080fd5b506103e96108df366004612e48565b611861565b3480156108f057600080fd5b506103846108ff366004612b15565b611899565b34801561091057600080fd5b5061043c600f5481565b34801561092657600080fd5b5061043c611974565b34801561093b57600080fd5b5061038461197e565b34801561095057600080fd5b5061035a61095f366004612ec8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561099957600080fd5b506103e961198d565b6103e96109b0366004612d57565b611997565b3480156109c157600080fd5b506103e96109d0366004612c9a565b6119d2565b3480156109e157600080fd5b5061043c6109f0366004612c9a565b60146020526000908152604090205481565b348015610a0e57600080fd5b5061043c610a1d366004612cf8565b611a6a565b348015610a2e57600080fd5b50610384611a9a565b6000610a4282611aa7565b92915050565b606060008054610a5790612ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8390612ef6565b8015610ad05780601f10610aa557610100808354040283529160200191610ad0565b820191906000526020600020905b815481529060010190602001808311610ab357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b7f8261145e565b9050806001600160a01b0316836001600160a01b03161415610bed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b4f565b336001600160a01b0382161480610c095750610c09813361095f565b610c7b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b4f565b610c858383611acc565b505050565b600a546001600160a01b03163314610cb45760405162461bcd60e51b8152600401610b4f90612f2b565b7f000000000000000000000000000000000000000000000000000000000000000060ff168360ff1610158015610d1057507f000000000000000000000000000000000000000000000000000000000000000660ff168360ff1611155b610d2c5760405162461bcd60e51b8152600401610b4f90612f60565b60ff8316600090815260186020526040902054821115610d9a5760405162461bcd60e51b815260206004820152602360248201527f5468617420776f756c642065786365656420746865206d61782072657365727660448201526232b21760e91b6064820152608401610b4f565b6000610da584611620565b5090506000610dc38560ff1660009081526015602052604090205490565b905060005b84811015610e295760ff86166000908152601560205260408120805460019290610df3908490612f9d565b90915550610e1790508482610e088587612f9d565b610e129190612f9d565b611b3a565b80610e2181612fb5565b915050610dc8565b5060ff851660009081526018602052604081208054869290610e4c908490612fd0565b90915550505050505050565b600a546001600160a01b03163314610e825760405162461bcd60e51b8152600401610b4f90612f2b565b8051610e9590601190602084019061296a565b5050565b600a546001600160a01b03163314610ec35760405162461bcd60e51b8152600401610b4f90612f2b565b6010546001600160a01b031615610ed957600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b610f053382611b54565b610f215760405162461bcd60e51b8152600401610b4f90612fe7565b610c85838383611c47565b601054600160a01b900460ff16610f785760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610b4f565b610f828383611df2565b610f8c8282612090565b6010546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050610c8557600080fd5b6000610fc883611563565b821061102a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b4f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff16101580156110b157507f000000000000000000000000000000000000000000000000000000000000000660ff168260ff1611155b6110cd5760405162461bcd60e51b8152600401610b4f90612f60565b5060ff1660009081526017602052604090205490565b600a546001600160a01b0316331461110d5760405162461bcd60e51b8152600401610b4f90612f2b565b6010546001600160a01b031661115b5760405162461bcd60e51b815260206004820152601360248201527210995b99599a58da585c9e481b9bdd081cd95d606a1b6044820152606401610b4f565b60105460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505061118d57600080fd5b50565b610c8583838360405180602001604052806000815250611861565b606060006111b883611563565b905060008167ffffffffffffffff8111156111d5576111d5612bc5565b6040519080825280602002602001820160405280156111fe578160200160208202803683370190505b50905060005b82811015611245576112168582610fbd565b82828151811061122857611228613038565b60209081029190910101528061123d81612fb5565b915050611204565b509392505050565b600a546001600160a01b031633146112775760405162461bcd60e51b8152600401610b4f90612f2b565b60ff909116600090815260176020526040902055565b60007f00000000000000000000000000000000000000000000000000000000000000005b7f000000000000000000000000000000000000000000000000000000000000000660ff168160ff161161134c5760ff811660009081526016602052604090205481906001600160801b0316841080159061132d575060ff8116600090815260166020526040902054600160801b90046001600160801b03168411155b15611339579392505050565b50806113448161304e565b9150506112b1565b5060405162461bcd60e51b815260206004820152601d60248201527f546f6b656e4964206e6f7420666f756e6420696e20616e7920746965720000006044820152606401610b4f565b60006113a060085490565b82106114035760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b4f565b6008828154811061141657611416613038565b90600052602060002001549050919050565b600a546001600160a01b031633146114525760405162461bcd60e51b8152600401610b4f90612f2b565b610c85601283836129ee565b6000818152600260205260408120546001600160a01b031680610a425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b4f565b601280546114e290612ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461150e90612ef6565b801561155b5780601f106115305761010080835404028352916020019161155b565b820191906000526020600020905b81548152906001019060200180831161153e57829003601f168201915b505050505081565b60006001600160a01b0382166115ce5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b4f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146116145760405162461bcd60e51b8152600401610b4f90612f2b565b61161e6000612202565b565b60ff166000908152601660205260409020546001600160801b0380821692600160801b9092041690565b600a546001600160a01b031633146116745760405162461bcd60e51b8152600401610b4f90612f2b565b6010546001600160a01b03166116c25760405162461bcd60e51b815260206004820152601360248201527210995b99599a58da585c9e481b9bdd081cd95d606a1b6044820152606401610b4f565b6010805460ff600160a01b808304821615810260ff60a01b19909316929092179283905591041680156116f55750600f54155b1561161e5761161e61198d565b600a546001600160a01b0316331461172c5760405162461bcd60e51b8152600401610b4f90612f2b565b600b55565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b5c1b195b595b9d1959608a1b6044820152606401610b4f565b606060018054610a5790612ef6565b6000611784612254565b905090565b61118d81611731565b6001600160a01b0382163314156117eb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b4f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e958282611731565b61186b3383611b54565b6118875760405162461bcd60e51b8152600401610b4f90612fe7565b6118938484848461227f565b50505050565b6000818152600260205260409020546060906001600160a01b03166119185760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b4f565b600061192261197e565b90506000815111611942576040518060200160405280600081525061196d565b8061194c846122b2565b60405160200161195d92919061306e565b6040516020818303038152906040525b9392505050565b60006117846123b0565b606060128054610a5790612ef6565b61161e6000600f55565b6119a18282611df2565b6010546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050610e9557600080fd5b600a546001600160a01b031633146119fc5760405162461bcd60e51b8152600401610b4f90612f2b565b6001600160a01b038116611a615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4f565b61118d81612202565b6000806000611a7884611620565b9092509050611a878282612fd0565b611a92906001612f9d565b949350505050565b601180546114e290612ef6565b60006001600160e01b0319821663780e9d6360e01b1480610a425750610a4282612439565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b018261145e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610e95828260405180602001604052806000815250612489565b6000818152600260205260408120546001600160a01b0316611bcd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b4f565b6000611bd88361145e565b9050806001600160a01b0316846001600160a01b03161480611c135750836001600160a01b0316611c0884610ada565b6001600160a01b0316145b80611a9257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611a92565b826001600160a01b0316611c5a8261145e565b6001600160a01b031614611cc25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b4f565b6001600160a01b038216611d245760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b4f565b611d2f8383836124bc565b611d3a600082611acc565b6001600160a01b0383166000908152600360205260408120805460019290611d63908490612fd0565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d91908490612f9d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b601054600160a01b900460ff16611e3e5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b6044820152606401610b4f565b7f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1610158015611e9a57507f000000000000000000000000000000000000000000000000000000000000000660ff168260ff1611155b611eb65760405162461bcd60e51b8152600401610b4f90612f60565b60ff821660009081526015602052604081205490611ed384611053565b90506000611ee085611620565b50600e54909150841115611f5c5760405162461bcd60e51b815260206004820152603d60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e204d41585f544f60448201527f4b454e535f5045525f4d494e5420746f6b656e73206174206f6e6365210000006064820152608401610b4f565b60ff8516600090815260186020526040902054611f7886611a6a565b611f829190612fd0565b611f8c8585612f9d565b1115611fda5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f75676820546f6b656e73206c6566742e0000000000000000006044820152606401610b4f565b34611fe5838661309d565b11156120335760405162461bcd60e51b815260206004820152601960248201527f496e636f6e73697374656e7420616d6f756e742073656e7421000000000000006044820152606401610b4f565b60005b848110156120885760ff86166000908152601560205260408120805460019290612061908490612f9d565b9091555061207690503382610e088786612f9d565b8061208081612fb5565b915050612036565b505050505050565b6001600160a01b038116158015906120b157506001600160a01b0381163314155b80156120cb5750600a546001600160a01b03828116911614155b80156120e557506010546001600160a01b03828116911614155b15610e95576001600160a01b03811660009081526013602052604081208054849290612112908490612f9d565b9091555061271090506121457f0000000000000000000000000000000000000000000000000000000000000bb83461309d565b61214f91906130d2565b6001600160a01b03821660009081526014602052604081208054909190612177908490612f9d565b90915550506001600160a01b0381167f834bb885e56c0e90e3c986b36f9fcdf80a6a6204b6a94b2c31c216b93df7485f3342856127106121d77f0000000000000000000000000000000000000000000000000000000000000bb83461309d565b6121e191906130d2565b6000366040516121f6969594939291906130e6565b60405180910390a25050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006117847f0000000000000000000000000000000000000000000000000000000000000000611053565b61228a848484611c47565b612296848484846124c7565b6118935760405162461bcd60e51b8152600401610b4f90613139565b6060816122d65750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230057806122ea81612fb5565b91506122f99050600a836130d2565b91506122da565b60008167ffffffffffffffff81111561231b5761231b612bc5565b6040519080825280601f01601f191660200182016040528015612345576020820181803683370190505b5090505b8415611a925761235a600183612fd0565b9150612367600a8661318b565b612372906030612f9d565b60f81b81838151811061238757612387613038565b60200101906001600160f81b031916908160001a9053506123a9600a866130d2565b9450612349565b6000807f00000000000000000000000000000000000000000000000000000000000000005b7f000000000000000000000000000000000000000000000000000000000000000660ff168160ff16116124335760ff811660009081526018602052604090205461241f9083612f9d565b91508061242b8161304e565b9150506123d5565b50919050565b60006001600160e01b031982166380ac58cd60e01b148061246a57506001600160e01b03198216635b5e139f60e01b145b80610a4257506301ffc9a760e01b6001600160e01b0319831614610a42565b61249383836125d4565b6124a060008484846124c7565b610c855760405162461bcd60e51b8152600401610b4f90613139565b610c85838383612722565b60006001600160a01b0384163b156125c957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061250b90339089908890889060040161319f565b602060405180830381600087803b15801561252557600080fd5b505af1925050508015612555575060408051601f3d908101601f19168201909252612552918101906131dc565b60015b6125af573d808015612583576040519150601f19603f3d011682016040523d82523d6000602084013e612588565b606091505b5080516125a75760405162461bcd60e51b8152600401610b4f90613139565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a92565b506001949350505050565b6001600160a01b03821661262a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b4f565b6000818152600260205260409020546001600160a01b03161561268f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b4f565b61269b600083836124bc565b6001600160a01b03821660009081526003602052604081208054600192906126c4908490612f9d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831661277d5761277881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127a0565b816001600160a01b0316836001600160a01b0316146127a0576127a083826127da565b6001600160a01b0382166127b757610c8581612877565b826001600160a01b0316826001600160a01b031614610c8557610c858282612926565b600060016127e784611563565b6127f19190612fd0565b600083815260076020526040902054909150808214612844576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061288990600190612fd0565b600083815260096020526040812054600880549394509092849081106128b1576128b1613038565b9060005260206000200154905080600883815481106128d2576128d2613038565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061290a5761290a6131f9565b6001900381819060005260206000200160009055905550505050565b600061293183611563565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461297690612ef6565b90600052602060002090601f01602090048101928261299857600085556129de565b82601f106129b157805160ff19168380011785556129de565b828001600101855582156129de579182015b828111156129de5782518255916020019190600101906129c3565b506129ea929150612a62565b5090565b8280546129fa90612ef6565b90600052602060002090601f016020900481019282612a1c57600085556129de565b82601f10612a355782800160ff198235161785556129de565b828001600101855582156129de579182015b828111156129de578235825591602001919060010190612a47565b5b808211156129ea5760008155600101612a63565b6001600160e01b03198116811461118d57600080fd5b600060208284031215612a9f57600080fd5b813561196d81612a77565b60005b83811015612ac5578181015183820152602001612aad565b838111156118935750506000910152565b60008151808452612aee816020860160208601612aaa565b601f01601f19169290920160200192915050565b60208152600061196d6020830184612ad6565b600060208284031215612b2757600080fd5b5035919050565b6001600160a01b038116811461118d57600080fd5b60008060408385031215612b5657600080fd5b8235612b6181612b2e565b946020939093013593505050565b803560ff81168114612b8057600080fd5b919050565b600080600060608486031215612b9a57600080fd5b612ba384612b6f565b9250602084013591506040840135612bba81612b2e565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612bf657612bf6612bc5565b604051601f8501601f19908116603f01168101908282118183101715612c1e57612c1e612bc5565b81604052809350858152868686011115612c3757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c6357600080fd5b813567ffffffffffffffff811115612c7a57600080fd5b8201601f81018413612c8b57600080fd5b611a9284823560208401612bdb565b600060208284031215612cac57600080fd5b813561196d81612b2e565b600080600060608486031215612ccc57600080fd5b8335612cd781612b2e565b92506020840135612ce781612b2e565b929592945050506040919091013590565b600060208284031215612d0a57600080fd5b61196d82612b6f565b6020808252825182820181905260009190848201906040850190845b81811015612d4b57835183529284019291840191600101612d2f565b50909695505050505050565b60008060408385031215612d6a57600080fd5b612b6183612b6f565b60008060208385031215612d8657600080fd5b823567ffffffffffffffff80821115612d9e57600080fd5b818501915085601f830112612db257600080fd5b813581811115612dc157600080fd5b866020828501011115612dd357600080fd5b60209290920196919550909350505050565b60008060408385031215612df857600080fd5b823591506020830135612e0a81612b2e565b809150509250929050565b60008060408385031215612e2857600080fd5b8235612e3381612b2e565b915060208301358015158114612e0a57600080fd5b60008060008060808587031215612e5e57600080fd5b8435612e6981612b2e565b93506020850135612e7981612b2e565b925060408501359150606085013567ffffffffffffffff811115612e9c57600080fd5b8501601f81018713612ead57600080fd5b612ebc87823560208401612bdb565b91505092959194509250565b60008060408385031215612edb57600080fd5b8235612ee681612b2e565b91506020830135612e0a81612b2e565b600181811c90821680612f0a57607f821691505b6020821081141561243357634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c24b73b30b634b2103a34b2b91760991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612fb057612fb0612f87565b500190565b6000600019821415612fc957612fc9612f87565b5060010190565b600082821015612fe257612fe2612f87565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff81141561306557613065612f87565b60010192915050565b60008351613080818460208801612aaa565b835190830190613094818360208801612aaa565b01949350505050565b60008160001904831182151516156130b7576130b7612f87565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826130e1576130e16130bc565b500490565b60018060a01b038716815285602082015284604082015283606082015260a060808201528160a0820152818360c0830137600081830160c090810191909152601f909201601f1916010195945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261319a5761319a6130bc565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131d290830184612ad6565b9695505050505050565b6000602082840312156131ee57600080fd5b815161196d81612a77565b634e487b7160e01b600052603160045260246000fdfea26469706673582212209c755c8241b579027b3e4653a431beee7bf67dfd2ace2d37ccd5fbe109b3fc7e64736f6c63430008080033
Deployed Bytecode Sourcemap
56086:3209:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41368:212;;;;;;;;;;-1:-1:-1;41368:212:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;41368:212:0;;;;;;;;18123:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19682:221::-;;;;;;;;;;-1:-1:-1;19682:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;19682:221:0;1528:203:1;19205:411:0;;;;;;;;;;-1:-1:-1;19205:411:0;;;;;:::i;:::-;;:::i;:::-;;49867:714;;;;;;;;;;-1:-1:-1;49867:714:0;;;;;:::i;:::-;;:::i;43002:125::-;;;;;;;;;;-1:-1:-1;43002:125:0;;;;;:::i;:::-;;:::i;31693:113::-;;;;;;;;;;-1:-1:-1;31781:10:0;:17;31693:113;;;4187:25:1;;;4175:2;4160:18;31693:113:0;4041:177:1;40949:199:0;;;;;;;;;;-1:-1:-1;40949:199:0;;;;;:::i;:::-;;:::i;20572:339::-;;;;;;;;;;-1:-1:-1;20572:339:0;;;;;:::i;:::-;;:::i;58144:308::-;;;;;;:::i;:::-;;:::i;31361:256::-;;;;;;;;;;-1:-1:-1;31361:256:0;;;;;:::i;:::-;;:::i;39941:25::-;;;;;;;;;;;;;;;;39985:34;;;;;;;;;;;;;;;;51720:41;;;;;;;;;;;;;;;48385:245;;;;;;;;;;-1:-1:-1;48385:245:0;;;;;:::i;:::-;;:::i;44930:111::-;;;;;;;;;;-1:-1:-1;45003:30:0;;;;;;;;;;;;-1:-1:-1;;;45003:30:0;;;;44930:111;;44691:231;;;;;;;;;;;;;:::i;20982:185::-;;;;;;;;;;-1:-1:-1;20982:185:0;;;;;:::i;:::-;;:::i;43185:342::-;;;;;;;;;;-1:-1:-1;43185:342:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45049:149::-;;;;;;;;;;-1:-1:-1;45147:42:0;45049:149;;57662:122;;;;;;;;;;-1:-1:-1;57662:122:0;;;;;:::i;:::-;;:::i;49441:114::-;;;;;;;;;;-1:-1:-1;49441:114:0;;;;;:::i;:::-;49526:21;;49499:7;49526:21;;;:15;:21;;;;;;;49441:114;47852:404;;;;;;;;;;-1:-1:-1;47852:404:0;;;;;:::i;:::-;;:::i;:::-;;;7251:4:1;7239:17;;;7221:36;;7209:2;7194:18;47852:404:0;7050:213:1;31883:233:0;;;;;;;;;;-1:-1:-1;31883:233:0;;;;;:::i;:::-;;:::i;40851:90::-;;;;;;;;;;-1:-1:-1;40851:90:0;;;;;:::i;:::-;;:::i;51787:54::-;;;;;;;;;;-1:-1:-1;51787:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;42488:87;;;;;;;;;;-1:-1:-1;42555:12:0;;-1:-1:-1;;;42555:12:0;;;;42488:87;;17817:239;;;;;;;;;;-1:-1:-1;17817:239:0;;;;;:::i;:::-;;:::i;40185:21::-;;;;;;;;;;;;;:::i;48792:106::-;;;;;;;;;;-1:-1:-1;48792:106:0;;;;;:::i;:::-;48871:19;;48844:7;48871:19;;;:13;:19;;;;;;;48792:106;17547:208;;;;;;;;;;-1:-1:-1;17547:208:0;;;;;:::i;:::-;;:::i;38797:94::-;;;;;;;;;;;;;:::i;48638:146::-;;;;;;;;;;-1:-1:-1;48638:146:0;;;;;:::i;:::-;;:::i;:::-;;;;8039:25:1;;;8095:2;8080:18;;8073:34;;;;8012:18;48638:146:0;7865:248:1;42220:260:0;;;;;;;;;;;;;:::i;38146:87::-;;;;;;;;;;-1:-1:-1;38219:6:0;;-1:-1:-1;;;;;38219:6:0;38146:87;;42642:101;;;;;;;;;;-1:-1:-1;42642:101:0;;;;;:::i;:::-;;:::i;57792:108::-;;;;;;:::i;:::-;;:::i;18292:104::-;;;;;;;;;;;;;:::i;58725:126::-;;;;;;;;;;;;;:::i;59177:113::-;;;;;;:::i;:::-;;:::i;19975:295::-;;;;;;;;;;-1:-1:-1;19975:295:0;;;;;:::i;:::-;;:::i;58859:195::-;;;;;;;;;;-1:-1:-1;58859:195:0;;;;;:::i;:::-;;:::i;21238:328::-;;;;;;;;;;-1:-1:-1;21238:328:0;;;;;:::i;:::-;;:::i;18467:334::-;;;;;;;;;;-1:-1:-1;18467:334:0;;;;;:::i;:::-;;:::i;40037:28::-;;;;;;;;;;;;;;;;58583:134;;;;;;;;;;;;;:::i;40751:92::-;;;;;;;;;;;;;:::i;20341:164::-;;;;;;;;;;-1:-1:-1;20341:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;20462:25:0;;;20438:4;20462:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;20341:164;59062:107;;;;;;;;;;;;;:::i;57908:228::-;;;;;;:::i;:::-;;:::i;39046:192::-;;;;;;;;;;-1:-1:-1;39046:192:0;;;;;:::i;:::-;;:::i;51848:54::-;;;;;;;;;;-1:-1:-1;51848:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;48906:191;;;;;;;;;;-1:-1:-1;48906:191:0;;;;;:::i;:::-;;:::i;40144:34::-;;;;;;;;;;;;;:::i;41368:212::-;41507:4;41536:36;41560:11;41536:23;:36::i;:::-;41529:43;41368:212;-1:-1:-1;;41368:212:0:o;18123:100::-;18177:13;18210:5;18203:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18123:100;:::o;19682:221::-;19758:7;23165:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23165:16:0;19778:73;;;;-1:-1:-1;;;19778:73:0;;10967:2:1;19778:73:0;;;10949:21:1;11006:2;10986:18;;;10979:30;11045:34;11025:18;;;11018:62;-1:-1:-1;;;11096:18:1;;;11089:42;11148:19;;19778:73:0;;;;;;;;;-1:-1:-1;19871:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19871:24:0;;19682:221::o;19205:411::-;19286:13;19302:23;19317:7;19302:14;:23::i;:::-;19286:39;;19350:5;-1:-1:-1;;;;;19344:11:0;:2;-1:-1:-1;;;;;19344:11:0;;;19336:57;;;;-1:-1:-1;;;19336:57:0;;11380:2:1;19336:57:0;;;11362:21:1;11419:2;11399:18;;;11392:30;11458:34;11438:18;;;11431:62;-1:-1:-1;;;11509:18:1;;;11502:31;11550:19;;19336:57:0;11178:397:1;19336:57:0;682:10;-1:-1:-1;;;;;19428:21:0;;;;:62;;-1:-1:-1;19453:37:0;19470:5;682:10;20341:164;:::i;19453:37::-;19406:168;;;;-1:-1:-1;;;19406:168:0;;11782:2:1;19406:168:0;;;11764:21:1;11821:2;11801:18;;;11794:30;11860:34;11840:18;;;11833:62;11931:26;11911:18;;;11904:54;11975:19;;19406:168:0;11580:420:1;19406:168:0;19587:21;19596:2;19600:7;19587:8;:21::i;:::-;19275:341;19205:411;;:::o;49867:714::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;50020:10:::1;49983:48;;49997:4;49983:48;;;;:99;;;;;50072:9;50035:47;;50049:4;50035:47;;;;49983:99;49975:125;;;;-1:-1:-1::0;;;49975:125:0::1;;;;;;;:::i;:::-;50132:21;::::0;::::1;;::::0;;;:15:::1;:21;::::0;;;;;50121:32;::::1;;50113:80;;;::::0;-1:-1:-1;;;50113:80:0;;12910:2:1;50113:80:0::1;::::0;::::1;12892:21:1::0;12949:2;12929:18;;;12922:30;12988:34;12968:18;;;12961:62;-1:-1:-1;;;13039:18:1;;;13032:33;13082:19;;50113:80:0::1;12708:399:1::0;50113:80:0::1;50206:13;50242:14;50251:4;50242:8;:14::i;:::-;-1:-1:-1::0;50230:26:0;-1:-1:-1;50267:14:0::1;50284:15;50294:4:::0;48871:19;;48844:7;48871:19;;;:13;:19;;;;;;;48792:106;50284:15:::1;50267:32;;50317:9;50312:217;50332:7;50328:1;:11;50312:217;;;50438:19;::::0;::::1;;::::0;;;:13:::1;:19;::::0;;;;:24;;50461:1:::1;::::0;50438:19;:24:::1;::::0;50461:1;;50438:24:::1;:::i;:::-;::::0;;;-1:-1:-1;50477:40:0::1;::::0;-1:-1:-1;50487:9:0;50515:1;50498:14:::1;50506:6:::0;50498:5;:14:::1;:::i;:::-;:18;;;;:::i;:::-;50477:9;:40::i;:::-;50341:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50312:217;;;-1:-1:-1::0;50541:21:0::1;::::0;::::1;;::::0;;;:15:::1;:21;::::0;;;;:32;;50566:7;;50541:21;:32:::1;::::0;50566:7;;50541:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;49867:714:0:o;43002:125::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;43087:32;;::::1;::::0;:15:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;43002:125:::0;:::o;40949:199::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;41075:11:::1;::::0;-1:-1:-1;;;;;41075:11:0::1;:25:::0;41067:34:::1;;;::::0;::::1;;41114:11;:26:::0;;-1:-1:-1;;;;;;41114:26:0::1;-1:-1:-1::0;;;;;41114:26:0;;;::::1;::::0;;;::::1;::::0;;40949:199::o;20572:339::-;20767:41;682:10;20800:7;20767:18;:41::i;:::-;20759:103;;;;-1:-1:-1;;;20759:103:0;;;;;;;:::i;:::-;20875:28;20885:4;20891:2;20895:7;20875:9;:28::i;58144:308::-;41634:12;;-1:-1:-1;;;41634:12:0;;;;41626:41;;;;-1:-1:-1;;;41626:41:0;;14267:2:1;41626:41:0;;;14249:21:1;14306:2;14286:18;;;14279:30;-1:-1:-1;;;14325:18:1;;;14318:46;14381:18;;41626:41:0;14065:340:1;41626:41:0;58256:25:::1;58267:4;58273:7;58256:10;:25::i;:::-;58294:34;58310:7;58319:8;58294:15;:34::i;:::-;58415:11;::::0;58407:36:::1;::::0;-1:-1:-1;;;;;58415:11:0;;::::1;::::0;58433:9:::1;58407:36:::0;::::1;;;::::0;58415:11:::1;58407:36:::0;58415:11;58407:36;58433:9;58415:11;58407:36;::::1;;;;;;58399:45;;;::::0;::::1;31361:256:::0;31458:7;31494:23;31511:5;31494:16;:23::i;:::-;31486:5;:31;31478:87;;;;-1:-1:-1;;;31478:87:0;;14612:2:1;31478:87:0;;;14594:21:1;14651:2;14631:18;;;14624:30;14690:34;14670:18;;;14663:62;-1:-1:-1;;;14741:18:1;;;14734:41;14792:19;;31478:87:0;14410:407:1;31478:87:0;-1:-1:-1;;;;;;31583:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;31361:256::o;48385:245::-;48437:7;48502:10;48465:48;;48479:4;48465:48;;;;:99;;;;;48554:9;48517:47;;48531:4;48517:47;;;;48465:99;48457:125;;;;-1:-1:-1;;;48457:125:0;;;;;;;:::i;:::-;-1:-1:-1;48602:18:0;;;;;;:12;:18;;;;;;;48385:245::o;44691:231::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;44755:11:::1;::::0;-1:-1:-1;;;;;44755:11:0::1;44747:57;;;::::0;-1:-1:-1;;;44747:57:0;;15024:2:1;44747:57:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;-1:-1:-1;;;15082:18:1;;;15075:49;15141:18;;44747:57:0::1;14822:343:1::0;44747:57:0::1;44886:11;::::0;44878:35:::1;::::0;44836:21:::1;::::0;-1:-1:-1;;;;;44886:11:0::1;::::0;44878:35;::::1;;;::::0;44836:21;;44817:16:::1;44878:35:::0;44817:16;44878:35;44836:21;44886:11;44878:35;::::1;;;;;;44870:44;;;::::0;::::1;;44736:186;44691:231::o:0;20982:185::-;21120:39;21137:4;21143:2;21147:7;21120:39;;;;;;;;;;;;:16;:39::i;43185:342::-;43244:16;43273:18;43294:17;43304:6;43294:9;:17::i;:::-;43273:38;;43324:25;43366:10;43352:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43352:25:0;;43324:53;;43392:9;43388:106;43407:10;43403:1;:14;43388:106;;;43452:30;43472:6;43480:1;43452:19;:30::i;:::-;43438:8;43447:1;43438:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;43419:3;;;;:::i;:::-;;;;43388:106;;;-1:-1:-1;43511:8:0;43185:342;-1:-1:-1;;;43185:342:0:o;57662:122::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;57746:18:::1;::::0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:30;57662:122::o;47852:404::-;47907:6;47955:10;47926:271;47987:9;47968:29;;:1;:29;;;47926:271;;48079:17;;;48019:11;48079:17;;;:11;:17;;;;;:23;48045:1;;-1:-1:-1;;;;;48079:23:0;48068:34;;;;;:70;;-1:-1:-1;48117:17:0;;;;;;;:11;:17;;;;;:21;-1:-1:-1;;;48117:21:0;;-1:-1:-1;;;;;48117:21:0;48106:32;;;48068:70;48064:122;;;48166:4;47852:404;-1:-1:-1;;;47852:404:0:o;48064:122::-;-1:-1:-1;47999:3:0;;;;:::i;:::-;;;;47926:271;;;-1:-1:-1;48209:39:0;;-1:-1:-1;;;48209:39:0;;15684:2:1;48209:39:0;;;15666:21:1;15723:2;15703:18;;;15696:30;15762:31;15742:18;;;15735:59;15811:18;;48209:39:0;15482:353:1;31883:233:0;31958:7;31994:30;31781:10;:17;;31693:113;31994:30;31986:5;:38;31978:95;;;;-1:-1:-1;;;31978:95:0;;16042:2:1;31978:95:0;;;16024:21:1;16081:2;16061:18;;;16054:30;16120:34;16100:18;;;16093:62;-1:-1:-1;;;16171:18:1;;;16164:42;16223:19;;31978:95:0;15840:408:1;31978:95:0;32091:10;32102:5;32091:17;;;;;;;;:::i;:::-;;;;;;;;;32084:24;;31883:233;;;:::o;40851:90::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;40920:13:::1;:7;40930:3:::0;;40920:13:::1;:::i;17817:239::-:0;17889:7;17925:16;;;:7;:16;;;;;;-1:-1:-1;;;;;17925:16:0;17960:19;17952:73;;;;-1:-1:-1;;;17952:73:0;;16455:2:1;17952:73:0;;;16437:21:1;16494:2;16474:18;;;16467:30;16533:34;16513:18;;;16506:62;-1:-1:-1;;;16584:18:1;;;16577:39;16633:19;;17952:73:0;16253:405:1;40185:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17547:208::-;17619:7;-1:-1:-1;;;;;17647:19:0;;17639:74;;;;-1:-1:-1;;;17639:74:0;;16865:2:1;17639:74:0;;;16847:21:1;16904:2;16884:18;;;16877:30;16943:34;16923:18;;;16916:62;-1:-1:-1;;;16994:18:1;;;16987:40;17044:19;;17639:74:0;16663:406:1;17639:74:0;-1:-1:-1;;;;;;17731:16:0;;;;;:9;:16;;;;;;;17547:208::o;38797:94::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;38862:21:::1;38880:1;38862:9;:21::i;:::-;38797:94::o:0;48638:146::-;48727:17;;48690:7;48727:17;;;:11;:17;;;;;:23;-1:-1:-1;;;;;48727:23:0;;;;-1:-1:-1;;;48752:21:0;;;;;48638:146::o;42220:260::-;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;42285:11:::1;::::0;-1:-1:-1;;;;;42285:11:0::1;42277:57;;;::::0;-1:-1:-1;;;42277:57:0;;15024:2:1;42277:57:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;-1:-1:-1;;;15082:18:1;;;15075:49;15141:18;;42277:57:0::1;14822:343:1::0;42277:57:0::1;42363:12;::::0;;::::1;-1:-1:-1::0;;;42363:12:0;;::::1;::::0;::::1;42362:13;42347:28:::0;::::1;-1:-1:-1::0;;;;42347:28:0;;::::1;::::0;;;::::1;::::0;;;;42392:12;::::1;;:34:::0;::::1;;;-1:-1:-1::0;42408:13:0::1;::::0;:18;42392:34:::1;42388:85;;;42443:18;:16;:18::i;42642:101::-:0;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;42717:6:::1;:18:::0;42642:101::o;57792:108::-;57867:25;;-1:-1:-1;;;57867:25:0;;17276:2:1;57867:25:0;;;17258:21:1;17315:2;17295:18;;;17288:30;-1:-1:-1;;;17334:18:1;;;17327:45;17389:18;;57867:25:0;17074:339:1;18292:104:0;18348:13;18381:7;18374:14;;;;;:::i;58725:126::-;58794:13;58827:16;:14;:16::i;:::-;58820:23;;58725:126;:::o;59177:113::-;59263:19;59274:7;59263:10;:19::i;19975:295::-;-1:-1:-1;;;;;20078:24:0;;682:10;20078:24;;20070:62;;;;-1:-1:-1;;;20070:62:0;;17620:2:1;20070:62:0;;;17602:21:1;17659:2;17639:18;;;17632:30;17698:27;17678:18;;;17671:55;17743:18;;20070:62:0;17418:349:1;20070:62:0;682:10;20145:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20145:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;20145:53:0;;;;;;;;;;20214:48;;540:41:1;;;20145:42:0;;682:10;20214:48;;513:18:1;20214:48:0;;;;;;;19975:295;;:::o;58859:195::-;59008:38;59028:7;59037:8;59008:19;:38::i;21238:328::-;21413:41;682:10;21446:7;21413:18;:41::i;:::-;21405:103;;;;-1:-1:-1;;;21405:103:0;;;;;;;:::i;:::-;21519:39;21533:4;21539:2;21543:7;21552:5;21519:13;:39::i;:::-;21238:328;;;;:::o;18467:334::-;23141:4;23165:16;;;:7;:16;;;;;;18540:13;;-1:-1:-1;;;;;23165:16:0;18566:76;;;;-1:-1:-1;;;18566:76:0;;17974:2:1;18566:76:0;;;17956:21:1;18013:2;17993:18;;;17986:30;18052:34;18032:18;;;18025:62;-1:-1:-1;;;18103:18:1;;;18096:45;18158:19;;18566:76:0;17772:411:1;18566:76:0;18655:21;18679:10;:8;:10::i;:::-;18655:34;;18731:1;18713:7;18707:21;:25;:86;;;;;;;;;;;;;;;;;18759:7;18768:18;:7;:16;:18::i;:::-;18742:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18707:86;18700:93;18467:334;-1:-1:-1;;;18467:334:0:o;58583:134::-;58659:7;58686:23;:21;:23::i;40751:92::-;40795:13;40828:7;40821:14;;;;;:::i;59062:107::-;59137:24;49728:1;49712:13;:17;49649:88;57908:228;57987:25;57998:4;58004:7;57987:10;:25::i;:::-;58099:11;;58091:36;;-1:-1:-1;;;;;58099:11:0;;;;58117:9;58091:36;;;;;58099:11;58091:36;58099:11;58091:36;58117:9;58099:11;58091:36;;;;;;;58083:45;;;;;39046:192;38219:6;;-1:-1:-1;;;;;38219:6:0;682:10;38366:23;38358:68;;;;-1:-1:-1;;;38358:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39135:22:0;::::1;39127:73;;;::::0;-1:-1:-1;;;39127:73:0;;18865:2:1;39127:73:0::1;::::0;::::1;18847:21:1::0;18904:2;18884:18;;;18877:30;18943:34;18923:18;;;18916:62;-1:-1:-1;;;18994:18:1;;;18987:36;19040:19;;39127:73:0::1;18663:402:1::0;39127:73:0::1;39211:19;39221:8;39211:9;:19::i;48906:191::-:0;48961:7;48982:13;48997:11;49012:14;49021:4;49012:8;:14::i;:::-;48981:45;;-1:-1:-1;48981:45:0;-1:-1:-1;49046:11:0;48981:45;;49046:11;:::i;:::-;:15;;49060:1;49046:15;:::i;:::-;49039:22;48906:191;-1:-1:-1;;;;48906:191:0:o;40144:34::-;;;;;;;:::i;31053:224::-;31155:4;-1:-1:-1;;;;;;31179:50:0;;-1:-1:-1;;;31179:50:0;;:90;;;31233:36;31257:11;31233:23;:36::i;27058:174::-;27133:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;27133:29:0;-1:-1:-1;;;;;27133:29:0;;;;;;;;:24;;27187:23;27133:24;27187:14;:23::i;:::-;-1:-1:-1;;;;;27178:46:0;;;;;;;;;;;27058:174;;:::o;24060:110::-;24136:26;24146:2;24150:7;24136:26;;;;;;;;;;;;:9;:26::i;23370:348::-;23463:4;23165:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23165:16:0;23480:73;;;;-1:-1:-1;;;23480:73:0;;19272:2:1;23480:73:0;;;19254:21:1;19311:2;19291:18;;;19284:30;19350:34;19330:18;;;19323:62;-1:-1:-1;;;19401:18:1;;;19394:42;19453:19;;23480:73:0;19070:408:1;23480:73:0;23564:13;23580:23;23595:7;23580:14;:23::i;:::-;23564:39;;23633:5;-1:-1:-1;;;;;23622:16:0;:7;-1:-1:-1;;;;;23622:16:0;;:51;;;;23666:7;-1:-1:-1;;;;;23642:31:0;:20;23654:7;23642:11;:20::i;:::-;-1:-1:-1;;;;;23642:31:0;;23622:51;:87;;;-1:-1:-1;;;;;;20462:25:0;;;20438:4;20462:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;23677:32;20341:164;26362:578;26521:4;-1:-1:-1;;;;;26494:31:0;:23;26509:7;26494:14;:23::i;:::-;-1:-1:-1;;;;;26494:31:0;;26486:85;;;;-1:-1:-1;;;26486:85:0;;19685:2:1;26486:85:0;;;19667:21:1;19724:2;19704:18;;;19697:30;19763:34;19743:18;;;19736:62;-1:-1:-1;;;19814:18:1;;;19807:39;19863:19;;26486:85:0;19483:405:1;26486:85:0;-1:-1:-1;;;;;26590:16:0;;26582:65;;;;-1:-1:-1;;;26582:65:0;;20095:2:1;26582:65:0;;;20077:21:1;20134:2;20114:18;;;20107:30;20173:34;20153:18;;;20146:62;-1:-1:-1;;;20224:18:1;;;20217:34;20268:19;;26582:65:0;19893:400:1;26582:65:0;26660:39;26681:4;26687:2;26691:7;26660:20;:39::i;:::-;26764:29;26781:1;26785:7;26764:8;:29::i;:::-;-1:-1:-1;;;;;26806:15:0;;;;;;:9;:15;;;;;:20;;26825:1;;26806:15;:20;;26825:1;;26806:20;:::i;:::-;;;;-1:-1:-1;;;;;;;26837:13:0;;;;;;:9;:13;;;;;:18;;26854:1;;26837:13;:18;;26854:1;;26837:18;:::i;:::-;;;;-1:-1:-1;;26866:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;26866:21:0;-1:-1:-1;;;;;26866:21:0;;;;;;;;;26905:27;;26866:16;;26905:27;;;;;;;26362:578;;;:::o;50696:909::-;41634:12;;-1:-1:-1;;;41634:12:0;;;;41626:41;;;;-1:-1:-1;;;41626:41:0;;14267:2:1;41626:41:0;;;14249:21:1;14306:2;14286:18;;;14279:30;-1:-1:-1;;;14325:18:1;;;14318:46;14381:18;;41626:41:0;14065:340:1;41626:41:0;50835:10:::1;50798:48;;50812:4;50798:48;;;;:99;;;;;50887:9;50850:47;;50864:4;50850:47;;;;50798:99;50790:125;;;;-1:-1:-1::0;;;50790:125:0::1;;;;;;;:::i;:::-;48871:19:::0;;;50928:14:::1;48871:19:::0;;;:13;:19;;;;;;;50987:14:::1;48871:19:::0;50987:8:::1;:14::i;:::-;50971:30;;51012:13;51048:14;51057:4;51048:8;:14::i;:::-;-1:-1:-1::0;51094:19:0::1;::::0;51036:26;;-1:-1:-1;51083:30:0;::::1;;51075:104;;;::::0;-1:-1:-1;;;51075:104:0;;20500:2:1;51075:104:0::1;::::0;::::1;20482:21:1::0;20539:2;20519:18;;;20512:30;20578:34;20558:18;;;20551:62;20649:31;20629:18;;;20622:59;20698:19;;51075:104:0::1;20298:425:1::0;51075:104:0::1;49526:21:::0;;;49499:7;49526:21;;;:15;:21;;;;;;51218:18:::1;51231:4;51218:12;:18::i;:::-;:42;;;;:::i;:::-;51198:16;51207:7:::0;51198:6;:16:::1;:::i;:::-;:62;;51190:98;;;::::0;-1:-1:-1;;;51190:98:0;;20930:2:1;51190:98:0::1;::::0;::::1;20912:21:1::0;20969:2;20949:18;;;20942:30;21008:25;20988:18;;;20981:53;21051:18;;51190:98:0::1;20728:347:1::0;51190:98:0::1;51326:9;51307:15;51317:5:::0;51307:7;:15:::1;:::i;:::-;:28;;51299:66;;;::::0;-1:-1:-1;;;51299:66:0;;21455:2:1;51299:66:0::1;::::0;::::1;21437:21:1::0;21494:2;21474:18;;;21467:30;21533:27;21513:18;;;21506:55;21578:18;;51299:66:0::1;21253:349:1::0;51299:66:0::1;51383:9;51378:218;51398:7;51394:1;:11;51378:218;;;51504:19;::::0;::::1;;::::0;;;:13:::1;:19;::::0;;;;:24;;51527:1:::1;::::0;51504:19;:24:::1;::::0;51527:1;;51504:24:::1;:::i;:::-;::::0;;;-1:-1:-1;51543:41:0::1;::::0;-1:-1:-1;51553:10:0::1;51582:1:::0;51565:14:::1;51573:6:::0;51565:5;:14:::1;:::i;51543:41::-;51407:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51378:218;;;;50779:826;;;50696:909:::0;;:::o;52476:684::-;-1:-1:-1;;;;;52655:22:0;;;;;;:48;;-1:-1:-1;;;;;;52681:22:0;;52693:10;52681:22;;52655:48;:71;;;;-1:-1:-1;38219:6:0;;-1:-1:-1;;;;;52707:19:0;;;38219:6;;52707:19;;52655:71;:98;;;;-1:-1:-1;52742:11:0;;-1:-1:-1;;;;;52730:23:0;;;52742:11;;52730:23;;52655:98;52651:502;;;-1:-1:-1;;;;;52770:28:0;;;;;;:18;:28;;;;;:39;;52802:7;;52770:28;:39;;52802:7;;52770:39;:::i;:::-;;;;-1:-1:-1;52887:5:0;;-1:-1:-1;52856:28:0;52868:16;52856:9;:28;:::i;:::-;:36;;;;:::i;:::-;-1:-1:-1;;;;;52824:28:0;;;;;;:18;:28;;;;;:68;;:28;;;:68;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;52914:227:0;;;52974:10;53003:15;53037:7;53094:5;53063:28;53075:16;53063:9;:28;:::i;:::-;:36;;;;:::i;:::-;53118:8;;52914:227;;;;;;;;;;;:::i;:::-;;;;;;;;52476:684;;:::o;39246:173::-;39321:6;;;-1:-1:-1;;;;;39338:17:0;;;-1:-1:-1;;;;;;39338:17:0;;;;;;;39371:40;;39321:6;;;39338:17;39321:6;;39371:40;;39302:16;;39371:40;39291:128;39246:173;:::o;48264:113::-;48322:7;48349:20;48358:10;48349:8;:20::i;22448:315::-;22605:28;22615:4;22621:2;22625:7;22605:9;:28::i;:::-;22652:48;22675:4;22681:2;22685:7;22694:5;22652:22;:48::i;:::-;22644:111;;;;-1:-1:-1;;;22644:111:0;;;;;;;:::i;53430:723::-;53486:13;53707:10;53703:53;;-1:-1:-1;;53734:10:0;;;;;;;;;;;;-1:-1:-1;;;53734:10:0;;;;;53430:723::o;53703:53::-;53781:5;53766:12;53822:78;53829:9;;53822:78;;53855:8;;;;:::i;:::-;;-1:-1:-1;53878:10:0;;-1:-1:-1;53886:2:0;53878:10;;:::i;:::-;;;53822:78;;;53910:19;53942:6;53932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53932:17:0;;53910:39;;53960:154;53967:10;;53960:154;;53994:11;54004:1;53994:11;;:::i;:::-;;-1:-1:-1;54063:10:0;54071:2;54063:5;:10;:::i;:::-;54050:24;;:2;:24;:::i;:::-;54037:39;;54020:6;54027;54020:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;54020:56:0;;;;;;;;-1:-1:-1;54091:11:0;54100:2;54091:11;;:::i;:::-;;;53960:154;;49105:328;49169:7;;49283:10;49254:147;49315:9;49296:29;;:1;:29;;;49254:147;;49356:33;;;;;;;:15;:33;;;;;;49347:42;;;;:::i;:::-;;-1:-1:-1;49327:3:0;;;;:::i;:::-;;;;49254:147;;;-1:-1:-1;49420:5:0;49105:328;-1:-1:-1;49105:328:0:o;17178:305::-;17280:4;-1:-1:-1;;;;;;17317:40:0;;-1:-1:-1;;;17317:40:0;;:105;;-1:-1:-1;;;;;;;17374:48:0;;-1:-1:-1;;;17374:48:0;17317:105;:158;;;-1:-1:-1;;;;;;;;;;10476:40:0;;;17439:36;10367:157;24397:321;24527:18;24533:2;24537:7;24527:5;:18::i;:::-;24578:54;24609:1;24613:2;24617:7;24626:5;24578:22;:54::i;:::-;24556:154;;;;-1:-1:-1;;;24556:154:0;;;;;;;:::i;41156:204::-;41307:45;41334:4;41340:2;41344:7;41307:26;:45::i;27797:799::-;27952:4;-1:-1:-1;;;;;27973:13:0;;1851:20;1899:8;27969:620;;28009:72;;-1:-1:-1;;;28009:72:0;;-1:-1:-1;;;;;28009:36:0;;;;;:72;;682:10;;28060:4;;28066:7;;28075:5;;28009:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28009:72:0;;;;;;;;-1:-1:-1;;28009:72:0;;;;;;;;;;;;:::i;:::-;;;28005:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28251:13:0;;28247:272;;28294:60;;-1:-1:-1;;;28294:60:0;;;;;;;:::i;28247:272::-;28469:6;28463:13;28454:6;28450:2;28446:15;28439:38;28005:529;-1:-1:-1;;;;;;28132:51:0;-1:-1:-1;;;28132:51:0;;-1:-1:-1;28125:58:0;;27969:620;-1:-1:-1;28573:4:0;27797:799;;;;;;:::o;25054:382::-;-1:-1:-1;;;;;25134:16:0;;25126:61;;;;-1:-1:-1;;;25126:61:0;;24059:2:1;25126:61:0;;;24041:21:1;;;24078:18;;;24071:30;24137:34;24117:18;;;24110:62;24189:18;;25126:61:0;23857:356:1;25126:61:0;23141:4;23165:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23165:16:0;:30;25198:58;;;;-1:-1:-1;;;25198:58:0;;24420:2:1;25198:58:0;;;24402:21:1;24459:2;24439:18;;;24432:30;24498;24478:18;;;24471:58;24546:18;;25198:58:0;24218:352:1;25198:58:0;25269:45;25298:1;25302:2;25306:7;25269:20;:45::i;:::-;-1:-1:-1;;;;;25327:13:0;;;;;;:9;:13;;;;;:18;;25344:1;;25327:13;:18;;25344:1;;25327:18;:::i;:::-;;;;-1:-1:-1;;25356:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;25356:21:0;-1:-1:-1;;;;;25356:21:0;;;;;;;;25395:33;;25356:16;;;25395:33;;25356:16;;25395:33;25054:382;;:::o;32729:589::-;-1:-1:-1;;;;;32935:18:0;;32931:187;;32970:40;33002:7;34145:10;:17;;34118:24;;;;:15;:24;;;;;:44;;;34173:24;;;;;;;;;;;;34041:164;32970:40;32931:187;;;33040:2;-1:-1:-1;;;;;33032:10:0;:4;-1:-1:-1;;;;;33032:10:0;;33028:90;;33059:47;33092:4;33098:7;33059:32;:47::i;:::-;-1:-1:-1;;;;;33132:16:0;;33128:183;;33165:45;33202:7;33165:36;:45::i;33128:183::-;33238:4;-1:-1:-1;;;;;33232:10:0;:2;-1:-1:-1;;;;;33232:10:0;;33228:83;;33259:40;33287:2;33291:7;33259:27;:40::i;34832:988::-;35098:22;35148:1;35123:22;35140:4;35123:16;:22::i;:::-;:26;;;;:::i;:::-;35160:18;35181:26;;;:17;:26;;;;;;35098:51;;-1:-1:-1;35314:28:0;;;35310:328;;-1:-1:-1;;;;;35381:18:0;;35359:19;35381:18;;;:12;:18;;;;;;;;:34;;;;;;;;;35432:30;;;;;;:44;;;35549:30;;:17;:30;;;;;:43;;;35310:328;-1:-1:-1;35734:26:0;;;;:17;:26;;;;;;;;35727:33;;;-1:-1:-1;;;;;35778:18:0;;;;;:12;:18;;;;;:34;;;;;;;35771:41;34832:988::o;36115:1079::-;36393:10;:17;36368:22;;36393:21;;36413:1;;36393:21;:::i;:::-;36425:18;36446:24;;;:15;:24;;;;;;36819:10;:26;;36368:46;;-1:-1:-1;36446:24:0;;36368:46;;36819:26;;;;;;:::i;:::-;;;;;;;;;36797:48;;36883:11;36858:10;36869;36858:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;36963:28;;;:15;:28;;;;;;;:41;;;37135:24;;;;;37128:31;37170:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36186:1008;;;36115:1079;:::o;33619:221::-;33704:14;33721:20;33738:2;33721:16;:20::i;:::-;-1:-1:-1;;;;;33752:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;33797:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;33619:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:178::-;2280:20;;2340:4;2329:16;;2319:27;;2309:55;;2360:1;2357;2350:12;2309:55;2192:178;;;:::o;2375:436::-;2479:6;2487;2495;2548:2;2536:9;2527:7;2523:23;2519:32;2516:52;;;2564:1;2561;2554:12;2516:52;2587:49;2626:9;2587:49;:::i;:::-;2577:59;;2683:2;2672:9;2668:18;2655:32;2645:42;;2737:2;2726:9;2722:18;2709:32;2750:31;2775:5;2750:31;:::i;:::-;2800:5;2790:15;;;2375:436;;;;;:::o;2816:127::-;2877:10;2872:3;2868:20;2865:1;2858:31;2908:4;2905:1;2898:15;2932:4;2929:1;2922:15;2948:632;3013:5;3043:18;3084:2;3076:6;3073:14;3070:40;;;3090:18;;:::i;:::-;3165:2;3159:9;3133:2;3219:15;;-1:-1:-1;;3215:24:1;;;3241:2;3211:33;3207:42;3195:55;;;3265:18;;;3285:22;;;3262:46;3259:72;;;3311:18;;:::i;:::-;3351:10;3347:2;3340:22;3380:6;3371:15;;3410:6;3402;3395:22;3450:3;3441:6;3436:3;3432:16;3429:25;3426:45;;;3467:1;3464;3457:12;3426:45;3517:6;3512:3;3505:4;3497:6;3493:17;3480:44;3572:1;3565:4;3556:6;3548;3544:19;3540:30;3533:41;;;;2948:632;;;;;:::o;3585:451::-;3654:6;3707:2;3695:9;3686:7;3682:23;3678:32;3675:52;;;3723:1;3720;3713:12;3675:52;3763:9;3750:23;3796:18;3788:6;3785:30;3782:50;;;3828:1;3825;3818:12;3782:50;3851:22;;3904:4;3896:13;;3892:27;-1:-1:-1;3882:55:1;;3933:1;3930;3923:12;3882:55;3956:74;4022:7;4017:2;4004:16;3999:2;3995;3991:11;3956:74;:::i;4223:255::-;4290:6;4343:2;4331:9;4322:7;4318:23;4314:32;4311:52;;;4359:1;4356;4349:12;4311:52;4398:9;4385:23;4417:31;4442:5;4417:31;:::i;4483:456::-;4560:6;4568;4576;4629:2;4617:9;4608:7;4604:23;4600:32;4597:52;;;4645:1;4642;4635:12;4597:52;4684:9;4671:23;4703:31;4728:5;4703:31;:::i;:::-;4753:5;-1:-1:-1;4810:2:1;4795:18;;4782:32;4823:33;4782:32;4823:33;:::i;:::-;4483:456;;4875:7;;-1:-1:-1;;;4929:2:1;4914:18;;;;4901:32;;4483:456::o;5393:233::-;5479:6;5532:2;5520:9;5511:7;5507:23;5503:32;5500:52;;;5548:1;5545;5538:12;5500:52;5571:49;5610:9;5571:49;:::i;5883:632::-;6054:2;6106:21;;;6176:13;;6079:18;;;6198:22;;;6025:4;;6054:2;6277:15;;;;6251:2;6236:18;;;6025:4;6320:169;6334:6;6331:1;6328:13;6320:169;;;6395:13;;6383:26;;6464:15;;;;6429:12;;;;6356:1;6349:9;6320:169;;;-1:-1:-1;6506:3:1;;5883:632;-1:-1:-1;;;;;;5883:632:1:o;6744:301::-;6839:6;6847;6900:2;6888:9;6879:7;6875:23;6871:32;6868:52;;;6916:1;6913;6906:12;6868:52;6939:49;6978:9;6939:49;:::i;7268:592::-;7339:6;7347;7400:2;7388:9;7379:7;7375:23;7371:32;7368:52;;;7416:1;7413;7406:12;7368:52;7456:9;7443:23;7485:18;7526:2;7518:6;7515:14;7512:34;;;7542:1;7539;7532:12;7512:34;7580:6;7569:9;7565:22;7555:32;;7625:7;7618:4;7614:2;7610:13;7606:27;7596:55;;7647:1;7644;7637:12;7596:55;7687:2;7674:16;7713:2;7705:6;7702:14;7699:34;;;7729:1;7726;7719:12;7699:34;7774:7;7769:2;7760:6;7756:2;7752:15;7748:24;7745:37;7742:57;;;7795:1;7792;7785:12;7742:57;7826:2;7818:11;;;;;7848:6;;-1:-1:-1;7268:592:1;;-1:-1:-1;;;;7268:592:1:o;8118:323::-;8194:6;8202;8255:2;8243:9;8234:7;8230:23;8226:32;8223:52;;;8271:1;8268;8261:12;8223:52;8307:9;8294:23;8284:33;;8367:2;8356:9;8352:18;8339:32;8380:31;8405:5;8380:31;:::i;:::-;8430:5;8420:15;;;8118:323;;;;;:::o;8446:416::-;8511:6;8519;8572:2;8560:9;8551:7;8547:23;8543:32;8540:52;;;8588:1;8585;8578:12;8540:52;8627:9;8614:23;8646:31;8671:5;8646:31;:::i;:::-;8696:5;-1:-1:-1;8753:2:1;8738:18;;8725:32;8795:15;;8788:23;8776:36;;8766:64;;8826:1;8823;8816:12;9187:795;9282:6;9290;9298;9306;9359:3;9347:9;9338:7;9334:23;9330:33;9327:53;;;9376:1;9373;9366:12;9327:53;9415:9;9402:23;9434:31;9459:5;9434:31;:::i;:::-;9484:5;-1:-1:-1;9541:2:1;9526:18;;9513:32;9554:33;9513:32;9554:33;:::i;:::-;9606:7;-1:-1:-1;9660:2:1;9645:18;;9632:32;;-1:-1:-1;9715:2:1;9700:18;;9687:32;9742:18;9731:30;;9728:50;;;9774:1;9771;9764:12;9728:50;9797:22;;9850:4;9842:13;;9838:27;-1:-1:-1;9828:55:1;;9879:1;9876;9869:12;9828:55;9902:74;9968:7;9963:2;9950:16;9945:2;9941;9937:11;9902:74;:::i;:::-;9892:84;;;9187:795;;;;;;;:::o;9987:388::-;10055:6;10063;10116:2;10104:9;10095:7;10091:23;10087:32;10084:52;;;10132:1;10129;10122:12;10084:52;10171:9;10158:23;10190:31;10215:5;10190:31;:::i;:::-;10240:5;-1:-1:-1;10297:2:1;10282:18;;10269:32;10310:33;10269:32;10310:33;:::i;10380:380::-;10459:1;10455:12;;;;10502;;;10523:61;;10577:4;10569:6;10565:17;10555:27;;10523:61;10630:2;10622:6;10619:14;10599:18;10596:38;10593:161;;;10676:10;10671:3;10667:20;10664:1;10657:31;10711:4;10708:1;10701:15;10739:4;10736:1;10729:15;12005:356;12207:2;12189:21;;;12226:18;;;12219:30;12285:34;12280:2;12265:18;;12258:62;12352:2;12337:18;;12005:356::o;12366:337::-;12568:2;12550:21;;;12607:2;12587:18;;;12580:30;-1:-1:-1;;;12641:2:1;12626:18;;12619:43;12694:2;12679:18;;12366:337::o;13112:127::-;13173:10;13168:3;13164:20;13161:1;13154:31;13204:4;13201:1;13194:15;13228:4;13225:1;13218:15;13244:128;13284:3;13315:1;13311:6;13308:1;13305:13;13302:39;;;13321:18;;:::i;:::-;-1:-1:-1;13357:9:1;;13244:128::o;13377:135::-;13416:3;-1:-1:-1;;13437:17:1;;13434:43;;;13457:18;;:::i;:::-;-1:-1:-1;13504:1:1;13493:13;;13377:135::o;13517:125::-;13557:4;13585:1;13582;13579:8;13576:34;;;13590:18;;:::i;:::-;-1:-1:-1;13627:9:1;;13517:125::o;13647:413::-;13849:2;13831:21;;;13888:2;13868:18;;;13861:30;13927:34;13922:2;13907:18;;13900:62;-1:-1:-1;;;13993:2:1;13978:18;;13971:47;14050:3;14035:19;;13647:413::o;15170:127::-;15231:10;15226:3;15222:20;15219:1;15212:31;15262:4;15259:1;15252:15;15286:4;15283:1;15276:15;15302:175;15339:3;15383:4;15376:5;15372:16;15412:4;15403:7;15400:17;15397:43;;;15420:18;;:::i;:::-;15469:1;15456:15;;15302:175;-1:-1:-1;;15302:175:1:o;18188:470::-;18367:3;18405:6;18399:13;18421:53;18467:6;18462:3;18455:4;18447:6;18443:17;18421:53;:::i;:::-;18537:13;;18496:16;;;;18559:57;18537:13;18496:16;18593:4;18581:17;;18559:57;:::i;:::-;18632:20;;18188:470;-1:-1:-1;;;;18188:470:1:o;21080:168::-;21120:7;21186:1;21182;21178:6;21174:14;21171:1;21168:21;21163:1;21156:9;21149:17;21145:45;21142:71;;;21193:18;;:::i;:::-;-1:-1:-1;21233:9:1;;21080:168::o;21607:127::-;21668:10;21663:3;21659:20;21656:1;21649:31;21699:4;21696:1;21689:15;21723:4;21720:1;21713:15;21739:120;21779:1;21805;21795:35;;21810:18;;:::i;:::-;-1:-1:-1;21844:9:1;;21739:120::o;21864:704::-;22162:1;22158;22153:3;22149:11;22145:19;22137:6;22133:32;22122:9;22115:51;22202:6;22197:2;22186:9;22182:18;22175:34;22245:6;22240:2;22229:9;22225:18;22218:34;22288:6;22283:2;22272:9;22268:18;22261:34;22332:3;22326;22315:9;22311:19;22304:32;22373:6;22367:3;22356:9;22352:19;22345:35;22431:6;22423;22417:3;22406:9;22402:19;22389:49;22488:1;22458:22;;;22482:3;22454:32;;;22447:43;;;;22551:2;22530:15;;;-1:-1:-1;;22526:29:1;22511:45;22507:55;;21864:704;-1:-1:-1;;;;;21864:704:1:o;22573:414::-;22775:2;22757:21;;;22814:2;22794:18;;;22787:30;22853:34;22848:2;22833:18;;22826:62;-1:-1:-1;;;22919:2:1;22904:18;;22897:48;22977:3;22962:19;;22573:414::o;22992:112::-;23024:1;23050;23040:35;;23055:18;;:::i;:::-;-1:-1:-1;23089:9:1;;22992:112::o;23109:489::-;-1:-1:-1;;;;;23378:15:1;;;23360:34;;23430:15;;23425:2;23410:18;;23403:43;23477:2;23462:18;;23455:34;;;23525:3;23520:2;23505:18;;23498:31;;;23303:4;;23546:46;;23572:19;;23564:6;23546:46;:::i;:::-;23538:54;23109:489;-1:-1:-1;;;;;;23109:489:1:o;23603:249::-;23672:6;23725:2;23713:9;23704:7;23700:23;23696:32;23693:52;;;23741:1;23738;23731:12;23693:52;23773:9;23767:16;23792:30;23816:5;23792:30;:::i;24575:127::-;24636:10;24631:3;24627:20;24624:1;24617:31;24667:4;24664:1;24657:15;24691:4;24688:1;24681:15
Swarm Source
ipfs://9c755c8241b579027b3e4653a431beee7bf67dfd2ace2d37ccd5fbe109b3fc7e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.