Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
52 SGOATC
Holders
28
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SGOATCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SGOATC
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-04 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/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/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 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/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/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/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/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/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/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/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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: Ape2Earn.sol pragma solidity ^0.8.0; contract SGOATC is ERC721Enumerable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenId; string public baseTokenURI = "https://ipfs.io/ipfs/QmTYK9VAWgiBURSj8M2UAS8pRFbJuqYRtTNeGbAbaXsUUg/"; uint256 public wFee = 0.015 ether; uint256 public nFee = 0.015 ether; uint256 public MAX_SUPPLY_FOR_WL = 2000; uint256 public MAX_SUPPLY_FOR_PUBLIC = 6000; uint256 public MAX_SUPPLY = 8000; uint256 public totalSold; uint256 public wlMinted; uint256 public MaxNum = 2; uint256 public NumPerTx = 2; uint256 public wprice = 0.015 ether; uint256 public price = 0.03 ether; bool public saleOpen = true; mapping (address => uint256) public minted; mapping (address => bool) public _WL; event Minted(address receiver, uint256 amount); constructor() ERC721("SGOATC", "SGOATC") {} function walletOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function setMaxNum(uint256 _num) external onlyOwner { MaxNum = _num; } function updateFee(uint256 _wFee, uint256 _nFee) external onlyOwner { wFee = _wFee; nFee = _nFee; } function toggleSale() external onlyOwner { saleOpen = !saleOpen; } function updateSupply(uint256 _wSupply, uint256 _nSupply) public onlyOwner { MAX_SUPPLY_FOR_WL = _wSupply; MAX_SUPPLY_FOR_PUBLIC = _nSupply; MAX_SUPPLY = _wSupply + _nSupply; } function setWhiteList(address[] calldata _accounts, bool _value) public onlyOwner { for(uint256 i = 0; i < _accounts.length; i++) { _WL[_accounts[i]] = _value; } } function withdraw() external onlyOwner { address payable _owner = payable(owner()); _owner.transfer(address(this).balance); } function estimateGas(uint256 _num, address _account) public view returns (uint256 gasFee, uint256 num, uint256 wlnum) { num = _num; if(num > NumPerTx) { num = NumPerTx; } if(totalSupply() + num > MAX_SUPPLY) { num = MAX_SUPPLY - totalSupply(); } if(minted[_account] + num > MaxNum) { num = MaxNum - minted[_account]; } gasFee = nFee * num; wlnum = 0; if(_WL[_account]){ wlnum = num; gasFee = wFee * num; if(wlMinted + num > MAX_SUPPLY_FOR_WL){ wlnum = MAX_SUPPLY_FOR_WL - wlMinted; gasFee = wFee * wlnum + nFee * (wlMinted + num - MAX_SUPPLY_FOR_WL); } } } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function mint(uint256 num) external payable { require(saleOpen, "not start"); (uint256 gasFee, uint256 mintNum, uint256 wlnum) = estimateGas(num, msg.sender); if(gasFee > 0){ require(msg.value >= gasFee , "not enough gasFee"); } minted[msg.sender] += mintNum; totalSold += mintNum; if(wlnum !=0) { wlMinted += wlnum; } for (uint256 i = 0; i < mintNum; i++) { _mint(msg.sender); } } function _mint(address _to) private { _tokenId.increment(); uint256 tokenId = _tokenId.current(); _safeMint(_to, tokenId); emit Minted(_to, tokenId); } }
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":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_FOR_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_FOR_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NumPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_WL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"estimateGas","outputs":[{"internalType":"uint256","name":"gasFee","type":"uint256"},{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"wlnum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"setMaxNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setWhiteList","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":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wFee","type":"uint256"},{"internalType":"uint256","name":"_nFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wSupply","type":"uint256"},{"internalType":"uint256","name":"_nSupply","type":"uint256"}],"name":"updateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610100604052604460808181529062002a2060a039600c90620000239082620001e6565b5066354a6ba7a18000600d819055600e8190556107d0600f55611770601055611f4060115560026014819055601555601655666a94d74f4300006017556018805460ff191660011790553480156200007a57600080fd5b5060408051808201825260068082526553474f41544360d01b6020808401829052845180860190955291845290830152906000620000b98382620001e6565b506001620000c88282620001e6565b505050620000e5620000df620000eb60201b60201c565b620000ef565b620002b2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200016c57607f821691505b6020821081036200018d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001e157600081815260208120601f850160051c81016020861015620001bc5750805b601f850160051c820191505b81811015620001dd57828155600101620001c8565b5050505b505050565b81516001600160401b0381111562000202576200020262000141565b6200021a8162000213845462000157565b8462000193565b602080601f831160018114620002525760008415620002395750858301515b600019600386901b1c1916600185901b178555620001dd565b600085815260208120601f198616915b82811015620002835788860151825594840194600190910190840162000262565b5085821015620002a25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61275e80620002c26000396000f3fe6080604052600436106102675760003560e01c80637483899411610144578063a22cb465116100b6578063d032505a1161007a578063d032505a1461070a578063d547cfb714610720578063e43f696e14610735578063e9639a1614610755578063e985e9c51461076b578063f2fde38b146107b457600080fd5b8063a22cb4651461067e578063a571578b1461069e578063b07f44f5146106b4578063b88d4fde146106ca578063c87b56dd146106ea57600080fd5b806395d89b411161010857806395d89b41146105f057806399288dbb146106055780639e2dcbfd1461061f5780639f5459fd1461063f578063a035b1fe14610655578063a0712d681461066b57600080fd5b806374838994146105565780637d8966e41461056c5780638b2d7b0a146105815780638da5cb5b146105bc5780639106d7ba146105da57600080fd5b80632f745c59116101dd578063463fb323116101a1578063463fb323146104ab5780634f6ccce7146104c157806355f804b3146104e15780636352211e1461050157806370a0823114610521578063715018a61461054157600080fd5b80632f745c591461041357806332cb6b0c146104335780633ccfd60b1461044957806342842e0e1461045e578063438b63001461047e57600080fd5b80630ca6b6271161022f5780630ca6b6271461033d5780631707ea611461036157806318160ddd146103915780631e7269c5146103a657806323b872dd146103d35780632740c197146103f357600080fd5b806301ffc9a71461026c57806302e5329e146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004611fa8565b6107d4565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004611fc5565b6107ff565b005b3480156102cf57600080fd5b506102d8610837565b604051610298919061202e565b3480156102f157600080fd5b50610305610300366004611fc5565b6108c9565b6040516001600160a01b039091168152602001610298565b34801561032957600080fd5b506102c161033836600461205d565b61095e565b34801561034957600080fd5b50610353600d5481565b604051908152602001610298565b34801561036d57600080fd5b5061028c61037c366004612087565b601a6020526000908152604090205460ff1681565b34801561039d57600080fd5b50600854610353565b3480156103b257600080fd5b506103536103c1366004612087565b60196020526000908152604090205481565b3480156103df57600080fd5b506102c16103ee3660046120a2565b610a73565b3480156103ff57600080fd5b506102c161040e3660046120de565b610aa4565b34801561041f57600080fd5b5061035361042e36600461205d565b610ad9565b34801561043f57600080fd5b5061035360115481565b34801561045557600080fd5b506102c1610b6f565b34801561046a57600080fd5b506102c16104793660046120a2565b610be9565b34801561048a57600080fd5b5061049e610499366004612087565b610c04565b6040516102989190612100565b3480156104b757600080fd5b5061035360135481565b3480156104cd57600080fd5b506103536104dc366004611fc5565b610ca6565b3480156104ed57600080fd5b506102c16104fc3660046121d0565b610d39565b34801561050d57600080fd5b5061030561051c366004611fc5565b610d6f565b34801561052d57600080fd5b5061035361053c366004612087565b610de6565b34801561054d57600080fd5b506102c1610e6d565b34801561056257600080fd5b5061035360105481565b34801561057857600080fd5b506102c1610ea3565b34801561058d57600080fd5b506105a161059c366004612219565b610ee1565b60408051938452602084019290925290820152606001610298565b3480156105c857600080fd5b50600a546001600160a01b0316610305565b3480156105e657600080fd5b5061035360125481565b3480156105fc57600080fd5b506102d8611039565b34801561061157600080fd5b5060185461028c9060ff1681565b34801561062b57600080fd5b506102c161063a3660046120de565b611048565b34801561064b57600080fd5b5061035360165481565b34801561066157600080fd5b5061035360175481565b6102c1610679366004611fc5565b61108d565b34801561068a57600080fd5b506102c1610699366004612255565b6111b3565b3480156106aa57600080fd5b50610353600e5481565b3480156106c057600080fd5b50610353600f5481565b3480156106d657600080fd5b506102c16106e536600461227f565b611277565b3480156106f657600080fd5b506102d8610705366004611fc5565b6112af565b34801561071657600080fd5b5061035360155481565b34801561072c57600080fd5b506102d861138a565b34801561074157600080fd5b506102c16107503660046122fb565b611418565b34801561076157600080fd5b5061035360145481565b34801561077757600080fd5b5061028c61078636600461237f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107c057600080fd5b506102c16107cf366004612087565b6114b3565b60006001600160e01b0319821663780e9d6360e01b14806107f957506107f98261154e565b92915050565b600a546001600160a01b031633146108325760405162461bcd60e51b8152600401610829906123a9565b60405180910390fd5b601455565b606060008054610846906123de565b80601f0160208091040260200160405190810160405280929190818152602001828054610872906123de565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610829565b506000908152600460205260409020546001600160a01b031690565b600061096982610d6f565b9050806001600160a01b0316836001600160a01b0316036109d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610829565b336001600160a01b03821614806109f257506109f28133610786565b610a645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610829565b610a6e838361159e565b505050565b610a7d338261160c565b610a995760405162461bcd60e51b815260040161082990612418565b610a6e838383611703565b600a546001600160a01b03163314610ace5760405162461bcd60e51b8152600401610829906123a9565b600d91909155600e55565b6000610ae483610de6565b8210610b465760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610829565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610b995760405162461bcd60e51b8152600401610829906123a9565b6000610bad600a546001600160a01b031690565b6040519091506001600160a01b038216904780156108fc02916000818181858888f19350505050158015610be5573d6000803e3d6000fd5b5050565b610a6e83838360405180602001604052806000815250611277565b60606000610c1183610de6565b905060008167ffffffffffffffff811115610c2e57610c2e612144565b604051908082528060200260200182016040528015610c57578160200160208202803683370190505b50905060005b82811015610c9e57610c6f8582610ad9565b828281518110610c8157610c81612469565b602090810291909101015280610c9681612495565b915050610c5d565b509392505050565b6000610cb160085490565b8210610d145760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610829565b60088281548110610d2757610d27612469565b90600052602060002001549050919050565b600a546001600160a01b03163314610d635760405162461bcd60e51b8152600401610829906123a9565b600c610be582826124fc565b6000818152600260205260408120546001600160a01b0316806107f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610829565b60006001600160a01b038216610e515760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610829565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e975760405162461bcd60e51b8152600401610829906123a9565b610ea160006118ae565b565b600a546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610829906123a9565b6018805460ff19811660ff90911615179055565b6000806000849150601554821115610ef95760155491505b60115482610f0660085490565b610f1091906125bc565b1115610f2957600854601154610f2691906125cf565b91505b6014546001600160a01b038516600090815260196020526040902054610f509084906125bc565b1115610f7f576001600160a01b038416600090815260196020526040902054601454610f7c91906125cf565b91505b81600e54610f8d91906125e2565b6001600160a01b0385166000908152601a6020526040812054919450915060ff16156110325781905081600d54610fc491906125e2565b9250600f5482601354610fd791906125bc565b111561103257601354600f54610fed91906125cf565b9050600f548260135461100091906125bc565b61100a91906125cf565b600e5461101791906125e2565b81600d5461102591906125e2565b61102f91906125bc565b92505b9250925092565b606060018054610846906123de565b600a546001600160a01b031633146110725760405162461bcd60e51b8152600401610829906123a9565b600f829055601081905561108681836125bc565b6011555050565b60185460ff166110cb5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b6044820152606401610829565b60008060006110da8433610ee1565b91945092509050821561112b578234101561112b5760405162461bcd60e51b81526020600482015260116024820152706e6f7420656e6f7567682067617346656560781b6044820152606401610829565b336000908152601960205260408120805484929061114a9084906125bc565b92505081905550816012600082825461116391906125bc565b9091555050801561118657806013600082825461118091906125bc565b90915550505b60005b828110156111ac5761119a33611900565b806111a481612495565b915050611189565b5050505050565b336001600160a01b0383160361120b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610829565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611281338361160c565b61129d5760405162461bcd60e51b815260040161082990612418565b6112a98484848461196b565b50505050565b6000818152600260205260409020546060906001600160a01b031661132e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610829565b600061133861199e565b905060008151116113585760405180602001604052806000815250611383565b80611362846119ad565b6040516020016113739291906125f9565b6040516020818303038152906040525b9392505050565b600c8054611397906123de565b80601f01602080910402602001604051908101604052809291908181526020018280546113c3906123de565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b505050505081565b600a546001600160a01b031633146114425760405162461bcd60e51b8152600401610829906123a9565b60005b828110156112a95781601a600086868581811061146457611464612469565b90506020020160208101906114799190612087565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806114ab81612495565b915050611445565b600a546001600160a01b031633146114dd5760405162461bcd60e51b8152600401610829906123a9565b6001600160a01b0381166115425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610829565b61154b816118ae565b50565b60006001600160e01b031982166380ac58cd60e01b148061157f57506001600160e01b03198216635b5e139f60e01b145b806107f957506301ffc9a760e01b6001600160e01b03198316146107f9565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115d382610d6f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610829565b600061169083610d6f565b9050806001600160a01b0316846001600160a01b031614806116cb5750836001600160a01b03166116c0846108c9565b6001600160a01b0316145b806116fb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661171682610d6f565b6001600160a01b03161461177e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610829565b6001600160a01b0382166117e05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610829565b6117eb838383611aae565b6117f660008261159e565b6001600160a01b038316600090815260036020526040812080546001929061181f9084906125cf565b90915550506001600160a01b038216600090815260036020526040812080546001929061184d9084906125bc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61190e600b80546001019055565b6000611919600b5490565b90506119258282611b66565b604080516001600160a01b0384168152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a15050565b611976848484611703565b61198284848484611b80565b6112a95760405162461bcd60e51b815260040161082990612628565b6060600c8054610846906123de565b6060816000036119d45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119fe57806119e881612495565b91506119f79050600a83612690565b91506119d8565b60008167ffffffffffffffff811115611a1957611a19612144565b6040519080825280601f01601f191660200182016040528015611a43576020820181803683370190505b5090505b84156116fb57611a586001836125cf565b9150611a65600a866126a4565b611a709060306125bc565b60f81b818381518110611a8557611a85612469565b60200101906001600160f81b031916908160001a905350611aa7600a86612690565b9450611a47565b6001600160a01b038316611b0957611b0481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611b2c565b816001600160a01b0316836001600160a01b031614611b2c57611b2c8382611c81565b6001600160a01b038216611b4357610a6e81611d1e565b826001600160a01b0316826001600160a01b031614610a6e57610a6e8282611dcd565b610be5828260405180602001604052806000815250611e11565b60006001600160a01b0384163b15611c7657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611bc49033908990889088906004016126b8565b6020604051808303816000875af1925050508015611bff575060408051601f3d908101601f19168201909252611bfc918101906126f5565b60015b611c5c573d808015611c2d576040519150601f19603f3d011682016040523d82523d6000602084013e611c32565b606091505b508051600003611c545760405162461bcd60e51b815260040161082990612628565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116fb565b506001949350505050565b60006001611c8e84610de6565b611c9891906125cf565b600083815260076020526040902054909150808214611ceb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611d30906001906125cf565b60008381526009602052604081205460088054939450909284908110611d5857611d58612469565b906000526020600020015490508060088381548110611d7957611d79612469565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611db157611db1612712565b6001900381819060005260206000200160009055905550505050565b6000611dd883610de6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611e1b8383611e44565b611e286000848484611b80565b610a6e5760405162461bcd60e51b815260040161082990612628565b6001600160a01b038216611e9a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610829565b6000818152600260205260409020546001600160a01b031615611eff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610829565b611f0b60008383611aae565b6001600160a01b0382166000908152600360205260408120805460019290611f349084906125bc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b03198116811461154b57600080fd5b600060208284031215611fba57600080fd5b813561138381611f92565b600060208284031215611fd757600080fd5b5035919050565b60005b83811015611ff9578181015183820152602001611fe1565b50506000910152565b6000815180845261201a816020860160208601611fde565b601f01601f19169290920160200192915050565b6020815260006113836020830184612002565b80356001600160a01b038116811461205857600080fd5b919050565b6000806040838503121561207057600080fd5b61207983612041565b946020939093013593505050565b60006020828403121561209957600080fd5b61138382612041565b6000806000606084860312156120b757600080fd5b6120c084612041565b92506120ce60208501612041565b9150604084013590509250925092565b600080604083850312156120f157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156121385783518352928401929184019160010161211c565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561217557612175612144565b604051601f8501601f19908116603f0116810190828211818310171561219d5761219d612144565b816040528093508581528686860111156121b657600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156121e257600080fd5b813567ffffffffffffffff8111156121f957600080fd5b8201601f8101841361220a57600080fd5b6116fb8482356020840161215a565b6000806040838503121561222c57600080fd5b8235915061223c60208401612041565b90509250929050565b8035801515811461205857600080fd5b6000806040838503121561226857600080fd5b61227183612041565b915061223c60208401612245565b6000806000806080858703121561229557600080fd5b61229e85612041565b93506122ac60208601612041565b925060408501359150606085013567ffffffffffffffff8111156122cf57600080fd5b8501601f810187136122e057600080fd5b6122ef8782356020840161215a565b91505092959194509250565b60008060006040848603121561231057600080fd5b833567ffffffffffffffff8082111561232857600080fd5b818601915086601f83011261233c57600080fd5b81358181111561234b57600080fd5b8760208260051b850101111561236057600080fd5b6020928301955093506123769186019050612245565b90509250925092565b6000806040838503121561239257600080fd5b61239b83612041565b915061223c60208401612041565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806123f257607f821691505b60208210810361241257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124a7576124a761247f565b5060010190565b601f821115610a6e57600081815260208120601f850160051c810160208610156124d55750805b601f850160051c820191505b818110156124f4578281556001016124e1565b505050505050565b815167ffffffffffffffff81111561251657612516612144565b61252a8161252484546123de565b846124ae565b602080601f83116001811461255f57600084156125475750858301515b600019600386901b1c1916600185901b1785556124f4565b600085815260208120601f198616915b8281101561258e5788860151825594840194600190910190840161256f565b50858210156125ac5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156107f9576107f961247f565b818103818111156107f9576107f961247f565b80820281158282048414176107f9576107f961247f565b6000835161260b818460208801611fde565b83519083019061261f818360208801611fde565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261269f5761269f61267a565b500490565b6000826126b3576126b361267a565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126eb90830184612002565b9695505050505050565b60006020828403121561270757600080fd5b815161138381611f92565b634e487b7160e01b600052603160045260246000fdfea264697066735822122019a55c617c34acd3e0fbc8c2b3fdcdf8d02b83b42673524b7566d2d91dd7191264736f6c6343000811003368747470733a2f2f697066732e696f2f697066732f516d54594b395641576769425552536a384d3255415338705246624a7571595274544e65476241626158735555672f
Deployed Bytecode
0x6080604052600436106102675760003560e01c80637483899411610144578063a22cb465116100b6578063d032505a1161007a578063d032505a1461070a578063d547cfb714610720578063e43f696e14610735578063e9639a1614610755578063e985e9c51461076b578063f2fde38b146107b457600080fd5b8063a22cb4651461067e578063a571578b1461069e578063b07f44f5146106b4578063b88d4fde146106ca578063c87b56dd146106ea57600080fd5b806395d89b411161010857806395d89b41146105f057806399288dbb146106055780639e2dcbfd1461061f5780639f5459fd1461063f578063a035b1fe14610655578063a0712d681461066b57600080fd5b806374838994146105565780637d8966e41461056c5780638b2d7b0a146105815780638da5cb5b146105bc5780639106d7ba146105da57600080fd5b80632f745c59116101dd578063463fb323116101a1578063463fb323146104ab5780634f6ccce7146104c157806355f804b3146104e15780636352211e1461050157806370a0823114610521578063715018a61461054157600080fd5b80632f745c591461041357806332cb6b0c146104335780633ccfd60b1461044957806342842e0e1461045e578063438b63001461047e57600080fd5b80630ca6b6271161022f5780630ca6b6271461033d5780631707ea611461036157806318160ddd146103915780631e7269c5146103a657806323b872dd146103d35780632740c197146103f357600080fd5b806301ffc9a71461026c57806302e5329e146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004611fa8565b6107d4565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004611fc5565b6107ff565b005b3480156102cf57600080fd5b506102d8610837565b604051610298919061202e565b3480156102f157600080fd5b50610305610300366004611fc5565b6108c9565b6040516001600160a01b039091168152602001610298565b34801561032957600080fd5b506102c161033836600461205d565b61095e565b34801561034957600080fd5b50610353600d5481565b604051908152602001610298565b34801561036d57600080fd5b5061028c61037c366004612087565b601a6020526000908152604090205460ff1681565b34801561039d57600080fd5b50600854610353565b3480156103b257600080fd5b506103536103c1366004612087565b60196020526000908152604090205481565b3480156103df57600080fd5b506102c16103ee3660046120a2565b610a73565b3480156103ff57600080fd5b506102c161040e3660046120de565b610aa4565b34801561041f57600080fd5b5061035361042e36600461205d565b610ad9565b34801561043f57600080fd5b5061035360115481565b34801561045557600080fd5b506102c1610b6f565b34801561046a57600080fd5b506102c16104793660046120a2565b610be9565b34801561048a57600080fd5b5061049e610499366004612087565b610c04565b6040516102989190612100565b3480156104b757600080fd5b5061035360135481565b3480156104cd57600080fd5b506103536104dc366004611fc5565b610ca6565b3480156104ed57600080fd5b506102c16104fc3660046121d0565b610d39565b34801561050d57600080fd5b5061030561051c366004611fc5565b610d6f565b34801561052d57600080fd5b5061035361053c366004612087565b610de6565b34801561054d57600080fd5b506102c1610e6d565b34801561056257600080fd5b5061035360105481565b34801561057857600080fd5b506102c1610ea3565b34801561058d57600080fd5b506105a161059c366004612219565b610ee1565b60408051938452602084019290925290820152606001610298565b3480156105c857600080fd5b50600a546001600160a01b0316610305565b3480156105e657600080fd5b5061035360125481565b3480156105fc57600080fd5b506102d8611039565b34801561061157600080fd5b5060185461028c9060ff1681565b34801561062b57600080fd5b506102c161063a3660046120de565b611048565b34801561064b57600080fd5b5061035360165481565b34801561066157600080fd5b5061035360175481565b6102c1610679366004611fc5565b61108d565b34801561068a57600080fd5b506102c1610699366004612255565b6111b3565b3480156106aa57600080fd5b50610353600e5481565b3480156106c057600080fd5b50610353600f5481565b3480156106d657600080fd5b506102c16106e536600461227f565b611277565b3480156106f657600080fd5b506102d8610705366004611fc5565b6112af565b34801561071657600080fd5b5061035360155481565b34801561072c57600080fd5b506102d861138a565b34801561074157600080fd5b506102c16107503660046122fb565b611418565b34801561076157600080fd5b5061035360145481565b34801561077757600080fd5b5061028c61078636600461237f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107c057600080fd5b506102c16107cf366004612087565b6114b3565b60006001600160e01b0319821663780e9d6360e01b14806107f957506107f98261154e565b92915050565b600a546001600160a01b031633146108325760405162461bcd60e51b8152600401610829906123a9565b60405180910390fd5b601455565b606060008054610846906123de565b80601f0160208091040260200160405190810160405280929190818152602001828054610872906123de565b80156108bf5780601f10610894576101008083540402835291602001916108bf565b820191906000526020600020905b8154815290600101906020018083116108a257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610829565b506000908152600460205260409020546001600160a01b031690565b600061096982610d6f565b9050806001600160a01b0316836001600160a01b0316036109d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610829565b336001600160a01b03821614806109f257506109f28133610786565b610a645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610829565b610a6e838361159e565b505050565b610a7d338261160c565b610a995760405162461bcd60e51b815260040161082990612418565b610a6e838383611703565b600a546001600160a01b03163314610ace5760405162461bcd60e51b8152600401610829906123a9565b600d91909155600e55565b6000610ae483610de6565b8210610b465760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610829565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610b995760405162461bcd60e51b8152600401610829906123a9565b6000610bad600a546001600160a01b031690565b6040519091506001600160a01b038216904780156108fc02916000818181858888f19350505050158015610be5573d6000803e3d6000fd5b5050565b610a6e83838360405180602001604052806000815250611277565b60606000610c1183610de6565b905060008167ffffffffffffffff811115610c2e57610c2e612144565b604051908082528060200260200182016040528015610c57578160200160208202803683370190505b50905060005b82811015610c9e57610c6f8582610ad9565b828281518110610c8157610c81612469565b602090810291909101015280610c9681612495565b915050610c5d565b509392505050565b6000610cb160085490565b8210610d145760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610829565b60088281548110610d2757610d27612469565b90600052602060002001549050919050565b600a546001600160a01b03163314610d635760405162461bcd60e51b8152600401610829906123a9565b600c610be582826124fc565b6000818152600260205260408120546001600160a01b0316806107f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610829565b60006001600160a01b038216610e515760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610829565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e975760405162461bcd60e51b8152600401610829906123a9565b610ea160006118ae565b565b600a546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610829906123a9565b6018805460ff19811660ff90911615179055565b6000806000849150601554821115610ef95760155491505b60115482610f0660085490565b610f1091906125bc565b1115610f2957600854601154610f2691906125cf565b91505b6014546001600160a01b038516600090815260196020526040902054610f509084906125bc565b1115610f7f576001600160a01b038416600090815260196020526040902054601454610f7c91906125cf565b91505b81600e54610f8d91906125e2565b6001600160a01b0385166000908152601a6020526040812054919450915060ff16156110325781905081600d54610fc491906125e2565b9250600f5482601354610fd791906125bc565b111561103257601354600f54610fed91906125cf565b9050600f548260135461100091906125bc565b61100a91906125cf565b600e5461101791906125e2565b81600d5461102591906125e2565b61102f91906125bc565b92505b9250925092565b606060018054610846906123de565b600a546001600160a01b031633146110725760405162461bcd60e51b8152600401610829906123a9565b600f829055601081905561108681836125bc565b6011555050565b60185460ff166110cb5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b6044820152606401610829565b60008060006110da8433610ee1565b91945092509050821561112b578234101561112b5760405162461bcd60e51b81526020600482015260116024820152706e6f7420656e6f7567682067617346656560781b6044820152606401610829565b336000908152601960205260408120805484929061114a9084906125bc565b92505081905550816012600082825461116391906125bc565b9091555050801561118657806013600082825461118091906125bc565b90915550505b60005b828110156111ac5761119a33611900565b806111a481612495565b915050611189565b5050505050565b336001600160a01b0383160361120b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610829565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611281338361160c565b61129d5760405162461bcd60e51b815260040161082990612418565b6112a98484848461196b565b50505050565b6000818152600260205260409020546060906001600160a01b031661132e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610829565b600061133861199e565b905060008151116113585760405180602001604052806000815250611383565b80611362846119ad565b6040516020016113739291906125f9565b6040516020818303038152906040525b9392505050565b600c8054611397906123de565b80601f01602080910402602001604051908101604052809291908181526020018280546113c3906123de565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b505050505081565b600a546001600160a01b031633146114425760405162461bcd60e51b8152600401610829906123a9565b60005b828110156112a95781601a600086868581811061146457611464612469565b90506020020160208101906114799190612087565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806114ab81612495565b915050611445565b600a546001600160a01b031633146114dd5760405162461bcd60e51b8152600401610829906123a9565b6001600160a01b0381166115425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610829565b61154b816118ae565b50565b60006001600160e01b031982166380ac58cd60e01b148061157f57506001600160e01b03198216635b5e139f60e01b145b806107f957506301ffc9a760e01b6001600160e01b03198316146107f9565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115d382610d6f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610829565b600061169083610d6f565b9050806001600160a01b0316846001600160a01b031614806116cb5750836001600160a01b03166116c0846108c9565b6001600160a01b0316145b806116fb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661171682610d6f565b6001600160a01b03161461177e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610829565b6001600160a01b0382166117e05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610829565b6117eb838383611aae565b6117f660008261159e565b6001600160a01b038316600090815260036020526040812080546001929061181f9084906125cf565b90915550506001600160a01b038216600090815260036020526040812080546001929061184d9084906125bc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61190e600b80546001019055565b6000611919600b5490565b90506119258282611b66565b604080516001600160a01b0384168152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a15050565b611976848484611703565b61198284848484611b80565b6112a95760405162461bcd60e51b815260040161082990612628565b6060600c8054610846906123de565b6060816000036119d45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119fe57806119e881612495565b91506119f79050600a83612690565b91506119d8565b60008167ffffffffffffffff811115611a1957611a19612144565b6040519080825280601f01601f191660200182016040528015611a43576020820181803683370190505b5090505b84156116fb57611a586001836125cf565b9150611a65600a866126a4565b611a709060306125bc565b60f81b818381518110611a8557611a85612469565b60200101906001600160f81b031916908160001a905350611aa7600a86612690565b9450611a47565b6001600160a01b038316611b0957611b0481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611b2c565b816001600160a01b0316836001600160a01b031614611b2c57611b2c8382611c81565b6001600160a01b038216611b4357610a6e81611d1e565b826001600160a01b0316826001600160a01b031614610a6e57610a6e8282611dcd565b610be5828260405180602001604052806000815250611e11565b60006001600160a01b0384163b15611c7657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611bc49033908990889088906004016126b8565b6020604051808303816000875af1925050508015611bff575060408051601f3d908101601f19168201909252611bfc918101906126f5565b60015b611c5c573d808015611c2d576040519150601f19603f3d011682016040523d82523d6000602084013e611c32565b606091505b508051600003611c545760405162461bcd60e51b815260040161082990612628565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116fb565b506001949350505050565b60006001611c8e84610de6565b611c9891906125cf565b600083815260076020526040902054909150808214611ceb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611d30906001906125cf565b60008381526009602052604081205460088054939450909284908110611d5857611d58612469565b906000526020600020015490508060088381548110611d7957611d79612469565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611db157611db1612712565b6001900381819060005260206000200160009055905550505050565b6000611dd883610de6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611e1b8383611e44565b611e286000848484611b80565b610a6e5760405162461bcd60e51b815260040161082990612628565b6001600160a01b038216611e9a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610829565b6000818152600260205260409020546001600160a01b031615611eff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610829565b611f0b60008383611aae565b6001600160a01b0382166000908152600360205260408120805460019290611f349084906125bc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b03198116811461154b57600080fd5b600060208284031215611fba57600080fd5b813561138381611f92565b600060208284031215611fd757600080fd5b5035919050565b60005b83811015611ff9578181015183820152602001611fe1565b50506000910152565b6000815180845261201a816020860160208601611fde565b601f01601f19169290920160200192915050565b6020815260006113836020830184612002565b80356001600160a01b038116811461205857600080fd5b919050565b6000806040838503121561207057600080fd5b61207983612041565b946020939093013593505050565b60006020828403121561209957600080fd5b61138382612041565b6000806000606084860312156120b757600080fd5b6120c084612041565b92506120ce60208501612041565b9150604084013590509250925092565b600080604083850312156120f157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156121385783518352928401929184019160010161211c565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561217557612175612144565b604051601f8501601f19908116603f0116810190828211818310171561219d5761219d612144565b816040528093508581528686860111156121b657600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156121e257600080fd5b813567ffffffffffffffff8111156121f957600080fd5b8201601f8101841361220a57600080fd5b6116fb8482356020840161215a565b6000806040838503121561222c57600080fd5b8235915061223c60208401612041565b90509250929050565b8035801515811461205857600080fd5b6000806040838503121561226857600080fd5b61227183612041565b915061223c60208401612245565b6000806000806080858703121561229557600080fd5b61229e85612041565b93506122ac60208601612041565b925060408501359150606085013567ffffffffffffffff8111156122cf57600080fd5b8501601f810187136122e057600080fd5b6122ef8782356020840161215a565b91505092959194509250565b60008060006040848603121561231057600080fd5b833567ffffffffffffffff8082111561232857600080fd5b818601915086601f83011261233c57600080fd5b81358181111561234b57600080fd5b8760208260051b850101111561236057600080fd5b6020928301955093506123769186019050612245565b90509250925092565b6000806040838503121561239257600080fd5b61239b83612041565b915061223c60208401612041565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806123f257607f821691505b60208210810361241257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124a7576124a761247f565b5060010190565b601f821115610a6e57600081815260208120601f850160051c810160208610156124d55750805b601f850160051c820191505b818110156124f4578281556001016124e1565b505050505050565b815167ffffffffffffffff81111561251657612516612144565b61252a8161252484546123de565b846124ae565b602080601f83116001811461255f57600084156125475750858301515b600019600386901b1c1916600185901b1785556124f4565b600085815260208120601f198616915b8281101561258e5788860151825594840194600190910190840161256f565b50858210156125ac5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156107f9576107f961247f565b818103818111156107f9576107f961247f565b80820281158282048414176107f9576107f961247f565b6000835161260b818460208801611fde565b83519083019061261f818360208801611fde565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261269f5761269f61267a565b500490565b6000826126b3576126b361267a565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126eb90830184612002565b9695505050505050565b60006020828403121561270757600080fd5b815161138381611f92565b634e487b7160e01b600052603160045260246000fdfea264697066735822122019a55c617c34acd3e0fbc8c2b3fdcdf8d02b83b42673524b7566d2d91dd7191264736f6c63430008110033
Deployed Bytecode Sourcemap
46338:3946:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39872:300;;;;;;;;;;-1:-1:-1;39872:300:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39872:300:0;;;;;;;;47752:84;;;;;;;;;;-1:-1:-1;47752:84:0;;;;;:::i;:::-;;:::i;:::-;;27032:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28725:308::-;;;;;;;;;;-1:-1:-1;28725:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;28725:308:0;1533:203:1;28248:411:0;;;;;;;;;;-1:-1:-1;28248:411:0;;;;;:::i;:::-;;:::i;46582:33::-;;;;;;;;;;;;;;;;;;;2324:25:1;;;2312:2;2297:18;46582:33:0;2178:177:1;47099:36:0;;;;;;;;;;-1:-1:-1;47099:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40675:113;;;;;;;;;;-1:-1:-1;40763:10:0;:17;40675:113;;47050:42;;;;;;;;;;-1:-1:-1;47050:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;29784:376;;;;;;;;;;-1:-1:-1;29784:376:0;;;;;:::i;:::-;;:::i;47844:122::-;;;;;;;;;;-1:-1:-1;47844:122:0;;;;;:::i;:::-;;:::i;40256:343::-;;;;;;;;;;-1:-1:-1;40256:343:0;;;;;:::i;:::-;;:::i;46760:32::-;;;;;;;;;;;;;;;;48485:148;;;;;;;;;;;;;:::i;30231:185::-;;;;;;;;;;-1:-1:-1;30231:185:0;;;;;:::i;:::-;;:::i;47250:385::-;;;;;;;;;;-1:-1:-1;47250:385:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46832:23::-;;;;;;;;;;;;;;;;40865:320;;;;;;;;;;-1:-1:-1;40865:320:0;;;;;:::i;:::-;;:::i;47643:101::-;;;;;;;;;;-1:-1:-1;47643:101:0;;;;;:::i;:::-;;:::i;26639:326::-;;;;;;;;;;-1:-1:-1;26639:326:0;;;;;:::i;:::-;;:::i;26282:295::-;;;;;;;;;;-1:-1:-1;26282:295:0;;;;;:::i;:::-;;:::i;9739:94::-;;;;;;;;;;;;;:::i;46710:43::-;;;;;;;;;;;;;;;;47974:80;;;;;;;;;;;;;:::i;48641:789::-;;;;;;;;;;-1:-1:-1;48641:789:0;;;;;:::i;:::-;;:::i;:::-;;;;5460:25:1;;;5516:2;5501:18;;5494:34;;;;5544:18;;;5537:34;5448:2;5433:18;48641:789:0;5258:319:1;9088:87:0;;;;;;;;;;-1:-1:-1;9161:6:0;;-1:-1:-1;;;;;9161:6:0;9088:87;;46801:24;;;;;;;;;;;;;;;;27201:104;;;;;;;;;;;;;:::i;47014:27::-;;;;;;;;;;-1:-1:-1;47014:27:0;;;;;;;;48062:208;;;;;;;;;;-1:-1:-1;48062:208:0;;;;;:::i;:::-;;:::i;46930:35::-;;;;;;;;;;;;;;;;46972:33;;;;;;;;;;;;;;;;49559:522;;;;;;:::i;:::-;;:::i;29105:327::-;;;;;;;;;;-1:-1:-1;29105:327:0;;;;;:::i;:::-;;:::i;46622:33::-;;;;;;;;;;;;;;;;46664:39;;;;;;;;;;;;;;;;30487:365;;;;;;;;;;-1:-1:-1;30487:365:0;;;;;:::i;:::-;;:::i;27376:468::-;;;;;;;;;;-1:-1:-1;27376:468:0;;;;;:::i;:::-;;:::i;46896:27::-;;;;;;;;;;;;;;;;46474:99;;;;;;;;;;;;;:::i;48278:199::-;;;;;;;;;;-1:-1:-1;48278:199:0;;;;;:::i;:::-;;:::i;46864:25::-;;;;;;;;;;;;;;;;29503:214;;;;;;;;;;-1:-1:-1;29503:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;29674:25:0;;;29645:4;29674:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29503:214;9988:229;;;;;;;;;;-1:-1:-1;9988:229:0;;;;;:::i;:::-;;:::i;39872:300::-;40019:4;-1:-1:-1;;;;;;40061:50:0;;-1:-1:-1;;;40061:50:0;;:103;;;40128:36;40152:11;40128:23;:36::i;:::-;40041:123;39872:300;-1:-1:-1;;39872:300:0:o;47752:84::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;;;;;;;;;47815:6:::1;:13:::0;47752:84::o;27032:100::-;27086:13;27119:5;27112:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27032:100;:::o;28725:308::-;28846:7;32488:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32488:16:0;28871:110;;;;-1:-1:-1;;;28871:110:0;;8585:2:1;28871:110:0;;;8567:21:1;8624:2;8604:18;;;8597:30;8663:34;8643:18;;;8636:62;-1:-1:-1;;;8714:18:1;;;8707:42;8766:19;;28871:110:0;8383:408:1;28871:110:0;-1:-1:-1;29001:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29001:24:0;;28725:308::o;28248:411::-;28329:13;28345:23;28360:7;28345:14;:23::i;:::-;28329:39;;28393:5;-1:-1:-1;;;;;28387:11:0;:2;-1:-1:-1;;;;;28387:11:0;;28379:57;;;;-1:-1:-1;;;28379:57:0;;8998:2:1;28379:57:0;;;8980:21:1;9037:2;9017:18;;;9010:30;9076:34;9056:18;;;9049:62;-1:-1:-1;;;9127:18:1;;;9120:31;9168:19;;28379:57:0;8796:397:1;28379:57:0;2141:10;-1:-1:-1;;;;;28471:21:0;;;;:62;;-1:-1:-1;28496:37:0;28513:5;2141:10;29503:214;:::i;28496:37::-;28449:168;;;;-1:-1:-1;;;28449:168:0;;9400:2:1;28449:168:0;;;9382:21:1;9439:2;9419:18;;;9412:30;9478:34;9458:18;;;9451:62;9549:26;9529:18;;;9522:54;9593:19;;28449:168:0;9198:420:1;28449:168:0;28630:21;28639:2;28643:7;28630:8;:21::i;:::-;28318:341;28248:411;;:::o;29784:376::-;29993:41;2141:10;30026:7;29993:18;:41::i;:::-;29971:140;;;;-1:-1:-1;;;29971:140:0;;;;;;;:::i;:::-;30124:28;30134:4;30140:2;30144:7;30124:9;:28::i;47844:122::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;47923:4:::1;:12:::0;;;;47946:4:::1;:12:::0;47844:122::o;40256:343::-;40398:7;40453:23;40470:5;40453:16;:23::i;:::-;40445:5;:31;40423:124;;;;-1:-1:-1;;;40423:124:0;;10243:2:1;40423:124:0;;;10225:21:1;10282:2;10262:18;;;10255:30;10321:34;10301:18;;;10294:62;-1:-1:-1;;;10372:18:1;;;10365:41;10423:19;;40423:124:0;10041:407:1;40423:124:0;-1:-1:-1;;;;;;40565:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40256:343::o;48485:148::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;48535:22:::1;48568:7;9161:6:::0;;-1:-1:-1;;;;;9161:6:0;;9088:87;48568:7:::1;48587:38;::::0;48535:41;;-1:-1:-1;;;;;;48587:15:0;::::1;::::0;48603:21:::1;48587:38:::0;::::1;;;::::0;::::1;::::0;;;48603:21;48587:15;:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;48524:109;48485:148::o:0;30231:185::-;30369:39;30386:4;30392:2;30396:7;30369:39;;;;;;;;;;;;:16;:39::i;47250:385::-;47339:16;47373:18;47394:17;47404:6;47394:9;:17::i;:::-;47373:38;;47424:25;47466:10;47452:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47452:25:0;;47424:53;;47493:9;47488:112;47512:10;47508:1;:14;47488:112;;;47558:30;47578:6;47586:1;47558:19;:30::i;:::-;47544:8;47553:1;47544:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;47524:3;;;;:::i;:::-;;;;47488:112;;;-1:-1:-1;47619:8:0;47250:385;-1:-1:-1;;;47250:385:0:o;40865:320::-;40985:7;41040:30;40763:10;:17;;40675:113;41040:30;41032:5;:38;41010:132;;;;-1:-1:-1;;;41010:132:0;;11059:2:1;41010:132:0;;;11041:21:1;11098:2;11078:18;;;11071:30;11137:34;11117:18;;;11110:62;-1:-1:-1;;;11188:18:1;;;11181:42;11240:19;;41010:132:0;10857:408:1;41010:132:0;41160:10;41171:5;41160:17;;;;;;;;:::i;:::-;;;;;;;;;41153:24;;40865:320;;;:::o;47643:101::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;47714:12:::1;:22;47729:7:::0;47714:12;:22:::1;:::i;26639:326::-:0;26756:7;26797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26797:16:0;;26824:110;;;;-1:-1:-1;;;26824:110:0;;13676:2:1;26824:110:0;;;13658:21:1;13715:2;13695:18;;;13688:30;13754:34;13734:18;;;13727:62;-1:-1:-1;;;13805:18:1;;;13798:39;13854:19;;26824:110:0;13474:405:1;26282:295:0;26399:7;-1:-1:-1;;;;;26446:19:0;;26424:111;;;;-1:-1:-1;;;26424:111:0;;14086:2:1;26424:111:0;;;14068:21:1;14125:2;14105:18;;;14098:30;14164:34;14144:18;;;14137:62;-1:-1:-1;;;14215:18:1;;;14208:40;14265:19;;26424:111:0;13884:406:1;26424:111:0;-1:-1:-1;;;;;;26553:16:0;;;;;:9;:16;;;;;;;26282:295::o;9739:94::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;9804:21:::1;9822:1;9804:9;:21::i;:::-;9739:94::o:0;47974:80::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;48038:8:::1;::::0;;-1:-1:-1;;48026:20:0;::::1;48038:8;::::0;;::::1;48037:9;48026:20;::::0;;47974:80::o;48641:789::-;48715:14;48731:11;48744:13;48776:4;48770:10;;48800:8;;48794:3;:14;48791:60;;;48831:8;;48825:14;;48791:60;48886:10;;48880:3;48864:13;40763:10;:17;;40675:113;48864:13;:19;;;;:::i;:::-;:32;48861:96;;;40763:10;:17;48919:10;;:26;;;;:::i;:::-;48913:32;;48861:96;48997:6;;-1:-1:-1;;;;;48972:16:0;;;;;;:6;:16;;;;;;:22;;48991:3;;48972:22;:::i;:::-;:31;48969:94;;;-1:-1:-1;;;;;49035:16:0;;;;;;:6;:16;;;;;;49026:6;;:25;;49035:16;49026:25;:::i;:::-;49020:31;;48969:94;49091:3;49084:4;;:10;;;;:::i;:::-;-1:-1:-1;;;;;49128:13:0;;49113:1;49128:13;;;:3;:13;;;;;;49075:19;;-1:-1:-1;49113:1:0;-1:-1:-1;49128:13:0;;49125:298;;;49165:3;49157:11;;49199:3;49192:4;;:10;;;;:::i;:::-;49183:19;;49237:17;;49231:3;49220:8;;:14;;;;:::i;:::-;:34;49217:195;;;49302:8;;49282:17;;:28;;;;:::i;:::-;49274:36;;49378:17;;49372:3;49361:8;;:14;;;;:::i;:::-;:34;;;;:::i;:::-;49353:4;;:43;;;;:::i;:::-;49345:5;49338:4;;:12;;;;:::i;:::-;:58;;;;:::i;:::-;49329:67;;49217:195;48641:789;;;;;:::o;27201:104::-;27257:13;27290:7;27283:14;;;;;:::i;48062:208::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;48148:17:::1;:28:::0;;;48187:21:::1;:32:::0;;;48243:19:::1;48211:8:::0;48168;48243:19:::1;:::i;:::-;48230:10;:32:::0;-1:-1:-1;;48062:208:0:o;49559:522::-;49622:8;;;;49614:30;;;;-1:-1:-1;;;49614:30:0;;14933:2:1;49614:30:0;;;14915:21:1;14972:1;14952:18;;;14945:29;-1:-1:-1;;;14990:18:1;;;14983:39;15039:18;;49614:30:0;14731:332:1;49614:30:0;49656:14;49672:15;49689:13;49706:28;49718:3;49723:10;49706:11;:28::i;:::-;49655:79;;-1:-1:-1;49655:79:0;-1:-1:-1;49655:79:0;-1:-1:-1;49750:10:0;;49747:92;;49797:6;49784:9;:19;;49776:51;;;;-1:-1:-1;;;49776:51:0;;15270:2:1;49776:51:0;;;15252:21:1;15309:2;15289:18;;;15282:30;-1:-1:-1;;;15328:18:1;;;15321:47;15385:18;;49776:51:0;15068:341:1;49776:51:0;49858:10;49851:18;;;;:6;:18;;;;;:29;;49873:7;;49851:18;:29;;49873:7;;49851:29;:::i;:::-;;;;;;;;49904:7;49891:9;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;49925:9:0;;49922:58;;49963:5;49951:8;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;49922:58:0;49997:9;49992:82;50016:7;50012:1;:11;49992:82;;;50045:17;50051:10;50045:5;:17::i;:::-;50025:3;;;;:::i;:::-;;;;49992:82;;;;49603:478;;;49559:522;:::o;29105:327::-;2141:10;-1:-1:-1;;;;;29240:24:0;;;29232:62;;;;-1:-1:-1;;;29232:62:0;;15616:2:1;29232:62:0;;;15598:21:1;15655:2;15635:18;;;15628:30;15694:27;15674:18;;;15667:55;15739:18;;29232:62:0;15414:349:1;29232:62:0;2141:10;29307:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29307:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29307:53:0;;;;;;;;;;29376:48;;540:41:1;;;29307:42:0;;2141:10;29376:48;;513:18:1;29376:48:0;;;;;;;29105:327;;:::o;30487:365::-;30676:41;2141:10;30709:7;30676:18;:41::i;:::-;30654:140;;;;-1:-1:-1;;;30654:140:0;;;;;;;:::i;:::-;30805:39;30819:4;30825:2;30829:7;30838:5;30805:13;:39::i;:::-;30487:365;;;;:::o;27376:468::-;32464:4;32488:16;;;:7;:16;;;;;;27494:13;;-1:-1:-1;;;;;32488:16:0;27525:113;;;;-1:-1:-1;;;27525:113:0;;15970:2:1;27525:113:0;;;15952:21:1;16009:2;15989:18;;;15982:30;16048:34;16028:18;;;16021:62;-1:-1:-1;;;16099:18:1;;;16092:45;16154:19;;27525:113:0;15768:411:1;27525:113:0;27651:21;27675:10;:8;:10::i;:::-;27651:34;;27740:1;27722:7;27716:21;:25;:120;;;;;;;;;;;;;;;;;27785:7;27794:18;:7;:16;:18::i;:::-;27768:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27716:120;27696:140;27376:468;-1:-1:-1;;;27376:468:0:o;46474:99::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48278:199::-;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;48375:9:::1;48371:99;48390:20:::0;;::::1;48371:99;;;48452:6;48432:3;:17;48436:9;;48446:1;48436:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48432:17:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48432:17:0;:26;;-1:-1:-1;;48432:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48412:3;::::1;::::0;::::1;:::i;:::-;;;;48371:99;;9988:229:::0;9161:6;;-1:-1:-1;;;;;9161:6:0;2141:10;9308:23;9300:68;;;;-1:-1:-1;;;9300:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10091:22:0;::::1;10069:110;;;::::0;-1:-1:-1;;;10069:110:0;;16887:2:1;10069:110:0::1;::::0;::::1;16869:21:1::0;16926:2;16906:18;;;16899:30;16965:34;16945:18;;;16938:62;-1:-1:-1;;;17016:18:1;;;17009:36;17062:19;;10069:110:0::1;16685:402:1::0;10069:110:0::1;10190:19;10200:8;10190:9;:19::i;:::-;9988:229:::0;:::o;25863:355::-;26010:4;-1:-1:-1;;;;;;26052:40:0;;-1:-1:-1;;;26052:40:0;;:105;;-1:-1:-1;;;;;;;26109:48:0;;-1:-1:-1;;;26109:48:0;26052:105;:158;;;-1:-1:-1;;;;;;;;;;12368:40:0;;;26174:36;12209:207;36522:174;36597:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36597:29:0;-1:-1:-1;;;;;36597:29:0;;;;;;;;:24;;36651:23;36597:24;36651:14;:23::i;:::-;-1:-1:-1;;;;;36642:46:0;;;;;;;;;;;36522:174;;:::o;32693:452::-;32822:4;32488:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32488:16:0;32844:110;;;;-1:-1:-1;;;32844:110:0;;17294:2:1;32844:110:0;;;17276:21:1;17333:2;17313:18;;;17306:30;17372:34;17352:18;;;17345:62;-1:-1:-1;;;17423:18:1;;;17416:42;17475:19;;32844:110:0;17092:408:1;32844:110:0;32965:13;32981:23;32996:7;32981:14;:23::i;:::-;32965:39;;33034:5;-1:-1:-1;;;;;33023:16:0;:7;-1:-1:-1;;;;;33023:16:0;;:64;;;;33080:7;-1:-1:-1;;;;;33056:31:0;:20;33068:7;33056:11;:20::i;:::-;-1:-1:-1;;;;;33056:31:0;;33023:64;:113;;;-1:-1:-1;;;;;;29674:25:0;;;29645:4;29674:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33104:32;33015:122;32693:452;-1:-1:-1;;;;32693:452:0:o;35789:615::-;35962:4;-1:-1:-1;;;;;35935:31:0;:23;35950:7;35935:14;:23::i;:::-;-1:-1:-1;;;;;35935:31:0;;35913:122;;;;-1:-1:-1;;;35913:122:0;;17707:2:1;35913:122:0;;;17689:21:1;17746:2;17726:18;;;17719:30;17785:34;17765:18;;;17758:62;-1:-1:-1;;;17836:18:1;;;17829:39;17885:19;;35913:122:0;17505:405:1;35913:122:0;-1:-1:-1;;;;;36054:16:0;;36046:65;;;;-1:-1:-1;;;36046:65:0;;18117:2:1;36046:65:0;;;18099:21:1;18156:2;18136:18;;;18129:30;18195:34;18175:18;;;18168:62;-1:-1:-1;;;18246:18:1;;;18239:34;18290:19;;36046:65:0;17915:400:1;36046:65:0;36124:39;36145:4;36151:2;36155:7;36124:20;:39::i;:::-;36228:29;36245:1;36249:7;36228:8;:29::i;:::-;-1:-1:-1;;;;;36270:15:0;;;;;;:9;:15;;;;;:20;;36289:1;;36270:15;:20;;36289:1;;36270:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36301:13:0;;;;;;:9;:13;;;;;:18;;36318:1;;36301:13;:18;;36318:1;;36301:18;:::i;:::-;;;;-1:-1:-1;;36330:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36330:21:0;-1:-1:-1;;;;;36330:21:0;;;;;;;;;36369:27;;36330:16;;36369:27;;;;;;;35789:615;;;:::o;10225:173::-;10300:6;;;-1:-1:-1;;;;;10317:17:0;;;-1:-1:-1;;;;;;10317:17:0;;;;;;;10350:40;;10300:6;;;10317:17;10300:6;;10350:40;;10281:16;;10350:40;10270:128;10225:173;:::o;50089:192::-;50136:20;:8;1059:19;;1077:1;1059:19;;;970:127;50136:20;50167:15;50185:18;:8;940:14;;848:114;50185:18;50167:36;;50214:23;50224:3;50229:7;50214:9;:23::i;:::-;50253:20;;;-1:-1:-1;;;;;18512:32:1;;18494:51;;18576:2;18561:18;;18554:34;;;50253:20:0;;18467:18:1;50253:20:0;;;;;;;50125:156;50089:192;:::o;31734:352::-;31891:28;31901:4;31907:2;31911:7;31891:9;:28::i;:::-;31952:48;31975:4;31981:2;31985:7;31994:5;31952:22;:48::i;:::-;31930:148;;;;-1:-1:-1;;;31930:148:0;;;;;;;:::i;49438:113::-;49498:13;49531:12;49524:19;;;;;:::i;12730:723::-;12786:13;13007:5;13016:1;13007:10;13003:53;;-1:-1:-1;;13034:10:0;;;;;;;;;;;;-1:-1:-1;;;13034:10:0;;;;;12730:723::o;13003:53::-;13081:5;13066:12;13122:78;13129:9;;13122:78;;13155:8;;;;:::i;:::-;;-1:-1:-1;13178:10:0;;-1:-1:-1;13186:2:0;13178:10;;:::i;:::-;;;13122:78;;;13210:19;13242:6;13232:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13232:17:0;;13210:39;;13260:154;13267:10;;13260:154;;13294:11;13304:1;13294:11;;:::i;:::-;;-1:-1:-1;13363:10:0;13371:2;13363:5;:10;:::i;:::-;13350:24;;:2;:24;:::i;:::-;13337:39;;13320:6;13327;13320:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13320:56:0;;;;;;;;-1:-1:-1;13391:11:0;13400:2;13391:11;;:::i;:::-;;;13260:154;;41798:589;-1:-1:-1;;;;;42004:18:0;;42000:187;;42039:40;42071:7;43214:10;:17;;43187:24;;;;:15;:24;;;;;:44;;;43242:24;;;;;;;;;;;;43110:164;42039:40;42000:187;;;42109:2;-1:-1:-1;;;;;42101:10:0;:4;-1:-1:-1;;;;;42101:10:0;;42097:90;;42128:47;42161:4;42167:7;42128:32;:47::i;:::-;-1:-1:-1;;;;;42201:16:0;;42197:183;;42234:45;42271:7;42234:36;:45::i;42197:183::-;42307:4;-1:-1:-1;;;;;42301:10:0;:2;-1:-1:-1;;;;;42301:10:0;;42297:83;;42328:40;42356:2;42360:7;42328:27;:40::i;33487:110::-;33563:26;33573:2;33577:7;33563:26;;;;;;;;;;;;:9;:26::i;37261:984::-;37416:4;-1:-1:-1;;;;;37437:13:0;;15606:20;15654:8;37433:805;;37490:175;;-1:-1:-1;;;37490:175:0;;-1:-1:-1;;;;;37490:36:0;;;;;:175;;2141:10;;37584:4;;37611:7;;37641:5;;37490:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37490:175:0;;;;;;;;-1:-1:-1;;37490:175:0;;;;;;;;;;;;:::i;:::-;;;37469:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37852:6;:13;37869:1;37852:18;37848:320;;37895:108;;-1:-1:-1;;;37895:108:0;;;;;;;:::i;37848:320::-;38118:6;38112:13;38103:6;38099:2;38095:15;38088:38;37469:714;-1:-1:-1;;;;;;37729:55:0;-1:-1:-1;;;37729:55:0;;-1:-1:-1;37722:62:0;;37433:805;-1:-1:-1;38222:4:0;37261:984;;;;;;:::o;43901:1002::-;44181:22;44231:1;44206:22;44223:4;44206:16;:22::i;:::-;:26;;;;:::i;:::-;44243:18;44264:26;;;:17;:26;;;;;;44181:51;;-1:-1:-1;44397:28:0;;;44393:328;;-1:-1:-1;;;;;44464:18:0;;44442:19;44464:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44515:30;;;;;;:44;;;44632:30;;:17;:30;;;;;:43;;;44393:328;-1:-1:-1;44817:26:0;;;;:17;:26;;;;;;;;44810:33;;;-1:-1:-1;;;;;44861:18:0;;;;;:12;:18;;;;;:34;;;;;;;44854:41;43901:1002::o;45198:1079::-;45476:10;:17;45451:22;;45476:21;;45496:1;;45476:21;:::i;:::-;45508:18;45529:24;;;:15;:24;;;;;;45902:10;:26;;45451:46;;-1:-1:-1;45529:24:0;;45451:46;;45902:26;;;;;;:::i;:::-;;;;;;;;;45880:48;;45966:11;45941:10;45952;45941:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46046:28;;;:15;:28;;;;;;;:41;;;46218:24;;;;;46211:31;46253:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45269:1008;;;45198:1079;:::o;42688:221::-;42773:14;42790:20;42807:2;42790:16;:20::i;:::-;-1:-1:-1;;;;;42821:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42866:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42688:221:0:o;33824:321::-;33954:18;33960:2;33964:7;33954:5;:18::i;:::-;34005:54;34036:1;34040:2;34044:7;34053:5;34005:22;:54::i;:::-;33983:154;;;;-1:-1:-1;;;33983:154:0;;;;;;;:::i;34481:382::-;-1:-1:-1;;;;;34561:16:0;;34553:61;;;;-1:-1:-1;;;34553:61:0;;20474:2:1;34553:61:0;;;20456:21:1;;;20493:18;;;20486:30;20552:34;20532:18;;;20525:62;20604:18;;34553:61:0;20272:356:1;34553:61:0;32464:4;32488:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32488:16:0;:30;34625:58;;;;-1:-1:-1;;;34625:58:0;;20835:2:1;34625:58:0;;;20817:21:1;20874:2;20854:18;;;20847:30;20913;20893:18;;;20886:58;20961:18;;34625:58:0;20633:352:1;34625:58:0;34696:45;34725:1;34729:2;34733:7;34696:20;:45::i;:::-;-1:-1:-1;;;;;34754:13:0;;;;;;:9;:13;;;;;:18;;34771:1;;34754:13;:18;;34771:1;;34754:18;:::i;:::-;;;;-1:-1:-1;;34783:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34783:21:0;-1:-1:-1;;;;;34783:21:0;;;;;;;;34822:33;;34783:16;;;34822:33;;34783:16;;34822:33;34481:382;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;777:250::-;862:1;872:113;886:6;883:1;880:13;872:113;;;962:11;;;956:18;943:11;;;936:39;908:2;901:10;872:113;;;-1:-1:-1;;1019:1:1;1001:16;;994:27;777:250::o;1032:271::-;1074:3;1112:5;1106:12;1139:6;1134:3;1127:19;1155:76;1224:6;1217:4;1212:3;1208:14;1201:4;1194:5;1190:16;1155:76;:::i;:::-;1285:2;1264:15;-1:-1:-1;;1260:29:1;1251:39;;;;1292:4;1247:50;;1032:271;-1:-1:-1;;1032:271:1:o;1308:220::-;1457:2;1446:9;1439:21;1420:4;1477:45;1518:2;1507:9;1503:18;1495:6;1477:45;:::i;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:186::-;2419:6;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2511:29;2530:9;2511:29;:::i;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;2884:248::-;2952:6;2960;3013:2;3001:9;2992:7;2988:23;2984:32;2981:52;;;3029:1;3026;3019:12;2981:52;-1:-1:-1;;3052:23:1;;;3122:2;3107:18;;;3094:32;;-1:-1:-1;2884:248:1:o;3137:632::-;3308:2;3360:21;;;3430:13;;3333:18;;;3452:22;;;3279:4;;3308:2;3531:15;;;;3505:2;3490:18;;;3279:4;3574:169;3588:6;3585:1;3582:13;3574:169;;;3649:13;;3637:26;;3718:15;;;;3683:12;;;;3610:1;3603:9;3574:169;;;-1:-1:-1;3760:3:1;;3137:632;-1:-1:-1;;;;;;3137:632:1:o;3774:127::-;3835:10;3830:3;3826:20;3823:1;3816:31;3866:4;3863:1;3856:15;3890:4;3887:1;3880:15;3906:632;3971:5;4001:18;4042:2;4034:6;4031:14;4028:40;;;4048:18;;:::i;:::-;4123:2;4117:9;4091:2;4177:15;;-1:-1:-1;;4173:24:1;;;4199:2;4169:33;4165:42;4153:55;;;4223:18;;;4243:22;;;4220:46;4217:72;;;4269:18;;:::i;:::-;4309:10;4305:2;4298:22;4338:6;4329:15;;4368:6;4360;4353:22;4408:3;4399:6;4394:3;4390:16;4387:25;4384:45;;;4425:1;4422;4415:12;4384:45;4475:6;4470:3;4463:4;4455:6;4451:17;4438:44;4530:1;4523:4;4514:6;4506;4502:19;4498:30;4491:41;;;;3906:632;;;;;:::o;4543:451::-;4612:6;4665:2;4653:9;4644:7;4640:23;4636:32;4633:52;;;4681:1;4678;4671:12;4633:52;4721:9;4708:23;4754:18;4746:6;4743:30;4740:50;;;4786:1;4783;4776:12;4740:50;4809:22;;4862:4;4854:13;;4850:27;-1:-1:-1;4840:55:1;;4891:1;4888;4881:12;4840:55;4914:74;4980:7;4975:2;4962:16;4957:2;4953;4949:11;4914:74;:::i;4999:254::-;5067:6;5075;5128:2;5116:9;5107:7;5103:23;5099:32;5096:52;;;5144:1;5141;5134:12;5096:52;5180:9;5167:23;5157:33;;5209:38;5243:2;5232:9;5228:18;5209:38;:::i;:::-;5199:48;;4999:254;;;;;:::o;5582:160::-;5647:20;;5703:13;;5696:21;5686:32;;5676:60;;5732:1;5729;5722:12;5747:254;5812:6;5820;5873:2;5861:9;5852:7;5848:23;5844:32;5841:52;;;5889:1;5886;5879:12;5841:52;5912:29;5931:9;5912:29;:::i;:::-;5902:39;;5960:35;5991:2;5980:9;5976:18;5960:35;:::i;6006:667::-;6101:6;6109;6117;6125;6178:3;6166:9;6157:7;6153:23;6149:33;6146:53;;;6195:1;6192;6185:12;6146:53;6218:29;6237:9;6218:29;:::i;:::-;6208:39;;6266:38;6300:2;6289:9;6285:18;6266:38;:::i;:::-;6256:48;;6351:2;6340:9;6336:18;6323:32;6313:42;;6406:2;6395:9;6391:18;6378:32;6433:18;6425:6;6422:30;6419:50;;;6465:1;6462;6455:12;6419:50;6488:22;;6541:4;6533:13;;6529:27;-1:-1:-1;6519:55:1;;6570:1;6567;6560:12;6519:55;6593:74;6659:7;6654:2;6641:16;6636:2;6632;6628:11;6593:74;:::i;:::-;6583:84;;;6006:667;;;;;;;:::o;6678:689::-;6770:6;6778;6786;6839:2;6827:9;6818:7;6814:23;6810:32;6807:52;;;6855:1;6852;6845:12;6807:52;6895:9;6882:23;6924:18;6965:2;6957:6;6954:14;6951:34;;;6981:1;6978;6971:12;6951:34;7019:6;7008:9;7004:22;6994:32;;7064:7;7057:4;7053:2;7049:13;7045:27;7035:55;;7086:1;7083;7076:12;7035:55;7126:2;7113:16;7152:2;7144:6;7141:14;7138:34;;;7168:1;7165;7158:12;7138:34;7223:7;7216:4;7206:6;7203:1;7199:14;7195:2;7191:23;7187:34;7184:47;7181:67;;;7244:1;7241;7234:12;7181:67;7275:4;7267:13;;;;-1:-1:-1;7299:6:1;-1:-1:-1;7324:37:1;;7340:20;;;-1:-1:-1;7324:37:1;:::i;:::-;7314:47;;6678:689;;;;;:::o;7372:260::-;7440:6;7448;7501:2;7489:9;7480:7;7476:23;7472:32;7469:52;;;7517:1;7514;7507:12;7469:52;7540:29;7559:9;7540:29;:::i;:::-;7530:39;;7588:38;7622:2;7611:9;7607:18;7588:38;:::i;7637:356::-;7839:2;7821:21;;;7858:18;;;7851:30;7917:34;7912:2;7897:18;;7890:62;7984:2;7969:18;;7637:356::o;7998:380::-;8077:1;8073:12;;;;8120;;;8141:61;;8195:4;8187:6;8183:17;8173:27;;8141:61;8248:2;8240:6;8237:14;8217:18;8214:38;8211:161;;8294:10;8289:3;8285:20;8282:1;8275:31;8329:4;8326:1;8319:15;8357:4;8354:1;8347:15;8211:161;;7998:380;;;:::o;9623:413::-;9825:2;9807:21;;;9864:2;9844:18;;;9837:30;9903:34;9898:2;9883:18;;9876:62;-1:-1:-1;;;9969:2:1;9954:18;;9947:47;10026:3;10011:19;;9623:413::o;10453:127::-;10514:10;10509:3;10505:20;10502:1;10495:31;10545:4;10542:1;10535:15;10569:4;10566:1;10559:15;10585:127;10646:10;10641:3;10637:20;10634:1;10627:31;10677:4;10674:1;10667:15;10701:4;10698:1;10691:15;10717:135;10756:3;10777:17;;;10774:43;;10797:18;;:::i;:::-;-1:-1:-1;10844:1:1;10833:13;;10717:135::o;11396:545::-;11498:2;11493:3;11490:11;11487:448;;;11534:1;11559:5;11555:2;11548:17;11604:4;11600:2;11590:19;11674:2;11662:10;11658:19;11655:1;11651:27;11645:4;11641:38;11710:4;11698:10;11695:20;11692:47;;;-1:-1:-1;11733:4:1;11692:47;11788:2;11783:3;11779:12;11776:1;11772:20;11766:4;11762:31;11752:41;;11843:82;11861:2;11854:5;11851:13;11843:82;;;11906:17;;;11887:1;11876:13;11843:82;;;11847:3;;;11396:545;;;:::o;12117:1352::-;12243:3;12237:10;12270:18;12262:6;12259:30;12256:56;;;12292:18;;:::i;:::-;12321:97;12411:6;12371:38;12403:4;12397:11;12371:38;:::i;:::-;12365:4;12321:97;:::i;:::-;12473:4;;12537:2;12526:14;;12554:1;12549:663;;;;13256:1;13273:6;13270:89;;;-1:-1:-1;13325:19:1;;;13319:26;13270:89;-1:-1:-1;;12074:1:1;12070:11;;;12066:24;12062:29;12052:40;12098:1;12094:11;;;12049:57;13372:81;;12519:944;;12549:663;11343:1;11336:14;;;11380:4;11367:18;;-1:-1:-1;;12585:20:1;;;12703:236;12717:7;12714:1;12711:14;12703:236;;;12806:19;;;12800:26;12785:42;;12898:27;;;;12866:1;12854:14;;;;12733:19;;12703:236;;;12707:3;12967:6;12958:7;12955:19;12952:201;;;13028:19;;;13022:26;-1:-1:-1;;13111:1:1;13107:14;;;13123:3;13103:24;13099:37;13095:42;13080:58;13065:74;;12952:201;-1:-1:-1;;;;;13199:1:1;13183:14;;;13179:22;13166:36;;-1:-1:-1;12117:1352:1:o;14295:125::-;14360:9;;;14381:10;;;14378:36;;;14394:18;;:::i;14425:128::-;14492:9;;;14513:11;;;14510:37;;;14527:18;;:::i;14558:168::-;14631:9;;;14662;;14679:15;;;14673:22;;14659:37;14649:71;;14700:18;;:::i;16184:496::-;16363:3;16401:6;16395:13;16417:66;16476:6;16471:3;16464:4;16456:6;16452:17;16417:66;:::i;:::-;16546:13;;16505:16;;;;16568:70;16546:13;16505:16;16615:4;16603:17;;16568:70;:::i;:::-;16654:20;;16184:496;-1:-1:-1;;;;16184:496:1:o;18599:414::-;18801:2;18783:21;;;18840:2;18820:18;;;18813:30;18879:34;18874:2;18859:18;;18852:62;-1:-1:-1;;;18945:2:1;18930:18;;18923:48;19003:3;18988:19;;18599:414::o;19018:127::-;19079:10;19074:3;19070:20;19067:1;19060:31;19110:4;19107:1;19100:15;19134:4;19131:1;19124:15;19150:120;19190:1;19216;19206:35;;19221:18;;:::i;:::-;-1:-1:-1;19255:9:1;;19150:120::o;19275:112::-;19307:1;19333;19323:35;;19338:18;;:::i;:::-;-1:-1:-1;19372:9:1;;19275:112::o;19392:489::-;-1:-1:-1;;;;;19661:15:1;;;19643:34;;19713:15;;19708:2;19693:18;;19686:43;19760:2;19745:18;;19738:34;;;19808:3;19803:2;19788:18;;19781:31;;;19586:4;;19829:46;;19855:19;;19847:6;19829:46;:::i;:::-;19821:54;19392:489;-1:-1:-1;;;;;;19392:489:1:o;19886:249::-;19955:6;20008:2;19996:9;19987:7;19983:23;19979:32;19976:52;;;20024:1;20021;20014:12;19976:52;20056:9;20050:16;20075:30;20099:5;20075:30;:::i;20140:127::-;20201:10;20196:3;20192:20;20189:1;20182:31;20232:4;20229:1;20222:15;20256:4;20253:1;20246:15
Swarm Source
ipfs://19a55c617c34acd3e0fbc8c2b3fdcdf8d02b83b42673524b7566d2d91dd71912
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.