Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 34 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 21353852 | 473 days ago | IN | 0 ETH | 0.00049805 | ||||
| Safe Transfer Fr... | 21353844 | 473 days ago | IN | 0 ETH | 0.00056418 | ||||
| Safe Transfer Fr... | 20567871 | 583 days ago | IN | 0 ETH | 0.00004517 | ||||
| Safe Transfer Fr... | 20314276 | 618 days ago | IN | 0 ETH | 0.00082295 | ||||
| Transfer From | 20084253 | 650 days ago | IN | 0 ETH | 0.00078906 | ||||
| Safe Transfer Fr... | 17931948 | 952 days ago | IN | 0 ETH | 0.00141726 | ||||
| Withdraw Funds | 15284617 | 1328 days ago | IN | 0 ETH | 0.0007346 | ||||
| Mint | 15203054 | 1341 days ago | IN | 0.08 ETH | 0.00171694 | ||||
| Transfer Ownersh... | 15201760 | 1341 days ago | IN | 0 ETH | 0.00041803 | ||||
| Withdraw Funds | 15074435 | 1361 days ago | IN | 0 ETH | 0.00030294 | ||||
| Transfer From | 15073516 | 1361 days ago | IN | 0 ETH | 0.00122153 | ||||
| Mint | 15073482 | 1361 days ago | IN | 0.08 ETH | 0.00272337 | ||||
| Mint | 15042175 | 1366 days ago | IN | 0.08 ETH | 0.0039635 | ||||
| Withdraw Funds | 15003305 | 1373 days ago | IN | 0 ETH | 0.00242631 | ||||
| Mint | 14993119 | 1375 days ago | IN | 0.08 ETH | 0.00336501 | ||||
| Transfer From | 14959494 | 1381 days ago | IN | 0 ETH | 0.00844185 | ||||
| Transfer From | 14954146 | 1382 days ago | IN | 0 ETH | 0.00196865 | ||||
| Transfer From | 14954138 | 1382 days ago | IN | 0 ETH | 0.002008 | ||||
| Transfer From | 14954128 | 1382 days ago | IN | 0 ETH | 0.00220457 | ||||
| Mint | 14954100 | 1382 days ago | IN | 0.24 ETH | 0.00820656 | ||||
| Mint | 14951470 | 1382 days ago | IN | 0.16 ETH | 0.00211207 | ||||
| Mint | 14930318 | 1386 days ago | IN | 0.16 ETH | 0.00713516 | ||||
| Mint | 14911531 | 1389 days ago | IN | 0.16 ETH | 0.0049908 | ||||
| Set Approval For... | 14895112 | 1392 days ago | IN | 0 ETH | 0.00343744 | ||||
| Set Base Token U... | 14882634 | 1394 days ago | IN | 0 ETH | 0.00380964 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MonksOfEleusis
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-05-27
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)
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 {
_setApprovalForAll(_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);
_afterTokenTransfer(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);
_afterTokenTransfer(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 from incorrect owner");
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);
_afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @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 {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: contracts/MonksOfEleusis.sol
pragma solidity ^0.8.13;
contract MonksOfEleusis is ERC721 {
uint256 public constant cMaxSupply = 1000;
uint256 public constant cMaxPerMint = 50;
uint256 public constant cMaxPerWallet = 50;
uint256 public constant cNumToReserve = 50;
uint256 public constant cPrice = 0.08 ether;
bool public mMintActive = false;
bool public mReserveMinted = false;
uint256 private mNextTokenId = 1;
address private mOwner = address(0);
address private mFounder = address(0);
uint256 private mRoyaltyBasisPoints = 1000;
mapping(address => uint256) private mWalletToAmountMinted;
string private mBaseTokenURI;
string private mContractURI;
uint256 public mTokenOffset = 0;
mapping(uint256 => uint256) private mTokenToMeditateStartTimes;
mapping(uint256 => uint256) private mTokenToMeditateTotalTime;
bool public mMeditationActive = false;
modifier onlyOwner {
require(msg.sender == mOwner, "only owner can call this");
_;
}
modifier onlyFounder {
require(msg.sender == mFounder, "only founder can call this");
_;
}
constructor() ERC721("Monks of Eleusis","MONK"){
mOwner = msg.sender;
}
event Mint(address indexed minter, uint256 tokenId);
function mintReserved() public onlyFounder {
require(!mReserveMinted, "can't mint more reserved tokens");
mReserveMinted = true;
uint256 numToReserve = cNumToReserve;
uint256 numAvailable = cMaxSupply - (mNextTokenId - 1);
if (numToReserve > numAvailable) {
numToReserve = numAvailable;
}
for (uint i = 0; i < numToReserve; i = i + 1){
_safeMint(msg.sender, mNextTokenId);
emit Mint(msg.sender, mNextTokenId);
unchecked {
mNextTokenId += 1;
}
}
}
function setMintActive(bool aActive) public onlyOwner {
mMintActive = aActive;
}
function mint(uint256 quantity) public payable {
require(mMintActive, "minting is not active");
require(mNextTokenId <= cMaxSupply, "sold out");
require(quantity > 0, "can't buy 0");
require(quantity <= cMaxPerMint, "can't buy that many at once");
require(mWalletToAmountMinted[msg.sender] + quantity <= cMaxPerWallet, "minting that many would give you too many");
require(msg.value == quantity*cPrice, "not enough eth sent");
mWalletToAmountMinted[msg.sender] += quantity;
for (uint i = 0; i < quantity; i = i + 1){
_safeMint(msg.sender, mNextTokenId);
emit Mint(msg.sender, mNextTokenId);
unchecked {
mNextTokenId += 1;
}
}
}
event Meditate(address indexed owner, uint256 indexed tokenId, uint256 time);
event Disturb(address indexed owner, uint256 indexed tokenId, uint256 time);
function setMeditationActive(bool aActive) public onlyOwner {
mMeditationActive = aActive;
}
function meditate(uint256 aTokenId) internal {
require(mMeditationActive, "meditation is not enabled");
require(_exists(aTokenId), "token doesn't exist");
mTokenToMeditateStartTimes[aTokenId] = block.timestamp;
emit Meditate(ownerOf(aTokenId), aTokenId, block.timestamp);
}
function disturbMeditation(uint256 aTokenId) internal {
require(_exists(aTokenId), "token doesn't exist");
mTokenToMeditateTotalTime[aTokenId] += block.timestamp - mTokenToMeditateStartTimes[aTokenId];
mTokenToMeditateStartTimes[aTokenId] = 0;
emit Disturb(ownerOf(aTokenId), aTokenId, block.timestamp);
}
function isMeditating(uint256 aTokenId) public view returns (bool){
return mTokenToMeditateStartTimes[aTokenId] != 0;
}
function toggleMeditation(uint256[] calldata aTokenIds) public {
for (uint i = 0; i < aTokenIds.length; i = i + 1){
uint256 thisTokenId = aTokenIds[i];
require(ownerOf(thisTokenId) == msg.sender, "you don't own this token");
if (isMeditating(thisTokenId)) {
disturbMeditation(thisTokenId);
} else {
meditate(thisTokenId);
}
}
}
function getTotalMeditationTime(uint256 aTokenId) public view returns (uint256) {
require(_exists(aTokenId), "token doesn't exist");
return mTokenToMeditateTotalTime[aTokenId] + getCurrentMeditationTime(aTokenId);
}
function getCurrentMeditationTime(uint256 aTokenId) public view returns (uint256){
require(_exists(aTokenId), "token doesn't exist");
uint256 currentTime = mTokenToMeditateStartTimes[aTokenId] == 0 ? 0 : block.timestamp - mTokenToMeditateStartTimes[aTokenId];
return currentTime;
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override {
if(isMeditating(tokenId)){
disturbMeditation(tokenId);
}
super._beforeTokenTransfer(from, to, tokenId);
}
function setTokenOffset(uint256 aWordConvertedToNumbers) public onlyOwner {
require(mTokenOffset == 0, "can only call this once");
mTokenOffset = block.timestamp + block.number + aWordConvertedToNumbers;
}
function setBaseTokenURI(string calldata URI) public onlyOwner {
mBaseTokenURI = URI;
}
function baseTokenURI() public view returns (string memory) {
return mBaseTokenURI;
}
function getOffsetTokenId(uint256 tokenId) public view returns (uint256) {
//the minus and plus 1 ensures this is between 1 and maxSupply because mod will return 0
return (((tokenId - 1 + mTokenOffset) % cMaxSupply) + 1);
}
function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
require(_exists(tokenId), "cannot query non-existent token");
return string(abi.encodePacked(baseTokenURI(), Strings.toString(getOffsetTokenId(tokenId)), '.json'));
}
function contractURI() public view returns (string memory) {
return mContractURI;
}
function setContractURI(string calldata aContractURI) public onlyOwner {
mContractURI = aContractURI;
}
function changeRoyaltyBasisPoints(uint256 aRoyaltyBasisPoints) public onlyFounder {
mRoyaltyBasisPoints = aRoyaltyBasisPoints;
}
function royaltyInfo(uint256 aTokenId, uint256 aSalePrice)
external
view
returns (address aReceiver, uint256 aRoyaltyAmount)
{
require(_exists(aTokenId), "Cannot query non-existent token");
return (mFounder, (aSalePrice * mRoyaltyBasisPoints) / 10000);
}
function withdrawFunds() public onlyFounder {
payable(mFounder).transfer(address(this).balance);
}
function transferOwnership(address aNewOwner) public onlyOwner {
require(aNewOwner != address(0), "new owner cannot be 0 address");
mOwner = aNewOwner;
}
function transferFounder(address aNewFounder) public onlyFounder {
require(aNewFounder != address(0),"can't set founder to null address");
mFounder = aNewFounder;
}
function addFounder (address aFounder) public onlyOwner {
require(mFounder == address(0), "can only call this once");
require(aFounder != address(0), "can't set founder to null address");
mFounder = aFounder;
}
function owner() public view virtual returns (address) {
return mOwner;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Disturb","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Meditate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":[{"internalType":"address","name":"aFounder","type":"address"}],"name":"addFounder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cMaxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cNumToReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"aRoyaltyBasisPoints","type":"uint256"}],"name":"changeRoyaltyBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"aTokenId","type":"uint256"}],"name":"getCurrentMeditationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOffsetTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"aTokenId","type":"uint256"}],"name":"getTotalMeditationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"aTokenId","type":"uint256"}],"name":"isMeditating","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mMeditationActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mReserveMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mTokenOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"aTokenId","type":"uint256"},{"internalType":"uint256","name":"aSalePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"aReceiver","type":"address"},{"internalType":"uint256","name":"aRoyaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"aContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"aActive","type":"bool"}],"name":"setMeditationActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"aActive","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"aWordConvertedToNumbers","type":"uint256"}],"name":"setTokenOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"aTokenIds","type":"uint256[]"}],"name":"toggleMeditation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"aNewFounder","type":"address"}],"name":"transferFounder","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"aNewOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526006805461ffff19169055600160075560088054600160a060020a03199081169091556009805490911690556103e8600a556000600e556011805460ff191690553480156200005257600080fd5b50604080518082018252601081527f4d6f6e6b73206f6620456c65757369730000000000000000000000000000000060208083019182528351808501909452600484527f4d4f4e4b00000000000000000000000000000000000000000000000000000000908401528151919291620000cd91600091620000fe565b508051620000e3906001906020840190620000fe565b505060088054600160a060020a0319163317905550620001f9565b8280546200010c90620001a4565b90600052602060002090601f0160209004810192826200013057600085556200017b565b82601f106200014b57805160ff19168380011785556200017b565b828001600101855582156200017b579182015b828111156200017b5782518255916020019190600101906200015e565b50620001899291506200018d565b5090565b5b808211156200018957600081556001016200018e565b600281046001821680620001b957607f821691505b602082108103620001f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b612ef280620002096000396000f3fe6080604052600436106102f9576000357c0100000000000000000000000000000000000000000000000000000000900480638f73a4a2116101a1578063bfcbc75f116100f3578063e8a3d485116100a7578063ee1cc94411610081578063ee1cc944146107de578063ef4ec047146107fe578063f2fde38b1461081e57600080fd5b8063e8a3d4851461076b578063e985e9c514610780578063ec8c8904146107c957600080fd5b8063d547cfb7116100d8578063d547cfb71461070d578063de82231714610722578063e344846c1461075157600080fd5b8063bfcbc75f14610658578063c87b56dd146106ed57600080fd5b8063a1ee978511610155578063b2a4c6b11161012f578063b2a4c6b11461068d578063b858c92f146106ad578063b88d4fde146106cd57600080fd5b8063a1ee978514610658578063a22cb4651461066d578063b0bfa0311461065857600080fd5b806395d89b411161018657806395d89b41146106105780639913910314610625578063a0712d681461064557600080fd5b80638f73a4a2146105da578063938e3d7b146105f057600080fd5b806330176e131161025a5780636352211e1161020e57806370a08231116101e857806370a082311461057c578063869ed08e1461059c5780638da5cb5b146105bc57600080fd5b80636352211e1461052257806364d1fe85146105425780636c8cede21461056257600080fd5b806342842e0e1161023f57806342842e0e146104cc57806344c59615146104ec5780635a47c9a91461050257600080fd5b806330176e131461048c5780633ba4ffa6146104ac57600080fd5b80630ed6b392116102b157806323b872dd1161029657806323b872dd1461041857806324600fc3146104385780632a55205a1461044d57600080fd5b80630ed6b392146103d9578063150c957c146103f857600080fd5b806306fdde03116102e257806306fdde031461035d578063081812fc1461037f578063095ea7b3146103b757600080fd5b806301ffc9a7146102fe578063032ebf5414610333575b600080fd5b34801561030a57600080fd5b5061031e6103193660046128d6565b61083e565b60405190151581526020015b60405180910390f35b34801561033f57600080fd5b5061034f67011c37937e08000081565b60405190815260200161032a565b34801561036957600080fd5b50610372610923565b60405161032a919061294b565b34801561038b57600080fd5b5061039f61039a36600461295e565b6109b5565b604051600160a060020a03909116815260200161032a565b3480156103c357600080fd5b506103d76103d2366004612993565b610a63565b005b3480156103e557600080fd5b5060065461031e90610100900460ff1681565b34801561040457600080fd5b506103d76104133660046129bd565b610b9a565b34801561042457600080fd5b506103d7610433366004612a31565b610c6c565b34801561044457600080fd5b506103d7610cf6565b34801561045957600080fd5b5061046d610468366004612a6d565b610d90565b60408051600160a060020a03909316835260208301919091520161032a565b34801561049857600080fd5b506103d76104a7366004612a8f565b610e2e565b3480156104b857600080fd5b506103d76104c7366004612aff565b610e97565b3480156104d857600080fd5b506103d76104e7366004612a31565b610f07565b3480156104f857600080fd5b5061034f6103e881565b34801561050e57600080fd5b506103d761051d36600461295e565b610f22565b34801561052e57600080fd5b5061039f61053d36600461295e565b610fed565b34801561054e57600080fd5b5061034f61055d36600461295e565b61107b565b34801561056e57600080fd5b5060065461031e9060ff1681565b34801561058857600080fd5b5061034f610597366004612b1a565b611104565b3480156105a857600080fd5b5061034f6105b736600461295e565b6111a1565b3480156105c857600080fd5b50600854600160a060020a031661039f565b3480156105e657600080fd5b5061034f600e5481565b3480156105fc57600080fd5b506103d761060b366004612a8f565b611244565b34801561061c57600080fd5b506103726112ad565b34801561063157600080fd5b506103d7610640366004612b1a565b6112bc565b6103d761065336600461295e565b6113c7565b34801561066457600080fd5b5061034f603281565b34801561067957600080fd5b506103d7610688366004612b35565b6116a8565b34801561069957600080fd5b5061034f6106a836600461295e565b6116b3565b3480156106b957600080fd5b506103d76106c836600461295e565b6116e7565b3480156106d957600080fd5b506103d76106e8366004612b97565b611749565b3480156106f957600080fd5b5061037261070836600461295e565b6117da565b34801561071957600080fd5b50610372611884565b34801561072e57600080fd5b5061031e61073d36600461295e565b6000908152600f6020526040902054151590565b34801561075d57600080fd5b5060115461031e9060ff1681565b34801561077757600080fd5b50610372611893565b34801561078c57600080fd5b5061031e61079b366004612c73565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d557600080fd5b506103d76118a2565b3480156107ea57600080fd5b506103d76107f9366004612aff565b611a05565b34801561080a57600080fd5b506103d7610819366004612b1a565b611a75565b34801561082a57600080fd5b506103d7610839366004612b1a565b611b2e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108d157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061091d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461093290612c9d565b80601f016020809104026020016040519081016040528092919081815260200182805461095e90612c9d565b80156109ab5780601f10610980576101008083540402835291602001916109ab565b820191906000526020600020905b81548152906001019060200180831161098e57829003601f168201915b5050505050905090565b600081815260026020526040812054600160a060020a0316610a475760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b50600090815260046020526040902054600160a060020a031690565b6000610a6e82610fed565b905080600160a060020a031683600160a060020a031603610afa5760405160e560020a62461bcd02815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a3e565b33600160a060020a0382161480610b165750610b16813361079b565b610b8b5760405160e560020a62461bcd02815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a3e565b610b958383611c13565b505050565b60005b81811015610b95576000838383818110610bb957610bb9612cf0565b90506020020135905033600160a060020a0316610bd582610fed565b600160a060020a031614610c2e5760405160e560020a62461bcd02815260206004820152601860248201527f796f7520646f6e2774206f776e207468697320746f6b656e00000000000000006044820152606401610a3e565b6000818152600f602052604090205415610c5057610c4b81611c8e565b610c59565b610c5981611d8f565b50610c65816001612d4e565b9050610b9d565b610c763382611ea0565b610ceb5760405160e560020a62461bcd02815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a3e565b610b95838383611fab565b600954600160a060020a03163314610d535760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610d8d573d6000803e3d6000fd5b50565b6000828152600260205260408120548190600160a060020a0316610df95760405160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610a3e565b600954600a54600160a060020a039091169061271090610e199086612d66565b610e239190612db4565b915091509250929050565b600854600160a060020a03163314610e8b5760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b610b95600c838361280f565b600854600160a060020a03163314610ef45760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b6011805460ff1916911515919091179055565b610b9583838360405180602001604052806000815250611749565b600854600160a060020a03163314610f7f5760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b600e5415610fd25760405160e560020a62461bcd02815260206004820152601760248201527f63616e206f6e6c792063616c6c2074686973206f6e63650000000000000000006044820152606401610a3e565b80610fdd4342612d4e565b610fe79190612d4e565b600e5550565b600081815260026020526040812054600160a060020a03168061091d5760405160e560020a62461bcd02815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a3e565b600081815260026020526040812054600160a060020a03166110e25760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6110eb826111a1565b60008381526010602052604090205461091d9190612d4e565b6000600160a060020a0382166111855760405160e560020a62461bcd02815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a3e565b50600160a060020a031660009081526003602052604090205490565b600081815260026020526040812054600160a060020a03166112085760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6000828152600f60205260408120541561123a576000838152600f60205260409020546112359042612dc8565b61123d565b60005b9392505050565b600854600160a060020a031633146112a15760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b610b95600d838361280f565b60606001805461093290612c9d565b600954600160a060020a031633146113195760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600160a060020a0381166113985760405160e560020a62461bcd02815260206004820152602160248201527f63616e27742073657420666f756e64657220746f206e756c6c2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a3e565b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60065460ff1661141c5760405160e560020a62461bcd02815260206004820152601560248201527f6d696e74696e67206973206e6f742061637469766500000000000000000000006044820152606401610a3e565b6103e860075411156114735760405160e560020a62461bcd02815260206004820152600860248201527f736f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610a3e565b600081116114c65760405160e560020a62461bcd02815260206004820152600b60248201527f63616e27742062757920300000000000000000000000000000000000000000006044820152606401610a3e565b603281111561151a5760405160e560020a62461bcd02815260206004820152601b60248201527f63616e2774206275792074686174206d616e79206174206f6e636500000000006044820152606401610a3e565b336000908152600b6020526040902054603290611538908390612d4e565b11156115af5760405160e560020a62461bcd02815260206004820152602960248201527f6d696e74696e672074686174206d616e7920776f756c64206769766520796f7560448201527f20746f6f206d616e7900000000000000000000000000000000000000000000006064820152608401610a3e565b6115c167011c37937e08000082612d66565b34146116125760405160e560020a62461bcd02815260206004820152601360248201527f6e6f7420656e6f756768206574682073656e74000000000000000000000000006044820152606401610a3e565b336000908152600b602052604081208054839290611631908490612d4e565b90915550600090505b818110156116a45761164e33600754612196565b60075460405190815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a260078054600190810190915561169d908290612d4e565b905061163a565b5050565b6116a43383836121b0565b60006103e8600e546001846116c89190612dc8565b6116d29190612d4e565b6116dc9190612ddf565b61091d906001612d4e565b600954600160a060020a031633146117445760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600a55565b6117533383611ea0565b6117c85760405160e560020a62461bcd02815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a3e565b6117d484848484612281565b50505050565b600081815260026020526040902054606090600160a060020a03166118445760405160e560020a62461bcd02815260206004820152601f60248201527f63616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610a3e565b61184c611884565b61185d611858846116b3565b61230d565b60405160200161186e929190612df3565b6040516020818303038152906040529050919050565b6060600c805461093290612c9d565b6060600d805461093290612c9d565b600954600160a060020a031633146118ff5760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600654610100900460ff161561195a5760405160e560020a62461bcd02815260206004820152601f60248201527f63616e2774206d696e74206d6f726520726573657276656420746f6b656e73006044820152606401610a3e565b6006805461ff00191661010017905560075460329060009061197e90600190612dc8565b61198a906103e8612dc8565b905080821115611998578091505b60005b82811015610b95576119af33600754612196565b60075460405190815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a26007805460019081019091556119fe908290612d4e565b905061199b565b600854600160a060020a03163314611a625760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b6006805460ff1916911515919091179055565b600854600160a060020a03163314611ad25760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b600954600160a060020a0316156113195760405160e560020a62461bcd02815260206004820152601760248201527f63616e206f6e6c792063616c6c2074686973206f6e63650000000000000000006044820152606401610a3e565b600854600160a060020a03163314611b8b5760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b600160a060020a038116611be45760405160e560020a62461bcd02815260206004820152601d60248201527f6e6577206f776e65722063616e6e6f74206265203020616464726573730000006044820152606401610a3e565b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091558190611c5582610fed565b600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260026020526040902054600160a060020a0316611cf55760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6000818152600f6020526040902054611d0e9042612dc8565b60008281526010602052604081208054909190611d2c908490612d4e565b90915550506000818152600f602052604081205580611d4a81610fed565b600160a060020a03167f3c8ee184e401c70c662bf201a42ce516749c47bea85326839530e4d3f602715642604051611d8491815260200190565b60405180910390a350565b60115460ff16611de45760405160e560020a62461bcd02815260206004820152601960248201527f6d656469746174696f6e206973206e6f7420656e61626c6564000000000000006044820152606401610a3e565b600081815260026020526040902054600160a060020a0316611e4b5760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6000818152600f6020526040902042905580611e6681610fed565b600160a060020a03167fd74c8446b84c39a2e97903540f9719cff0e6a07a77f71228a36e5a3d0f5ab22842604051611d8491815260200190565b600081815260026020526040812054600160a060020a0316611f2d5760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a3e565b6000611f3883610fed565b905080600160a060020a031684600160a060020a03161480611f73575083600160a060020a0316611f68846109b5565b600160a060020a0316145b80611fa35750600160a060020a0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b82600160a060020a0316611fbe82610fed565b600160a060020a03161461203d5760405160e560020a62461bcd02815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a3e565b600160a060020a0382166120bb5760405160e560020a62461bcd028152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a3e565b6120c6838383612461565b6120d1600082611c13565b600160a060020a03831660009081526003602052604081208054600192906120fa908490612dc8565b9091555050600160a060020a0382166000908152600360205260408120805460019290612128908490612d4e565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116a482826040518060200160405280600081525061247e565b81600160a060020a031683600160a060020a0316036122145760405160e560020a62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a3e565b600160a060020a03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61228c848484611fab565b6122988484848461250a565b6117d45760405160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a3e565b60608160000361235057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561237a578061236481612e4a565b91506123739050600a83612db4565b9150612354565b60008167ffffffffffffffff81111561239557612395612b68565b6040519080825280601f01601f1916602001820160405280156123bf576020820181803683370190505b5090505b8415611fa3576123d4600183612dc8565b91506123e1600a86612ddf565b6123ec906030612d4e565b7f01000000000000000000000000000000000000000000000000000000000000000281838151811061242057612420612cf0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061245a600a86612db4565b94506123c3565b6000818152600f602052604090205415610b9557610b9581611c8e565b61248883836126ae565b612495600084848461250a565b610b955760405160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a3e565b6000600160a060020a0384163b156126a3576040517f150b7a02000000000000000000000000000000000000000000000000000000008152600160a060020a0385169063150b7a0290612567903390899088908890600401612e63565b6020604051808303816000875af19250505080156125a2575060408051601f3d908101601f1916820190925261259f91810190612e9f565b60015b612658573d8080156125d0576040519150601f19603f3d011682016040523d82523d6000602084013e6125d5565b606091505b5080516000036126505760405160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a3e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611fa3565b506001949350505050565b600160a060020a0382166127075760405160e560020a62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a3e565b600081815260026020526040902054600160a060020a03161561276f5760405160e560020a62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a3e565b61277b60008383612461565b600160a060020a03821660009081526003602052604081208054600192906127a4908490612d4e565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461281b90612c9d565b90600052602060002090601f01602090048101928261283d5760008555612883565b82601f106128565782800160ff19823516178555612883565b82800160010185558215612883579182015b82811115612883578235825591602001919060010190612868565b5061288f929150612893565b5090565b5b8082111561288f5760008155600101612894565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d8d57600080fd5b6000602082840312156128e857600080fd5b813561123d816128a8565b60005b8381101561290e5781810151838201526020016128f6565b838111156117d45750506000910152565b600081518084526129378160208601602086016128f3565b601f01601f19169290920160200192915050565b60208152600061123d602083018461291f565b60006020828403121561297057600080fd5b5035919050565b8035600160a060020a038116811461298e57600080fd5b919050565b600080604083850312156129a657600080fd5b6129af83612977565b946020939093013593505050565b600080602083850312156129d057600080fd5b823567ffffffffffffffff808211156129e857600080fd5b818501915085601f8301126129fc57600080fd5b813581811115612a0b57600080fd5b8660208083028501011115612a1f57600080fd5b60209290920196919550909350505050565b600080600060608486031215612a4657600080fd5b612a4f84612977565b9250612a5d60208501612977565b9150604084013590509250925092565b60008060408385031215612a8057600080fd5b50508035926020909101359150565b60008060208385031215612aa257600080fd5b823567ffffffffffffffff80821115612aba57600080fd5b818501915085601f830112612ace57600080fd5b813581811115612add57600080fd5b866020828501011115612a1f57600080fd5b8035801515811461298e57600080fd5b600060208284031215612b1157600080fd5b61123d82612aef565b600060208284031215612b2c57600080fd5b61123d82612977565b60008060408385031215612b4857600080fd5b612b5183612977565b9150612b5f60208401612aef565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060008060808587031215612bad57600080fd5b612bb685612977565b9350612bc460208601612977565b925060408501359150606085013567ffffffffffffffff80821115612be857600080fd5b818701915087601f830112612bfc57600080fd5b813581811115612c0e57612c0e612b68565b604051601f8201601f19908116603f01168101908382118183101715612c3657612c36612b68565b816040528281528a6020848701011115612c4f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612c8657600080fd5b612c8f83612977565b9150612b5f60208401612977565b600281046001821680612cb157607f821691505b602082108103612cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612d6157612d61612d1f565b500190565b6000816000190483118215151615612d8057612d80612d1f565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612dc357612dc3612d85565b500490565b600082821015612dda57612dda612d1f565b500390565b600082612dee57612dee612d85565b500690565b60008351612e058184602088016128f3565b835190830190612e198183602088016128f3565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060018201612e5c57612e5c612d1f565b5060010190565b6000600160a060020a03808716835280861660208401525083604083015260806060830152612e95608083018461291f565b9695505050505050565b600060208284031215612eb157600080fd5b815161123d816128a856fea2646970667358221220800e95eefdfa005cd32e19ada2b734d39766171a0403fbd69c2df564c402027c64736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106102f9576000357c0100000000000000000000000000000000000000000000000000000000900480638f73a4a2116101a1578063bfcbc75f116100f3578063e8a3d485116100a7578063ee1cc94411610081578063ee1cc944146107de578063ef4ec047146107fe578063f2fde38b1461081e57600080fd5b8063e8a3d4851461076b578063e985e9c514610780578063ec8c8904146107c957600080fd5b8063d547cfb7116100d8578063d547cfb71461070d578063de82231714610722578063e344846c1461075157600080fd5b8063bfcbc75f14610658578063c87b56dd146106ed57600080fd5b8063a1ee978511610155578063b2a4c6b11161012f578063b2a4c6b11461068d578063b858c92f146106ad578063b88d4fde146106cd57600080fd5b8063a1ee978514610658578063a22cb4651461066d578063b0bfa0311461065857600080fd5b806395d89b411161018657806395d89b41146106105780639913910314610625578063a0712d681461064557600080fd5b80638f73a4a2146105da578063938e3d7b146105f057600080fd5b806330176e131161025a5780636352211e1161020e57806370a08231116101e857806370a082311461057c578063869ed08e1461059c5780638da5cb5b146105bc57600080fd5b80636352211e1461052257806364d1fe85146105425780636c8cede21461056257600080fd5b806342842e0e1161023f57806342842e0e146104cc57806344c59615146104ec5780635a47c9a91461050257600080fd5b806330176e131461048c5780633ba4ffa6146104ac57600080fd5b80630ed6b392116102b157806323b872dd1161029657806323b872dd1461041857806324600fc3146104385780632a55205a1461044d57600080fd5b80630ed6b392146103d9578063150c957c146103f857600080fd5b806306fdde03116102e257806306fdde031461035d578063081812fc1461037f578063095ea7b3146103b757600080fd5b806301ffc9a7146102fe578063032ebf5414610333575b600080fd5b34801561030a57600080fd5b5061031e6103193660046128d6565b61083e565b60405190151581526020015b60405180910390f35b34801561033f57600080fd5b5061034f67011c37937e08000081565b60405190815260200161032a565b34801561036957600080fd5b50610372610923565b60405161032a919061294b565b34801561038b57600080fd5b5061039f61039a36600461295e565b6109b5565b604051600160a060020a03909116815260200161032a565b3480156103c357600080fd5b506103d76103d2366004612993565b610a63565b005b3480156103e557600080fd5b5060065461031e90610100900460ff1681565b34801561040457600080fd5b506103d76104133660046129bd565b610b9a565b34801561042457600080fd5b506103d7610433366004612a31565b610c6c565b34801561044457600080fd5b506103d7610cf6565b34801561045957600080fd5b5061046d610468366004612a6d565b610d90565b60408051600160a060020a03909316835260208301919091520161032a565b34801561049857600080fd5b506103d76104a7366004612a8f565b610e2e565b3480156104b857600080fd5b506103d76104c7366004612aff565b610e97565b3480156104d857600080fd5b506103d76104e7366004612a31565b610f07565b3480156104f857600080fd5b5061034f6103e881565b34801561050e57600080fd5b506103d761051d36600461295e565b610f22565b34801561052e57600080fd5b5061039f61053d36600461295e565b610fed565b34801561054e57600080fd5b5061034f61055d36600461295e565b61107b565b34801561056e57600080fd5b5060065461031e9060ff1681565b34801561058857600080fd5b5061034f610597366004612b1a565b611104565b3480156105a857600080fd5b5061034f6105b736600461295e565b6111a1565b3480156105c857600080fd5b50600854600160a060020a031661039f565b3480156105e657600080fd5b5061034f600e5481565b3480156105fc57600080fd5b506103d761060b366004612a8f565b611244565b34801561061c57600080fd5b506103726112ad565b34801561063157600080fd5b506103d7610640366004612b1a565b6112bc565b6103d761065336600461295e565b6113c7565b34801561066457600080fd5b5061034f603281565b34801561067957600080fd5b506103d7610688366004612b35565b6116a8565b34801561069957600080fd5b5061034f6106a836600461295e565b6116b3565b3480156106b957600080fd5b506103d76106c836600461295e565b6116e7565b3480156106d957600080fd5b506103d76106e8366004612b97565b611749565b3480156106f957600080fd5b5061037261070836600461295e565b6117da565b34801561071957600080fd5b50610372611884565b34801561072e57600080fd5b5061031e61073d36600461295e565b6000908152600f6020526040902054151590565b34801561075d57600080fd5b5060115461031e9060ff1681565b34801561077757600080fd5b50610372611893565b34801561078c57600080fd5b5061031e61079b366004612c73565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d557600080fd5b506103d76118a2565b3480156107ea57600080fd5b506103d76107f9366004612aff565b611a05565b34801561080a57600080fd5b506103d7610819366004612b1a565b611a75565b34801561082a57600080fd5b506103d7610839366004612b1a565b611b2e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108d157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061091d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461093290612c9d565b80601f016020809104026020016040519081016040528092919081815260200182805461095e90612c9d565b80156109ab5780601f10610980576101008083540402835291602001916109ab565b820191906000526020600020905b81548152906001019060200180831161098e57829003601f168201915b5050505050905090565b600081815260026020526040812054600160a060020a0316610a475760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b50600090815260046020526040902054600160a060020a031690565b6000610a6e82610fed565b905080600160a060020a031683600160a060020a031603610afa5760405160e560020a62461bcd02815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a3e565b33600160a060020a0382161480610b165750610b16813361079b565b610b8b5760405160e560020a62461bcd02815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a3e565b610b958383611c13565b505050565b60005b81811015610b95576000838383818110610bb957610bb9612cf0565b90506020020135905033600160a060020a0316610bd582610fed565b600160a060020a031614610c2e5760405160e560020a62461bcd02815260206004820152601860248201527f796f7520646f6e2774206f776e207468697320746f6b656e00000000000000006044820152606401610a3e565b6000818152600f602052604090205415610c5057610c4b81611c8e565b610c59565b610c5981611d8f565b50610c65816001612d4e565b9050610b9d565b610c763382611ea0565b610ceb5760405160e560020a62461bcd02815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a3e565b610b95838383611fab565b600954600160a060020a03163314610d535760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610d8d573d6000803e3d6000fd5b50565b6000828152600260205260408120548190600160a060020a0316610df95760405160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610a3e565b600954600a54600160a060020a039091169061271090610e199086612d66565b610e239190612db4565b915091509250929050565b600854600160a060020a03163314610e8b5760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b610b95600c838361280f565b600854600160a060020a03163314610ef45760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b6011805460ff1916911515919091179055565b610b9583838360405180602001604052806000815250611749565b600854600160a060020a03163314610f7f5760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b600e5415610fd25760405160e560020a62461bcd02815260206004820152601760248201527f63616e206f6e6c792063616c6c2074686973206f6e63650000000000000000006044820152606401610a3e565b80610fdd4342612d4e565b610fe79190612d4e565b600e5550565b600081815260026020526040812054600160a060020a03168061091d5760405160e560020a62461bcd02815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a3e565b600081815260026020526040812054600160a060020a03166110e25760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6110eb826111a1565b60008381526010602052604090205461091d9190612d4e565b6000600160a060020a0382166111855760405160e560020a62461bcd02815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a3e565b50600160a060020a031660009081526003602052604090205490565b600081815260026020526040812054600160a060020a03166112085760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6000828152600f60205260408120541561123a576000838152600f60205260409020546112359042612dc8565b61123d565b60005b9392505050565b600854600160a060020a031633146112a15760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b610b95600d838361280f565b60606001805461093290612c9d565b600954600160a060020a031633146113195760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600160a060020a0381166113985760405160e560020a62461bcd02815260206004820152602160248201527f63616e27742073657420666f756e64657220746f206e756c6c2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a3e565b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60065460ff1661141c5760405160e560020a62461bcd02815260206004820152601560248201527f6d696e74696e67206973206e6f742061637469766500000000000000000000006044820152606401610a3e565b6103e860075411156114735760405160e560020a62461bcd02815260206004820152600860248201527f736f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610a3e565b600081116114c65760405160e560020a62461bcd02815260206004820152600b60248201527f63616e27742062757920300000000000000000000000000000000000000000006044820152606401610a3e565b603281111561151a5760405160e560020a62461bcd02815260206004820152601b60248201527f63616e2774206275792074686174206d616e79206174206f6e636500000000006044820152606401610a3e565b336000908152600b6020526040902054603290611538908390612d4e565b11156115af5760405160e560020a62461bcd02815260206004820152602960248201527f6d696e74696e672074686174206d616e7920776f756c64206769766520796f7560448201527f20746f6f206d616e7900000000000000000000000000000000000000000000006064820152608401610a3e565b6115c167011c37937e08000082612d66565b34146116125760405160e560020a62461bcd02815260206004820152601360248201527f6e6f7420656e6f756768206574682073656e74000000000000000000000000006044820152606401610a3e565b336000908152600b602052604081208054839290611631908490612d4e565b90915550600090505b818110156116a45761164e33600754612196565b60075460405190815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a260078054600190810190915561169d908290612d4e565b905061163a565b5050565b6116a43383836121b0565b60006103e8600e546001846116c89190612dc8565b6116d29190612d4e565b6116dc9190612ddf565b61091d906001612d4e565b600954600160a060020a031633146117445760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600a55565b6117533383611ea0565b6117c85760405160e560020a62461bcd02815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a3e565b6117d484848484612281565b50505050565b600081815260026020526040902054606090600160a060020a03166118445760405160e560020a62461bcd02815260206004820152601f60248201527f63616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610a3e565b61184c611884565b61185d611858846116b3565b61230d565b60405160200161186e929190612df3565b6040516020818303038152906040529050919050565b6060600c805461093290612c9d565b6060600d805461093290612c9d565b600954600160a060020a031633146118ff5760405160e560020a62461bcd02815260206004820152601a60248201527f6f6e6c7920666f756e6465722063616e2063616c6c20746869730000000000006044820152606401610a3e565b600654610100900460ff161561195a5760405160e560020a62461bcd02815260206004820152601f60248201527f63616e2774206d696e74206d6f726520726573657276656420746f6b656e73006044820152606401610a3e565b6006805461ff00191661010017905560075460329060009061197e90600190612dc8565b61198a906103e8612dc8565b905080821115611998578091505b60005b82811015610b95576119af33600754612196565b60075460405190815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a26007805460019081019091556119fe908290612d4e565b905061199b565b600854600160a060020a03163314611a625760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b6006805460ff1916911515919091179055565b600854600160a060020a03163314611ad25760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b600954600160a060020a0316156113195760405160e560020a62461bcd02815260206004820152601760248201527f63616e206f6e6c792063616c6c2074686973206f6e63650000000000000000006044820152606401610a3e565b600854600160a060020a03163314611b8b5760405160e560020a62461bcd02815260206004820152601860248201527f6f6e6c79206f776e65722063616e2063616c6c207468697300000000000000006044820152606401610a3e565b600160a060020a038116611be45760405160e560020a62461bcd02815260206004820152601d60248201527f6e6577206f776e65722063616e6e6f74206265203020616464726573730000006044820152606401610a3e565b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091558190611c5582610fed565b600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260026020526040902054600160a060020a0316611cf55760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6000818152600f6020526040902054611d0e9042612dc8565b60008281526010602052604081208054909190611d2c908490612d4e565b90915550506000818152600f602052604081205580611d4a81610fed565b600160a060020a03167f3c8ee184e401c70c662bf201a42ce516749c47bea85326839530e4d3f602715642604051611d8491815260200190565b60405180910390a350565b60115460ff16611de45760405160e560020a62461bcd02815260206004820152601960248201527f6d656469746174696f6e206973206e6f7420656e61626c6564000000000000006044820152606401610a3e565b600081815260026020526040902054600160a060020a0316611e4b5760405160e560020a62461bcd02815260206004820152601360248201527f746f6b656e20646f65736e2774206578697374000000000000000000000000006044820152606401610a3e565b6000818152600f6020526040902042905580611e6681610fed565b600160a060020a03167fd74c8446b84c39a2e97903540f9719cff0e6a07a77f71228a36e5a3d0f5ab22842604051611d8491815260200190565b600081815260026020526040812054600160a060020a0316611f2d5760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a3e565b6000611f3883610fed565b905080600160a060020a031684600160a060020a03161480611f73575083600160a060020a0316611f68846109b5565b600160a060020a0316145b80611fa35750600160a060020a0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b82600160a060020a0316611fbe82610fed565b600160a060020a03161461203d5760405160e560020a62461bcd02815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a3e565b600160a060020a0382166120bb5760405160e560020a62461bcd028152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a3e565b6120c6838383612461565b6120d1600082611c13565b600160a060020a03831660009081526003602052604081208054600192906120fa908490612dc8565b9091555050600160a060020a0382166000908152600360205260408120805460019290612128908490612d4e565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116a482826040518060200160405280600081525061247e565b81600160a060020a031683600160a060020a0316036122145760405160e560020a62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a3e565b600160a060020a03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61228c848484611fab565b6122988484848461250a565b6117d45760405160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a3e565b60608160000361235057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561237a578061236481612e4a565b91506123739050600a83612db4565b9150612354565b60008167ffffffffffffffff81111561239557612395612b68565b6040519080825280601f01601f1916602001820160405280156123bf576020820181803683370190505b5090505b8415611fa3576123d4600183612dc8565b91506123e1600a86612ddf565b6123ec906030612d4e565b7f01000000000000000000000000000000000000000000000000000000000000000281838151811061242057612420612cf0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061245a600a86612db4565b94506123c3565b6000818152600f602052604090205415610b9557610b9581611c8e565b61248883836126ae565b612495600084848461250a565b610b955760405160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a3e565b6000600160a060020a0384163b156126a3576040517f150b7a02000000000000000000000000000000000000000000000000000000008152600160a060020a0385169063150b7a0290612567903390899088908890600401612e63565b6020604051808303816000875af19250505080156125a2575060408051601f3d908101601f1916820190925261259f91810190612e9f565b60015b612658573d8080156125d0576040519150601f19603f3d011682016040523d82523d6000602084013e6125d5565b606091505b5080516000036126505760405160e560020a62461bcd02815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a3e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611fa3565b506001949350505050565b600160a060020a0382166127075760405160e560020a62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a3e565b600081815260026020526040902054600160a060020a03161561276f5760405160e560020a62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a3e565b61277b60008383612461565b600160a060020a03821660009081526003602052604081208054600192906127a4908490612d4e565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461281b90612c9d565b90600052602060002090601f01602090048101928261283d5760008555612883565b82601f106128565782800160ff19823516178555612883565b82800160010185558215612883579182015b82811115612883578235825591602001919060010190612868565b5061288f929150612893565b5090565b5b8082111561288f5760008155600101612894565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d8d57600080fd5b6000602082840312156128e857600080fd5b813561123d816128a8565b60005b8381101561290e5781810151838201526020016128f6565b838111156117d45750506000910152565b600081518084526129378160208601602086016128f3565b601f01601f19169290920160200192915050565b60208152600061123d602083018461291f565b60006020828403121561297057600080fd5b5035919050565b8035600160a060020a038116811461298e57600080fd5b919050565b600080604083850312156129a657600080fd5b6129af83612977565b946020939093013593505050565b600080602083850312156129d057600080fd5b823567ffffffffffffffff808211156129e857600080fd5b818501915085601f8301126129fc57600080fd5b813581811115612a0b57600080fd5b8660208083028501011115612a1f57600080fd5b60209290920196919550909350505050565b600080600060608486031215612a4657600080fd5b612a4f84612977565b9250612a5d60208501612977565b9150604084013590509250925092565b60008060408385031215612a8057600080fd5b50508035926020909101359150565b60008060208385031215612aa257600080fd5b823567ffffffffffffffff80821115612aba57600080fd5b818501915085601f830112612ace57600080fd5b813581811115612add57600080fd5b866020828501011115612a1f57600080fd5b8035801515811461298e57600080fd5b600060208284031215612b1157600080fd5b61123d82612aef565b600060208284031215612b2c57600080fd5b61123d82612977565b60008060408385031215612b4857600080fd5b612b5183612977565b9150612b5f60208401612aef565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060008060808587031215612bad57600080fd5b612bb685612977565b9350612bc460208601612977565b925060408501359150606085013567ffffffffffffffff80821115612be857600080fd5b818701915087601f830112612bfc57600080fd5b813581811115612c0e57612c0e612b68565b604051601f8201601f19908116603f01168101908382118183101715612c3657612c36612b68565b816040528281528a6020848701011115612c4f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612c8657600080fd5b612c8f83612977565b9150612b5f60208401612977565b600281046001821680612cb157607f821691505b602082108103612cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612d6157612d61612d1f565b500190565b6000816000190483118215151615612d8057612d80612d1f565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612dc357612dc3612d85565b500490565b600082821015612dda57612dda612d1f565b500390565b600082612dee57612dee612d85565b500690565b60008351612e058184602088016128f3565b835190830190612e198183602088016128f3565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060018201612e5c57612e5c612d1f565b5060010190565b6000600160a060020a03808716835280861660208401525083604083015260806060830152612e95608083018461291f565b9695505050505050565b600060208284031215612eb157600080fd5b815161123d816128a856fea2646970667358221220800e95eefdfa005cd32e19ada2b734d39766171a0403fbd69c2df564c402027c64736f6c634300080d0033
Deployed Bytecode Sourcemap
34771:7784:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21588:305;;;;;;;;;;-1:-1:-1;21588:305:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;21588:305:0;;;;;;;;35005:43;;;;;;;;;;;;35038:10;35005:43;;;;;784:25:1;;;772:2;757:18;35005:43:0;638:177:1;22533:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24092:221::-;;;;;;;;;;-1:-1:-1;24092:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1920:55:1;;;1902:74;;1890:2;1875:18;24092:221:0;1756:226:1;23615:411:0;;;;;;;;;;-1:-1:-1;23615:411:0;;;;;:::i;:::-;;:::i;:::-;;35093:34;;;;;;;;;;-1:-1:-1;35093:34:0;;;;;;;;;;;38701:449;;;;;;;;;;-1:-1:-1;38701:449:0;;;;;:::i;:::-;;:::i;24842:339::-;;;;;;;;;;-1:-1:-1;24842:339:0;;;;;:::i;:::-;;:::i;41716:112::-;;;;;;;;;;;;;:::i;41399:309::-;;;;;;;;;;-1:-1:-1;41399:309:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3846:55:1;;;3828:74;;3933:2;3918:18;;3911:34;;;;3801:18;41399:309:0;3654:297:1;40258:101:0;;;;;;;;;;-1:-1:-1;40258:101:0;;;;;:::i;:::-;;:::i;37760:106::-;;;;;;;;;;-1:-1:-1;37760:106:0;;;;;:::i;:::-;;:::i;25252:185::-;;;;;;;;;;-1:-1:-1;25252:185:0;;;;;:::i;:::-;;:::i;34812:41::-;;;;;;;;;;;;34849:4;34812:41;;40022:228;;;;;;;;;;-1:-1:-1;40022:228:0;;;;;:::i;:::-;;:::i;22227:239::-;;;;;;;;;;-1:-1:-1;22227:239:0;;;;;:::i;:::-;;:::i;39158:248::-;;;;;;;;;;-1:-1:-1;39158:248:0;;;;;:::i;:::-;;:::i;35055:31::-;;;;;;;;;;-1:-1:-1;35055:31:0;;;;;;;;21957:208;;;;;;;;;;-1:-1:-1;21957:208:0;;;;;:::i;:::-;;:::i;39414:315::-;;;;;;;;;;-1:-1:-1;39414:315:0;;;;;:::i;:::-;;:::i;42465:87::-;;;;;;;;;;-1:-1:-1;42538:6:0;;-1:-1:-1;;;;;42538:6:0;42465:87;;35447:31;;;;;;;;;;;;;;;;41124:117;;;;;;;;;;-1:-1:-1;41124:117:0;;;;;:::i;:::-;;:::i;22702:104::-;;;;;;;;;;;;;:::i;42020:187::-;;;;;;;;;;-1:-1:-1;42020:187:0;;;;;:::i;:::-;;:::i;36801:784::-;;;;;;:::i;:::-;;:::i;34956:42::-;;;;;;;;;;;;34996:2;34956:42;;24385:155;;;;;;;;;;-1:-1:-1;24385:155:0;;;;;:::i;:::-;;:::i;40474:246::-;;;;;;;;;;-1:-1:-1;40474:246:0;;;;;:::i;:::-;;:::i;41249:142::-;;;;;;;;;;-1:-1:-1;41249:142:0;;;;;:::i;:::-;;:::i;25508:328::-;;;;;;;;;;-1:-1:-1;25508:328:0;;;;;:::i;:::-;;:::i;40728:279::-;;;;;;;;;;-1:-1:-1;40728:279:0;;;;;:::i;:::-;;:::i;40367:99::-;;;;;;;;;;;;;:::i;38560:133::-;;;;;;;;;;-1:-1:-1;38560:133:0;;;;;:::i;:::-;38621:4;38644:36;;;:26;:36;;;;;;:41;;;38560:133;35624:37;;;;;;;;;;-1:-1:-1;35624:37:0;;;;;;;;41019:97;;;;;;;;;;;;;:::i;24611:164::-;;;;;;;;;;-1:-1:-1;24611:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24732:25:0;;;24708:4;24732:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24611:164;36063:628;;;;;;;;;;;;;:::i;36699:94::-;;;;;;;;;;-1:-1:-1;36699:94:0;;;;;:::i;:::-;;:::i;42215:242::-;;;;;;;;;;-1:-1:-1;42215:242:0;;;;;:::i;:::-;;:::i;41836:176::-;;;;;;;;;;-1:-1:-1;41836:176:0;;;;;:::i;:::-;;:::i;21588:305::-;21690:4;21727:40;;;21742:25;21727:40;;:105;;-1:-1:-1;21784:48:0;;;21799:33;21784:48;21727:105;:158;;;-1:-1:-1;20145:25:0;20130:40;;;;21849:36;21707:178;21588:305;-1:-1:-1;;21588:305:0:o;22533:100::-;22587:13;22620:5;22613:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22533:100;:::o;24092:221::-;24168:7;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;24188:73;;;;-1:-1:-1;;;;;24188:73:0;;7594:2:1;24188:73:0;;;7576:21:1;7633:2;7613:18;;;7606:30;7672:34;7652:18;;;7645:62;7743:14;7723:18;;;7716:42;7775:19;;24188:73:0;;;;;;;;;-1:-1:-1;24281:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24281:24:0;;24092:221::o;23615:411::-;23696:13;23712:23;23727:7;23712:14;:23::i;:::-;23696:39;;23760:5;-1:-1:-1;;;;;23754:11:0;:2;-1:-1:-1;;;;;23754:11:0;;23746:57;;;;-1:-1:-1;;;;;23746:57:0;;8007:2:1;23746:57:0;;;7989:21:1;8046:2;8026:18;;;8019:30;8085:34;8065:18;;;8058:62;8156:3;8136:18;;;8129:31;8177:19;;23746:57:0;7805:397:1;23746:57:0;16904:10;-1:-1:-1;;;;;23838:21:0;;;;:62;;-1:-1:-1;23863:37:0;23880:5;16904:10;24611:164;:::i;23863:37::-;23816:168;;;;-1:-1:-1;;;;;23816:168:0;;8409:2:1;23816:168:0;;;8391:21:1;8448:2;8428:18;;;8421:30;8487:34;8467:18;;;8460:62;8558:26;8538:18;;;8531:54;8602:19;;23816:168:0;8207:420:1;23816:168:0;23997:21;24006:2;24010:7;23997:8;:21::i;:::-;23685:341;23615:411;;:::o;38701:449::-;38780:6;38775:368;38792:20;;;38775:368;;;38839:19;38861:9;;38871:1;38861:12;;;;;;;:::i;:::-;;;;;;;38839:34;;38920:10;-1:-1:-1;;;;;38896:34:0;:20;38904:11;38896:7;:20::i;:::-;-1:-1:-1;;;;;38896:34:0;;38888:71;;;;-1:-1:-1;;;;;38888:71:0;;9023:2:1;38888:71:0;;;9005:21:1;9062:2;9042:18;;;9035:30;9101:26;9081:18;;;9074:54;9145:18;;38888:71:0;8821:348:1;38888:71:0;38621:4;38644:36;;;:26;:36;;;;;;:41;38974:158;;39024:30;39042:11;39024:17;:30::i;:::-;38974:158;;;39095:21;39104:11;39095:8;:21::i;:::-;-1:-1:-1;38818:5:0;:1;38822;38818:5;:::i;:::-;38814:9;;38775:368;;24842:339;25037:41;16904:10;25070:7;25037:18;:41::i;:::-;25029:103;;;;-1:-1:-1;;;;;25029:103:0;;9698:2:1;25029:103:0;;;9680:21:1;9737:2;9717:18;;;9710:30;9776:34;9756:18;;;9749:62;9847:19;9827:18;;;9820:47;9884:19;;25029:103:0;9496:413:1;25029:103:0;25145:28;25155:4;25161:2;25165:7;25145:9;:28::i;41716:112::-;35843:8;;-1:-1:-1;;;;;35843:8:0;35829:10;:22;35821:61;;;;-1:-1:-1;;;;;35821:61:0;;10116:2:1;35821:61:0;;;10098:21:1;10155:2;10135:18;;;10128:30;10194:28;10174:18;;;10167:56;10240:18;;35821:61:0;9914:350:1;35821:61:0;41779:8:::1;::::0;41771:49:::1;::::0;-1:-1:-1;;;;;41779:8:0;;::::1;::::0;41806:4:::1;41798:21;41771:49:::0;::::1;;;::::0;41779:8:::1;41771:49:::0;41779:8;41771:49;41798:21;41779:8;41771:49;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41716:112::o:0;41399:309::-;41508:17;27435:16;;;:7;:16;;;;;;41508:17;;-1:-1:-1;;;;;27435:16:0;41567:61;;;;-1:-1:-1;;;;;41567:61:0;;10471:2:1;41567:61:0;;;10453:21:1;10510:2;10490:18;;;10483:30;10549:33;10529:18;;;10522:61;10600:18;;41567:61:0;10269:355:1;41567:61:0;41647:8;;41671:19;;-1:-1:-1;;;;;41647:8:0;;;;41694:5;;41658:32;;:10;:32;:::i;:::-;41657:42;;;;:::i;:::-;41639:61;;;;41399:309;;;;;:::o;40258:101::-;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;40332:19:::1;:13;40348:3:::0;;40332:19:::1;:::i;37760:106::-:0;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;37831:17:::1;:27:::0;;-1:-1:-1;;37831:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37760:106::o;25252:185::-;25390:39;25407:4;25413:2;25417:7;25390:39;;;;;;;;;;;;:16;:39::i;40022:228::-;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;40115:12:::1;::::0;:17;40107:53:::1;;;::::0;-1:-1:-1;;;;;40107:53:0;;11671:2:1;40107:53:0::1;::::0;::::1;11653:21:1::0;11710:2;11690:18;;;11683:30;11749:25;11729:18;;;11722:53;11792:18;;40107:53:0::1;11469:347:1::0;40107:53:0::1;40219:23:::0;40186:30:::1;40204:12;40186:15;:30;:::i;:::-;:56;;;;:::i;:::-;40171:12;:71:::0;-1:-1:-1;40022:228:0:o;22227:239::-;22299:7;22335:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22335:16:0;;22362:73;;;;-1:-1:-1;;;;;22362:73:0;;12023:2:1;22362:73:0;;;12005:21:1;12062:2;12042:18;;;12035:30;12101:34;12081:18;;;12074:62;12172:11;12152:18;;;12145:39;12201:19;;22362:73:0;11821:405:1;39158:248:0;39229:7;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;39249:49;;;;-1:-1:-1;;;;;39249:49:0;;12433:2:1;39249:49:0;;;12415:21:1;12472:2;12452:18;;;12445:30;12511:21;12491:18;;;12484:49;12550:18;;39249:49:0;12231:343:1;39249:49:0;39364:34;39389:8;39364:24;:34::i;:::-;39326:35;;;;:25;:35;;;;;;:72;;;;:::i;21957:208::-;22029:7;-1:-1:-1;;;;;22057:19:0;;22049:74;;;;-1:-1:-1;;;;;22049:74:0;;12781:2:1;22049:74:0;;;12763:21:1;12820:2;12800:18;;;12793:30;12859:34;12839:18;;;12832:62;12930:12;12910:18;;;12903:40;12960:19;;22049:74:0;12579:406:1;22049:74:0;-1:-1:-1;;;;;;22141:16:0;;;;;:9;:16;;;;;;;21957:208::o;39414:315::-;39487:7;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;39506:49;;;;-1:-1:-1;;;;;39506:49:0;;12433:2:1;39506:49:0;;;12415:21:1;12472:2;12452:18;;;12445:30;12511:21;12491:18;;;12484:49;12550:18;;39506:49:0;12231:343:1;39506:49:0;39568:19;39590:36;;;:26;:36;;;;;;:41;:102;;39656:36;;;;:26;:36;;;;;;39638:54;;:15;:54;:::i;:::-;39590:102;;;39634:1;39590:102;39568:124;39414:315;-1:-1:-1;;;39414:315:0:o;41124:117::-;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;41206:27:::1;:12;41221::::0;;41206:27:::1;:::i;22702:104::-:0;22758:13;22791:7;22784:14;;;;;:::i;42020:187::-;35843:8;;-1:-1:-1;;;;;35843:8:0;35829:10;:22;35821:61;;;;-1:-1:-1;;;;;35821:61:0;;10116:2:1;35821:61:0;;;10098:21:1;10155:2;10135:18;;;10128:30;10194:28;10174:18;;;10167:56;10240:18;;35821:61:0;9914:350:1;35821:61:0;-1:-1:-1;;;;;42104:25:0;::::1;42096:70;;;::::0;-1:-1:-1;;;;;42096:70:0;;13322:2:1;42096:70:0::1;::::0;::::1;13304:21:1::0;13361:2;13341:18;;;13334:30;13400:34;13380:18;;;13373:62;13471:3;13451:18;;;13444:31;13492:19;;42096:70:0::1;13120:397:1::0;42096:70:0::1;42177:8;:22:::0;;-1:-1:-1;;42177:22:0::1;-1:-1:-1::0;;;;;42177:22:0;;;::::1;::::0;;;::::1;::::0;;42020:187::o;36801:784::-;36867:11;;;;36859:45;;;;-1:-1:-1;;;;;36859:45:0;;13724:2:1;36859:45:0;;;13706:21:1;13763:2;13743:18;;;13736:30;13802:23;13782:18;;;13775:51;13843:18;;36859:45:0;13522:345:1;36859:45:0;34849:4;36923:12;;:26;;36915:47;;;;-1:-1:-1;;;;;36915:47:0;;14074:2:1;36915:47:0;;;14056:21:1;14113:1;14093:18;;;14086:29;14151:10;14131:18;;;14124:38;14179:18;;36915:47:0;13872:331:1;36915:47:0;36992:1;36981:8;:12;36973:36;;;;-1:-1:-1;;;;;36973:36:0;;14410:2:1;36973:36:0;;;14392:21:1;14449:2;14429:18;;;14422:30;14488:13;14468:18;;;14461:41;14519:18;;36973:36:0;14208:335:1;36973:36:0;34898:2;37028:8;:23;;37020:63;;;;-1:-1:-1;;;;;37020:63:0;;14750:2:1;37020:63:0;;;14732:21:1;14789:2;14769:18;;;14762:30;14828:29;14808:18;;;14801:57;14875:18;;37020:63:0;14548:351:1;37020:63:0;37124:10;37102:33;;;;:21;:33;;;;;;34947:2;;37102:44;;37138:8;;37102:44;:::i;:::-;:61;;37094:115;;;;-1:-1:-1;;;;;37094:115:0;;15106:2:1;37094:115:0;;;15088:21:1;15145:2;15125:18;;;15118:30;15184:34;15164:18;;;15157:62;15255:11;15235:18;;;15228:39;15284:19;;37094:115:0;14904:405:1;37094:115:0;37241:15;35038:10;37241:8;:15;:::i;:::-;37228:9;:28;37220:60;;;;-1:-1:-1;;;;;37220:60:0;;15516:2:1;37220:60:0;;;15498:21:1;15555:2;15535:18;;;15528:30;15594:21;15574:18;;;15567:49;15633:18;;37220:60:0;15314:343:1;37220:60:0;37315:10;37293:33;;;;:21;:33;;;;;:45;;37330:8;;37293:33;:45;;37330:8;;37293:45;:::i;:::-;;;;-1:-1:-1;37354:6:0;;-1:-1:-1;37349:229:0;37370:8;37366:1;:12;37349:229;;;37405:35;37415:10;37427:12;;37405:9;:35::i;:::-;37477:12;;37460:30;;784:25:1;;;37465:10:0;;37460:30;;772:2:1;757:18;37460:30:0;;;;;;;37534:12;:17;;37550:1;37534:17;;;;;;37384:5;;:1;;:5;:::i;:::-;37380:9;;37349:229;;;;36801:784;:::o;24385:155::-;24480:52;16904:10;24513:8;24523;24480:18;:52::i;40474:246::-;40538:7;34849:4;40680:12;;40676:1;40666:7;:11;;;;:::i;:::-;:26;;;;:::i;:::-;40665:41;;;;:::i;:::-;40664:47;;40710:1;40664:47;:::i;41249:142::-;35843:8;;-1:-1:-1;;;;;35843:8:0;35829:10;:22;35821:61;;;;-1:-1:-1;;;;;35821:61:0;;10116:2:1;35821:61:0;;;10098:21:1;10155:2;10135:18;;;10128:30;10194:28;10174:18;;;10167:56;10240:18;;35821:61:0;9914:350:1;35821:61:0;41342:19:::1;:41:::0;41249:142::o;25508:328::-;25683:41;16904:10;25716:7;25683:18;:41::i;:::-;25675:103;;;;-1:-1:-1;;;;;25675:103:0;;9698:2:1;25675:103:0;;;9680:21:1;9737:2;9717:18;;;9710:30;9776:34;9756:18;;;9749:62;9847:19;9827:18;;;9820:47;9884:19;;25675:103:0;9496:413:1;25675:103:0;25789:39;25803:4;25809:2;25813:7;25822:5;25789:13;:39::i;:::-;25508:328;;;;:::o;40728:279::-;27411:4;27435:16;;;:7;:16;;;;;;40801:13;;-1:-1:-1;;;;;27435:16:0;40827:60;;;;-1:-1:-1;;;;;40827:60:0;;15981:2:1;40827:60:0;;;15963:21:1;16020:2;16000:18;;;15993:30;16059:33;16039:18;;;16032:61;16110:18;;40827:60:0;15779:355:1;40827:60:0;40929:14;:12;:14::i;:::-;40945:43;40962:25;40979:7;40962:16;:25::i;:::-;40945:16;:43::i;:::-;40912:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40898:101;;40728:279;;;:::o;40367:99::-;40412:13;40445;40438:20;;;;;:::i;41019:97::-;41063:13;41096:12;41089:19;;;;;:::i;36063:628::-;35843:8;;-1:-1:-1;;;;;35843:8:0;35829:10;:22;35821:61;;;;-1:-1:-1;;;;;35821:61:0;;10116:2:1;35821:61:0;;;10098:21:1;10155:2;10135:18;;;10128:30;10194:28;10174:18;;;10167:56;10240:18;;35821:61:0;9914:350:1;35821:61:0;36126:14:::1;::::0;::::1;::::0;::::1;;;36125:15;36117:59;;;::::0;-1:-1:-1;;;;;36117:59:0;;16983:2:1;36117:59:0::1;::::0;::::1;16965:21:1::0;17022:2;17002:18;;;16995:30;17061:33;17041:18;;;17034:61;17112:18;;36117:59:0::1;16781:355:1::0;36117:59:0::1;36187:14;:21:::0;;-1:-1:-1;;36187:21:0::1;;;::::0;;36313:12:::1;::::0;34996:2:::1;::::0;36187:21;;36313:16:::1;::::0;36204:4:::1;::::0;36313:16:::1;:::i;:::-;36299:31;::::0;34849:4:::1;36299:31;:::i;:::-;36276:54;;36360:12;36345;:27;36341:87;;;36404:12;36389:27;;36341:87;36453:6;36448:233;36469:12;36465:1;:16;36448:233;;;36508:35;36518:10;36530:12;;36508:9;:35::i;:::-;36580:12;::::0;36563:30:::1;::::0;784:25:1;;;36568:10:0::1;::::0;36563:30:::1;::::0;772:2:1;757:18;36563:30:0::1;;;;;;;36637:12;:17:::0;;36653:1:::1;36637:17:::0;;::::1;::::0;;;36487:5:::1;::::0;:1;;:5:::1;:::i;:::-;36483:9;;36448:233;;36699:94:::0;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;36764:11:::1;:21:::0;;-1:-1:-1;;36764:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36699:94::o;42215:242::-;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;42290:8:::1;::::0;-1:-1:-1;;;;;42290:8:0::1;:22:::0;42282:58:::1;;;::::0;-1:-1:-1;;;;;42282:58:0;;11671:2:1;42282:58:0::1;::::0;::::1;11653:21:1::0;11710:2;11690:18;;;11683:30;11749:25;11729:18;;;11722:53;11792:18;;42282:58:0::1;11469:347:1::0;41836:176:0;35726:6;;-1:-1:-1;;;;;35726:6:0;35712:10;:20;35704:57;;;;-1:-1:-1;;;;;35704:57:0;;11318:2:1;35704:57:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:26;11376:18;;;11369:54;11440:18;;35704:57:0;11116:348:1;35704:57:0;-1:-1:-1;;;;;41918:23:0;::::1;41910:65;;;::::0;-1:-1:-1;;;;;41910:65:0;;17343:2:1;41910:65:0::1;::::0;::::1;17325:21:1::0;17382:2;17362:18;;;17355:30;17421:31;17401:18;;;17394:59;17470:18;;41910:65:0::1;17141:353:1::0;41910:65:0::1;41986:6;:18:::0;;-1:-1:-1;;41986:18:0::1;-1:-1:-1::0;;;;;41986:18:0;;;::::1;::::0;;;::::1;::::0;;41836:176::o;31492:174::-;31567:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;31567:29:0;-1:-1:-1;;;;;31567:29:0;;;;;;;;:24;;31621:23;31567:24;31621:14;:23::i;:::-;-1:-1:-1;;;;;31612:46:0;;;;;;;;;;;31492:174;;:::o;38204:348::-;27411:4;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;38269:49;;;;-1:-1:-1;;;;;38269:49:0;;12433:2:1;38269:49:0;;;12415:21:1;12472:2;12452:18;;;12445:30;12511:21;12491:18;;;12484:49;12550:18;;38269:49:0;12231:343:1;38269:49:0;38388:36;;;;:26;:36;;;;;;38370:54;;:15;:54;:::i;:::-;38331:35;;;;:25;:35;;;;;:93;;:35;;;:93;;;;;:::i;:::-;;;;-1:-1:-1;;38474:1:0;38435:36;;;:26;:36;;;;;:40;38462:8;38499:17;38462:8;38499:7;:17::i;:::-;-1:-1:-1;;;;;38491:53:0;;38528:15;38491:53;;;;784:25:1;;772:2;757:18;;638:177;38491:53:0;;;;;;;;38204:348;:::o;37874:318::-;37938:17;;;;37930:55;;;;-1:-1:-1;;;;;37930:55:0;;17701:2:1;37930:55:0;;;17683:21:1;17740:2;17720:18;;;17713:30;17779:27;17759:18;;;17752:55;17824:18;;37930:55:0;17499:349:1;37930:55:0;27411:4;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;37996:49;;;;-1:-1:-1;;;;;37996:49:0;;12433:2:1;37996:49:0;;;12415:21:1;12472:2;12452:18;;;12445:30;12511:21;12491:18;;;12484:49;12550:18;;37996:49:0;12231:343:1;37996:49:0;38058:36;;;;:26;:36;;;;;38097:15;38058:54;;38085:8;38139:17;38085:8;38139:7;:17::i;:::-;-1:-1:-1;;;;;38130:54:0;;38168:15;38130:54;;;;784:25:1;;772:2;757:18;;638:177;27640:348:0;27733:4;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;27750:73;;;;-1:-1:-1;;;;;27750:73:0;;18055:2:1;27750:73:0;;;18037:21:1;18094:2;18074:18;;;18067:30;18133:34;18113:18;;;18106:62;18204:14;18184:18;;;18177:42;18236:19;;27750:73:0;17853:408:1;27750:73:0;27834:13;27850:23;27865:7;27850:14;:23::i;:::-;27834:39;;27903:5;-1:-1:-1;;;;;27892:16:0;:7;-1:-1:-1;;;;;27892:16:0;;:51;;;;27936:7;-1:-1:-1;;;;;27912:31:0;:20;27924:7;27912:11;:20::i;:::-;-1:-1:-1;;;;;27912:31:0;;27892:51;:87;;;-1:-1:-1;;;;;;24732:25:0;;;24708:4;24732:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27947:32;27884:96;27640:348;-1:-1:-1;;;;27640:348:0:o;30749:625::-;30908:4;-1:-1:-1;;;;;30881:31:0;:23;30896:7;30881:14;:23::i;:::-;-1:-1:-1;;;;;30881:31:0;;30873:81;;;;-1:-1:-1;;;;;30873:81:0;;18468:2:1;30873:81:0;;;18450:21:1;18507:2;18487:18;;;18480:30;18546:34;18526:18;;;18519:62;18617:7;18597:18;;;18590:35;18642:19;;30873:81:0;18266:401:1;30873:81:0;-1:-1:-1;;;;;30973:16:0;;30965:65;;;;-1:-1:-1;;;;;30965:65:0;;18874:2:1;30965:65:0;;;18856:21:1;18913:2;18893:18;;;18886:30;18952:34;18932:18;;;18925:62;19023:6;19003:18;;;18996:34;19047:19;;30965:65:0;18672:400:1;30965:65:0;31043:39;31064:4;31070:2;31074:7;31043:20;:39::i;:::-;31147:29;31164:1;31168:7;31147:8;:29::i;:::-;-1:-1:-1;;;;;31189:15:0;;;;;;:9;:15;;;;;:20;;31208:1;;31189:15;:20;;31208:1;;31189:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31220:13:0;;;;;;:9;:13;;;;;:18;;31237:1;;31220:13;:18;;31237:1;;31220:18;:::i;:::-;;;;-1:-1:-1;;31249:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;31249:21:0;-1:-1:-1;;;;;31249:21:0;;;;;;;;;31288:27;;31249:16;;31288:27;;;;;;;23685:341;23615:411;;:::o;28330:110::-;28406:26;28416:2;28420:7;28406:26;;;;;;;;;;;;:9;:26::i;31808:315::-;31963:8;-1:-1:-1;;;;;31954:17:0;:5;-1:-1:-1;;;;;31954:17:0;;31946:55;;;;-1:-1:-1;;;;;31946:55:0;;19279:2:1;31946:55:0;;;19261:21:1;19318:2;19298:18;;;19291:30;19357:27;19337:18;;;19330:55;19402:18;;31946:55:0;19077:349:1;31946:55:0;-1:-1:-1;;;;;32012:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32012:46:0;;;;;;;;;;32074:41;;586::1;;;32074::0;;559:18:1;32074:41:0;;;;;;;31808:315;;;:::o;26718:::-;26875:28;26885:4;26891:2;26895:7;26875:9;:28::i;:::-;26922:48;26945:4;26951:2;26955:7;26964:5;26922:22;:48::i;:::-;26914:111;;;;-1:-1:-1;;;;;26914:111:0;;19633:2:1;26914:111:0;;;19615:21:1;19672:2;19652:18;;;19645:30;19711:34;19691:18;;;19684:62;19782:20;19762:18;;;19755:48;19820:19;;26914:111:0;19431:414:1;17401:723:0;17457:13;17678:5;17687:1;17678:10;17674:53;;-1:-1:-1;;17705:10:0;;;;;;;;;;;;;;;;;;17401:723::o;17674:53::-;17752:5;17737:12;17793:78;17800:9;;17793:78;;17826:8;;;;:::i;:::-;;-1:-1:-1;17849:10:0;;-1:-1:-1;17857:2:0;17849:10;;:::i;:::-;;;17793:78;;;17881:19;17913:6;17903:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17903:17:0;;17881:39;;17931:154;17938:10;;17931:154;;17965:11;17975:1;17965:11;;:::i;:::-;;-1:-1:-1;18034:10:0;18042:2;18034:5;:10;:::i;:::-;18021:24;;:2;:24;:::i;:::-;18008:39;;17991:6;17998;17991:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;18062:11:0;18071:2;18062:11;;:::i;:::-;;;17931:154;;39737:277;38621:4;38644:36;;;:26;:36;;;;;;:41;39873:78;;39913:26;39931:7;39913:17;:26::i;28667:321::-;28797:18;28803:2;28807:7;28797:5;:18::i;:::-;28848:54;28879:1;28883:2;28887:7;28896:5;28848:22;:54::i;:::-;28826:154;;;;-1:-1:-1;;;;;28826:154:0;;19633:2:1;28826:154:0;;;19615:21:1;19672:2;19652:18;;;19645:30;19711:34;19691:18;;;19684:62;19782:20;19762:18;;;19755:48;19820:19;;28826:154:0;19431:414:1;32688:799:0;32843:4;-1:-1:-1;;;;;32864:13:0;;9172:19;:23;32860:620;;32900:72;;;;;-1:-1:-1;;;;;32900:36:0;;;;;:72;;16904:10;;32951:4;;32957:7;;32966:5;;32900:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32900:72:0;;;;;;;;-1:-1:-1;;32900:72:0;;;;;;;;;;;;:::i;:::-;;;32896:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33142:6;:13;33159:1;33142:18;33138:272;;33185:60;;-1:-1:-1;;;;;33185:60:0;;19633:2:1;33185:60:0;;;19615:21:1;19672:2;19652:18;;;19645:30;19711:34;19691:18;;;19684:62;19782:20;19762:18;;;19755:48;19820:19;;33185:60:0;19431:414:1;33138:272:0;33360:6;33354:13;33345:6;33341:2;33337:15;33330:38;32896:529;33023:51;;33033:41;33023:51;;-1:-1:-1;33016:58:0;;32860:620;-1:-1:-1;33464:4:0;32688:799;;;;;;:::o;29324:439::-;-1:-1:-1;;;;;29404:16:0;;29396:61;;;;-1:-1:-1;;;;;29396:61:0;;20963:2:1;29396:61:0;;;20945:21:1;;;20982:18;;;20975:30;21041:34;21021:18;;;21014:62;21093:18;;29396:61:0;20761:356:1;29396:61:0;27411:4;27435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27435:16:0;:30;29468:58;;;;-1:-1:-1;;;;;29468:58:0;;21324:2:1;29468:58:0;;;21306:21:1;21363:2;21343:18;;;21336:30;21402;21382:18;;;21375:58;21450:18;;29468:58:0;21122:352:1;29468:58:0;29539:45;29568:1;29572:2;29576:7;29539:20;:45::i;:::-;-1:-1:-1;;;;;29597:13:0;;;;;;:9;:13;;;;;:18;;29614:1;;29597:13;:18;;29614:1;;29597:18;:::i;:::-;;;;-1:-1:-1;;29626:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;29626:21:0;-1:-1:-1;;;;;29626:21:0;;;;;;;;29665:33;;29626:16;;;29665:33;;29626:16;;29665:33;37349:229;36801:784;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:258::-;892:1;902:113;916:6;913:1;910:13;902:113;;;992:11;;;986:18;973:11;;;966:39;938:2;931:10;902:113;;;1033:6;1030:1;1027:13;1024:48;;;-1:-1:-1;;1068:1:1;1050:16;;1043:27;820:258::o;1083:::-;1125:3;1163:5;1157:12;1190:6;1185:3;1178:19;1206:63;1262:6;1255:4;1250:3;1246:14;1239:4;1232:5;1228:16;1206:63;:::i;:::-;1323:2;1302:15;-1:-1:-1;;1298:29:1;1289:39;;;;1330:4;1285:50;;1083:258;-1:-1:-1;;1083:258:1:o;1346:220::-;1495:2;1484:9;1477:21;1458:4;1515:45;1556:2;1545:9;1541:18;1533:6;1515:45;:::i;1571:180::-;1630:6;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;-1:-1:-1;1722:23:1;;1571:180;-1:-1:-1;1571:180:1:o;1987:196::-;2055:20;;-1:-1:-1;;;;;2104:54:1;;2094:65;;2084:93;;2173:1;2170;2163:12;2084:93;1987:196;;;:::o;2188:254::-;2256:6;2264;2317:2;2305:9;2296:7;2292:23;2288:32;2285:52;;;2333:1;2330;2323:12;2285:52;2356:29;2375:9;2356:29;:::i;:::-;2346:39;2432:2;2417:18;;;;2404:32;;-1:-1:-1;;;2188:254:1:o;2447:616::-;2533:6;2541;2594:2;2582:9;2573:7;2569:23;2565:32;2562:52;;;2610:1;2607;2600:12;2562:52;2650:9;2637:23;2679:18;2720:2;2712:6;2709:14;2706:34;;;2736:1;2733;2726:12;2706:34;2774:6;2763:9;2759:22;2749:32;;2819:7;2812:4;2808:2;2804:13;2800:27;2790:55;;2841:1;2838;2831:12;2790:55;2881:2;2868:16;2907:2;2899:6;2896:14;2893:34;;;2923:1;2920;2913:12;2893:34;2977:7;2972:2;2966;2958:6;2954:15;2950:2;2946:24;2942:33;2939:46;2936:66;;;2998:1;2995;2988:12;2936:66;3029:2;3021:11;;;;;3051:6;;-1:-1:-1;2447:616:1;;-1:-1:-1;;;;2447:616:1:o;3068:328::-;3145:6;3153;3161;3214:2;3202:9;3193:7;3189:23;3185:32;3182:52;;;3230:1;3227;3220:12;3182:52;3253:29;3272:9;3253:29;:::i;:::-;3243:39;;3301:38;3335:2;3324:9;3320:18;3301:38;:::i;:::-;3291:48;;3386:2;3375:9;3371:18;3358:32;3348:42;;3068:328;;;;;:::o;3401:248::-;3469:6;3477;3530:2;3518:9;3509:7;3505:23;3501:32;3498:52;;;3546:1;3543;3536:12;3498:52;-1:-1:-1;;3569:23:1;;;3639:2;3624:18;;;3611:32;;-1:-1:-1;3401:248:1:o;3956:592::-;4027:6;4035;4088:2;4076:9;4067:7;4063:23;4059:32;4056:52;;;4104:1;4101;4094:12;4056:52;4144:9;4131:23;4173:18;4214:2;4206:6;4203:14;4200:34;;;4230:1;4227;4220:12;4200:34;4268:6;4257:9;4253:22;4243:32;;4313:7;4306:4;4302:2;4298:13;4294:27;4284:55;;4335:1;4332;4325:12;4284:55;4375:2;4362:16;4401:2;4393:6;4390:14;4387:34;;;4417:1;4414;4407:12;4387:34;4462:7;4457:2;4448:6;4444:2;4440:15;4436:24;4433:37;4430:57;;;4483:1;4480;4473:12;4553:160;4618:20;;4674:13;;4667:21;4657:32;;4647:60;;4703:1;4700;4693:12;4718:180;4774:6;4827:2;4815:9;4806:7;4802:23;4798:32;4795:52;;;4843:1;4840;4833:12;4795:52;4866:26;4882:9;4866:26;:::i;4903:186::-;4962:6;5015:2;5003:9;4994:7;4990:23;4986:32;4983:52;;;5031:1;5028;5021:12;4983:52;5054:29;5073:9;5054:29;:::i;5094:254::-;5159:6;5167;5220:2;5208:9;5199:7;5195:23;5191:32;5188:52;;;5236:1;5233;5226:12;5188:52;5259:29;5278:9;5259:29;:::i;:::-;5249:39;;5307:35;5338:2;5327:9;5323:18;5307:35;:::i;:::-;5297:45;;5094:254;;;;;:::o;5353:184::-;5405:77;5402:1;5395:88;5502:4;5499:1;5492:15;5526:4;5523:1;5516:15;5542:1138;5637:6;5645;5653;5661;5714:3;5702:9;5693:7;5689:23;5685:33;5682:53;;;5731:1;5728;5721:12;5682:53;5754:29;5773:9;5754:29;:::i;:::-;5744:39;;5802:38;5836:2;5825:9;5821:18;5802:38;:::i;:::-;5792:48;;5887:2;5876:9;5872:18;5859:32;5849:42;;5942:2;5931:9;5927:18;5914:32;5965:18;6006:2;5998:6;5995:14;5992:34;;;6022:1;6019;6012:12;5992:34;6060:6;6049:9;6045:22;6035:32;;6105:7;6098:4;6094:2;6090:13;6086:27;6076:55;;6127:1;6124;6117:12;6076:55;6163:2;6150:16;6185:2;6181;6178:10;6175:36;;;6191:18;;:::i;:::-;6266:2;6260:9;6234:2;6320:13;;-1:-1:-1;;6316:22:1;;;6340:2;6312:31;6308:40;6296:53;;;6364:18;;;6384:22;;;6361:46;6358:72;;;6410:18;;:::i;:::-;6450:10;6446:2;6439:22;6485:2;6477:6;6470:18;6525:7;6520:2;6515;6511;6507:11;6503:20;6500:33;6497:53;;;6546:1;6543;6536:12;6497:53;6602:2;6597;6593;6589:11;6584:2;6576:6;6572:15;6559:46;6647:1;6642:2;6637;6629:6;6625:15;6621:24;6614:35;6668:6;6658:16;;;;;;;5542:1138;;;;;;;:::o;6685:260::-;6753:6;6761;6814:2;6802:9;6793:7;6789:23;6785:32;6782:52;;;6830:1;6827;6820:12;6782:52;6853:29;6872:9;6853:29;:::i;:::-;6843:39;;6901:38;6935:2;6924:9;6920:18;6901:38;:::i;6950:437::-;7035:1;7025:12;;7082:1;7072:12;;;7093:61;;7147:4;7139:6;7135:17;7125:27;;7093:61;7200:2;7192:6;7189:14;7169:18;7166:38;7163:218;;7237:77;7234:1;7227:88;7338:4;7335:1;7328:15;7366:4;7363:1;7356:15;7163:218;;6950:437;;;:::o;8632:184::-;8684:77;8681:1;8674:88;8781:4;8778:1;8771:15;8805:4;8802:1;8795:15;9174:184;9226:77;9223:1;9216:88;9323:4;9320:1;9313:15;9347:4;9344:1;9337:15;9363:128;9403:3;9434:1;9430:6;9427:1;9424:13;9421:39;;;9440:18;;:::i;:::-;-1:-1:-1;9476:9:1;;9363:128::o;10629:168::-;10669:7;10735:1;10731;10727:6;10723:14;10720:1;10717:21;10712:1;10705:9;10698:17;10694:45;10691:71;;;10742:18;;:::i;:::-;-1:-1:-1;10782:9:1;;10629:168::o;10802:184::-;10854:77;10851:1;10844:88;10951:4;10948:1;10941:15;10975:4;10972:1;10965:15;10991:120;11031:1;11057;11047:35;;11062:18;;:::i;:::-;-1:-1:-1;11096:9:1;;10991:120::o;12990:125::-;13030:4;13058:1;13055;13052:8;13049:34;;;13063:18;;:::i;:::-;-1:-1:-1;13100:9:1;;12990:125::o;15662:112::-;15694:1;15720;15710:35;;15725:18;;:::i;:::-;-1:-1:-1;15759:9:1;;15662:112::o;16139:637::-;16419:3;16457:6;16451:13;16473:53;16519:6;16514:3;16507:4;16499:6;16495:17;16473:53;:::i;:::-;16589:13;;16548:16;;;;16611:57;16589:13;16548:16;16645:4;16633:17;;16611:57;:::i;:::-;16733:7;16690:20;;16719:22;;;16768:1;16757:13;;16139:637;-1:-1:-1;;;;16139:637:1:o;19850:135::-;19889:3;19910:17;;;19907:43;;19930:18;;:::i;:::-;-1:-1:-1;19977:1:1;19966:13;;19850:135::o;19990:512::-;20184:4;-1:-1:-1;;;;;20294:2:1;20286:6;20282:15;20271:9;20264:34;20346:2;20338:6;20334:15;20329:2;20318:9;20314:18;20307:43;;20386:6;20381:2;20370:9;20366:18;20359:34;20429:3;20424:2;20413:9;20409:18;20402:31;20450:46;20491:3;20480:9;20476:19;20468:6;20450:46;:::i;:::-;20442:54;19990:512;-1:-1:-1;;;;;;19990:512:1:o;20507:249::-;20576:6;20629:2;20617:9;20608:7;20604:23;20600:32;20597:52;;;20645:1;20642;20635:12;20597:52;20677:9;20671:16;20696:30;20720:5;20696:30;:::i
Swarm Source
ipfs://800e95eefdfa005cd32e19ada2b734d39766171a0403fbd69c2df564c402027c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.