Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 RTOADZ
Holders
84
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 RTOADZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RotatedToadz
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-19 */ 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/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol 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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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/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}. 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 { // solhint-disable-next-line no-inline-assembly 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` 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 { } } // 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/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: @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract RotatedToadz is ERC721, Ownable { bool public devMintLocked = false; uint256 public constant maxTokens = 6969; uint256 public numAvailableTokens = 6969; uint256 public constant maxMintsPerTx = 5; mapping(address => uint256) public addressToNumOwned; string private _contractURI; uint256[10000] private _availableTokens; uint256 private _price = 2 * 10**16; //0.02 ETH; string private _baseTokenURI; constructor() public ERC721("RotatedToadz", "RTOADZ") {} function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 _serialId) public view override returns (string memory) { string memory base = _baseURI(); string memory _tokenURI = Strings.toString(_serialId); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } return string(abi.encodePacked(base, _tokenURI)); } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setContractURI(string memory contractURI_) external onlyOwner { _contractURI = contractURI_; } function contractURI() public view returns (string memory) { return _contractURI; } function withdrawAll() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } //Minting function mint(uint256 quantity) public payable { uint256 updatedNumAvailableTokens = numAvailableTokens; require( quantity <= maxMintsPerTx, "There is a limit on minting too many at a time!" ); require( updatedNumAvailableTokens - quantity >= 0, "Minting this many would exceed supply!" ); require( addressToNumOwned[msg.sender] + quantity <= 5, "Can't own more than 5 toadz" ); if (updatedNumAvailableTokens < 6719) { require( msg.value >= _price * quantity,"Ether sent is not correct" ); } require(msg.sender == tx.origin, "No contracts!"); for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = getRandomSerialToken(quantity, i); _safeMint(msg.sender, tokenId); updatedNumAvailableTokens--; } numAvailableTokens = updatedNumAvailableTokens; addressToNumOwned[msg.sender] = addressToNumOwned[msg.sender] + quantity; } function mintSpecial(uint256[] memory specialIds) external onlyOwner { require(!devMintLocked, "Dev Mint Permanently Locked"); uint256 num = specialIds.length; for (uint256 i = 0; i < num; i++) { uint256 specialId = specialIds[i]; _safeMint(msg.sender, specialId); } } function getRandomSerialToken(uint256 _numToFetch, uint256 _i) internal returns (uint256) { uint256 randomNum = uint256( keccak256( abi.encode( msg.sender, tx.gasprice, block.number, block.timestamp, blockhash(block.number - 1), _numToFetch, _i ) ) ); uint256 randomIndex = randomNum % numAvailableTokens; uint256 valAtIndex = _availableTokens[randomIndex]; uint256 result; if (valAtIndex == 0) { result = randomIndex; } else { result = valAtIndex; } uint256 lastIndex = numAvailableTokens - 1; if (randomIndex != lastIndex) { uint256 lastValInArray = _availableTokens[lastIndex]; if (lastValInArray == 0) { _availableTokens[randomIndex] = lastIndex; } else { _availableTokens[randomIndex] = lastValInArray; } } numAvailableTokens--; return result; } function lockDevMint() public onlyOwner { devMintLocked = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToNumOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"lockDevMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"specialIds","type":"uint256[]"}],"name":"mintSpecial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_serialId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600660146101000a81548160ff021916908315150217905550611b3960075566470de4df82000061271a553480156200003e57600080fd5b506040518060400160405280600c81526020017f526f7461746564546f61647a00000000000000000000000000000000000000008152506040518060400160405280600681526020017f52544f41445a00000000000000000000000000000000000000000000000000008152508160009080519060200190620000c39291906200019e565b508060019080519060200190620000dc9291906200019e565b5050506000620000f16200019660201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002b3565b600033905090565b828054620001ac906200024e565b90600052602060002090601f016020900481019282620001d057600085556200021c565b82601f10620001eb57805160ff19168380011785556200021c565b828001600101855582156200021c579182015b828111156200021b578251825591602001919060010190620001fe565b5b5090506200022b91906200022f565b5090565b5b808211156200024a57600081600090555060010162000230565b5090565b600060028204905060018216806200026757607f821691505b602082108114156200027e576200027d62000284565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613e7e80620002c36000396000f3fe6080604052600436106101b75760003560e01c8063853828b6116100ec578063b88d4fde1161008a578063e831574211610064578063e8315742146105c8578063e8a3d485146105f3578063e985e9c51461061e578063f2fde38b1461065b576101b7565b8063b88d4fde14610537578063c87b56dd14610560578063dc30158b1461059d576101b7565b806395d89b41116100c657806395d89b411461049c5780639a7c8e69146104c7578063a0712d68146104f2578063a22cb4651461050e576101b7565b8063853828b61461043e5780638da5cb5b14610448578063938e3d7b14610473576101b7565b8063413ac78d116101595780636352211e116101335780636352211e1461037057806370a08231146103ad578063715018a6146103ea578063787faa7f14610401576101b7565b8063413ac78d146102f357806342842e0e1461031e57806355f804b314610347576101b7565b8063081812fc11610195578063081812fc1461023b578063095ea7b3146102785780631f65d743146102a157806323b872dd146102ca576101b7565b806301ffc9a7146101bc57806306fd5133146101f957806306fdde0314610210575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612ae8565b610684565b6040516101f091906130bd565b60405180910390f35b34801561020557600080fd5b5061020e610766565b005b34801561021c57600080fd5b506102256107ff565b60405161023291906130d8565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612bd8565b610891565b60405161026f9190612fe7565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190612a5f565b610916565b005b3480156102ad57600080fd5b506102c860048036038101906102c39190612a9f565b610a2e565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190612949565b610b4d565b005b3480156102ff57600080fd5b50610308610bad565b604051610315919061339a565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612949565b610bb3565b005b34801561035357600080fd5b5061036e60048036038101906103699190612b42565b610bd3565b005b34801561037c57600080fd5b5061039760048036038101906103929190612bd8565b610c66565b6040516103a49190612fe7565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf91906128dc565b610d18565b6040516103e1919061339a565b60405180910390f35b3480156103f657600080fd5b506103ff610dd0565b005b34801561040d57600080fd5b50610428600480360381019061042391906128dc565b610f0d565b604051610435919061339a565b60405180910390f35b610446610f25565b005b34801561045457600080fd5b5061045d610fe1565b60405161046a9190612fe7565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612b8f565b61100b565b005b3480156104a857600080fd5b506104b16110a1565b6040516104be91906130d8565b60405180910390f35b3480156104d357600080fd5b506104dc611133565b6040516104e991906130bd565b60405180910390f35b61050c60048036038101906105079190612bd8565b611146565b005b34801561051a57600080fd5b5061053560048036038101906105309190612a1f565b611417565b005b34801561054357600080fd5b5061055e6004803603810190610559919061299c565b611598565b005b34801561056c57600080fd5b5061058760048036038101906105829190612bd8565b6115fa565b60405161059491906130d8565b60405180910390f35b3480156105a957600080fd5b506105b2611655565b6040516105bf919061339a565b60405180910390f35b3480156105d457600080fd5b506105dd61165a565b6040516105ea919061339a565b60405180910390f35b3480156105ff57600080fd5b50610608611660565b60405161061591906130d8565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190612909565b6116f2565b60405161065291906130bd565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d91906128dc565b611786565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061075f575061075e82611932565b5b9050919050565b61076e61199c565b73ffffffffffffffffffffffffffffffffffffffff1661078c610fe1565b73ffffffffffffffffffffffffffffffffffffffff16146107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d99061329a565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550565b60606000805461080e906136aa565b80601f016020809104026020016040519081016040528092919081815260200182805461083a906136aa565b80156108875780601f1061085c57610100808354040283529160200191610887565b820191906000526020600020905b81548152906001019060200180831161086a57829003601f168201915b5050505050905090565b600061089c826119a4565b6108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29061325a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092182610c66565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610989906132fa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b161199c565b73ffffffffffffffffffffffffffffffffffffffff1614806109e057506109df816109da61199c565b6116f2565b5b610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a16906131da565b60405180910390fd5b610a298383611a10565b505050565b610a3661199c565b73ffffffffffffffffffffffffffffffffffffffff16610a54610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa19061329a565b60405180910390fd5b600660149054906101000a900460ff1615610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af19061337a565b60405180910390fd5b60008151905060005b81811015610b48576000838281518110610b2057610b1f613814565b5b60200260200101519050610b343382611ac9565b508080610b409061370d565b915050610b03565b505050565b610b5e610b5861199c565b82611ae7565b610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b949061335a565b60405180910390fd5b610ba8838383611bc5565b505050565b60075481565b610bce83838360405180602001604052806000815250611598565b505050565b610bdb61199c565b73ffffffffffffffffffffffffffffffffffffffff16610bf9610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c469061329a565b60405180910390fd5b818161271b9190610c61929190612576565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d069061321a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d80906131fa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd861199c565b73ffffffffffffffffffffffffffffffffffffffff16610df6610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e439061329a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60086020528060005260406000206000915090505481565b610f2d61199c565b73ffffffffffffffffffffffffffffffffffffffff16610f4b610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f989061329a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610fdf57600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61101361199c565b73ffffffffffffffffffffffffffffffffffffffff16611031610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e9061329a565b60405180910390fd5b806009908051906020019061109d9291906125fc565b5050565b6060600180546110b0906136aa565b80601f01602080910402602001604051908101604052809291908181526020018280546110dc906136aa565b80156111295780601f106110fe57610100808354040283529160200191611129565b820191906000526020600020905b81548152906001019060200180831161110c57829003601f168201915b5050505050905090565b600660149054906101000a900460ff1681565b600060075490506005821115611191576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611188906132da565b60405180910390fd5b6000828261119f919061358c565b10156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d79061311a565b60405180910390fd5b600582600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122d91906134ab565b111561126e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112659061327a565b60405180910390fd5b611a3f8110156112ca578161271a546112879190613532565b3410156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c09061331a565b60405180910390fd5b5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f9061333a565b60405180910390fd5b60005b8281101561137d57600061134f8483611e21565b905061135b3382611ac9565b828061136690613680565b9350505080806113759061370d565b91505061133b565b508060078190555081600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113d091906134ab565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61141f61199c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114849061319a565b60405180910390fd5b806005600061149a61199c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661154761199c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161158c91906130bd565b60405180910390a35050565b6115a96115a361199c565b83611ae7565b6115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061335a565b60405180910390fd5b6115f484848484611f4e565b50505050565b60606000611606611faa565b905060006116138461203d565b9050600082511415611629578092505050611650565b818160405160200161163c929190612fc3565b604051602081830303815290604052925050505b919050565b600581565b611b3981565b60606009805461166f906136aa565b80601f016020809104026020016040519081016040528092919081815260200182805461169b906136aa565b80156116e85780601f106116bd576101008083540402835291602001916116e8565b820191906000526020600020905b8154815290600101906020018083116116cb57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61178e61199c565b73ffffffffffffffffffffffffffffffffffffffff166117ac610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f99061329a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118699061313a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a8383610c66565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611ae382826040518060200160405280600081525061219e565b5050565b6000611af2826119a4565b611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b28906131ba565b60405180910390fd5b6000611b3c83610c66565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bab57508373ffffffffffffffffffffffffffffffffffffffff16611b9384610891565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bbc5750611bbb81856116f2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611be582610c66565b73ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906132ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca29061317a565b60405180910390fd5b611cb68383836121f9565b611cc1600082611a10565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d11919061358c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6891906134ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080333a4342600143611e35919061358c565b408888604051602001611e4e979695949392919061304e565b6040516020818303038152906040528051906020012060001c9050600060075482611e799190613756565b90506000600a826127108110611e9257611e91613814565b5b01549050600080821415611ea857829050611eac565b8190505b60006001600754611ebd919061358c565b9050808414611f28576000600a826127108110611edd57611edc613814565b5b015490506000811415611f0a5781600a866127108110611f0057611eff613814565b5b0181905550611f26565b80600a866127108110611f2057611f1f613814565b5b01819055505b505b60076000815480929190611f3b90613680565b9190505550819550505050505092915050565b611f59848484611bc5565b611f65848484846121fe565b611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b906130fa565b60405180910390fd5b50505050565b606061271b8054611fba906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe6906136aa565b80156120335780601f1061200857610100808354040283529160200191612033565b820191906000526020600020905b81548152906001019060200180831161201657829003601f168201915b5050505050905090565b60606000821415612085576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612199565b600082905060005b600082146120b75780806120a09061370d565b915050600a826120b09190613501565b915061208d565b60008167ffffffffffffffff8111156120d3576120d2613843565b5b6040519080825280601f01601f1916602001820160405280156121055781602001600182028036833780820191505090505b5090505b600085146121925760018261211e919061358c565b9150600a8561212d9190613756565b603061213991906134ab565b60f81b81838151811061214f5761214e613814565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561218b9190613501565b9450612109565b8093505050505b919050565b6121a88383612395565b6121b560008484846121fe565b6121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906130fa565b60405180910390fd5b505050565b505050565b600061221f8473ffffffffffffffffffffffffffffffffffffffff16612563565b15612388578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261224861199c565b8786866040518563ffffffff1660e01b815260040161226a9493929190613002565b602060405180830381600087803b15801561228457600080fd5b505af19250505080156122b557506040513d601f19601f820116820180604052508101906122b29190612b15565b60015b612338573d80600081146122e5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ea565b606091505b50600081511415612330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612327906130fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061238d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc9061323a565b60405180910390fd5b61240e816119a4565b1561244e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124459061315a565b60405180910390fd5b61245a600083836121f9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124aa91906134ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612582906136aa565b90600052602060002090601f0160209004810192826125a457600085556125eb565b82601f106125bd57803560ff19168380011785556125eb565b828001600101855582156125eb579182015b828111156125ea5782358255916020019190600101906125cf565b5b5090506125f89190612682565b5090565b828054612608906136aa565b90600052602060002090601f01602090048101928261262a5760008555612671565b82601f1061264357805160ff1916838001178555612671565b82800160010185558215612671579182015b82811115612670578251825591602001919060010190612655565b5b50905061267e9190612682565b5090565b5b8082111561269b576000816000905550600101612683565b5090565b60006126b26126ad846133da565b6133b5565b905080838252602082019050828560208602820111156126d5576126d461387c565b5b60005b8581101561270557816126eb88826128c7565b8452602084019350602083019250506001810190506126d8565b5050509392505050565b600061272261271d84613406565b6133b5565b90508281526020810184848401111561273e5761273d613881565b5b61274984828561363e565b509392505050565b600061276461275f84613437565b6133b5565b9050828152602081018484840111156127805761277f613881565b5b61278b84828561363e565b509392505050565b6000813590506127a281613dec565b92915050565b600082601f8301126127bd576127bc613877565b5b81356127cd84826020860161269f565b91505092915050565b6000813590506127e581613e03565b92915050565b6000813590506127fa81613e1a565b92915050565b60008151905061280f81613e1a565b92915050565b600082601f83011261282a57612829613877565b5b813561283a84826020860161270f565b91505092915050565b60008083601f84011261285957612858613877565b5b8235905067ffffffffffffffff81111561287657612875613872565b5b6020830191508360018202830111156128925761289161387c565b5b9250929050565b600082601f8301126128ae576128ad613877565b5b81356128be848260208601612751565b91505092915050565b6000813590506128d681613e31565b92915050565b6000602082840312156128f2576128f161388b565b5b600061290084828501612793565b91505092915050565b600080604083850312156129205761291f61388b565b5b600061292e85828601612793565b925050602061293f85828601612793565b9150509250929050565b6000806000606084860312156129625761296161388b565b5b600061297086828701612793565b935050602061298186828701612793565b9250506040612992868287016128c7565b9150509250925092565b600080600080608085870312156129b6576129b561388b565b5b60006129c487828801612793565b94505060206129d587828801612793565b93505060406129e6878288016128c7565b925050606085013567ffffffffffffffff811115612a0757612a06613886565b5b612a1387828801612815565b91505092959194509250565b60008060408385031215612a3657612a3561388b565b5b6000612a4485828601612793565b9250506020612a55858286016127d6565b9150509250929050565b60008060408385031215612a7657612a7561388b565b5b6000612a8485828601612793565b9250506020612a95858286016128c7565b9150509250929050565b600060208284031215612ab557612ab461388b565b5b600082013567ffffffffffffffff811115612ad357612ad2613886565b5b612adf848285016127a8565b91505092915050565b600060208284031215612afe57612afd61388b565b5b6000612b0c848285016127eb565b91505092915050565b600060208284031215612b2b57612b2a61388b565b5b6000612b3984828501612800565b91505092915050565b60008060208385031215612b5957612b5861388b565b5b600083013567ffffffffffffffff811115612b7757612b76613886565b5b612b8385828601612843565b92509250509250929050565b600060208284031215612ba557612ba461388b565b5b600082013567ffffffffffffffff811115612bc357612bc2613886565b5b612bcf84828501612899565b91505092915050565b600060208284031215612bee57612bed61388b565b5b6000612bfc848285016128c7565b91505092915050565b612c0e816135c0565b82525050565b612c1d816135d2565b82525050565b612c2c816135de565b82525050565b6000612c3d82613468565b612c47818561347e565b9350612c5781856020860161364d565b612c6081613890565b840191505092915050565b6000612c7682613473565b612c80818561348f565b9350612c9081856020860161364d565b612c9981613890565b840191505092915050565b6000612caf82613473565b612cb981856134a0565b9350612cc981856020860161364d565b80840191505092915050565b6000612ce260328361348f565b9150612ced826138a1565b604082019050919050565b6000612d0560268361348f565b9150612d10826138f0565b604082019050919050565b6000612d2860268361348f565b9150612d338261393f565b604082019050919050565b6000612d4b601c8361348f565b9150612d568261398e565b602082019050919050565b6000612d6e60248361348f565b9150612d79826139b7565b604082019050919050565b6000612d9160198361348f565b9150612d9c82613a06565b602082019050919050565b6000612db4602c8361348f565b9150612dbf82613a2f565b604082019050919050565b6000612dd760388361348f565b9150612de282613a7e565b604082019050919050565b6000612dfa602a8361348f565b9150612e0582613acd565b604082019050919050565b6000612e1d60298361348f565b9150612e2882613b1c565b604082019050919050565b6000612e4060208361348f565b9150612e4b82613b6b565b602082019050919050565b6000612e63602c8361348f565b9150612e6e82613b94565b604082019050919050565b6000612e86601b8361348f565b9150612e9182613be3565b602082019050919050565b6000612ea960208361348f565b9150612eb482613c0c565b602082019050919050565b6000612ecc60298361348f565b9150612ed782613c35565b604082019050919050565b6000612eef602f8361348f565b9150612efa82613c84565b604082019050919050565b6000612f1260218361348f565b9150612f1d82613cd3565b604082019050919050565b6000612f3560198361348f565b9150612f4082613d22565b602082019050919050565b6000612f58600d8361348f565b9150612f6382613d4b565b602082019050919050565b6000612f7b60318361348f565b9150612f8682613d74565b604082019050919050565b6000612f9e601b8361348f565b9150612fa982613dc3565b602082019050919050565b612fbd81613634565b82525050565b6000612fcf8285612ca4565b9150612fdb8284612ca4565b91508190509392505050565b6000602082019050612ffc6000830184612c05565b92915050565b60006080820190506130176000830187612c05565b6130246020830186612c05565b6130316040830185612fb4565b81810360608301526130438184612c32565b905095945050505050565b600060e082019050613063600083018a612c05565b6130706020830189612fb4565b61307d6040830188612fb4565b61308a6060830187612fb4565b6130976080830186612c23565b6130a460a0830185612fb4565b6130b160c0830184612fb4565b98975050505050505050565b60006020820190506130d26000830184612c14565b92915050565b600060208201905081810360008301526130f28184612c6b565b905092915050565b6000602082019050818103600083015261311381612cd5565b9050919050565b6000602082019050818103600083015261313381612cf8565b9050919050565b6000602082019050818103600083015261315381612d1b565b9050919050565b6000602082019050818103600083015261317381612d3e565b9050919050565b6000602082019050818103600083015261319381612d61565b9050919050565b600060208201905081810360008301526131b381612d84565b9050919050565b600060208201905081810360008301526131d381612da7565b9050919050565b600060208201905081810360008301526131f381612dca565b9050919050565b6000602082019050818103600083015261321381612ded565b9050919050565b6000602082019050818103600083015261323381612e10565b9050919050565b6000602082019050818103600083015261325381612e33565b9050919050565b6000602082019050818103600083015261327381612e56565b9050919050565b6000602082019050818103600083015261329381612e79565b9050919050565b600060208201905081810360008301526132b381612e9c565b9050919050565b600060208201905081810360008301526132d381612ebf565b9050919050565b600060208201905081810360008301526132f381612ee2565b9050919050565b6000602082019050818103600083015261331381612f05565b9050919050565b6000602082019050818103600083015261333381612f28565b9050919050565b6000602082019050818103600083015261335381612f4b565b9050919050565b6000602082019050818103600083015261337381612f6e565b9050919050565b6000602082019050818103600083015261339381612f91565b9050919050565b60006020820190506133af6000830184612fb4565b92915050565b60006133bf6133d0565b90506133cb82826136dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156133f5576133f4613843565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561342157613420613843565b5b61342a82613890565b9050602081019050919050565b600067ffffffffffffffff82111561345257613451613843565b5b61345b82613890565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134b682613634565b91506134c183613634565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134f6576134f5613787565b5b828201905092915050565b600061350c82613634565b915061351783613634565b925082613527576135266137b6565b5b828204905092915050565b600061353d82613634565b915061354883613634565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561358157613580613787565b5b828202905092915050565b600061359782613634565b91506135a283613634565b9250828210156135b5576135b4613787565b5b828203905092915050565b60006135cb82613614565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561366b578082015181840152602081019050613650565b8381111561367a576000848401525b50505050565b600061368b82613634565b9150600082141561369f5761369e613787565b5b600182039050919050565b600060028204905060018216806136c257607f821691505b602082108114156136d6576136d56137e5565b5b50919050565b6136e582613890565b810181811067ffffffffffffffff8211171561370457613703613843565b5b80604052505050565b600061371882613634565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561374b5761374a613787565b5b600182019050919050565b600061376182613634565b915061376c83613634565b92508261377c5761377b6137b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564207360008201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e2774206f776e206d6f7265207468616e203520746f61647a0000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f54686572652069732061206c696d6974206f6e206d696e74696e6720746f6f2060008201527f6d616e7920617420612074696d65210000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4e6f20636f6e7472616374732100000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000600082015250565b613df5816135c0565b8114613e0057600080fd5b50565b613e0c816135d2565b8114613e1757600080fd5b50565b613e23816135e8565b8114613e2e57600080fd5b50565b613e3a81613634565b8114613e4557600080fd5b5056fea26469706673582212209e0c44ed57713bacb04c98ac78b9f0039e3315f9053ef08678a86f464863cf1a64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c8063853828b6116100ec578063b88d4fde1161008a578063e831574211610064578063e8315742146105c8578063e8a3d485146105f3578063e985e9c51461061e578063f2fde38b1461065b576101b7565b8063b88d4fde14610537578063c87b56dd14610560578063dc30158b1461059d576101b7565b806395d89b41116100c657806395d89b411461049c5780639a7c8e69146104c7578063a0712d68146104f2578063a22cb4651461050e576101b7565b8063853828b61461043e5780638da5cb5b14610448578063938e3d7b14610473576101b7565b8063413ac78d116101595780636352211e116101335780636352211e1461037057806370a08231146103ad578063715018a6146103ea578063787faa7f14610401576101b7565b8063413ac78d146102f357806342842e0e1461031e57806355f804b314610347576101b7565b8063081812fc11610195578063081812fc1461023b578063095ea7b3146102785780631f65d743146102a157806323b872dd146102ca576101b7565b806301ffc9a7146101bc57806306fd5133146101f957806306fdde0314610210575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612ae8565b610684565b6040516101f091906130bd565b60405180910390f35b34801561020557600080fd5b5061020e610766565b005b34801561021c57600080fd5b506102256107ff565b60405161023291906130d8565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612bd8565b610891565b60405161026f9190612fe7565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190612a5f565b610916565b005b3480156102ad57600080fd5b506102c860048036038101906102c39190612a9f565b610a2e565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190612949565b610b4d565b005b3480156102ff57600080fd5b50610308610bad565b604051610315919061339a565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612949565b610bb3565b005b34801561035357600080fd5b5061036e60048036038101906103699190612b42565b610bd3565b005b34801561037c57600080fd5b5061039760048036038101906103929190612bd8565b610c66565b6040516103a49190612fe7565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf91906128dc565b610d18565b6040516103e1919061339a565b60405180910390f35b3480156103f657600080fd5b506103ff610dd0565b005b34801561040d57600080fd5b50610428600480360381019061042391906128dc565b610f0d565b604051610435919061339a565b60405180910390f35b610446610f25565b005b34801561045457600080fd5b5061045d610fe1565b60405161046a9190612fe7565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612b8f565b61100b565b005b3480156104a857600080fd5b506104b16110a1565b6040516104be91906130d8565b60405180910390f35b3480156104d357600080fd5b506104dc611133565b6040516104e991906130bd565b60405180910390f35b61050c60048036038101906105079190612bd8565b611146565b005b34801561051a57600080fd5b5061053560048036038101906105309190612a1f565b611417565b005b34801561054357600080fd5b5061055e6004803603810190610559919061299c565b611598565b005b34801561056c57600080fd5b5061058760048036038101906105829190612bd8565b6115fa565b60405161059491906130d8565b60405180910390f35b3480156105a957600080fd5b506105b2611655565b6040516105bf919061339a565b60405180910390f35b3480156105d457600080fd5b506105dd61165a565b6040516105ea919061339a565b60405180910390f35b3480156105ff57600080fd5b50610608611660565b60405161061591906130d8565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190612909565b6116f2565b60405161065291906130bd565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d91906128dc565b611786565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061075f575061075e82611932565b5b9050919050565b61076e61199c565b73ffffffffffffffffffffffffffffffffffffffff1661078c610fe1565b73ffffffffffffffffffffffffffffffffffffffff16146107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d99061329a565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550565b60606000805461080e906136aa565b80601f016020809104026020016040519081016040528092919081815260200182805461083a906136aa565b80156108875780601f1061085c57610100808354040283529160200191610887565b820191906000526020600020905b81548152906001019060200180831161086a57829003601f168201915b5050505050905090565b600061089c826119a4565b6108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29061325a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092182610c66565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610989906132fa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b161199c565b73ffffffffffffffffffffffffffffffffffffffff1614806109e057506109df816109da61199c565b6116f2565b5b610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a16906131da565b60405180910390fd5b610a298383611a10565b505050565b610a3661199c565b73ffffffffffffffffffffffffffffffffffffffff16610a54610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa19061329a565b60405180910390fd5b600660149054906101000a900460ff1615610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af19061337a565b60405180910390fd5b60008151905060005b81811015610b48576000838281518110610b2057610b1f613814565b5b60200260200101519050610b343382611ac9565b508080610b409061370d565b915050610b03565b505050565b610b5e610b5861199c565b82611ae7565b610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b949061335a565b60405180910390fd5b610ba8838383611bc5565b505050565b60075481565b610bce83838360405180602001604052806000815250611598565b505050565b610bdb61199c565b73ffffffffffffffffffffffffffffffffffffffff16610bf9610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c469061329a565b60405180910390fd5b818161271b9190610c61929190612576565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d069061321a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d80906131fa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd861199c565b73ffffffffffffffffffffffffffffffffffffffff16610df6610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e439061329a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60086020528060005260406000206000915090505481565b610f2d61199c565b73ffffffffffffffffffffffffffffffffffffffff16610f4b610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f989061329a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610fdf57600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61101361199c565b73ffffffffffffffffffffffffffffffffffffffff16611031610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e9061329a565b60405180910390fd5b806009908051906020019061109d9291906125fc565b5050565b6060600180546110b0906136aa565b80601f01602080910402602001604051908101604052809291908181526020018280546110dc906136aa565b80156111295780601f106110fe57610100808354040283529160200191611129565b820191906000526020600020905b81548152906001019060200180831161110c57829003601f168201915b5050505050905090565b600660149054906101000a900460ff1681565b600060075490506005821115611191576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611188906132da565b60405180910390fd5b6000828261119f919061358c565b10156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d79061311a565b60405180910390fd5b600582600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122d91906134ab565b111561126e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112659061327a565b60405180910390fd5b611a3f8110156112ca578161271a546112879190613532565b3410156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c09061331a565b60405180910390fd5b5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f9061333a565b60405180910390fd5b60005b8281101561137d57600061134f8483611e21565b905061135b3382611ac9565b828061136690613680565b9350505080806113759061370d565b91505061133b565b508060078190555081600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113d091906134ab565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61141f61199c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114849061319a565b60405180910390fd5b806005600061149a61199c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661154761199c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161158c91906130bd565b60405180910390a35050565b6115a96115a361199c565b83611ae7565b6115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061335a565b60405180910390fd5b6115f484848484611f4e565b50505050565b60606000611606611faa565b905060006116138461203d565b9050600082511415611629578092505050611650565b818160405160200161163c929190612fc3565b604051602081830303815290604052925050505b919050565b600581565b611b3981565b60606009805461166f906136aa565b80601f016020809104026020016040519081016040528092919081815260200182805461169b906136aa565b80156116e85780601f106116bd576101008083540402835291602001916116e8565b820191906000526020600020905b8154815290600101906020018083116116cb57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61178e61199c565b73ffffffffffffffffffffffffffffffffffffffff166117ac610fe1565b73ffffffffffffffffffffffffffffffffffffffff1614611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f99061329a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118699061313a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a8383610c66565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611ae382826040518060200160405280600081525061219e565b5050565b6000611af2826119a4565b611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b28906131ba565b60405180910390fd5b6000611b3c83610c66565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bab57508373ffffffffffffffffffffffffffffffffffffffff16611b9384610891565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bbc5750611bbb81856116f2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611be582610c66565b73ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906132ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca29061317a565b60405180910390fd5b611cb68383836121f9565b611cc1600082611a10565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d11919061358c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6891906134ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080333a4342600143611e35919061358c565b408888604051602001611e4e979695949392919061304e565b6040516020818303038152906040528051906020012060001c9050600060075482611e799190613756565b90506000600a826127108110611e9257611e91613814565b5b01549050600080821415611ea857829050611eac565b8190505b60006001600754611ebd919061358c565b9050808414611f28576000600a826127108110611edd57611edc613814565b5b015490506000811415611f0a5781600a866127108110611f0057611eff613814565b5b0181905550611f26565b80600a866127108110611f2057611f1f613814565b5b01819055505b505b60076000815480929190611f3b90613680565b9190505550819550505050505092915050565b611f59848484611bc5565b611f65848484846121fe565b611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b906130fa565b60405180910390fd5b50505050565b606061271b8054611fba906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe6906136aa565b80156120335780601f1061200857610100808354040283529160200191612033565b820191906000526020600020905b81548152906001019060200180831161201657829003601f168201915b5050505050905090565b60606000821415612085576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612199565b600082905060005b600082146120b75780806120a09061370d565b915050600a826120b09190613501565b915061208d565b60008167ffffffffffffffff8111156120d3576120d2613843565b5b6040519080825280601f01601f1916602001820160405280156121055781602001600182028036833780820191505090505b5090505b600085146121925760018261211e919061358c565b9150600a8561212d9190613756565b603061213991906134ab565b60f81b81838151811061214f5761214e613814565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561218b9190613501565b9450612109565b8093505050505b919050565b6121a88383612395565b6121b560008484846121fe565b6121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906130fa565b60405180910390fd5b505050565b505050565b600061221f8473ffffffffffffffffffffffffffffffffffffffff16612563565b15612388578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261224861199c565b8786866040518563ffffffff1660e01b815260040161226a9493929190613002565b602060405180830381600087803b15801561228457600080fd5b505af19250505080156122b557506040513d601f19601f820116820180604052508101906122b29190612b15565b60015b612338573d80600081146122e5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ea565b606091505b50600081511415612330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612327906130fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061238d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc9061323a565b60405180910390fd5b61240e816119a4565b1561244e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124459061315a565b60405180910390fd5b61245a600083836121f9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124aa91906134ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612582906136aa565b90600052602060002090601f0160209004810192826125a457600085556125eb565b82601f106125bd57803560ff19168380011785556125eb565b828001600101855582156125eb579182015b828111156125ea5782358255916020019190600101906125cf565b5b5090506125f89190612682565b5090565b828054612608906136aa565b90600052602060002090601f01602090048101928261262a5760008555612671565b82601f1061264357805160ff1916838001178555612671565b82800160010185558215612671579182015b82811115612670578251825591602001919060010190612655565b5b50905061267e9190612682565b5090565b5b8082111561269b576000816000905550600101612683565b5090565b60006126b26126ad846133da565b6133b5565b905080838252602082019050828560208602820111156126d5576126d461387c565b5b60005b8581101561270557816126eb88826128c7565b8452602084019350602083019250506001810190506126d8565b5050509392505050565b600061272261271d84613406565b6133b5565b90508281526020810184848401111561273e5761273d613881565b5b61274984828561363e565b509392505050565b600061276461275f84613437565b6133b5565b9050828152602081018484840111156127805761277f613881565b5b61278b84828561363e565b509392505050565b6000813590506127a281613dec565b92915050565b600082601f8301126127bd576127bc613877565b5b81356127cd84826020860161269f565b91505092915050565b6000813590506127e581613e03565b92915050565b6000813590506127fa81613e1a565b92915050565b60008151905061280f81613e1a565b92915050565b600082601f83011261282a57612829613877565b5b813561283a84826020860161270f565b91505092915050565b60008083601f84011261285957612858613877565b5b8235905067ffffffffffffffff81111561287657612875613872565b5b6020830191508360018202830111156128925761289161387c565b5b9250929050565b600082601f8301126128ae576128ad613877565b5b81356128be848260208601612751565b91505092915050565b6000813590506128d681613e31565b92915050565b6000602082840312156128f2576128f161388b565b5b600061290084828501612793565b91505092915050565b600080604083850312156129205761291f61388b565b5b600061292e85828601612793565b925050602061293f85828601612793565b9150509250929050565b6000806000606084860312156129625761296161388b565b5b600061297086828701612793565b935050602061298186828701612793565b9250506040612992868287016128c7565b9150509250925092565b600080600080608085870312156129b6576129b561388b565b5b60006129c487828801612793565b94505060206129d587828801612793565b93505060406129e6878288016128c7565b925050606085013567ffffffffffffffff811115612a0757612a06613886565b5b612a1387828801612815565b91505092959194509250565b60008060408385031215612a3657612a3561388b565b5b6000612a4485828601612793565b9250506020612a55858286016127d6565b9150509250929050565b60008060408385031215612a7657612a7561388b565b5b6000612a8485828601612793565b9250506020612a95858286016128c7565b9150509250929050565b600060208284031215612ab557612ab461388b565b5b600082013567ffffffffffffffff811115612ad357612ad2613886565b5b612adf848285016127a8565b91505092915050565b600060208284031215612afe57612afd61388b565b5b6000612b0c848285016127eb565b91505092915050565b600060208284031215612b2b57612b2a61388b565b5b6000612b3984828501612800565b91505092915050565b60008060208385031215612b5957612b5861388b565b5b600083013567ffffffffffffffff811115612b7757612b76613886565b5b612b8385828601612843565b92509250509250929050565b600060208284031215612ba557612ba461388b565b5b600082013567ffffffffffffffff811115612bc357612bc2613886565b5b612bcf84828501612899565b91505092915050565b600060208284031215612bee57612bed61388b565b5b6000612bfc848285016128c7565b91505092915050565b612c0e816135c0565b82525050565b612c1d816135d2565b82525050565b612c2c816135de565b82525050565b6000612c3d82613468565b612c47818561347e565b9350612c5781856020860161364d565b612c6081613890565b840191505092915050565b6000612c7682613473565b612c80818561348f565b9350612c9081856020860161364d565b612c9981613890565b840191505092915050565b6000612caf82613473565b612cb981856134a0565b9350612cc981856020860161364d565b80840191505092915050565b6000612ce260328361348f565b9150612ced826138a1565b604082019050919050565b6000612d0560268361348f565b9150612d10826138f0565b604082019050919050565b6000612d2860268361348f565b9150612d338261393f565b604082019050919050565b6000612d4b601c8361348f565b9150612d568261398e565b602082019050919050565b6000612d6e60248361348f565b9150612d79826139b7565b604082019050919050565b6000612d9160198361348f565b9150612d9c82613a06565b602082019050919050565b6000612db4602c8361348f565b9150612dbf82613a2f565b604082019050919050565b6000612dd760388361348f565b9150612de282613a7e565b604082019050919050565b6000612dfa602a8361348f565b9150612e0582613acd565b604082019050919050565b6000612e1d60298361348f565b9150612e2882613b1c565b604082019050919050565b6000612e4060208361348f565b9150612e4b82613b6b565b602082019050919050565b6000612e63602c8361348f565b9150612e6e82613b94565b604082019050919050565b6000612e86601b8361348f565b9150612e9182613be3565b602082019050919050565b6000612ea960208361348f565b9150612eb482613c0c565b602082019050919050565b6000612ecc60298361348f565b9150612ed782613c35565b604082019050919050565b6000612eef602f8361348f565b9150612efa82613c84565b604082019050919050565b6000612f1260218361348f565b9150612f1d82613cd3565b604082019050919050565b6000612f3560198361348f565b9150612f4082613d22565b602082019050919050565b6000612f58600d8361348f565b9150612f6382613d4b565b602082019050919050565b6000612f7b60318361348f565b9150612f8682613d74565b604082019050919050565b6000612f9e601b8361348f565b9150612fa982613dc3565b602082019050919050565b612fbd81613634565b82525050565b6000612fcf8285612ca4565b9150612fdb8284612ca4565b91508190509392505050565b6000602082019050612ffc6000830184612c05565b92915050565b60006080820190506130176000830187612c05565b6130246020830186612c05565b6130316040830185612fb4565b81810360608301526130438184612c32565b905095945050505050565b600060e082019050613063600083018a612c05565b6130706020830189612fb4565b61307d6040830188612fb4565b61308a6060830187612fb4565b6130976080830186612c23565b6130a460a0830185612fb4565b6130b160c0830184612fb4565b98975050505050505050565b60006020820190506130d26000830184612c14565b92915050565b600060208201905081810360008301526130f28184612c6b565b905092915050565b6000602082019050818103600083015261311381612cd5565b9050919050565b6000602082019050818103600083015261313381612cf8565b9050919050565b6000602082019050818103600083015261315381612d1b565b9050919050565b6000602082019050818103600083015261317381612d3e565b9050919050565b6000602082019050818103600083015261319381612d61565b9050919050565b600060208201905081810360008301526131b381612d84565b9050919050565b600060208201905081810360008301526131d381612da7565b9050919050565b600060208201905081810360008301526131f381612dca565b9050919050565b6000602082019050818103600083015261321381612ded565b9050919050565b6000602082019050818103600083015261323381612e10565b9050919050565b6000602082019050818103600083015261325381612e33565b9050919050565b6000602082019050818103600083015261327381612e56565b9050919050565b6000602082019050818103600083015261329381612e79565b9050919050565b600060208201905081810360008301526132b381612e9c565b9050919050565b600060208201905081810360008301526132d381612ebf565b9050919050565b600060208201905081810360008301526132f381612ee2565b9050919050565b6000602082019050818103600083015261331381612f05565b9050919050565b6000602082019050818103600083015261333381612f28565b9050919050565b6000602082019050818103600083015261335381612f4b565b9050919050565b6000602082019050818103600083015261337381612f6e565b9050919050565b6000602082019050818103600083015261339381612f91565b9050919050565b60006020820190506133af6000830184612fb4565b92915050565b60006133bf6133d0565b90506133cb82826136dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156133f5576133f4613843565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561342157613420613843565b5b61342a82613890565b9050602081019050919050565b600067ffffffffffffffff82111561345257613451613843565b5b61345b82613890565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134b682613634565b91506134c183613634565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134f6576134f5613787565b5b828201905092915050565b600061350c82613634565b915061351783613634565b925082613527576135266137b6565b5b828204905092915050565b600061353d82613634565b915061354883613634565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561358157613580613787565b5b828202905092915050565b600061359782613634565b91506135a283613634565b9250828210156135b5576135b4613787565b5b828203905092915050565b60006135cb82613614565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561366b578082015181840152602081019050613650565b8381111561367a576000848401525b50505050565b600061368b82613634565b9150600082141561369f5761369e613787565b5b600182039050919050565b600060028204905060018216806136c257607f821691505b602082108114156136d6576136d56137e5565b5b50919050565b6136e582613890565b810181811067ffffffffffffffff8211171561370457613703613843565b5b80604052505050565b600061371882613634565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561374b5761374a613787565b5b600182019050919050565b600061376182613634565b915061376c83613634565b92508261377c5761377b6137b6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564207360008201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e2774206f776e206d6f7265207468616e203520746f61647a0000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f54686572652069732061206c696d6974206f6e206d696e74696e6720746f6f2060008201527f6d616e7920617420612074696d65210000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4e6f20636f6e7472616374732100000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000600082015250565b613df5816135c0565b8114613e0057600080fd5b50565b613e0c816135d2565b8114613e1757600080fd5b50565b613e23816135e8565b8114613e2e57600080fd5b50565b613e3a81613634565b8114613e4557600080fd5b5056fea26469706673582212209e0c44ed57713bacb04c98ac78b9f0039e3315f9053ef08678a86f464863cf1a64736f6c63430008070033
Deployed Bytecode Sourcemap
42661:3896:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20452:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46479:73;;;;;;;;;;;;;:::i;:::-;;21384:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22844:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22381:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45156:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23734;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42790:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24110:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43674:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21078:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20808:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42043:148;;;;;;;;;;;;;:::i;:::-;;42881:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44046:117;;;:::i;:::-;;41388:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43782:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21553:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42707:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44182:966;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23137:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24332:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43277:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42835:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42745:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43905:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23503:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42346:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20452:292;20554:4;20593:25;20578:40;;;:11;:40;;;;:105;;;;20650:33;20635:48;;;:11;:48;;;;20578:105;:158;;;;20700:36;20724:11;20700:23;:36::i;:::-;20578:158;20571:165;;20452:292;;;:::o;46479:73::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46542:4:::1;46526:13;;:20;;;;;;;;;;;;;;;;;;46479:73::o:0;21384:100::-;21438:13;21471:5;21464:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21384:100;:::o;22844:221::-;22920:7;22948:16;22956:7;22948;:16::i;:::-;22940:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23033:15;:24;23049:7;23033:24;;;;;;;;;;;;;;;;;;;;;23026:31;;22844:221;;;:::o;22381:397::-;22462:13;22478:23;22493:7;22478:14;:23::i;:::-;22462:39;;22526:5;22520:11;;:2;:11;;;;22512:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22606:5;22590:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22615:37;22632:5;22639:12;:10;:12::i;:::-;22615:16;:37::i;:::-;22590:62;22582:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22749:21;22758:2;22762:7;22749:8;:21::i;:::-;22451:327;22381:397;;:::o;45156:305::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45241:13:::1;;;;;;;;;;;45240:14;45232:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;45293:11;45307:10;:17;45293:31;;45336:9;45331:125;45355:3;45351:1;:7;45331:125;;;45374:17;45394:10;45405:1;45394:13;;;;;;;;:::i;:::-;;;;;;;;45374:33;;45416:32;45426:10;45438:9;45416;:32::i;:::-;45365:91;45360:3;;;;;:::i;:::-;;;;45331:125;;;;45225:236;45156:305:::0;:::o;23734:::-;23895:41;23914:12;:10;:12::i;:::-;23928:7;23895:18;:41::i;:::-;23887:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24003:28;24013:4;24019:2;24023:7;24003:9;:28::i;:::-;23734:305;;;:::o;42790:40::-;;;;:::o;24110:151::-;24214:39;24231:4;24237:2;24241:7;24214:39;;;;;;;;;;;;:16;:39::i;:::-;24110:151;;;:::o;43674:100::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43761:7:::1;;43745:13;:23;;;;;;;:::i;:::-;;43674:100:::0;;:::o;21078:239::-;21150:7;21170:13;21186:7;:16;21194:7;21186:16;;;;;;;;;;;;;;;;;;;;;21170:32;;21238:1;21221:19;;:5;:19;;;;21213:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21304:5;21297:12;;;21078:239;;;:::o;20808:208::-;20880:7;20925:1;20908:19;;:5;:19;;;;20900:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20992:9;:16;21002:5;20992:16;;;;;;;;;;;;;;;;20985:23;;20808:208;;;:::o;42043:148::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42150:1:::1;42113:40;;42134:6;;;;;;;;;;;42113:40;;;;;;;;;;;;42181:1;42164:6;;:19;;;;;;;;;;;;;;;;;;42043:148::o:0;42881:52::-;;;;;;;;;;;;;;;;;:::o;44046:117::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44117:10:::1;44109:24;;:47;44134:21;44109:47;;;;;;;;;;;;;;;;;;;;;;;44101:56;;;::::0;::::1;;44046:117::o:0;41388:87::-;41434:7;41461:6;;;;;;;;;;;41454:13;;41388:87;:::o;43782:115::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43879:12:::1;43864;:27;;;;;;;;;;;;:::i;:::-;;43782:115:::0;:::o;21553:104::-;21609:13;21642:7;21635:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21553:104;:::o;42707:33::-;;;;;;;;;;;;;:::o;44182:966::-;44236:33;44272:18;;44236:54;;42875:1;44313:8;:25;;44297:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;44466:1;44454:8;44426:25;:36;;;;:::i;:::-;:41;;44410:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;44590:1;44578:8;44546:17;:29;44564:10;44546:29;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:45;;44530:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;44675:4;44647:25;:32;44643:124;;;44721:8;44712:6;;:17;;;;:::i;:::-;44699:9;:30;;44690:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44643:124;44795:9;44781:23;;:10;:23;;;44773:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;44834:9;44829:182;44853:8;44849:1;:12;44829:182;;;44877:15;44895:33;44916:8;44926:1;44895:20;:33::i;:::-;44877:51;;44937:30;44947:10;44959:7;44937:9;:30::i;:::-;44976:27;;;;;:::i;:::-;;;;44868:143;44863:3;;;;;:::i;:::-;;;;44829:182;;;;45038:25;45017:18;:46;;;;45134:8;45102:17;:29;45120:10;45102:29;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;45070:17;:29;45088:10;45070:29;;;;;;;;;;;;;;;:72;;;;44229:919;44182:966;:::o;23137:295::-;23252:12;:10;:12::i;:::-;23240:24;;:8;:24;;;;23232:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23352:8;23307:18;:32;23326:12;:10;:12::i;:::-;23307:32;;;;;;;;;;;;;;;:42;23340:8;23307:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23405:8;23376:48;;23391:12;:10;:12::i;:::-;23376:48;;;23415:8;23376:48;;;;;;:::i;:::-;;;;;;;;23137:295;;:::o;24332:285::-;24464:41;24483:12;:10;:12::i;:::-;24497:7;24464:18;:41::i;:::-;24456:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24570:39;24584:4;24590:2;24594:7;24603:5;24570:13;:39::i;:::-;24332:285;;;;:::o;43277:391::-;43364:13;43389:18;43410:10;:8;:10::i;:::-;43389:31;;43427:23;43453:27;43470:9;43453:16;:27::i;:::-;43427:53;;43570:1;43554:4;43548:18;:23;43544:62;;;43589:9;43582:16;;;;;;43544:62;43645:4;43651:9;43628:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43614:48;;;;43277:391;;;;:::o;42835:41::-;42875:1;42835:41;:::o;42745:40::-;42781:4;42745:40;:::o;43905:133::-;43979:13;44018:12;44011:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43905:133;:::o;23503:164::-;23600:4;23624:18;:25;23643:5;23624:25;;;;;;;;;;;;;;;:35;23650:8;23624:35;;;;;;;;;;;;;;;;;;;;;;;;;23617:42;;23503:164;;;;:::o;42346:244::-;41619:12;:10;:12::i;:::-;41608:23;;:7;:5;:7::i;:::-;:23;;;41600:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42455:1:::1;42435:22;;:8;:22;;;;42427:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42545:8;42516:38;;42537:6;;;;;;;;;;;42516:38;;;;;;;;;;;;42574:8;42565:6;;:17;;;;;;;;;;;;;;;;;;42346:244:::0;:::o;18968:157::-;19053:4;19092:25;19077:40;;;:11;:40;;;;19070:47;;18968:157;;;:::o;15762:98::-;15815:7;15842:10;15835:17;;15762:98;:::o;26084:127::-;26149:4;26201:1;26173:30;;:7;:16;26181:7;26173:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26166:37;;26084:127;;;:::o;29961:174::-;30063:2;30036:15;:24;30052:7;30036:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30119:7;30115:2;30081:46;;30090:23;30105:7;30090:14;:23::i;:::-;30081:46;;;;;;;;;;;;29961:174;;:::o;27068:110::-;27144:26;27154:2;27158:7;27144:26;;;;;;;;;;;;:9;:26::i;:::-;27068:110;;:::o;26378:348::-;26471:4;26496:16;26504:7;26496;:16::i;:::-;26488:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26572:13;26588:23;26603:7;26588:14;:23::i;:::-;26572:39;;26641:5;26630:16;;:7;:16;;;:51;;;;26674:7;26650:31;;:20;26662:7;26650:11;:20::i;:::-;:31;;;26630:51;:87;;;;26685:32;26702:5;26709:7;26685:16;:32::i;:::-;26630:87;26622:96;;;26378:348;;;;:::o;29299:544::-;29424:4;29397:31;;:23;29412:7;29397:14;:23::i;:::-;:31;;;29389:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29507:1;29493:16;;:2;:16;;;;29485:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29563:39;29584:4;29590:2;29594:7;29563:20;:39::i;:::-;29667:29;29684:1;29688:7;29667:8;:29::i;:::-;29728:1;29709:9;:15;29719:4;29709:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29757:1;29740:9;:13;29750:2;29740:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29788:2;29769:7;:16;29777:7;29769:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29827:7;29823:2;29808:27;;29817:4;29808:27;;;;;;;;;;;;29299:544;;;:::o;45467:1004::-;45558:7;45577:17;45656:10;45679:11;45703:12;45728:15;45781:1;45766:12;:16;;;;:::i;:::-;45756:27;45796:11;45820:2;45633:200;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45613:229;;;;;;45597:252;;45577:272;;45856:19;45890:18;;45878:9;:30;;;;:::i;:::-;45856:52;;45915:18;45936:16;45953:11;45936:29;;;;;;;:::i;:::-;;;;45915:50;;45972:14;46011:1;45997:10;:15;45993:100;;;46032:11;46023:20;;45993:100;;;46075:10;46066:19;;45993:100;46101:17;46142:1;46121:18;;:22;;;;:::i;:::-;46101:42;;46169:9;46154:11;:24;46150:267;;46189:22;46214:16;46231:9;46214:27;;;;;;;:::i;:::-;;;;46189:52;;46272:1;46254:14;:19;46250:160;;;46318:9;46286:16;46303:11;46286:29;;;;;;;:::i;:::-;;;:41;;;;46250:160;;;46386:14;46354:16;46371:11;46354:29;;;;;;;:::i;:::-;;;:46;;;;46250:160;46180:237;46150:267;46425:18;;:20;;;;;;;;;:::i;:::-;;;;;;46459:6;46452:13;;;;;;;45467:1004;;;;:::o;25499:272::-;25613:28;25623:4;25629:2;25633:7;25613:9;:28::i;:::-;25660:48;25683:4;25689:2;25693:7;25702:5;25660:22;:48::i;:::-;25652:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25499:272;;;;:::o;43163:108::-;43223:13;43252;43245:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43163:108;:::o;16417:723::-;16473:13;16703:1;16694:5;:10;16690:53;;;16721:10;;;;;;;;;;;;;;;;;;;;;16690:53;16753:12;16768:5;16753:20;;16784:14;16809:78;16824:1;16816:4;:9;16809:78;;16842:8;;;;;:::i;:::-;;;;16873:2;16865:10;;;;;:::i;:::-;;;16809:78;;;16897:19;16929:6;16919:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16897:39;;16947:154;16963:1;16954:5;:10;16947:154;;16991:1;16981:11;;;;;:::i;:::-;;;17058:2;17050:5;:10;;;;:::i;:::-;17037:2;:24;;;;:::i;:::-;17024:39;;17007:6;17014;17007:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17087:2;17078:11;;;;;:::i;:::-;;;16947:154;;;17125:6;17111:21;;;;;16417:723;;;;:::o;27405:250::-;27501:18;27507:2;27511:7;27501:5;:18::i;:::-;27538:54;27569:1;27573:2;27577:7;27586:5;27538:22;:54::i;:::-;27530:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27405:250;;;:::o;32156:93::-;;;;:::o;30700:843::-;30821:4;30847:15;:2;:13;;;:15::i;:::-;30843:693;;;30899:2;30883:36;;;30920:12;:10;:12::i;:::-;30934:4;30940:7;30949:5;30883:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30879:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31146:1;31129:6;:13;:18;31125:341;;;31172:60;;;;;;;;;;:::i;:::-;;;;;;;;31125:341;31416:6;31410:13;31401:6;31397:2;31393:15;31386:38;30879:602;31016:45;;;31006:55;;;:6;:55;;;;30999:62;;;;;30843:693;31520:4;31513:11;;30700:843;;;;;;;:::o;27991:382::-;28085:1;28071:16;;:2;:16;;;;28063:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28144:16;28152:7;28144;:16::i;:::-;28143:17;28135:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28206:45;28235:1;28239:2;28243:7;28206:20;:45::i;:::-;28281:1;28264:9;:13;28274:2;28264:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28312:2;28293:7;:16;28301:7;28293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28357:7;28353:2;28332:33;;28349:1;28332:33;;;;;;;;;;;;27991:382;;:::o;7883:422::-;7943:4;8151:12;8262:7;8250:20;8242:28;;8296:1;8289:4;:8;8282:15;;;7883:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:553::-;2982:8;2992:6;3042:3;3035:4;3027:6;3023:17;3019:27;3009:122;;3050:79;;:::i;:::-;3009:122;3163:6;3150:20;3140:30;;3193:18;3185:6;3182:30;3179:117;;;3215:79;;:::i;:::-;3179:117;3329:4;3321:6;3317:17;3305:29;;3383:3;3375:4;3367:6;3363:17;3353:8;3349:32;3346:41;3343:128;;;3390:79;;:::i;:::-;3343:128;2924:553;;;;;:::o;3497:340::-;3553:5;3602:3;3595:4;3587:6;3583:17;3579:27;3569:122;;3610:79;;:::i;:::-;3569:122;3727:6;3714:20;3752:79;3827:3;3819:6;3812:4;3804:6;3800:17;3752:79;:::i;:::-;3743:88;;3559:278;3497:340;;;;:::o;3843:139::-;3889:5;3927:6;3914:20;3905:29;;3943:33;3970:5;3943:33;:::i;:::-;3843:139;;;;:::o;3988:329::-;4047:6;4096:2;4084:9;4075:7;4071:23;4067:32;4064:119;;;4102:79;;:::i;:::-;4064:119;4222:1;4247:53;4292:7;4283:6;4272:9;4268:22;4247:53;:::i;:::-;4237:63;;4193:117;3988:329;;;;:::o;4323:474::-;4391:6;4399;4448:2;4436:9;4427:7;4423:23;4419:32;4416:119;;;4454:79;;:::i;:::-;4416:119;4574:1;4599:53;4644:7;4635:6;4624:9;4620:22;4599:53;:::i;:::-;4589:63;;4545:117;4701:2;4727:53;4772:7;4763:6;4752:9;4748:22;4727:53;:::i;:::-;4717:63;;4672:118;4323:474;;;;;:::o;4803:619::-;4880:6;4888;4896;4945:2;4933:9;4924:7;4920:23;4916:32;4913:119;;;4951:79;;:::i;:::-;4913:119;5071:1;5096:53;5141:7;5132:6;5121:9;5117:22;5096:53;:::i;:::-;5086:63;;5042:117;5198:2;5224:53;5269:7;5260:6;5249:9;5245:22;5224:53;:::i;:::-;5214:63;;5169:118;5326:2;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5297:118;4803:619;;;;;:::o;5428:943::-;5523:6;5531;5539;5547;5596:3;5584:9;5575:7;5571:23;5567:33;5564:120;;;5603:79;;:::i;:::-;5564:120;5723:1;5748:53;5793:7;5784:6;5773:9;5769:22;5748:53;:::i;:::-;5738:63;;5694:117;5850:2;5876:53;5921:7;5912:6;5901:9;5897:22;5876:53;:::i;:::-;5866:63;;5821:118;5978:2;6004:53;6049:7;6040:6;6029:9;6025:22;6004:53;:::i;:::-;5994:63;;5949:118;6134:2;6123:9;6119:18;6106:32;6165:18;6157:6;6154:30;6151:117;;;6187:79;;:::i;:::-;6151:117;6292:62;6346:7;6337:6;6326:9;6322:22;6292:62;:::i;:::-;6282:72;;6077:287;5428:943;;;;;;;:::o;6377:468::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6625:1;6650:53;6695:7;6686:6;6675:9;6671:22;6650:53;:::i;:::-;6640:63;;6596:117;6752:2;6778:50;6820:7;6811:6;6800:9;6796:22;6778:50;:::i;:::-;6768:60;;6723:115;6377:468;;;;;:::o;6851:474::-;6919:6;6927;6976:2;6964:9;6955:7;6951:23;6947:32;6944:119;;;6982:79;;:::i;:::-;6944:119;7102:1;7127:53;7172:7;7163:6;7152:9;7148:22;7127:53;:::i;:::-;7117:63;;7073:117;7229:2;7255:53;7300:7;7291:6;7280:9;7276:22;7255:53;:::i;:::-;7245:63;;7200:118;6851:474;;;;;:::o;7331:539::-;7415:6;7464:2;7452:9;7443:7;7439:23;7435:32;7432:119;;;7470:79;;:::i;:::-;7432:119;7618:1;7607:9;7603:17;7590:31;7648:18;7640:6;7637:30;7634:117;;;7670:79;;:::i;:::-;7634:117;7775:78;7845:7;7836:6;7825:9;7821:22;7775:78;:::i;:::-;7765:88;;7561:302;7331:539;;;;:::o;7876:327::-;7934:6;7983:2;7971:9;7962:7;7958:23;7954:32;7951:119;;;7989:79;;:::i;:::-;7951:119;8109:1;8134:52;8178:7;8169:6;8158:9;8154:22;8134:52;:::i;:::-;8124:62;;8080:116;7876:327;;;;:::o;8209:349::-;8278:6;8327:2;8315:9;8306:7;8302:23;8298:32;8295:119;;;8333:79;;:::i;:::-;8295:119;8453:1;8478:63;8533:7;8524:6;8513:9;8509:22;8478:63;:::i;:::-;8468:73;;8424:127;8209:349;;;;:::o;8564:529::-;8635:6;8643;8692:2;8680:9;8671:7;8667:23;8663:32;8660:119;;;8698:79;;:::i;:::-;8660:119;8846:1;8835:9;8831:17;8818:31;8876:18;8868:6;8865:30;8862:117;;;8898:79;;:::i;:::-;8862:117;9011:65;9068:7;9059:6;9048:9;9044:22;9011:65;:::i;:::-;8993:83;;;;8789:297;8564:529;;;;;:::o;9099:509::-;9168:6;9217:2;9205:9;9196:7;9192:23;9188:32;9185:119;;;9223:79;;:::i;:::-;9185:119;9371:1;9360:9;9356:17;9343:31;9401:18;9393:6;9390:30;9387:117;;;9423:79;;:::i;:::-;9387:117;9528:63;9583:7;9574:6;9563:9;9559:22;9528:63;:::i;:::-;9518:73;;9314:287;9099:509;;;;:::o;9614:329::-;9673:6;9722:2;9710:9;9701:7;9697:23;9693:32;9690:119;;;9728:79;;:::i;:::-;9690:119;9848:1;9873:53;9918:7;9909:6;9898:9;9894:22;9873:53;:::i;:::-;9863:63;;9819:117;9614:329;;;;:::o;9949:118::-;10036:24;10054:5;10036:24;:::i;:::-;10031:3;10024:37;9949:118;;:::o;10073:109::-;10154:21;10169:5;10154:21;:::i;:::-;10149:3;10142:34;10073:109;;:::o;10188:118::-;10275:24;10293:5;10275:24;:::i;:::-;10270:3;10263:37;10188:118;;:::o;10312:360::-;10398:3;10426:38;10458:5;10426:38;:::i;:::-;10480:70;10543:6;10538:3;10480:70;:::i;:::-;10473:77;;10559:52;10604:6;10599:3;10592:4;10585:5;10581:16;10559:52;:::i;:::-;10636:29;10658:6;10636:29;:::i;:::-;10631:3;10627:39;10620:46;;10402:270;10312:360;;;;:::o;10678:364::-;10766:3;10794:39;10827:5;10794:39;:::i;:::-;10849:71;10913:6;10908:3;10849:71;:::i;:::-;10842:78;;10929:52;10974:6;10969:3;10962:4;10955:5;10951:16;10929:52;:::i;:::-;11006:29;11028:6;11006:29;:::i;:::-;11001:3;10997:39;10990:46;;10770:272;10678:364;;;;:::o;11048:377::-;11154:3;11182:39;11215:5;11182:39;:::i;:::-;11237:89;11319:6;11314:3;11237:89;:::i;:::-;11230:96;;11335:52;11380:6;11375:3;11368:4;11361:5;11357:16;11335:52;:::i;:::-;11412:6;11407:3;11403:16;11396:23;;11158:267;11048:377;;;;:::o;11431:366::-;11573:3;11594:67;11658:2;11653:3;11594:67;:::i;:::-;11587:74;;11670:93;11759:3;11670:93;:::i;:::-;11788:2;11783:3;11779:12;11772:19;;11431:366;;;:::o;11803:::-;11945:3;11966:67;12030:2;12025:3;11966:67;:::i;:::-;11959:74;;12042:93;12131:3;12042:93;:::i;:::-;12160:2;12155:3;12151:12;12144:19;;11803:366;;;:::o;12175:::-;12317:3;12338:67;12402:2;12397:3;12338:67;:::i;:::-;12331:74;;12414:93;12503:3;12414:93;:::i;:::-;12532:2;12527:3;12523:12;12516:19;;12175:366;;;:::o;12547:::-;12689:3;12710:67;12774:2;12769:3;12710:67;:::i;:::-;12703:74;;12786:93;12875:3;12786:93;:::i;:::-;12904:2;12899:3;12895:12;12888:19;;12547:366;;;:::o;12919:::-;13061:3;13082:67;13146:2;13141:3;13082:67;:::i;:::-;13075:74;;13158:93;13247:3;13158:93;:::i;:::-;13276:2;13271:3;13267:12;13260:19;;12919:366;;;:::o;13291:::-;13433:3;13454:67;13518:2;13513:3;13454:67;:::i;:::-;13447:74;;13530:93;13619:3;13530:93;:::i;:::-;13648:2;13643:3;13639:12;13632:19;;13291:366;;;:::o;13663:::-;13805:3;13826:67;13890:2;13885:3;13826:67;:::i;:::-;13819:74;;13902:93;13991:3;13902:93;:::i;:::-;14020:2;14015:3;14011:12;14004:19;;13663:366;;;:::o;14035:::-;14177:3;14198:67;14262:2;14257:3;14198:67;:::i;:::-;14191:74;;14274:93;14363:3;14274:93;:::i;:::-;14392:2;14387:3;14383:12;14376:19;;14035:366;;;:::o;14407:::-;14549:3;14570:67;14634:2;14629:3;14570:67;:::i;:::-;14563:74;;14646:93;14735:3;14646:93;:::i;:::-;14764:2;14759:3;14755:12;14748:19;;14407:366;;;:::o;14779:::-;14921:3;14942:67;15006:2;15001:3;14942:67;:::i;:::-;14935:74;;15018:93;15107:3;15018:93;:::i;:::-;15136:2;15131:3;15127:12;15120:19;;14779:366;;;:::o;15151:::-;15293:3;15314:67;15378:2;15373:3;15314:67;:::i;:::-;15307:74;;15390:93;15479:3;15390:93;:::i;:::-;15508:2;15503:3;15499:12;15492:19;;15151:366;;;:::o;15523:::-;15665:3;15686:67;15750:2;15745:3;15686:67;:::i;:::-;15679:74;;15762:93;15851:3;15762:93;:::i;:::-;15880:2;15875:3;15871:12;15864:19;;15523:366;;;:::o;15895:::-;16037:3;16058:67;16122:2;16117:3;16058:67;:::i;:::-;16051:74;;16134:93;16223:3;16134:93;:::i;:::-;16252:2;16247:3;16243:12;16236:19;;15895:366;;;:::o;16267:::-;16409:3;16430:67;16494:2;16489:3;16430:67;:::i;:::-;16423:74;;16506:93;16595:3;16506:93;:::i;:::-;16624:2;16619:3;16615:12;16608:19;;16267:366;;;:::o;16639:::-;16781:3;16802:67;16866:2;16861:3;16802:67;:::i;:::-;16795:74;;16878:93;16967:3;16878:93;:::i;:::-;16996:2;16991:3;16987:12;16980:19;;16639:366;;;:::o;17011:::-;17153:3;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17250:93;17339:3;17250:93;:::i;:::-;17368:2;17363:3;17359:12;17352:19;;17011:366;;;:::o;17383:::-;17525:3;17546:67;17610:2;17605:3;17546:67;:::i;:::-;17539:74;;17622:93;17711:3;17622:93;:::i;:::-;17740:2;17735:3;17731:12;17724:19;;17383:366;;;:::o;17755:::-;17897:3;17918:67;17982:2;17977:3;17918:67;:::i;:::-;17911:74;;17994:93;18083:3;17994:93;:::i;:::-;18112:2;18107:3;18103:12;18096:19;;17755:366;;;:::o;18127:::-;18269:3;18290:67;18354:2;18349:3;18290:67;:::i;:::-;18283:74;;18366:93;18455:3;18366:93;:::i;:::-;18484:2;18479:3;18475:12;18468:19;;18127:366;;;:::o;18499:::-;18641:3;18662:67;18726:2;18721:3;18662:67;:::i;:::-;18655:74;;18738:93;18827:3;18738:93;:::i;:::-;18856:2;18851:3;18847:12;18840:19;;18499:366;;;:::o;18871:::-;19013:3;19034:67;19098:2;19093:3;19034:67;:::i;:::-;19027:74;;19110:93;19199:3;19110:93;:::i;:::-;19228:2;19223:3;19219:12;19212:19;;18871:366;;;:::o;19243:118::-;19330:24;19348:5;19330:24;:::i;:::-;19325:3;19318:37;19243:118;;:::o;19367:435::-;19547:3;19569:95;19660:3;19651:6;19569:95;:::i;:::-;19562:102;;19681:95;19772:3;19763:6;19681:95;:::i;:::-;19674:102;;19793:3;19786:10;;19367:435;;;;;:::o;19808:222::-;19901:4;19939:2;19928:9;19924:18;19916:26;;19952:71;20020:1;20009:9;20005:17;19996:6;19952:71;:::i;:::-;19808:222;;;;:::o;20036:640::-;20231:4;20269:3;20258:9;20254:19;20246:27;;20283:71;20351:1;20340:9;20336:17;20327:6;20283:71;:::i;:::-;20364:72;20432:2;20421:9;20417:18;20408:6;20364:72;:::i;:::-;20446;20514:2;20503:9;20499:18;20490:6;20446:72;:::i;:::-;20565:9;20559:4;20555:20;20550:2;20539:9;20535:18;20528:48;20593:76;20664:4;20655:6;20593:76;:::i;:::-;20585:84;;20036:640;;;;;;;:::o;20682:886::-;20943:4;20981:3;20970:9;20966:19;20958:27;;20995:71;21063:1;21052:9;21048:17;21039:6;20995:71;:::i;:::-;21076:72;21144:2;21133:9;21129:18;21120:6;21076:72;:::i;:::-;21158;21226:2;21215:9;21211:18;21202:6;21158:72;:::i;:::-;21240;21308:2;21297:9;21293:18;21284:6;21240:72;:::i;:::-;21322:73;21390:3;21379:9;21375:19;21366:6;21322:73;:::i;:::-;21405;21473:3;21462:9;21458:19;21449:6;21405:73;:::i;:::-;21488;21556:3;21545:9;21541:19;21532:6;21488:73;:::i;:::-;20682:886;;;;;;;;;;:::o;21574:210::-;21661:4;21699:2;21688:9;21684:18;21676:26;;21712:65;21774:1;21763:9;21759:17;21750:6;21712:65;:::i;:::-;21574:210;;;;:::o;21790:313::-;21903:4;21941:2;21930:9;21926:18;21918:26;;21990:9;21984:4;21980:20;21976:1;21965:9;21961:17;21954:47;22018:78;22091:4;22082:6;22018:78;:::i;:::-;22010:86;;21790:313;;;;:::o;22109:419::-;22275:4;22313:2;22302:9;22298:18;22290:26;;22362:9;22356:4;22352:20;22348:1;22337:9;22333:17;22326:47;22390:131;22516:4;22390:131;:::i;:::-;22382:139;;22109:419;;;:::o;22534:::-;22700:4;22738:2;22727:9;22723:18;22715:26;;22787:9;22781:4;22777:20;22773:1;22762:9;22758:17;22751:47;22815:131;22941:4;22815:131;:::i;:::-;22807:139;;22534:419;;;:::o;22959:::-;23125:4;23163:2;23152:9;23148:18;23140:26;;23212:9;23206:4;23202:20;23198:1;23187:9;23183:17;23176:47;23240:131;23366:4;23240:131;:::i;:::-;23232:139;;22959:419;;;:::o;23384:::-;23550:4;23588:2;23577:9;23573:18;23565:26;;23637:9;23631:4;23627:20;23623:1;23612:9;23608:17;23601:47;23665:131;23791:4;23665:131;:::i;:::-;23657:139;;23384:419;;;:::o;23809:::-;23975:4;24013:2;24002:9;23998:18;23990:26;;24062:9;24056:4;24052:20;24048:1;24037:9;24033:17;24026:47;24090:131;24216:4;24090:131;:::i;:::-;24082:139;;23809:419;;;:::o;24234:::-;24400:4;24438:2;24427:9;24423:18;24415:26;;24487:9;24481:4;24477:20;24473:1;24462:9;24458:17;24451:47;24515:131;24641:4;24515:131;:::i;:::-;24507:139;;24234:419;;;:::o;24659:::-;24825:4;24863:2;24852:9;24848:18;24840:26;;24912:9;24906:4;24902:20;24898:1;24887:9;24883:17;24876:47;24940:131;25066:4;24940:131;:::i;:::-;24932:139;;24659:419;;;:::o;25084:::-;25250:4;25288:2;25277:9;25273:18;25265:26;;25337:9;25331:4;25327:20;25323:1;25312:9;25308:17;25301:47;25365:131;25491:4;25365:131;:::i;:::-;25357:139;;25084:419;;;:::o;25509:::-;25675:4;25713:2;25702:9;25698:18;25690:26;;25762:9;25756:4;25752:20;25748:1;25737:9;25733:17;25726:47;25790:131;25916:4;25790:131;:::i;:::-;25782:139;;25509:419;;;:::o;25934:::-;26100:4;26138:2;26127:9;26123:18;26115:26;;26187:9;26181:4;26177:20;26173:1;26162:9;26158:17;26151:47;26215:131;26341:4;26215:131;:::i;:::-;26207:139;;25934:419;;;:::o;26359:::-;26525:4;26563:2;26552:9;26548:18;26540:26;;26612:9;26606:4;26602:20;26598:1;26587:9;26583:17;26576:47;26640:131;26766:4;26640:131;:::i;:::-;26632:139;;26359:419;;;:::o;26784:::-;26950:4;26988:2;26977:9;26973:18;26965:26;;27037:9;27031:4;27027:20;27023:1;27012:9;27008:17;27001:47;27065:131;27191:4;27065:131;:::i;:::-;27057:139;;26784:419;;;:::o;27209:::-;27375:4;27413:2;27402:9;27398:18;27390:26;;27462:9;27456:4;27452:20;27448:1;27437:9;27433:17;27426:47;27490:131;27616:4;27490:131;:::i;:::-;27482:139;;27209:419;;;:::o;27634:::-;27800:4;27838:2;27827:9;27823:18;27815:26;;27887:9;27881:4;27877:20;27873:1;27862:9;27858:17;27851:47;27915:131;28041:4;27915:131;:::i;:::-;27907:139;;27634:419;;;:::o;28059:::-;28225:4;28263:2;28252:9;28248:18;28240:26;;28312:9;28306:4;28302:20;28298:1;28287:9;28283:17;28276:47;28340:131;28466:4;28340:131;:::i;:::-;28332:139;;28059:419;;;:::o;28484:::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:::-;29075:4;29113:2;29102:9;29098:18;29090:26;;29162:9;29156:4;29152:20;29148:1;29137:9;29133:17;29126:47;29190:131;29316:4;29190:131;:::i;:::-;29182:139;;28909:419;;;:::o;29334:::-;29500:4;29538:2;29527:9;29523:18;29515:26;;29587:9;29581:4;29577:20;29573:1;29562:9;29558:17;29551:47;29615:131;29741:4;29615:131;:::i;:::-;29607:139;;29334:419;;;:::o;29759:::-;29925:4;29963:2;29952:9;29948:18;29940:26;;30012:9;30006:4;30002:20;29998:1;29987:9;29983:17;29976:47;30040:131;30166:4;30040:131;:::i;:::-;30032:139;;29759:419;;;:::o;30184:::-;30350:4;30388:2;30377:9;30373:18;30365:26;;30437:9;30431:4;30427:20;30423:1;30412:9;30408:17;30401:47;30465:131;30591:4;30465:131;:::i;:::-;30457:139;;30184:419;;;:::o;30609:::-;30775:4;30813:2;30802:9;30798:18;30790:26;;30862:9;30856:4;30852:20;30848:1;30837:9;30833:17;30826:47;30890:131;31016:4;30890:131;:::i;:::-;30882:139;;30609:419;;;:::o;31034:222::-;31127:4;31165:2;31154:9;31150:18;31142:26;;31178:71;31246:1;31235:9;31231:17;31222:6;31178:71;:::i;:::-;31034:222;;;;:::o;31262:129::-;31296:6;31323:20;;:::i;:::-;31313:30;;31352:33;31380:4;31372:6;31352:33;:::i;:::-;31262:129;;;:::o;31397:75::-;31430:6;31463:2;31457:9;31447:19;;31397:75;:::o;31478:311::-;31555:4;31645:18;31637:6;31634:30;31631:56;;;31667:18;;:::i;:::-;31631:56;31717:4;31709:6;31705:17;31697:25;;31777:4;31771;31767:15;31759:23;;31478:311;;;:::o;31795:307::-;31856:4;31946:18;31938:6;31935:30;31932:56;;;31968:18;;:::i;:::-;31932:56;32006:29;32028:6;32006:29;:::i;:::-;31998:37;;32090:4;32084;32080:15;32072:23;;31795:307;;;:::o;32108:308::-;32170:4;32260:18;32252:6;32249:30;32246:56;;;32282:18;;:::i;:::-;32246:56;32320:29;32342:6;32320:29;:::i;:::-;32312:37;;32404:4;32398;32394:15;32386:23;;32108:308;;;:::o;32422:98::-;32473:6;32507:5;32501:12;32491:22;;32422:98;;;:::o;32526:99::-;32578:6;32612:5;32606:12;32596:22;;32526:99;;;:::o;32631:168::-;32714:11;32748:6;32743:3;32736:19;32788:4;32783:3;32779:14;32764:29;;32631:168;;;;:::o;32805:169::-;32889:11;32923:6;32918:3;32911:19;32963:4;32958:3;32954:14;32939:29;;32805:169;;;;:::o;32980:148::-;33082:11;33119:3;33104:18;;32980:148;;;;:::o;33134:305::-;33174:3;33193:20;33211:1;33193:20;:::i;:::-;33188:25;;33227:20;33245:1;33227:20;:::i;:::-;33222:25;;33381:1;33313:66;33309:74;33306:1;33303:81;33300:107;;;33387:18;;:::i;:::-;33300:107;33431:1;33428;33424:9;33417:16;;33134:305;;;;:::o;33445:185::-;33485:1;33502:20;33520:1;33502:20;:::i;:::-;33497:25;;33536:20;33554:1;33536:20;:::i;:::-;33531:25;;33575:1;33565:35;;33580:18;;:::i;:::-;33565:35;33622:1;33619;33615:9;33610:14;;33445:185;;;;:::o;33636:348::-;33676:7;33699:20;33717:1;33699:20;:::i;:::-;33694:25;;33733:20;33751:1;33733:20;:::i;:::-;33728:25;;33921:1;33853:66;33849:74;33846:1;33843:81;33838:1;33831:9;33824:17;33820:105;33817:131;;;33928:18;;:::i;:::-;33817:131;33976:1;33973;33969:9;33958:20;;33636:348;;;;:::o;33990:191::-;34030:4;34050:20;34068:1;34050:20;:::i;:::-;34045:25;;34084:20;34102:1;34084:20;:::i;:::-;34079:25;;34123:1;34120;34117:8;34114:34;;;34128:18;;:::i;:::-;34114:34;34173:1;34170;34166:9;34158:17;;33990:191;;;;:::o;34187:96::-;34224:7;34253:24;34271:5;34253:24;:::i;:::-;34242:35;;34187:96;;;:::o;34289:90::-;34323:7;34366:5;34359:13;34352:21;34341:32;;34289:90;;;:::o;34385:77::-;34422:7;34451:5;34440:16;;34385:77;;;:::o;34468:149::-;34504:7;34544:66;34537:5;34533:78;34522:89;;34468:149;;;:::o;34623:126::-;34660:7;34700:42;34693:5;34689:54;34678:65;;34623:126;;;:::o;34755:77::-;34792:7;34821:5;34810:16;;34755:77;;;:::o;34838:154::-;34922:6;34917:3;34912;34899:30;34984:1;34975:6;34970:3;34966:16;34959:27;34838:154;;;:::o;34998:307::-;35066:1;35076:113;35090:6;35087:1;35084:13;35076:113;;;35175:1;35170:3;35166:11;35160:18;35156:1;35151:3;35147:11;35140:39;35112:2;35109:1;35105:10;35100:15;;35076:113;;;35207:6;35204:1;35201:13;35198:101;;;35287:1;35278:6;35273:3;35269:16;35262:27;35198:101;35047:258;34998:307;;;:::o;35311:171::-;35350:3;35373:24;35391:5;35373:24;:::i;:::-;35364:33;;35419:4;35412:5;35409:15;35406:41;;;35427:18;;:::i;:::-;35406:41;35474:1;35467:5;35463:13;35456:20;;35311:171;;;:::o;35488:320::-;35532:6;35569:1;35563:4;35559:12;35549:22;;35616:1;35610:4;35606:12;35637:18;35627:81;;35693:4;35685:6;35681:17;35671:27;;35627:81;35755:2;35747:6;35744:14;35724:18;35721:38;35718:84;;;35774:18;;:::i;:::-;35718:84;35539:269;35488:320;;;:::o;35814:281::-;35897:27;35919:4;35897:27;:::i;:::-;35889:6;35885:40;36027:6;36015:10;36012:22;35991:18;35979:10;35976:34;35973:62;35970:88;;;36038:18;;:::i;:::-;35970:88;36078:10;36074:2;36067:22;35857:238;35814:281;;:::o;36101:233::-;36140:3;36163:24;36181:5;36163:24;:::i;:::-;36154:33;;36209:66;36202:5;36199:77;36196:103;;;36279:18;;:::i;:::-;36196:103;36326:1;36319:5;36315:13;36308:20;;36101:233;;;:::o;36340:176::-;36372:1;36389:20;36407:1;36389:20;:::i;:::-;36384:25;;36423:20;36441:1;36423:20;:::i;:::-;36418:25;;36462:1;36452:35;;36467:18;;:::i;:::-;36452:35;36508:1;36505;36501:9;36496:14;;36340:176;;;;:::o;36522:180::-;36570:77;36567:1;36560:88;36667:4;36664:1;36657:15;36691:4;36688:1;36681:15;36708:180;36756:77;36753:1;36746:88;36853:4;36850:1;36843:15;36877:4;36874:1;36867:15;36894:180;36942:77;36939:1;36932:88;37039:4;37036:1;37029:15;37063:4;37060:1;37053:15;37080:180;37128:77;37125:1;37118:88;37225:4;37222:1;37215:15;37249:4;37246:1;37239:15;37266:180;37314:77;37311:1;37304:88;37411:4;37408:1;37401:15;37435:4;37432:1;37425:15;37452:117;37561:1;37558;37551:12;37575:117;37684:1;37681;37674:12;37698:117;37807:1;37804;37797:12;37821:117;37930:1;37927;37920:12;37944:117;38053:1;38050;38043:12;38067:117;38176:1;38173;38166:12;38190:102;38231:6;38282:2;38278:7;38273:2;38266:5;38262:14;38258:28;38248:38;;38190:102;;;:::o;38298:237::-;38438:34;38434:1;38426:6;38422:14;38415:58;38507:20;38502:2;38494:6;38490:15;38483:45;38298:237;:::o;38541:225::-;38681:34;38677:1;38669:6;38665:14;38658:58;38750:8;38745:2;38737:6;38733:15;38726:33;38541:225;:::o;38772:::-;38912:34;38908:1;38900:6;38896:14;38889:58;38981:8;38976:2;38968:6;38964:15;38957:33;38772:225;:::o;39003:178::-;39143:30;39139:1;39131:6;39127:14;39120:54;39003:178;:::o;39187:223::-;39327:34;39323:1;39315:6;39311:14;39304:58;39396:6;39391:2;39383:6;39379:15;39372:31;39187:223;:::o;39416:175::-;39556:27;39552:1;39544:6;39540:14;39533:51;39416:175;:::o;39597:231::-;39737:34;39733:1;39725:6;39721:14;39714:58;39806:14;39801:2;39793:6;39789:15;39782:39;39597:231;:::o;39834:243::-;39974:34;39970:1;39962:6;39958:14;39951:58;40043:26;40038:2;40030:6;40026:15;40019:51;39834:243;:::o;40083:229::-;40223:34;40219:1;40211:6;40207:14;40200:58;40292:12;40287:2;40279:6;40275:15;40268:37;40083:229;:::o;40318:228::-;40458:34;40454:1;40446:6;40442:14;40435:58;40527:11;40522:2;40514:6;40510:15;40503:36;40318:228;:::o;40552:182::-;40692:34;40688:1;40680:6;40676:14;40669:58;40552:182;:::o;40740:231::-;40880:34;40876:1;40868:6;40864:14;40857:58;40949:14;40944:2;40936:6;40932:15;40925:39;40740:231;:::o;40977:177::-;41117:29;41113:1;41105:6;41101:14;41094:53;40977:177;:::o;41160:182::-;41300:34;41296:1;41288:6;41284:14;41277:58;41160:182;:::o;41348:228::-;41488:34;41484:1;41476:6;41472:14;41465:58;41557:11;41552:2;41544:6;41540:15;41533:36;41348:228;:::o;41582:234::-;41722:34;41718:1;41710:6;41706:14;41699:58;41791:17;41786:2;41778:6;41774:15;41767:42;41582:234;:::o;41822:220::-;41962:34;41958:1;41950:6;41946:14;41939:58;42031:3;42026:2;42018:6;42014:15;42007:28;41822:220;:::o;42048:175::-;42188:27;42184:1;42176:6;42172:14;42165:51;42048:175;:::o;42229:163::-;42369:15;42365:1;42357:6;42353:14;42346:39;42229:163;:::o;42398:236::-;42538:34;42534:1;42526:6;42522:14;42515:58;42607:19;42602:2;42594:6;42590:15;42583:44;42398:236;:::o;42640:177::-;42780:29;42776:1;42768:6;42764:14;42757:53;42640:177;:::o;42823:122::-;42896:24;42914:5;42896:24;:::i;:::-;42889:5;42886:35;42876:63;;42935:1;42932;42925:12;42876:63;42823:122;:::o;42951:116::-;43021:21;43036:5;43021:21;:::i;:::-;43014:5;43011:32;43001:60;;43057:1;43054;43047:12;43001:60;42951:116;:::o;43073:120::-;43145:23;43162:5;43145:23;:::i;:::-;43138:5;43135:34;43125:62;;43183:1;43180;43173:12;43125:62;43073:120;:::o;43199:122::-;43272:24;43290:5;43272:24;:::i;:::-;43265:5;43262:35;43252:63;;43311:1;43308;43301:12;43252:63;43199:122;:::o
Swarm Source
ipfs://9e0c44ed57713bacb04c98ac78b9f0039e3315f9053ef08678a86f464863cf1a
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.