Overview
POL Balance
0 POL
POL Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 382 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 66486239 | 3 days ago | IN | 0 POL | 0.00220315 | ||||
Safe Transfer Fr... | 65568031 | 27 days ago | IN | 0 POL | 0.00265231 | ||||
Set Approval For... | 63225568 | 85 days ago | IN | 0 POL | 0.00089326 | ||||
Set Approval For... | 63171735 | 87 days ago | IN | 0 POL | 0.0014133 | ||||
Set Approval For... | 62751438 | 97 days ago | IN | 0 POL | 0.00139959 | ||||
Safe Transfer Fr... | 59756208 | 172 days ago | IN | 0 POL | 0.00265179 | ||||
Set Approval For... | 59715459 | 173 days ago | IN | 0 POL | 0.00145272 | ||||
Set Approval For... | 59411545 | 181 days ago | IN | 0 POL | 0.00187364 | ||||
Safe Transfer Fr... | 59398243 | 181 days ago | IN | 0 POL | 0.00297065 | ||||
Safe Transfer Fr... | 59398198 | 181 days ago | IN | 0 POL | 0.00296981 | ||||
Set Approval For... | 59227218 | 185 days ago | IN | 0 POL | 0.0014035 | ||||
Safe Transfer Fr... | 59196598 | 186 days ago | IN | 0 POL | 0.00519295 | ||||
Safe Transfer Fr... | 59196560 | 186 days ago | IN | 0 POL | 0.00533594 | ||||
Safe Transfer Fr... | 59196501 | 186 days ago | IN | 0 POL | 0.00469488 | ||||
Safe Transfer Fr... | 57867501 | 219 days ago | IN | 0 POL | 0.00296544 | ||||
Set Approval For... | 57690063 | 224 days ago | IN | 0 POL | 0.00139959 | ||||
Safe Transfer Fr... | 57636375 | 225 days ago | IN | 0 POL | 0.00296508 | ||||
Set Approval For... | 56563764 | 253 days ago | IN | 0 POL | 0.00139959 | ||||
Set Approval For... | 56544067 | 254 days ago | IN | 0 POL | 0.00154332 | ||||
Safe Transfer Fr... | 55364449 | 285 days ago | IN | 0 POL | 0.01156392 | ||||
Set Approval For... | 53755119 | 327 days ago | IN | 0 POL | 0.00253175 | ||||
Set Approval For... | 53342845 | 337 days ago | IN | 0 POL | 0.00140145 | ||||
Set Approval For... | 53018121 | 346 days ago | IN | 0 POL | 0.00280466 | ||||
Safe Transfer Fr... | 52241647 | 366 days ago | IN | 0 POL | 0.01567748 | ||||
Set Approval For... | 51971685 | 373 days ago | IN | 0 POL | 0.00394163 |
Loading...
Loading
Contract Name:
TonyStories
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-03-21 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; 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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } 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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } 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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } 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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-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. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } 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); /** * @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); } 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 See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; 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(); } } abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } contract TonyStories is ERC721, ERC721Enumerable, ERC721Burnable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; string private _baseUri; string private _contractUri; address payable treasurer; // withdraw to uint256 public tokenPrice = 0.003 ether; // 40 matic uint256 public tokenPriceOG = 0.001 ether; // 40 matic uint256 public tokenPriceWL = 0.002 ether; // 40 matic uint256 public maxSupply = 3000; uint256 public maxMintsPerTx = 4; // maximum mints per transaction // giveaway variables uint256 public airdropSupply = 500; bool public airdropDone = true; bool private _mintOpen; // if _mintOnlyOg and _mintOnlyOgAndWl are false everyone can mint bool private _mintOnlyOg; bool private _mintOnlyOgAndWl; ERC1155 private tonyEmotionsWl; constructor( string memory baseUri_, string memory contractUri_ ) ERC721("TonyStories", "TSC") { _baseUri = baseUri_; _contractUri = contractUri_; treasurer = payable(_msgSender()); _mintOnlyOg = false; _mintOnlyOgAndWl = false; _mintOpen = false; tonyEmotionsWl = ERC1155(0xb033b6D2DEFf926567ccBA11907F2F0d2968Cd07); } /** * @dev Returns true if the mint is only to og, and false otherwise. */ function mintOpen() public view virtual returns (bool) { return _mintOpen; } function openMint() public onlyOwner { _mintOpen = true; } function closeMint() public onlyOwner { _mintOpen = false; } /** * @dev Returns true if the mint is only to og, and false otherwise. */ function mintOnlyOg() public view virtual returns (bool) { return _mintOnlyOg; } function enableMintOnlyOg() public onlyOwner { _mintOnlyOg = true; } function disableMintOnlyOg() public onlyOwner { _mintOnlyOg = false; } /** * @dev Returns true if the mint is only to og and wl, and false otherwise. */ function mintOnlyOgAndWl() public view virtual returns (bool) { return _mintOnlyOgAndWl; } function enableMintOnlyOgAndWl() public onlyOwner { _mintOnlyOgAndWl = true; } function disableMintOnlyOgAndWl() public onlyOwner { _mintOnlyOgAndWl = false; } function setPrice(uint256 amount) public onlyOwner { tokenPrice = 1 ether * amount; } function setPriceOG(uint256 amount) public onlyOwner { tokenPriceOG = 1 ether * amount; } function setPriceWL(uint256 amount) public onlyOwner { tokenPriceWL = 1 ether * amount; } function _baseURI() internal view override returns (string memory) { return _baseUri; } function contractURI() public view returns (string memory) { return _contractUri; } function airdrop(address[] memory recipients) public onlyOwner { require(recipients.length <= airdropSupply, ""); for (uint256 i = 0; i < recipients.length; i++) { address to = recipients[i]; _tokenIds.increment(); uint256 tokenId = _tokenIds.current(); _mint(to, tokenId); } } function mint(address to, uint256 amount) public payable { require(mintOpen(), "Mint is closed"); require(amount != 0, "Requested amount cannot be zero"); require(amount <= maxMintsPerTx, "Requested amount is more than maximum"); uint256 mintAmount = amount; if (!airdropDone) { mintAmount += airdropSupply; } require(currentTokenId() <= (maxSupply - mintAmount), "Total supply will exceed limit"); require(to != address(0), "Cannot be minted to zero address"); bool canMint = false; uint256 totalOg = tonyEmotionsWl.balanceOf(to, 0); uint256 totalWl = tonyEmotionsWl.balanceOf(to, 1); if (mintOnlyOg() && totalOg > 0) { require((amount * tokenPriceOG) <= msg.value, "Not enough Matic sent"); require((balanceOf(to) + amount) <= totalOg * maxMintsPerTx, "Requested amount is more than maximum per OG"); canMint = true; } if (mintOnlyOgAndWl() && (totalOg > 0 || totalWl > 0)) { require((amount * tokenPriceWL) <= msg.value, "Not enough Matic sent"); require((balanceOf(to) + amount) <= (totalOg + totalWl) * maxMintsPerTx, "Requested amount is more than maximum per OG or WL"); canMint = true; } if (!mintOnlyOg() && !mintOnlyOgAndWl()) { require((amount * tokenPrice) <= msg.value, "Not enough Matic sent"); canMint = true; } if (canMint) { for (uint256 i = 0; i < amount; i++) { _tokenIds.increment(); uint256 tokenId = _tokenIds.current(); _mint(to, tokenId); } } } function setAirdropsDone() public onlyOwner { airdropDone = true; } function currentTokenId() public view returns (uint256) { return _tokenIds.current(); } // withdraw function claimBalance() public onlyOwner { (bool success,) = treasurer.call{value : address(this).balance}(""); require(success, "transfer failed"); } function updateBaseUri(string memory newBaseUri_) public onlyOwner { _baseUri = newBaseUri_; } function updateContractUri(string memory newContractUri_) public onlyOwner { _contractUri = newContractUri_; } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseUri_","type":"string"},{"internalType":"string","name":"contractUri_","type":"string"}],"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":"recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropSupply","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMintOnlyOg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMintOnlyOgAndWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMintOnlyOg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMintOnlyOgAndWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintOnlyOg","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOnlyOgAndWl","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"setAirdropsDone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPriceOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPriceWL","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri_","type":"string"}],"name":"updateBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractUri_","type":"string"}],"name":"updateContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052660aa87bee538000600f5566038d7ea4c6800060105566071afd498d0000601155610bb860125560046013556101f46014556001601560006101000a81548160ff0219169083151502179055503480156200005e57600080fd5b50604051620056c2380380620056c28339818101604052810190620000849190620004b9565b6040518060400160405280600b81526020017f546f6e7953746f726965730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f5453430000000000000000000000000000000000000000000000000000000000815250816000908162000101919062000789565b50806001908162000113919062000789565b505050620001366200012a6200025860201b60201c565b6200026060201b60201c565b81600c908162000147919062000789565b5080600d908162000159919062000789565b506200016a6200025860201b60201c565b600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601560026101000a81548160ff0219169083151502179055506000601560036101000a81548160ff0219169083151502179055506000601560016101000a81548160ff02191690831515021790555073b033b6d2deff926567ccba11907f2f0d2968cd07601560046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000870565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200038f8262000344565b810181811067ffffffffffffffff82111715620003b157620003b062000355565b5b80604052505050565b6000620003c662000326565b9050620003d4828262000384565b919050565b600067ffffffffffffffff821115620003f757620003f662000355565b5b620004028262000344565b9050602081019050919050565b60005b838110156200042f57808201518184015260208101905062000412565b60008484015250505050565b6000620004526200044c84620003d9565b620003ba565b9050828152602081018484840111156200047157620004706200033f565b5b6200047e8482856200040f565b509392505050565b600082601f8301126200049e576200049d6200033a565b5b8151620004b08482602086016200043b565b91505092915050565b60008060408385031215620004d357620004d262000330565b5b600083015167ffffffffffffffff811115620004f457620004f362000335565b5b620005028582860162000486565b925050602083015167ffffffffffffffff81111562000526576200052562000335565b5b620005348582860162000486565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059157607f821691505b602082108103620005a757620005a662000549565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005d2565b6200061d8683620005d2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200066a620006646200065e8462000635565b6200063f565b62000635565b9050919050565b6000819050919050565b620006868362000649565b6200069e620006958262000671565b848454620005df565b825550505050565b600090565b620006b5620006a6565b620006c28184846200067b565b505050565b5b81811015620006ea57620006de600082620006ab565b600181019050620006c8565b5050565b601f82111562000739576200070381620005ad565b6200070e84620005c2565b810160208510156200071e578190505b620007366200072d85620005c2565b830182620006c7565b50505b505050565b600082821c905092915050565b60006200075e600019846008026200073e565b1980831691505092915050565b60006200077983836200074b565b9150826002028217905092915050565b62000794826200053e565b67ffffffffffffffff811115620007b057620007af62000355565b5b620007bc825462000578565b620007c9828285620006ee565b600060209050601f831160018114620008015760008415620007ec578287015190505b620007f885826200076b565b86555062000868565b601f1984166200081186620005ad565b60005b828110156200083b5784890151825560018201915060208501945060208101905062000814565b868310156200085b578489015162000857601f8916826200074b565b8355505b6001600288020188555050505b505050505050565b614e4280620008806000396000f3fe6080604052600436106102875760003560e01c8063715018a61161015a578063bce6d672116100c1578063e8a3d4851161007a578063e8a3d48514610912578063e985e9c51461093d578063f2ad29891461097a578063f2fde38b146109a5578063f77d8109146109ce578063fb3ed5c7146109f957610287565b8063bce6d6721461083a578063c232365a14610851578063c80a8ce714610868578063c87b56dd1461087f578063d5abeb01146108bc578063dc30158b146108e757610287565b80638da5cb5b116101135780638da5cb5b1461075257806391b7f5ed1461077d57806395d89b41146107a6578063a22cb465146107d1578063b3737e18146107fa578063b88d4fde1461081157610287565b8063715018a61461067c578063729ad39e146106935780637e8964ac146106bc5780637ff9b596146106e757806381d8488f146107125780638972e68a1461073b57610287565b80632f745c59116101fe57806347c8ff5e116101b757806347c8ff5e1461055a5780634ca64b5d146105835780634f6ccce7146105ae5780636352211e146105eb57806364f101f01461062857806370a082311461063f57610287565b80632f745c591461046f57806330509bca146104ac57806339f7e37f146104c357806340c10f19146104ec57806342842e0e1461050857806342966c681461053157610287565b8063095ea7b311610250578063095ea7b31461038757806312d71894146103b057806318160ddd146103d957806323b872dd1461040457806324bbd0491461042d5780632ae324201461045857610287565b80629a9b7b1461028c57806301ffc9a7146102b7578063021ed83d146102f457806306fdde031461031f578063081812fc1461034a575b600080fd5b34801561029857600080fd5b506102a1610a24565b6040516102ae919061326e565b60405180910390f35b3480156102c357600080fd5b506102de60048036038101906102d991906132f5565b610a35565b6040516102eb919061333d565b60405180910390f35b34801561030057600080fd5b50610309610a47565b604051610316919061333d565b60405180910390f35b34801561032b57600080fd5b50610334610a5e565b60405161034191906133e8565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190613436565b610af0565b60405161037e91906134a4565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a991906134eb565b610b36565b005b3480156103bc57600080fd5b506103d760048036038101906103d29190613436565b610c4d565b005b3480156103e557600080fd5b506103ee610c72565b6040516103fb919061326e565b60405180910390f35b34801561041057600080fd5b5061042b6004803603810190610426919061352b565b610c7f565b005b34801561043957600080fd5b50610442610cdf565b60405161044f919061333d565b60405180910390f35b34801561046457600080fd5b5061046d610cf6565b005b34801561047b57600080fd5b50610496600480360381019061049191906134eb565b610d1b565b6040516104a3919061326e565b60405180910390f35b3480156104b857600080fd5b506104c1610dc0565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906136b3565b610e99565b005b610506600480360381019061050191906134eb565b610eb4565b005b34801561051457600080fd5b5061052f600480360381019061052a919061352b565b611435565b005b34801561053d57600080fd5b5061055860048036038101906105539190613436565b611455565b005b34801561056657600080fd5b50610581600480360381019061057c91906136b3565b6114b1565b005b34801561058f57600080fd5b506105986114cc565b6040516105a5919061333d565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613436565b6114df565b6040516105e2919061326e565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d9190613436565b611550565b60405161061f91906134a4565b60405180910390f35b34801561063457600080fd5b5061063d6115d6565b005b34801561064b57600080fd5b50610666600480360381019061066191906136fc565b6115fb565b604051610673919061326e565b60405180910390f35b34801561068857600080fd5b506106916116b2565b005b34801561069f57600080fd5b506106ba60048036038101906106b591906137f1565b6116c6565b005b3480156106c857600080fd5b506106d161177a565b6040516106de919061326e565b60405180910390f35b3480156106f357600080fd5b506106fc611780565b604051610709919061326e565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613436565b611786565b005b34801561074757600080fd5b506107506117ab565b005b34801561075e57600080fd5b506107676117d0565b60405161077491906134a4565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f9190613436565b6117fa565b005b3480156107b257600080fd5b506107bb61181f565b6040516107c891906133e8565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190613866565b6118b1565b005b34801561080657600080fd5b5061080f6118c7565b005b34801561081d57600080fd5b5061083860048036038101906108339190613947565b6118ec565b005b34801561084657600080fd5b5061084f61194e565b005b34801561085d57600080fd5b50610866611973565b005b34801561087457600080fd5b5061087d611998565b005b34801561088b57600080fd5b506108a660048036038101906108a19190613436565b6119bd565b6040516108b391906133e8565b60405180910390f35b3480156108c857600080fd5b506108d1611a25565b6040516108de919061326e565b60405180910390f35b3480156108f357600080fd5b506108fc611a2b565b604051610909919061326e565b60405180910390f35b34801561091e57600080fd5b50610927611a31565b60405161093491906133e8565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f91906139ca565b611ac3565b604051610971919061333d565b60405180910390f35b34801561098657600080fd5b5061098f611b57565b60405161099c919061333d565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c791906136fc565b611b6e565b005b3480156109da57600080fd5b506109e3611bf1565b6040516109f0919061326e565b60405180910390f35b348015610a0557600080fd5b50610a0e611bf7565b604051610a1b919061326e565b60405180910390f35b6000610a30600b611bfd565b905090565b6000610a4082611c0b565b9050919050565b6000601560039054906101000a900460ff16905090565b606060008054610a6d90613a39565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990613a39565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b6000610afb82611c85565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4182611550565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613adc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd0611cd0565b73ffffffffffffffffffffffffffffffffffffffff161480610bff5750610bfe81610bf9611cd0565b611ac3565b5b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590613b6e565b60405180910390fd5b610c488383611cd8565b505050565b610c55611d91565b80670de0b6b3a7640000610c699190613bbd565b60108190555050565b6000600880549050905090565b610c90610c8a611cd0565b82611e0f565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690613c71565b60405180910390fd5b610cda838383611ea4565b505050565b6000601560019054906101000a900460ff16905090565b610cfe611d91565b6001601560036101000a81548160ff021916908315150217905550565b6000610d26836115fb565b8210610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90613d03565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610dc8611d91565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e1090613d54565b60006040518083038185875af1925050503d8060008114610e4d576040519150601f19603f3d011682016040523d82523d6000602084013e610e52565b606091505b5050905080610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d90613db5565b60405180910390fd5b50565b610ea1611d91565b80600c9081610eb09190613f81565b5050565b610ebc610cdf565b610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef29061409f565b60405180910390fd5b60008103610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f359061410b565b60405180910390fd5b601354811115610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a9061419d565b60405180910390fd5b6000819050601560009054906101000a900460ff16610fad5760145481610faa91906141bd565b90505b80601254610fbb91906141f1565b610fc3610a24565b1115611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb90614271565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906142dd565b60405180910390fd5b600080601560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e8660006040518363ffffffff1660e01b81526004016110d3929190614338565b602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190614376565b90506000601560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e8760016040518363ffffffff1660e01b81526004016111759291906143de565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190614376565b90506111c0611b57565b80156111cc5750600082115b156112895734601054866111e09190613bbd565b1115611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614453565b60405180910390fd5b6013548261122f9190613bbd565b85611239886115fb565b61124391906141bd565b1115611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906144e5565b60405180910390fd5b600192505b611291610a47565b80156112a8575060008211806112a75750600081115b5b156113705734601154866112bc9190613bbd565b11156112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490614453565b60405180910390fd5b601354818361130c91906141bd565b6113169190613bbd565b85611320886115fb565b61132a91906141bd565b111561136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290614577565b60405180910390fd5b600192505b611378611b57565b15801561138a5750611388610a47565b155b156113e45734600f548661139e9190613bbd565b11156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690614453565b60405180910390fd5b600192505b821561142d5760005b8581101561142b576113ff600b61219d565b600061140b600b611bfd565b905061141788826121b3565b50808061142390614597565b9150506113ed565b505b505050505050565b611450838383604051806020016040528060008152506118ec565b505050565b611466611460611cd0565b82611e0f565b6114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90613c71565b60405180910390fd5b6114ae816123d0565b50565b6114b9611d91565b80600d90816114c89190613f81565b5050565b601560009054906101000a900460ff1681565b60006114e9610c72565b821061152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614651565b60405180910390fd5b6008828154811061153e5761153d614671565b5b90600052602060002001549050919050565b60008061155c8361251e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c4906146ec565b60405180910390fd5b80915050919050565b6115de611d91565b6000601560016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116629061477e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116ba611d91565b6116c4600061255b565b565b6116ce611d91565b60145481511115611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b906147c1565b60405180910390fd5b60005b815181101561177657600082828151811061173557611734614671565b5b60200260200101519050611749600b61219d565b6000611755600b611bfd565b905061176182826121b3565b5050808061176e90614597565b915050611717565b5050565b60105481565b600f5481565b61178e611d91565b80670de0b6b3a76400006117a29190613bbd565b60118190555050565b6117b3611d91565b6001601560006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611802611d91565b80670de0b6b3a76400006118169190613bbd565b600f8190555050565b60606001805461182e90613a39565b80601f016020809104026020016040519081016040528092919081815260200182805461185a90613a39565b80156118a75780601f1061187c576101008083540402835291602001916118a7565b820191906000526020600020905b81548152906001019060200180831161188a57829003601f168201915b5050505050905090565b6118c36118bc611cd0565b8383612621565b5050565b6118cf611d91565b6000601560036101000a81548160ff021916908315150217905550565b6118fd6118f7611cd0565b83611e0f565b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613c71565b60405180910390fd5b6119488484848461278d565b50505050565b611956611d91565b6001601560016101000a81548160ff021916908315150217905550565b61197b611d91565b6001601560026101000a81548160ff021916908315150217905550565b6119a0611d91565b6000601560026101000a81548160ff021916908315150217905550565b60606119c882611c85565b60006119d26127e9565b905060008151116119f25760405180602001604052806000815250611a1d565b806119fc8461287b565b604051602001611a0d92919061481d565b6040516020818303038152906040525b915050919050565b60125481565b60135481565b6060600d8054611a4090613a39565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6c90613a39565b8015611ab95780601f10611a8e57610100808354040283529160200191611ab9565b820191906000526020600020905b815481529060010190602001808311611a9c57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601560029054906101000a900460ff16905090565b611b76611d91565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc906148b3565b60405180910390fd5b611bee8161255b565b50565b60115481565b60145481565b600081600001549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c7e5750611c7d82612949565b5b9050919050565b611c8e81612a2b565b611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc4906146ec565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4b83611550565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611d99611cd0565b73ffffffffffffffffffffffffffffffffffffffff16611db76117d0565b73ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e049061491f565b60405180910390fd5b565b600080611e1b83611550565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e5d5750611e5c8185611ac3565b5b80611e9b57508373ffffffffffffffffffffffffffffffffffffffff16611e8384610af0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ec482611550565b73ffffffffffffffffffffffffffffffffffffffff1614611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f11906149b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090614a43565b60405180910390fd5b611f968383836001612a6c565b8273ffffffffffffffffffffffffffffffffffffffff16611fb682611550565b73ffffffffffffffffffffffffffffffffffffffff161461200c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612003906149b1565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121988383836001612a7e565b505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221990614aaf565b60405180910390fd5b61222b81612a2b565b1561226b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226290614b1b565b60405180910390fd5b612279600083836001612a6c565b61228281612a2b565b156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990614b1b565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123cc600083836001612a7e565b5050565b60006123db82611550565b90506123eb816000846001612a6c565b6123f482611550565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251a816000846001612a7e565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690614b87565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612780919061333d565b60405180910390a3505050565b612798848484611ea4565b6127a484848484612a84565b6127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614c19565b60405180910390fd5b50505050565b6060600c80546127f890613a39565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613a39565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b5050505050905090565b60606000600161288a84612c0b565b01905060008167ffffffffffffffff8111156128a9576128a8613588565b5b6040519080825280601f01601f1916602001820160405280156128db5781602001600182028036833780820191505090505b509050600082602001820190505b60011561293e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161293257612931614c39565b5b049450600085036128e9575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a1457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a245750612a2382612d5e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612a4d8361251e565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612a7884848484612dc8565b50505050565b50505050565b6000612aa58473ffffffffffffffffffffffffffffffffffffffff16612f26565b15612bfe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ace611cd0565b8786866040518563ffffffff1660e01b8152600401612af09493929190614cbd565b6020604051808303816000875af1925050508015612b2c57506040513d601f19601f82011682018060405250810190612b299190614d1e565b60015b612bae573d8060008114612b5c576040519150601f19603f3d011682016040523d82523d6000602084013e612b61565b606091505b506000815103612ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9d90614c19565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c03565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612c69577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612c5f57612c5e614c39565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ca6576d04ee2d6d415b85acef81000000008381612c9c57612c9b614c39565b5b0492506020810190505b662386f26fc100008310612cd557662386f26fc100008381612ccb57612cca614c39565b5b0492506010810190505b6305f5e1008310612cfe576305f5e1008381612cf457612cf3614c39565b5b0492506008810190505b6127108310612d23576127108381612d1957612d18614c39565b5b0492506004810190505b60648310612d465760648381612d3c57612d3b614c39565b5b0492506002810190505b600a8310612d55576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dd484848484612f49565b6001811115612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f90614dbd565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612e5f57612e5a81612f4f565b612e9e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612e9d57612e9c8582612f98565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ee057612edb81613105565b612f1f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612f1e57612f1d84826131d6565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fa5846115fb565b612faf91906141f1565b9050600060076000848152602001908152602001600020549050818114613094576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061311991906141f1565b905060006009600084815260200190815260200160002054905060006008838154811061314957613148614671565b5b90600052602060002001549050806008838154811061316b5761316a614671565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131ba576131b9614ddd565b5b6001900381819060005260206000200160009055905550505050565b60006131e1836115fb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000819050919050565b61326881613255565b82525050565b6000602082019050613283600083018461325f565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132d28161329d565b81146132dd57600080fd5b50565b6000813590506132ef816132c9565b92915050565b60006020828403121561330b5761330a613293565b5b6000613319848285016132e0565b91505092915050565b60008115159050919050565b61333781613322565b82525050565b6000602082019050613352600083018461332e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613392578082015181840152602081019050613377565b60008484015250505050565b6000601f19601f8301169050919050565b60006133ba82613358565b6133c48185613363565b93506133d4818560208601613374565b6133dd8161339e565b840191505092915050565b6000602082019050818103600083015261340281846133af565b905092915050565b61341381613255565b811461341e57600080fd5b50565b6000813590506134308161340a565b92915050565b60006020828403121561344c5761344b613293565b5b600061345a84828501613421565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061348e82613463565b9050919050565b61349e81613483565b82525050565b60006020820190506134b96000830184613495565b92915050565b6134c881613483565b81146134d357600080fd5b50565b6000813590506134e5816134bf565b92915050565b6000806040838503121561350257613501613293565b5b6000613510858286016134d6565b925050602061352185828601613421565b9150509250929050565b60008060006060848603121561354457613543613293565b5b6000613552868287016134d6565b9350506020613563868287016134d6565b925050604061357486828701613421565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135c08261339e565b810181811067ffffffffffffffff821117156135df576135de613588565b5b80604052505050565b60006135f2613289565b90506135fe82826135b7565b919050565b600067ffffffffffffffff82111561361e5761361d613588565b5b6136278261339e565b9050602081019050919050565b82818337600083830152505050565b600061365661365184613603565b6135e8565b90508281526020810184848401111561367257613671613583565b5b61367d848285613634565b509392505050565b600082601f83011261369a5761369961357e565b5b81356136aa848260208601613643565b91505092915050565b6000602082840312156136c9576136c8613293565b5b600082013567ffffffffffffffff8111156136e7576136e6613298565b5b6136f384828501613685565b91505092915050565b60006020828403121561371257613711613293565b5b6000613720848285016134d6565b91505092915050565b600067ffffffffffffffff82111561374457613743613588565b5b602082029050602081019050919050565b600080fd5b600061376d61376884613729565b6135e8565b905080838252602082019050602084028301858111156137905761378f613755565b5b835b818110156137b957806137a588826134d6565b845260208401935050602081019050613792565b5050509392505050565b600082601f8301126137d8576137d761357e565b5b81356137e884826020860161375a565b91505092915050565b60006020828403121561380757613806613293565b5b600082013567ffffffffffffffff81111561382557613824613298565b5b613831848285016137c3565b91505092915050565b61384381613322565b811461384e57600080fd5b50565b6000813590506138608161383a565b92915050565b6000806040838503121561387d5761387c613293565b5b600061388b858286016134d6565b925050602061389c85828601613851565b9150509250929050565b600067ffffffffffffffff8211156138c1576138c0613588565b5b6138ca8261339e565b9050602081019050919050565b60006138ea6138e5846138a6565b6135e8565b90508281526020810184848401111561390657613905613583565b5b613911848285613634565b509392505050565b600082601f83011261392e5761392d61357e565b5b813561393e8482602086016138d7565b91505092915050565b6000806000806080858703121561396157613960613293565b5b600061396f878288016134d6565b9450506020613980878288016134d6565b935050604061399187828801613421565b925050606085013567ffffffffffffffff8111156139b2576139b1613298565b5b6139be87828801613919565b91505092959194509250565b600080604083850312156139e1576139e0613293565b5b60006139ef858286016134d6565b9250506020613a00858286016134d6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5157607f821691505b602082108103613a6457613a63613a0a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ac6602183613363565b9150613ad182613a6a565b604082019050919050565b60006020820190508181036000830152613af581613ab9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613b58603d83613363565b9150613b6382613afc565b604082019050919050565b60006020820190508181036000830152613b8781613b4b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bc882613255565b9150613bd383613255565b9250828202613be181613255565b91508282048414831517613bf857613bf7613b8e565b5b5092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613c5b602d83613363565b9150613c6682613bff565b604082019050919050565b60006020820190508181036000830152613c8a81613c4e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ced602b83613363565b9150613cf882613c91565b604082019050919050565b60006020820190508181036000830152613d1c81613ce0565b9050919050565b600081905092915050565b50565b6000613d3e600083613d23565b9150613d4982613d2e565b600082019050919050565b6000613d5f82613d31565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613d9f600f83613363565b9150613daa82613d69565b602082019050919050565b60006020820190508181036000830152613dce81613d92565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613dfa565b613e418683613dfa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e7e613e79613e7484613255565b613e59565b613255565b9050919050565b6000819050919050565b613e9883613e63565b613eac613ea482613e85565b848454613e07565b825550505050565b600090565b613ec1613eb4565b613ecc818484613e8f565b505050565b5b81811015613ef057613ee5600082613eb9565b600181019050613ed2565b5050565b601f821115613f3557613f0681613dd5565b613f0f84613dea565b81016020851015613f1e578190505b613f32613f2a85613dea565b830182613ed1565b50505b505050565b600082821c905092915050565b6000613f5860001984600802613f3a565b1980831691505092915050565b6000613f718383613f47565b9150826002028217905092915050565b613f8a82613358565b67ffffffffffffffff811115613fa357613fa2613588565b5b613fad8254613a39565b613fb8828285613ef4565b600060209050601f831160018114613feb5760008415613fd9578287015190505b613fe38582613f65565b86555061404b565b601f198416613ff986613dd5565b60005b8281101561402157848901518255600182019150602085019450602081019050613ffc565b8683101561403e578489015161403a601f891682613f47565b8355505b6001600288020188555050505b505050505050565b7f4d696e7420697320636c6f736564000000000000000000000000000000000000600082015250565b6000614089600e83613363565b915061409482614053565b602082019050919050565b600060208201905081810360008301526140b88161407c565b9050919050565b7f52657175657374656420616d6f756e742063616e6e6f74206265207a65726f00600082015250565b60006140f5601f83613363565b9150614100826140bf565b602082019050919050565b60006020820190508181036000830152614124816140e8565b9050919050565b7f52657175657374656420616d6f756e74206973206d6f7265207468616e206d6160008201527f78696d756d000000000000000000000000000000000000000000000000000000602082015250565b6000614187602583613363565b91506141928261412b565b604082019050919050565b600060208201905081810360008301526141b68161417a565b9050919050565b60006141c882613255565b91506141d383613255565b92508282019050808211156141eb576141ea613b8e565b5b92915050565b60006141fc82613255565b915061420783613255565b925082820390508181111561421f5761421e613b8e565b5b92915050565b7f546f74616c20737570706c792077696c6c20657863656564206c696d69740000600082015250565b600061425b601e83613363565b915061426682614225565b602082019050919050565b6000602082019050818103600083015261428a8161424e565b9050919050565b7f43616e6e6f74206265206d696e74656420746f207a65726f2061646472657373600082015250565b60006142c7602083613363565b91506142d282614291565b602082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b6000819050919050565b600061432261431d614318846142fd565b613e59565b613255565b9050919050565b61433281614307565b82525050565b600060408201905061434d6000830185613495565b61435a6020830184614329565b9392505050565b6000815190506143708161340a565b92915050565b60006020828403121561438c5761438b613293565b5b600061439a84828501614361565b91505092915050565b6000819050919050565b60006143c86143c36143be846143a3565b613e59565b613255565b9050919050565b6143d8816143ad565b82525050565b60006040820190506143f36000830185613495565b61440060208301846143cf565b9392505050565b7f4e6f7420656e6f756768204d617469632073656e740000000000000000000000600082015250565b600061443d601583613363565b915061444882614407565b602082019050919050565b6000602082019050818103600083015261446c81614430565b9050919050565b7f52657175657374656420616d6f756e74206973206d6f7265207468616e206d6160008201527f78696d756d20706572204f470000000000000000000000000000000000000000602082015250565b60006144cf602c83613363565b91506144da82614473565b604082019050919050565b600060208201905081810360008301526144fe816144c2565b9050919050565b7f52657175657374656420616d6f756e74206973206d6f7265207468616e206d6160008201527f78696d756d20706572204f47206f7220574c0000000000000000000000000000602082015250565b6000614561603283613363565b915061456c82614505565b604082019050919050565b6000602082019050818103600083015261459081614554565b9050919050565b60006145a282613255565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145d4576145d3613b8e565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061463b602c83613363565b9150614646826145df565b604082019050919050565b6000602082019050818103600083015261466a8161462e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146d6601883613363565b91506146e1826146a0565b602082019050919050565b60006020820190508181036000830152614705816146c9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614768602983613363565b91506147738261470c565b604082019050919050565b600060208201905081810360008301526147978161475b565b9050919050565b60006147ab600083613363565b91506147b682613d2e565b600082019050919050565b600060208201905081810360008301526147da8161479e565b9050919050565b600081905092915050565b60006147f782613358565b61480181856147e1565b9350614811818560208601613374565b80840191505092915050565b600061482982856147ec565b915061483582846147ec565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061489d602683613363565b91506148a882614841565b604082019050919050565b600060208201905081810360008301526148cc81614890565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614909602083613363565b9150614914826148d3565b602082019050919050565b60006020820190508181036000830152614938816148fc565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061499b602583613363565b91506149a68261493f565b604082019050919050565b600060208201905081810360008301526149ca8161498e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a2d602483613363565b9150614a38826149d1565b604082019050919050565b60006020820190508181036000830152614a5c81614a20565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a99602083613363565b9150614aa482614a63565b602082019050919050565b60006020820190508181036000830152614ac881614a8c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b05601c83613363565b9150614b1082614acf565b602082019050919050565b60006020820190508181036000830152614b3481614af8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b71601983613363565b9150614b7c82614b3b565b602082019050919050565b60006020820190508181036000830152614ba081614b64565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614c03603283613363565b9150614c0e82614ba7565b604082019050919050565b60006020820190508181036000830152614c3281614bf6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614c8f82614c68565b614c998185614c73565b9350614ca9818560208601613374565b614cb28161339e565b840191505092915050565b6000608082019050614cd26000830187613495565b614cdf6020830186613495565b614cec604083018561325f565b8181036060830152614cfe8184614c84565b905095945050505050565b600081519050614d18816132c9565b92915050565b600060208284031215614d3457614d33613293565b5b6000614d4284828501614d09565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614da7603583613363565b9150614db282614d4b565b604082019050919050565b60006020820190508181036000830152614dd681614d9a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212208e8b0a22eaf3a0ba70f6af50ea4b8965e8922992a28ac0d217cbae093ac11e0864736f6c634300081300330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102875760003560e01c8063715018a61161015a578063bce6d672116100c1578063e8a3d4851161007a578063e8a3d48514610912578063e985e9c51461093d578063f2ad29891461097a578063f2fde38b146109a5578063f77d8109146109ce578063fb3ed5c7146109f957610287565b8063bce6d6721461083a578063c232365a14610851578063c80a8ce714610868578063c87b56dd1461087f578063d5abeb01146108bc578063dc30158b146108e757610287565b80638da5cb5b116101135780638da5cb5b1461075257806391b7f5ed1461077d57806395d89b41146107a6578063a22cb465146107d1578063b3737e18146107fa578063b88d4fde1461081157610287565b8063715018a61461067c578063729ad39e146106935780637e8964ac146106bc5780637ff9b596146106e757806381d8488f146107125780638972e68a1461073b57610287565b80632f745c59116101fe57806347c8ff5e116101b757806347c8ff5e1461055a5780634ca64b5d146105835780634f6ccce7146105ae5780636352211e146105eb57806364f101f01461062857806370a082311461063f57610287565b80632f745c591461046f57806330509bca146104ac57806339f7e37f146104c357806340c10f19146104ec57806342842e0e1461050857806342966c681461053157610287565b8063095ea7b311610250578063095ea7b31461038757806312d71894146103b057806318160ddd146103d957806323b872dd1461040457806324bbd0491461042d5780632ae324201461045857610287565b80629a9b7b1461028c57806301ffc9a7146102b7578063021ed83d146102f457806306fdde031461031f578063081812fc1461034a575b600080fd5b34801561029857600080fd5b506102a1610a24565b6040516102ae919061326e565b60405180910390f35b3480156102c357600080fd5b506102de60048036038101906102d991906132f5565b610a35565b6040516102eb919061333d565b60405180910390f35b34801561030057600080fd5b50610309610a47565b604051610316919061333d565b60405180910390f35b34801561032b57600080fd5b50610334610a5e565b60405161034191906133e8565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190613436565b610af0565b60405161037e91906134a4565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a991906134eb565b610b36565b005b3480156103bc57600080fd5b506103d760048036038101906103d29190613436565b610c4d565b005b3480156103e557600080fd5b506103ee610c72565b6040516103fb919061326e565b60405180910390f35b34801561041057600080fd5b5061042b6004803603810190610426919061352b565b610c7f565b005b34801561043957600080fd5b50610442610cdf565b60405161044f919061333d565b60405180910390f35b34801561046457600080fd5b5061046d610cf6565b005b34801561047b57600080fd5b50610496600480360381019061049191906134eb565b610d1b565b6040516104a3919061326e565b60405180910390f35b3480156104b857600080fd5b506104c1610dc0565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906136b3565b610e99565b005b610506600480360381019061050191906134eb565b610eb4565b005b34801561051457600080fd5b5061052f600480360381019061052a919061352b565b611435565b005b34801561053d57600080fd5b5061055860048036038101906105539190613436565b611455565b005b34801561056657600080fd5b50610581600480360381019061057c91906136b3565b6114b1565b005b34801561058f57600080fd5b506105986114cc565b6040516105a5919061333d565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613436565b6114df565b6040516105e2919061326e565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d9190613436565b611550565b60405161061f91906134a4565b60405180910390f35b34801561063457600080fd5b5061063d6115d6565b005b34801561064b57600080fd5b50610666600480360381019061066191906136fc565b6115fb565b604051610673919061326e565b60405180910390f35b34801561068857600080fd5b506106916116b2565b005b34801561069f57600080fd5b506106ba60048036038101906106b591906137f1565b6116c6565b005b3480156106c857600080fd5b506106d161177a565b6040516106de919061326e565b60405180910390f35b3480156106f357600080fd5b506106fc611780565b604051610709919061326e565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613436565b611786565b005b34801561074757600080fd5b506107506117ab565b005b34801561075e57600080fd5b506107676117d0565b60405161077491906134a4565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f9190613436565b6117fa565b005b3480156107b257600080fd5b506107bb61181f565b6040516107c891906133e8565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190613866565b6118b1565b005b34801561080657600080fd5b5061080f6118c7565b005b34801561081d57600080fd5b5061083860048036038101906108339190613947565b6118ec565b005b34801561084657600080fd5b5061084f61194e565b005b34801561085d57600080fd5b50610866611973565b005b34801561087457600080fd5b5061087d611998565b005b34801561088b57600080fd5b506108a660048036038101906108a19190613436565b6119bd565b6040516108b391906133e8565b60405180910390f35b3480156108c857600080fd5b506108d1611a25565b6040516108de919061326e565b60405180910390f35b3480156108f357600080fd5b506108fc611a2b565b604051610909919061326e565b60405180910390f35b34801561091e57600080fd5b50610927611a31565b60405161093491906133e8565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f91906139ca565b611ac3565b604051610971919061333d565b60405180910390f35b34801561098657600080fd5b5061098f611b57565b60405161099c919061333d565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c791906136fc565b611b6e565b005b3480156109da57600080fd5b506109e3611bf1565b6040516109f0919061326e565b60405180910390f35b348015610a0557600080fd5b50610a0e611bf7565b604051610a1b919061326e565b60405180910390f35b6000610a30600b611bfd565b905090565b6000610a4082611c0b565b9050919050565b6000601560039054906101000a900460ff16905090565b606060008054610a6d90613a39565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990613a39565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b6000610afb82611c85565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4182611550565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613adc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd0611cd0565b73ffffffffffffffffffffffffffffffffffffffff161480610bff5750610bfe81610bf9611cd0565b611ac3565b5b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590613b6e565b60405180910390fd5b610c488383611cd8565b505050565b610c55611d91565b80670de0b6b3a7640000610c699190613bbd565b60108190555050565b6000600880549050905090565b610c90610c8a611cd0565b82611e0f565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690613c71565b60405180910390fd5b610cda838383611ea4565b505050565b6000601560019054906101000a900460ff16905090565b610cfe611d91565b6001601560036101000a81548160ff021916908315150217905550565b6000610d26836115fb565b8210610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90613d03565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610dc8611d91565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e1090613d54565b60006040518083038185875af1925050503d8060008114610e4d576040519150601f19603f3d011682016040523d82523d6000602084013e610e52565b606091505b5050905080610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d90613db5565b60405180910390fd5b50565b610ea1611d91565b80600c9081610eb09190613f81565b5050565b610ebc610cdf565b610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef29061409f565b60405180910390fd5b60008103610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f359061410b565b60405180910390fd5b601354811115610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a9061419d565b60405180910390fd5b6000819050601560009054906101000a900460ff16610fad5760145481610faa91906141bd565b90505b80601254610fbb91906141f1565b610fc3610a24565b1115611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb90614271565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906142dd565b60405180910390fd5b600080601560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e8660006040518363ffffffff1660e01b81526004016110d3929190614338565b602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190614376565b90506000601560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e8760016040518363ffffffff1660e01b81526004016111759291906143de565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190614376565b90506111c0611b57565b80156111cc5750600082115b156112895734601054866111e09190613bbd565b1115611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614453565b60405180910390fd5b6013548261122f9190613bbd565b85611239886115fb565b61124391906141bd565b1115611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906144e5565b60405180910390fd5b600192505b611291610a47565b80156112a8575060008211806112a75750600081115b5b156113705734601154866112bc9190613bbd565b11156112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490614453565b60405180910390fd5b601354818361130c91906141bd565b6113169190613bbd565b85611320886115fb565b61132a91906141bd565b111561136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290614577565b60405180910390fd5b600192505b611378611b57565b15801561138a5750611388610a47565b155b156113e45734600f548661139e9190613bbd565b11156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690614453565b60405180910390fd5b600192505b821561142d5760005b8581101561142b576113ff600b61219d565b600061140b600b611bfd565b905061141788826121b3565b50808061142390614597565b9150506113ed565b505b505050505050565b611450838383604051806020016040528060008152506118ec565b505050565b611466611460611cd0565b82611e0f565b6114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90613c71565b60405180910390fd5b6114ae816123d0565b50565b6114b9611d91565b80600d90816114c89190613f81565b5050565b601560009054906101000a900460ff1681565b60006114e9610c72565b821061152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614651565b60405180910390fd5b6008828154811061153e5761153d614671565b5b90600052602060002001549050919050565b60008061155c8361251e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c4906146ec565b60405180910390fd5b80915050919050565b6115de611d91565b6000601560016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116629061477e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116ba611d91565b6116c4600061255b565b565b6116ce611d91565b60145481511115611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b906147c1565b60405180910390fd5b60005b815181101561177657600082828151811061173557611734614671565b5b60200260200101519050611749600b61219d565b6000611755600b611bfd565b905061176182826121b3565b5050808061176e90614597565b915050611717565b5050565b60105481565b600f5481565b61178e611d91565b80670de0b6b3a76400006117a29190613bbd565b60118190555050565b6117b3611d91565b6001601560006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611802611d91565b80670de0b6b3a76400006118169190613bbd565b600f8190555050565b60606001805461182e90613a39565b80601f016020809104026020016040519081016040528092919081815260200182805461185a90613a39565b80156118a75780601f1061187c576101008083540402835291602001916118a7565b820191906000526020600020905b81548152906001019060200180831161188a57829003601f168201915b5050505050905090565b6118c36118bc611cd0565b8383612621565b5050565b6118cf611d91565b6000601560036101000a81548160ff021916908315150217905550565b6118fd6118f7611cd0565b83611e0f565b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613c71565b60405180910390fd5b6119488484848461278d565b50505050565b611956611d91565b6001601560016101000a81548160ff021916908315150217905550565b61197b611d91565b6001601560026101000a81548160ff021916908315150217905550565b6119a0611d91565b6000601560026101000a81548160ff021916908315150217905550565b60606119c882611c85565b60006119d26127e9565b905060008151116119f25760405180602001604052806000815250611a1d565b806119fc8461287b565b604051602001611a0d92919061481d565b6040516020818303038152906040525b915050919050565b60125481565b60135481565b6060600d8054611a4090613a39565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6c90613a39565b8015611ab95780601f10611a8e57610100808354040283529160200191611ab9565b820191906000526020600020905b815481529060010190602001808311611a9c57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601560029054906101000a900460ff16905090565b611b76611d91565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc906148b3565b60405180910390fd5b611bee8161255b565b50565b60115481565b60145481565b600081600001549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c7e5750611c7d82612949565b5b9050919050565b611c8e81612a2b565b611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc4906146ec565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4b83611550565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611d99611cd0565b73ffffffffffffffffffffffffffffffffffffffff16611db76117d0565b73ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e049061491f565b60405180910390fd5b565b600080611e1b83611550565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e5d5750611e5c8185611ac3565b5b80611e9b57508373ffffffffffffffffffffffffffffffffffffffff16611e8384610af0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ec482611550565b73ffffffffffffffffffffffffffffffffffffffff1614611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f11906149b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090614a43565b60405180910390fd5b611f968383836001612a6c565b8273ffffffffffffffffffffffffffffffffffffffff16611fb682611550565b73ffffffffffffffffffffffffffffffffffffffff161461200c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612003906149b1565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121988383836001612a7e565b505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221990614aaf565b60405180910390fd5b61222b81612a2b565b1561226b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226290614b1b565b60405180910390fd5b612279600083836001612a6c565b61228281612a2b565b156122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990614b1b565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123cc600083836001612a7e565b5050565b60006123db82611550565b90506123eb816000846001612a6c565b6123f482611550565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251a816000846001612a7e565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690614b87565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612780919061333d565b60405180910390a3505050565b612798848484611ea4565b6127a484848484612a84565b6127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614c19565b60405180910390fd5b50505050565b6060600c80546127f890613a39565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613a39565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b5050505050905090565b60606000600161288a84612c0b565b01905060008167ffffffffffffffff8111156128a9576128a8613588565b5b6040519080825280601f01601f1916602001820160405280156128db5781602001600182028036833780820191505090505b509050600082602001820190505b60011561293e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161293257612931614c39565b5b049450600085036128e9575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a1457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a245750612a2382612d5e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612a4d8361251e565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612a7884848484612dc8565b50505050565b50505050565b6000612aa58473ffffffffffffffffffffffffffffffffffffffff16612f26565b15612bfe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ace611cd0565b8786866040518563ffffffff1660e01b8152600401612af09493929190614cbd565b6020604051808303816000875af1925050508015612b2c57506040513d601f19601f82011682018060405250810190612b299190614d1e565b60015b612bae573d8060008114612b5c576040519150601f19603f3d011682016040523d82523d6000602084013e612b61565b606091505b506000815103612ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9d90614c19565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c03565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612c69577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612c5f57612c5e614c39565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ca6576d04ee2d6d415b85acef81000000008381612c9c57612c9b614c39565b5b0492506020810190505b662386f26fc100008310612cd557662386f26fc100008381612ccb57612cca614c39565b5b0492506010810190505b6305f5e1008310612cfe576305f5e1008381612cf457612cf3614c39565b5b0492506008810190505b6127108310612d23576127108381612d1957612d18614c39565b5b0492506004810190505b60648310612d465760648381612d3c57612d3b614c39565b5b0492506002810190505b600a8310612d55576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dd484848484612f49565b6001811115612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f90614dbd565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612e5f57612e5a81612f4f565b612e9e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612e9d57612e9c8582612f98565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ee057612edb81613105565b612f1f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612f1e57612f1d84826131d6565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fa5846115fb565b612faf91906141f1565b9050600060076000848152602001908152602001600020549050818114613094576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061311991906141f1565b905060006009600084815260200190815260200160002054905060006008838154811061314957613148614671565b5b90600052602060002001549050806008838154811061316b5761316a614671565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131ba576131b9614ddd565b5b6001900381819060005260206000200160009055905550505050565b60006131e1836115fb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000819050919050565b61326881613255565b82525050565b6000602082019050613283600083018461325f565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132d28161329d565b81146132dd57600080fd5b50565b6000813590506132ef816132c9565b92915050565b60006020828403121561330b5761330a613293565b5b6000613319848285016132e0565b91505092915050565b60008115159050919050565b61333781613322565b82525050565b6000602082019050613352600083018461332e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613392578082015181840152602081019050613377565b60008484015250505050565b6000601f19601f8301169050919050565b60006133ba82613358565b6133c48185613363565b93506133d4818560208601613374565b6133dd8161339e565b840191505092915050565b6000602082019050818103600083015261340281846133af565b905092915050565b61341381613255565b811461341e57600080fd5b50565b6000813590506134308161340a565b92915050565b60006020828403121561344c5761344b613293565b5b600061345a84828501613421565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061348e82613463565b9050919050565b61349e81613483565b82525050565b60006020820190506134b96000830184613495565b92915050565b6134c881613483565b81146134d357600080fd5b50565b6000813590506134e5816134bf565b92915050565b6000806040838503121561350257613501613293565b5b6000613510858286016134d6565b925050602061352185828601613421565b9150509250929050565b60008060006060848603121561354457613543613293565b5b6000613552868287016134d6565b9350506020613563868287016134d6565b925050604061357486828701613421565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135c08261339e565b810181811067ffffffffffffffff821117156135df576135de613588565b5b80604052505050565b60006135f2613289565b90506135fe82826135b7565b919050565b600067ffffffffffffffff82111561361e5761361d613588565b5b6136278261339e565b9050602081019050919050565b82818337600083830152505050565b600061365661365184613603565b6135e8565b90508281526020810184848401111561367257613671613583565b5b61367d848285613634565b509392505050565b600082601f83011261369a5761369961357e565b5b81356136aa848260208601613643565b91505092915050565b6000602082840312156136c9576136c8613293565b5b600082013567ffffffffffffffff8111156136e7576136e6613298565b5b6136f384828501613685565b91505092915050565b60006020828403121561371257613711613293565b5b6000613720848285016134d6565b91505092915050565b600067ffffffffffffffff82111561374457613743613588565b5b602082029050602081019050919050565b600080fd5b600061376d61376884613729565b6135e8565b905080838252602082019050602084028301858111156137905761378f613755565b5b835b818110156137b957806137a588826134d6565b845260208401935050602081019050613792565b5050509392505050565b600082601f8301126137d8576137d761357e565b5b81356137e884826020860161375a565b91505092915050565b60006020828403121561380757613806613293565b5b600082013567ffffffffffffffff81111561382557613824613298565b5b613831848285016137c3565b91505092915050565b61384381613322565b811461384e57600080fd5b50565b6000813590506138608161383a565b92915050565b6000806040838503121561387d5761387c613293565b5b600061388b858286016134d6565b925050602061389c85828601613851565b9150509250929050565b600067ffffffffffffffff8211156138c1576138c0613588565b5b6138ca8261339e565b9050602081019050919050565b60006138ea6138e5846138a6565b6135e8565b90508281526020810184848401111561390657613905613583565b5b613911848285613634565b509392505050565b600082601f83011261392e5761392d61357e565b5b813561393e8482602086016138d7565b91505092915050565b6000806000806080858703121561396157613960613293565b5b600061396f878288016134d6565b9450506020613980878288016134d6565b935050604061399187828801613421565b925050606085013567ffffffffffffffff8111156139b2576139b1613298565b5b6139be87828801613919565b91505092959194509250565b600080604083850312156139e1576139e0613293565b5b60006139ef858286016134d6565b9250506020613a00858286016134d6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a5157607f821691505b602082108103613a6457613a63613a0a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ac6602183613363565b9150613ad182613a6a565b604082019050919050565b60006020820190508181036000830152613af581613ab9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613b58603d83613363565b9150613b6382613afc565b604082019050919050565b60006020820190508181036000830152613b8781613b4b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bc882613255565b9150613bd383613255565b9250828202613be181613255565b91508282048414831517613bf857613bf7613b8e565b5b5092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613c5b602d83613363565b9150613c6682613bff565b604082019050919050565b60006020820190508181036000830152613c8a81613c4e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613ced602b83613363565b9150613cf882613c91565b604082019050919050565b60006020820190508181036000830152613d1c81613ce0565b9050919050565b600081905092915050565b50565b6000613d3e600083613d23565b9150613d4982613d2e565b600082019050919050565b6000613d5f82613d31565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613d9f600f83613363565b9150613daa82613d69565b602082019050919050565b60006020820190508181036000830152613dce81613d92565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613dfa565b613e418683613dfa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e7e613e79613e7484613255565b613e59565b613255565b9050919050565b6000819050919050565b613e9883613e63565b613eac613ea482613e85565b848454613e07565b825550505050565b600090565b613ec1613eb4565b613ecc818484613e8f565b505050565b5b81811015613ef057613ee5600082613eb9565b600181019050613ed2565b5050565b601f821115613f3557613f0681613dd5565b613f0f84613dea565b81016020851015613f1e578190505b613f32613f2a85613dea565b830182613ed1565b50505b505050565b600082821c905092915050565b6000613f5860001984600802613f3a565b1980831691505092915050565b6000613f718383613f47565b9150826002028217905092915050565b613f8a82613358565b67ffffffffffffffff811115613fa357613fa2613588565b5b613fad8254613a39565b613fb8828285613ef4565b600060209050601f831160018114613feb5760008415613fd9578287015190505b613fe38582613f65565b86555061404b565b601f198416613ff986613dd5565b60005b8281101561402157848901518255600182019150602085019450602081019050613ffc565b8683101561403e578489015161403a601f891682613f47565b8355505b6001600288020188555050505b505050505050565b7f4d696e7420697320636c6f736564000000000000000000000000000000000000600082015250565b6000614089600e83613363565b915061409482614053565b602082019050919050565b600060208201905081810360008301526140b88161407c565b9050919050565b7f52657175657374656420616d6f756e742063616e6e6f74206265207a65726f00600082015250565b60006140f5601f83613363565b9150614100826140bf565b602082019050919050565b60006020820190508181036000830152614124816140e8565b9050919050565b7f52657175657374656420616d6f756e74206973206d6f7265207468616e206d6160008201527f78696d756d000000000000000000000000000000000000000000000000000000602082015250565b6000614187602583613363565b91506141928261412b565b604082019050919050565b600060208201905081810360008301526141b68161417a565b9050919050565b60006141c882613255565b91506141d383613255565b92508282019050808211156141eb576141ea613b8e565b5b92915050565b60006141fc82613255565b915061420783613255565b925082820390508181111561421f5761421e613b8e565b5b92915050565b7f546f74616c20737570706c792077696c6c20657863656564206c696d69740000600082015250565b600061425b601e83613363565b915061426682614225565b602082019050919050565b6000602082019050818103600083015261428a8161424e565b9050919050565b7f43616e6e6f74206265206d696e74656420746f207a65726f2061646472657373600082015250565b60006142c7602083613363565b91506142d282614291565b602082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b6000819050919050565b600061432261431d614318846142fd565b613e59565b613255565b9050919050565b61433281614307565b82525050565b600060408201905061434d6000830185613495565b61435a6020830184614329565b9392505050565b6000815190506143708161340a565b92915050565b60006020828403121561438c5761438b613293565b5b600061439a84828501614361565b91505092915050565b6000819050919050565b60006143c86143c36143be846143a3565b613e59565b613255565b9050919050565b6143d8816143ad565b82525050565b60006040820190506143f36000830185613495565b61440060208301846143cf565b9392505050565b7f4e6f7420656e6f756768204d617469632073656e740000000000000000000000600082015250565b600061443d601583613363565b915061444882614407565b602082019050919050565b6000602082019050818103600083015261446c81614430565b9050919050565b7f52657175657374656420616d6f756e74206973206d6f7265207468616e206d6160008201527f78696d756d20706572204f470000000000000000000000000000000000000000602082015250565b60006144cf602c83613363565b91506144da82614473565b604082019050919050565b600060208201905081810360008301526144fe816144c2565b9050919050565b7f52657175657374656420616d6f756e74206973206d6f7265207468616e206d6160008201527f78696d756d20706572204f47206f7220574c0000000000000000000000000000602082015250565b6000614561603283613363565b915061456c82614505565b604082019050919050565b6000602082019050818103600083015261459081614554565b9050919050565b60006145a282613255565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145d4576145d3613b8e565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061463b602c83613363565b9150614646826145df565b604082019050919050565b6000602082019050818103600083015261466a8161462e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146d6601883613363565b91506146e1826146a0565b602082019050919050565b60006020820190508181036000830152614705816146c9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614768602983613363565b91506147738261470c565b604082019050919050565b600060208201905081810360008301526147978161475b565b9050919050565b60006147ab600083613363565b91506147b682613d2e565b600082019050919050565b600060208201905081810360008301526147da8161479e565b9050919050565b600081905092915050565b60006147f782613358565b61480181856147e1565b9350614811818560208601613374565b80840191505092915050565b600061482982856147ec565b915061483582846147ec565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061489d602683613363565b91506148a882614841565b604082019050919050565b600060208201905081810360008301526148cc81614890565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614909602083613363565b9150614914826148d3565b602082019050919050565b60006020820190508181036000830152614938816148fc565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061499b602583613363565b91506149a68261493f565b604082019050919050565b600060208201905081810360008301526149ca8161498e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a2d602483613363565b9150614a38826149d1565b604082019050919050565b60006020820190508181036000830152614a5c81614a20565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a99602083613363565b9150614aa482614a63565b602082019050919050565b60006020820190508181036000830152614ac881614a8c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b05601c83613363565b9150614b1082614acf565b602082019050919050565b60006020820190508181036000830152614b3481614af8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b71601983613363565b9150614b7c82614b3b565b602082019050919050565b60006020820190508181036000830152614ba081614b64565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614c03603283613363565b9150614c0e82614ba7565b604082019050919050565b60006020820190508181036000830152614c3281614bf6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614c8f82614c68565b614c998185614c73565b9350614ca9818560208601613374565b614cb28161339e565b840191505092915050565b6000608082019050614cd26000830187613495565b614cdf6020830186613495565b614cec604083018561325f565b8181036060830152614cfe8184614c84565b905095945050505050565b600081519050614d18816132c9565b92915050565b600060208284031215614d3457614d33613293565b5b6000614d4284828501614d09565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614da7603583613363565b9150614db282614d4b565b604082019050919050565b60006020820190508181036000830152614dd681614d9a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212208e8b0a22eaf3a0ba70f6af50ea4b8965e8922992a28ac0d217cbae093ac11e0864736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseUri_ (string):
Arg [1] : contractUri_ (string):
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
82671:6239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87872:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88726:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84807:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34686:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36198:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35716:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85228:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51925:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36898:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84072:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84919:92;;;;;;;;;;;;;:::i;:::-;;51593:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87998:173;;;;;;;;;;;;;:::i;:::-;;88179:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86033:1742;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37304:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57451:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88295:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83312:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52115:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34396:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84250:74;;;;;;;;;;;;;:::i;:::-;;34127:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6409:103;;;;;;;;;;;;;:::i;:::-;;85664:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83010:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82952:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85339:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87783:81;;;;;;;;;;;;;:::i;:::-;;5761:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85121:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34855:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36441:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85019:94;;;;;;;;;;;;;:::i;:::-;;37560:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84170:72;;;;;;;;;;;;;:::i;:::-;;84526:82;;;;;;;;;;;;;:::i;:::-;;84616:84;;;;;;;;;;;;;:::i;:::-;;35030:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83132:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83170:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85559:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36667:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84424:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6667:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83070:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83271:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87872:101;87919:7;87946:19;:9;:17;:19::i;:::-;87939:26;;87872:101;:::o;88726:181::-;88834:4;88863:36;88887:11;88863:23;:36::i;:::-;88856:43;;88726:181;;;:::o;84807:104::-;84863:4;84887:16;;;;;;;;;;;84880:23;;84807:104;:::o;34686:100::-;34740:13;34773:5;34766:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34686:100;:::o;36198:171::-;36274:7;36294:23;36309:7;36294:14;:23::i;:::-;36337:15;:24;36353:7;36337:24;;;;;;;;;;;;;;;;;;;;;36330:31;;36198:171;;;:::o;35716:416::-;35797:13;35813:23;35828:7;35813:14;:23::i;:::-;35797:39;;35861:5;35855:11;;:2;:11;;;35847:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35955:5;35939:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35964:37;35981:5;35988:12;:10;:12::i;:::-;35964:16;:37::i;:::-;35939:62;35917:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;36103:21;36112:2;36116:7;36103:8;:21::i;:::-;35786:346;35716:416;;:::o;85228:103::-;5647:13;:11;:13::i;:::-;85317:6:::1;85307:7;:16;;;;:::i;:::-;85292:12;:31;;;;85228:103:::0;:::o;51925:113::-;51986:7;52013:10;:17;;;;52006:24;;51925:113;:::o;36898:335::-;37093:41;37112:12;:10;:12::i;:::-;37126:7;37093:18;:41::i;:::-;37085:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;37197:28;37207:4;37213:2;37217:7;37197:9;:28::i;:::-;36898:335;;;:::o;84072:90::-;84121:4;84145:9;;;;;;;;;;;84138:16;;84072:90;:::o;84919:92::-;5647:13;:11;:13::i;:::-;84999:4:::1;84980:16;;:23;;;;;;;;;;;;;;;;;;84919:92::o:0;51593:256::-;51690:7;51726:23;51743:5;51726:16;:23::i;:::-;51718:5;:31;51710:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;51815:12;:19;51828:5;51815:19;;;;;;;;;;;;;;;:26;51835:5;51815:26;;;;;;;;;;;;51808:33;;51593:256;;;;:::o;87998:173::-;5647:13;:11;:13::i;:::-;88051:12:::1;88068:9;;;;;;;;;;;:14;;88091:21;88068:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88050:67;;;88136:7;88128:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;88039:132;87998:173::o:0;88179:108::-;5647:13;:11;:13::i;:::-;88268:11:::1;88257:8;:22;;;;;;:::i;:::-;;88179:108:::0;:::o;86033:1742::-;86109:10;:8;:10::i;:::-;86101:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;86167:1;86157:6;:11;86149:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;86233:13;;86223:6;:23;;86215:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;86299:18;86320:6;86299:27;;86342:11;;;;;;;;;;;86337:72;;86384:13;;86370:27;;;;;:::i;:::-;;;86337:72;86460:10;86448:9;;:22;;;;:::i;:::-;86427:16;:14;:16::i;:::-;:44;;86419:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;86539:1;86525:16;;:2;:16;;;86517:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;86591:12;86622:15;86640:14;;;;;;;;;;;:24;;;86665:2;86669:1;86640:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86622:49;;86682:15;86700:14;;;;;;;;;;;:24;;;86725:2;86729:1;86700:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86682:49;;86746:12;:10;:12::i;:::-;:27;;;;;86772:1;86762:7;:11;86746:27;86742:282;;;86825:9;86808:12;;86799:6;:21;;;;:::i;:::-;86798:36;;86790:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;86921:13;;86911:7;:23;;;;:::i;:::-;86900:6;86884:13;86894:2;86884:9;:13::i;:::-;:22;;;;:::i;:::-;86883:51;;86875:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;87008:4;86998:14;;86742:282;87038:17;:15;:17::i;:::-;:49;;;;;87070:1;87060:7;:11;:26;;;;87085:1;87075:7;:11;87060:26;87038:49;87034:322;;;87139:9;87122:12;;87113:6;:21;;;;:::i;:::-;87112:36;;87104:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;87247:13;;87236:7;87226;:17;;;;:::i;:::-;87225:35;;;;:::i;:::-;87214:6;87198:13;87208:2;87198:9;:13::i;:::-;:22;;;;:::i;:::-;87197:63;;87189:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;87340:4;87330:14;;87034:322;87371:12;:10;:12::i;:::-;87370:13;:35;;;;;87388:17;:15;:17::i;:::-;87387:18;87370:35;87366:165;;;87455:9;87440:10;;87431:6;:19;;;;:::i;:::-;87430:34;;87422:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;87515:4;87505:14;;87366:165;87547:7;87543:225;;;87576:9;87571:186;87595:6;87591:1;:10;87571:186;;;87627:21;:9;:19;:21::i;:::-;87667:15;87685:19;:9;:17;:19::i;:::-;87667:37;;87723:18;87729:2;87733:7;87723:5;:18::i;:::-;87608:149;87603:3;;;;;:::i;:::-;;;;87571:186;;;;87543:225;86090:1685;;;;86033:1742;;:::o;37304:185::-;37442:39;37459:4;37465:2;37469:7;37442:39;;;;;;;;;;;;:16;:39::i;:::-;37304:185;;;:::o;57451:242::-;57569:41;57588:12;:10;:12::i;:::-;57602:7;57569:18;:41::i;:::-;57561:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57671:14;57677:7;57671:5;:14::i;:::-;57451:242;:::o;88295:124::-;5647:13;:11;:13::i;:::-;88396:15:::1;88381:12;:30;;;;;;:::i;:::-;;88295:124:::0;:::o;83312:30::-;;;;;;;;;;;;;:::o;52115:233::-;52190:7;52226:30;:28;:30::i;:::-;52218:5;:38;52210:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52323:10;52334:5;52323:17;;;;;;;;:::i;:::-;;;;;;;;;;52316:24;;52115:233;;;:::o;34396:223::-;34468:7;34488:13;34504:17;34513:7;34504:8;:17::i;:::-;34488:33;;34557:1;34540:19;;:5;:19;;;34532:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;34606:5;34599:12;;;34396:223;;;:::o;84250:74::-;5647:13;:11;:13::i;:::-;84311:5:::1;84299:9;;:17;;;;;;;;;;;;;;;;;;84250:74::o:0;34127:207::-;34199:7;34244:1;34227:19;;:5;:19;;;34219:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34310:9;:16;34320:5;34310:16;;;;;;;;;;;;;;;;34303:23;;34127:207;;;:::o;6409:103::-;5647:13;:11;:13::i;:::-;6474:30:::1;6501:1;6474:18;:30::i;:::-;6409:103::o:0;85664:361::-;5647:13;:11;:13::i;:::-;85767::::1;;85746:10;:17;:34;;85738:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;85801:9;85796:222;85820:10;:17;85816:1;:21;85796:222;;;85859:10;85872;85883:1;85872:13;;;;;;;;:::i;:::-;;;;;;;;85859:26;;85900:21;:9;:19;:21::i;:::-;85936:15;85954:19;:9;:17;:19::i;:::-;85936:37;;85988:18;85994:2;85998:7;85988:5;:18::i;:::-;85844:174;;85839:3;;;;;:::i;:::-;;;;85796:222;;;;85664:361:::0;:::o;83010:41::-;;;;:::o;82952:39::-;;;;:::o;85339:103::-;5647:13;:11;:13::i;:::-;85428:6:::1;85418:7;:16;;;;:::i;:::-;85403:12;:31;;;;85339:103:::0;:::o;87783:81::-;5647:13;:11;:13::i;:::-;87852:4:::1;87838:11;;:18;;;;;;;;;;;;;;;;;;87783:81::o:0;5761:87::-;5807:7;5834:6;;;;;;;;;;;5827:13;;5761:87;:::o;85121:99::-;5647:13;:11;:13::i;:::-;85206:6:::1;85196:7;:16;;;;:::i;:::-;85183:10;:29;;;;85121:99:::0;:::o;34855:104::-;34911:13;34944:7;34937:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34855:104;:::o;36441:155::-;36536:52;36555:12;:10;:12::i;:::-;36569:8;36579;36536:18;:52::i;:::-;36441:155;;:::o;85019:94::-;5647:13;:11;:13::i;:::-;85100:5:::1;85081:16;;:24;;;;;;;;;;;;;;;;;;85019:94::o:0;37560:322::-;37734:41;37753:12;:10;:12::i;:::-;37767:7;37734:18;:41::i;:::-;37726:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;37836:38;37850:4;37856:2;37860:7;37869:4;37836:13;:38::i;:::-;37560:322;;;;:::o;84170:72::-;5647:13;:11;:13::i;:::-;84230:4:::1;84218:9;;:16;;;;;;;;;;;;;;;;;;84170:72::o:0;84526:82::-;5647:13;:11;:13::i;:::-;84596:4:::1;84582:11;;:18;;;;;;;;;;;;;;;;;;84526:82::o:0;84616:84::-;5647:13;:11;:13::i;:::-;84687:5:::1;84673:11;;:19;;;;;;;;;;;;;;;;;;84616:84::o:0;35030:281::-;35103:13;35129:23;35144:7;35129:14;:23::i;:::-;35165:21;35189:10;:8;:10::i;:::-;35165:34;;35241:1;35223:7;35217:21;:25;:86;;;;;;;;;;;;;;;;;35269:7;35278:18;:7;:16;:18::i;:::-;35252:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35217:86;35210:93;;;35030:281;;;:::o;83132:31::-;;;;:::o;83170:32::-;;;;:::o;85559:97::-;85603:13;85636:12;85629:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85559:97;:::o;36667:164::-;36764:4;36788:18;:25;36807:5;36788:25;;;;;;;;;;;;;;;:35;36814:8;36788:35;;;;;;;;;;;;;;;;;;;;;;;;;36781:42;;36667:164;;;;:::o;84424:94::-;84475:4;84499:11;;;;;;;;;;;84492:18;;84424:94;:::o;6667:201::-;5647:13;:11;:13::i;:::-;6776:1:::1;6756:22;;:8;:22;;::::0;6748:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6832:28;6851:8;6832:18;:28::i;:::-;6667:201:::0;:::o;83070:41::-;;;;:::o;83271:34::-;;;;:::o;69436:114::-;69501:7;69528;:14;;;69521:21;;69436:114;;;:::o;51285:224::-;51387:4;51426:35;51411:50;;;:11;:50;;;;:90;;;;51465:36;51489:11;51465:23;:36::i;:::-;51411:90;51404:97;;51285:224;;;:::o;46017:135::-;46099:16;46107:7;46099;:16::i;:::-;46091:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46017:135;:::o;4979:98::-;5032:7;5059:10;5052:17;;4979:98;:::o;45296:174::-;45398:2;45371:15;:24;45387:7;45371:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45454:7;45450:2;45416:46;;45425:23;45440:7;45425:14;:23::i;:::-;45416:46;;;;;;;;;;;;45296:174;;:::o;5926:132::-;6001:12;:10;:12::i;:::-;5990:23;;:7;:5;:7::i;:::-;:23;;;5982:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5926:132::o;39915:264::-;40008:4;40025:13;40041:23;40056:7;40041:14;:23::i;:::-;40025:39;;40094:5;40083:16;;:7;:16;;;:52;;;;40103:32;40120:5;40127:7;40103:16;:32::i;:::-;40083:52;:87;;;;40163:7;40139:31;;:20;40151:7;40139:11;:20::i;:::-;:31;;;40083:87;40075:96;;;39915:264;;;;:::o;43914:1263::-;44073:4;44046:31;;:23;44061:7;44046:14;:23::i;:::-;:31;;;44038:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44152:1;44138:16;;:2;:16;;;44130:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44208:42;44229:4;44235:2;44239:7;44248:1;44208:20;:42::i;:::-;44380:4;44353:31;;:23;44368:7;44353:14;:23::i;:::-;:31;;;44345:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44498:15;:24;44514:7;44498:24;;;;;;;;;;;;44491:31;;;;;;;;;;;44993:1;44974:9;:15;44984:4;44974:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;45026:1;45009:9;:13;45019:2;45009:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;45068:2;45049:7;:16;45057:7;45049:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45107:7;45103:2;45088:27;;45097:4;45088:27;;;;;;;;;;;;45128:41;45148:4;45154:2;45158:7;45167:1;45128:19;:41::i;:::-;43914:1263;;;:::o;69558:127::-;69665:1;69647:7;:14;;;:19;;;;;;;;;;;69558:127;:::o;41513:942::-;41607:1;41593:16;;:2;:16;;;41585:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41666:16;41674:7;41666;:16::i;:::-;41665:17;41657:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41728:48;41757:1;41761:2;41765:7;41774:1;41728:20;:48::i;:::-;41875:16;41883:7;41875;:16::i;:::-;41874:17;41866:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42290:1;42273:9;:13;42283:2;42273:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;42334:2;42315:7;:16;42323:7;42315:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42379:7;42375:2;42354:33;;42371:1;42354:33;;;;;;;;;;;;42400:47;42428:1;42432:2;42436:7;42445:1;42400:19;:47::i;:::-;41513:942;;:::o;42794:783::-;42854:13;42870:23;42885:7;42870:14;:23::i;:::-;42854:39;;42906:51;42927:5;42942:1;42946:7;42955:1;42906:20;:51::i;:::-;43070:23;43085:7;43070:14;:23::i;:::-;43062:31;;43141:15;:24;43157:7;43141:24;;;;;;;;;;;;43134:31;;;;;;;;;;;43406:1;43386:9;:16;43396:5;43386:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;43436:7;:16;43444:7;43436:16;;;;;;;;;;;;43429:23;;;;;;;;;;;43498:7;43494:1;43470:36;;43479:5;43470:36;;;;;;;;;;;;43519:50;43539:5;43554:1;43558:7;43567:1;43519:19;:50::i;:::-;42843:734;42794:783;:::o;39190:117::-;39256:7;39283;:16;39291:7;39283:16;;;;;;;;;;;;;;;;;;;;;39276:23;;39190:117;;;:::o;7028:191::-;7102:16;7121:6;;;;;;;;;;;7102:25;;7147:8;7138:6;;:17;;;;;;;;;;;;;;;;;;7202:8;7171:40;;7192:8;7171:40;;;;;;;;;;;;7091:128;7028:191;:::o;45613:315::-;45768:8;45759:17;;:5;:17;;;45751:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45855:8;45817:18;:25;45836:5;45817:25;;;;;;;;;;;;;;;:35;45843:8;45817:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45901:8;45879:41;;45894:5;45879:41;;;45911:8;45879:41;;;;;;:::i;:::-;;;;;;;;45613:315;;;:::o;38763:313::-;38919:28;38929:4;38935:2;38939:7;38919:9;:28::i;:::-;38966:47;38989:4;38995:2;38999:7;39008:4;38966:22;:47::i;:::-;38958:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38763:313;;;;:::o;85450:101::-;85502:13;85535:8;85528:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85450:101;:::o;67133:716::-;67189:13;67240:14;67277:1;67257:17;67268:5;67257:10;:17::i;:::-;:21;67240:38;;67293:20;67327:6;67316:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67293:41;;67349:11;67478:6;67474:2;67470:15;67462:6;67458:28;67451:35;;67515:288;67522:4;67515:288;;;67547:5;;;;;;;;67689:8;67684:2;67677:5;67673:14;67668:30;67663:3;67655:44;67745:2;67736:11;;;;;;:::i;:::-;;;;;67779:1;67770:5;:10;67515:288;67766:21;67515:288;67824:6;67817:13;;;;;67133:716;;;:::o;33758:305::-;33860:4;33912:25;33897:40;;;:11;:40;;;;:105;;;;33969:33;33954:48;;;:11;:48;;;;33897:105;:158;;;;34019:36;34043:11;34019:23;:36::i;:::-;33897:158;33877:178;;33758:305;;;:::o;39620:128::-;39685:4;39738:1;39709:31;;:17;39718:7;39709:8;:17::i;:::-;:31;;;;39702:38;;39620:128;;;:::o;88497:221::-;88654:56;88681:4;88687:2;88691:7;88700:9;88654:26;:56::i;:::-;88497:221;;;;:::o;49182:158::-;;;;;:::o;46716:853::-;46870:4;46891:15;:2;:13;;;:15::i;:::-;46887:675;;;46943:2;46927:36;;;46964:12;:10;:12::i;:::-;46978:4;46984:7;46993:4;46927:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46923:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47185:1;47168:6;:13;:18;47164:328;;47211:60;;;;;;;;;;:::i;:::-;;;;;;;;47164:328;47442:6;47436:13;47427:6;47423:2;47419:15;47412:38;46923:584;47059:41;;;47049:51;;;:6;:51;;;;47042:58;;;;;46887:675;47546:4;47539:11;;46716:853;;;;;;;:::o;79963:922::-;80016:7;80036:14;80053:1;80036:18;;80103:6;80094:5;:15;80090:102;;80139:6;80130:15;;;;;;:::i;:::-;;;;;80174:2;80164:12;;;;80090:102;80219:6;80210:5;:15;80206:102;;80255:6;80246:15;;;;;;:::i;:::-;;;;;80290:2;80280:12;;;;80206:102;80335:6;80326:5;:15;80322:102;;80371:6;80362:15;;;;;;:::i;:::-;;;;;80406:2;80396:12;;;;80322:102;80451:5;80442;:14;80438:99;;80486:5;80477:14;;;;;;:::i;:::-;;;;;80520:1;80510:11;;;;80438:99;80564:5;80555;:14;80551:99;;80599:5;80590:14;;;;;;:::i;:::-;;;;;80633:1;80623:11;;;;80551:99;80677:5;80668;:14;80664:99;;80712:5;80703:14;;;;;;:::i;:::-;;;;;80746:1;80736:11;;;;80664:99;80790:5;80781;:14;80777:66;;80826:1;80816:11;;;;80777:66;80871:6;80864:13;;;79963:922;;;:::o;626:157::-;711:4;750:25;735:40;;;:11;:40;;;;728:47;;626:157;;;:::o;52422:915::-;52599:61;52626:4;52632:2;52636:12;52650:9;52599:26;:61::i;:::-;52689:1;52677:9;:13;52673:222;;;52820:63;;;;;;;;;;:::i;:::-;;;;;;;;52673:222;52907:15;52925:12;52907:30;;52970:1;52954:18;;:4;:18;;;52950:187;;52989:40;53021:7;52989:31;:40::i;:::-;52950:187;;;53059:2;53051:10;;:4;:10;;;53047:90;;53078:47;53111:4;53117:7;53078:32;:47::i;:::-;53047:90;52950:187;53165:1;53151:16;;:2;:16;;;53147:183;;53184:45;53221:7;53184:36;:45::i;:::-;53147:183;;;53257:4;53251:10;;:2;:10;;;53247:83;;53278:40;53306:2;53310:7;53278:27;:40::i;:::-;53247:83;53147:183;52588:749;52422:915;;;;:::o;58706:326::-;58766:4;59023:1;59001:7;:19;;;:23;58994:30;;58706:326;;;:::o;48301:159::-;;;;;:::o;54060:164::-;54164:10;:17;;;;54137:15;:24;54153:7;54137:24;;;;;;;;;;;:44;;;;54192:10;54208:7;54192:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54060:164;:::o;54851:988::-;55117:22;55167:1;55142:22;55159:4;55142:16;:22::i;:::-;:26;;;;:::i;:::-;55117:51;;55179:18;55200:17;:26;55218:7;55200:26;;;;;;;;;;;;55179:47;;55347:14;55333:10;:28;55329:328;;55378:19;55400:12;:18;55413:4;55400:18;;;;;;;;;;;;;;;:34;55419:14;55400:34;;;;;;;;;;;;55378:56;;55484:11;55451:12;:18;55464:4;55451:18;;;;;;;;;;;;;;;:30;55470:10;55451:30;;;;;;;;;;;:44;;;;55601:10;55568:17;:30;55586:11;55568:30;;;;;;;;;;;:43;;;;55363:294;55329:328;55753:17;:26;55771:7;55753:26;;;;;;;;;;;55746:33;;;55797:12;:18;55810:4;55797:18;;;;;;;;;;;;;;;:34;55816:14;55797:34;;;;;;;;;;;55790:41;;;54932:907;;54851:988;;:::o;56134:1079::-;56387:22;56432:1;56412:10;:17;;;;:21;;;;:::i;:::-;56387:46;;56444:18;56465:15;:24;56481:7;56465:24;;;;;;;;;;;;56444:45;;56816:19;56838:10;56849:14;56838:26;;;;;;;;:::i;:::-;;;;;;;;;;56816:48;;56902:11;56877:10;56888;56877:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;57013:10;56982:15;:28;56998:11;56982:28;;;;;;;;;;;:41;;;;57154:15;:24;57170:7;57154:24;;;;;;;;;;;57147:31;;;57189:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56205:1008;;;56134:1079;:::o;53638:221::-;53723:14;53740:20;53757:2;53740:16;:20::i;:::-;53723:37;;53798:7;53771:12;:16;53784:2;53771:16;;;;;;;;;;;;;;;:24;53788:6;53771:24;;;;;;;;;;;:34;;;;53845:6;53816:17;:26;53834:7;53816:26;;;;;;;;;;;:35;;;;53712:147;53638:221;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:311::-;8905:4;8995:18;8987:6;8984:30;8981:56;;;9017:18;;:::i;:::-;8981:56;9067:4;9059:6;9055:17;9047:25;;9127:4;9121;9117:15;9109:23;;8828:311;;;:::o;9145:117::-;9254:1;9251;9244:12;9285:710;9381:5;9406:81;9422:64;9479:6;9422:64;:::i;:::-;9406:81;:::i;:::-;9397:90;;9507:5;9536:6;9529:5;9522:21;9570:4;9563:5;9559:16;9552:23;;9623:4;9615:6;9611:17;9603:6;9599:30;9652:3;9644:6;9641:15;9638:122;;;9671:79;;:::i;:::-;9638:122;9786:6;9769:220;9803:6;9798:3;9795:15;9769:220;;;9878:3;9907:37;9940:3;9928:10;9907:37;:::i;:::-;9902:3;9895:50;9974:4;9969:3;9965:14;9958:21;;9845:144;9829:4;9824:3;9820:14;9813:21;;9769:220;;;9773:21;9387:608;;9285:710;;;;;:::o;10018:370::-;10089:5;10138:3;10131:4;10123:6;10119:17;10115:27;10105:122;;10146:79;;:::i;:::-;10105:122;10263:6;10250:20;10288:94;10378:3;10370:6;10363:4;10355:6;10351:17;10288:94;:::i;:::-;10279:103;;10095:293;10018:370;;;;:::o;10394:539::-;10478:6;10527:2;10515:9;10506:7;10502:23;10498:32;10495:119;;;10533:79;;:::i;:::-;10495:119;10681:1;10670:9;10666:17;10653:31;10711:18;10703:6;10700:30;10697:117;;;10733:79;;:::i;:::-;10697:117;10838:78;10908:7;10899:6;10888:9;10884:22;10838:78;:::i;:::-;10828:88;;10624:302;10394:539;;;;:::o;10939:116::-;11009:21;11024:5;11009:21;:::i;:::-;11002:5;10999:32;10989:60;;11045:1;11042;11035:12;10989:60;10939:116;:::o;11061:133::-;11104:5;11142:6;11129:20;11120:29;;11158:30;11182:5;11158:30;:::i;:::-;11061:133;;;;:::o;11200:468::-;11265:6;11273;11322:2;11310:9;11301:7;11297:23;11293:32;11290:119;;;11328:79;;:::i;:::-;11290:119;11448:1;11473:53;11518:7;11509:6;11498:9;11494:22;11473:53;:::i;:::-;11463:63;;11419:117;11575:2;11601:50;11643:7;11634:6;11623:9;11619:22;11601:50;:::i;:::-;11591:60;;11546:115;11200:468;;;;;:::o;11674:307::-;11735:4;11825:18;11817:6;11814:30;11811:56;;;11847:18;;:::i;:::-;11811:56;11885:29;11907:6;11885:29;:::i;:::-;11877:37;;11969:4;11963;11959:15;11951:23;;11674:307;;;:::o;11987:423::-;12064:5;12089:65;12105:48;12146:6;12105:48;:::i;:::-;12089:65;:::i;:::-;12080:74;;12177:6;12170:5;12163:21;12215:4;12208:5;12204:16;12253:3;12244:6;12239:3;12235:16;12232:25;12229:112;;;12260:79;;:::i;:::-;12229:112;12350:54;12397:6;12392:3;12387;12350:54;:::i;:::-;12070:340;11987:423;;;;;:::o;12429:338::-;12484:5;12533:3;12526:4;12518:6;12514:17;12510:27;12500:122;;12541:79;;:::i;:::-;12500:122;12658:6;12645:20;12683:78;12757:3;12749:6;12742:4;12734:6;12730:17;12683:78;:::i;:::-;12674:87;;12490:277;12429:338;;;;:::o;12773:943::-;12868:6;12876;12884;12892;12941:3;12929:9;12920:7;12916:23;12912:33;12909:120;;;12948:79;;:::i;:::-;12909:120;13068:1;13093:53;13138:7;13129:6;13118:9;13114:22;13093:53;:::i;:::-;13083:63;;13039:117;13195:2;13221:53;13266:7;13257:6;13246:9;13242:22;13221:53;:::i;:::-;13211:63;;13166:118;13323:2;13349:53;13394:7;13385:6;13374:9;13370:22;13349:53;:::i;:::-;13339:63;;13294:118;13479:2;13468:9;13464:18;13451:32;13510:18;13502:6;13499:30;13496:117;;;13532:79;;:::i;:::-;13496:117;13637:62;13691:7;13682:6;13671:9;13667:22;13637:62;:::i;:::-;13627:72;;13422:287;12773:943;;;;;;;:::o;13722:474::-;13790:6;13798;13847:2;13835:9;13826:7;13822:23;13818:32;13815:119;;;13853:79;;:::i;:::-;13815:119;13973:1;13998:53;14043:7;14034:6;14023:9;14019:22;13998:53;:::i;:::-;13988:63;;13944:117;14100:2;14126:53;14171:7;14162:6;14151:9;14147:22;14126:53;:::i;:::-;14116:63;;14071:118;13722:474;;;;;:::o;14202:180::-;14250:77;14247:1;14240:88;14347:4;14344:1;14337:15;14371:4;14368:1;14361:15;14388:320;14432:6;14469:1;14463:4;14459:12;14449:22;;14516:1;14510:4;14506:12;14537:18;14527:81;;14593:4;14585:6;14581:17;14571:27;;14527:81;14655:2;14647:6;14644:14;14624:18;14621:38;14618:84;;14674:18;;:::i;:::-;14618:84;14439:269;14388:320;;;:::o;14714:220::-;14854:34;14850:1;14842:6;14838:14;14831:58;14923:3;14918:2;14910:6;14906:15;14899:28;14714:220;:::o;14940:366::-;15082:3;15103:67;15167:2;15162:3;15103:67;:::i;:::-;15096:74;;15179:93;15268:3;15179:93;:::i;:::-;15297:2;15292:3;15288:12;15281:19;;14940:366;;;:::o;15312:419::-;15478:4;15516:2;15505:9;15501:18;15493:26;;15565:9;15559:4;15555:20;15551:1;15540:9;15536:17;15529:47;15593:131;15719:4;15593:131;:::i;:::-;15585:139;;15312:419;;;:::o;15737:248::-;15877:34;15873:1;15865:6;15861:14;15854:58;15946:31;15941:2;15933:6;15929:15;15922:56;15737:248;:::o;15991:366::-;16133:3;16154:67;16218:2;16213:3;16154:67;:::i;:::-;16147:74;;16230:93;16319:3;16230:93;:::i;:::-;16348:2;16343:3;16339:12;16332:19;;15991:366;;;:::o;16363:419::-;16529:4;16567:2;16556:9;16552:18;16544:26;;16616:9;16610:4;16606:20;16602:1;16591:9;16587:17;16580:47;16644:131;16770:4;16644:131;:::i;:::-;16636:139;;16363:419;;;:::o;16788:180::-;16836:77;16833:1;16826:88;16933:4;16930:1;16923:15;16957:4;16954:1;16947:15;16974:410;17014:7;17037:20;17055:1;17037:20;:::i;:::-;17032:25;;17071:20;17089:1;17071:20;:::i;:::-;17066:25;;17126:1;17123;17119:9;17148:30;17166:11;17148:30;:::i;:::-;17137:41;;17327:1;17318:7;17314:15;17311:1;17308:22;17288:1;17281:9;17261:83;17238:139;;17357:18;;:::i;:::-;17238:139;17022:362;16974:410;;;;:::o;17390:232::-;17530:34;17526:1;17518:6;17514:14;17507:58;17599:15;17594:2;17586:6;17582:15;17575:40;17390:232;:::o;17628:366::-;17770:3;17791:67;17855:2;17850:3;17791:67;:::i;:::-;17784:74;;17867:93;17956:3;17867:93;:::i;:::-;17985:2;17980:3;17976:12;17969:19;;17628:366;;;:::o;18000:419::-;18166:4;18204:2;18193:9;18189:18;18181:26;;18253:9;18247:4;18243:20;18239:1;18228:9;18224:17;18217:47;18281:131;18407:4;18281:131;:::i;:::-;18273:139;;18000:419;;;:::o;18425:230::-;18565:34;18561:1;18553:6;18549:14;18542:58;18634:13;18629:2;18621:6;18617:15;18610:38;18425:230;:::o;18661:366::-;18803:3;18824:67;18888:2;18883:3;18824:67;:::i;:::-;18817:74;;18900:93;18989:3;18900:93;:::i;:::-;19018:2;19013:3;19009:12;19002:19;;18661:366;;;:::o;19033:419::-;19199:4;19237:2;19226:9;19222:18;19214:26;;19286:9;19280:4;19276:20;19272:1;19261:9;19257:17;19250:47;19314:131;19440:4;19314:131;:::i;:::-;19306:139;;19033:419;;;:::o;19458:147::-;19559:11;19596:3;19581:18;;19458:147;;;;:::o;19611:114::-;;:::o;19731:398::-;19890:3;19911:83;19992:1;19987:3;19911:83;:::i;:::-;19904:90;;20003:93;20092:3;20003:93;:::i;:::-;20121:1;20116:3;20112:11;20105:18;;19731:398;;;:::o;20135:379::-;20319:3;20341:147;20484:3;20341:147;:::i;:::-;20334:154;;20505:3;20498:10;;20135:379;;;:::o;20520:165::-;20660:17;20656:1;20648:6;20644:14;20637:41;20520:165;:::o;20691:366::-;20833:3;20854:67;20918:2;20913:3;20854:67;:::i;:::-;20847:74;;20930:93;21019:3;20930:93;:::i;:::-;21048:2;21043:3;21039:12;21032:19;;20691:366;;;:::o;21063:419::-;21229:4;21267:2;21256:9;21252:18;21244:26;;21316:9;21310:4;21306:20;21302:1;21291:9;21287:17;21280:47;21344:131;21470:4;21344:131;:::i;:::-;21336:139;;21063:419;;;:::o;21488:141::-;21537:4;21560:3;21552:11;;21583:3;21580:1;21573:14;21617:4;21614:1;21604:18;21596:26;;21488:141;;;:::o;21635:93::-;21672:6;21719:2;21714;21707:5;21703:14;21699:23;21689:33;;21635:93;;;:::o;21734:107::-;21778:8;21828:5;21822:4;21818:16;21797:37;;21734:107;;;;:::o;21847:393::-;21916:6;21966:1;21954:10;21950:18;21989:97;22019:66;22008:9;21989:97;:::i;:::-;22107:39;22137:8;22126:9;22107:39;:::i;:::-;22095:51;;22179:4;22175:9;22168:5;22164:21;22155:30;;22228:4;22218:8;22214:19;22207:5;22204:30;22194:40;;21923:317;;21847:393;;;;;:::o;22246:60::-;22274:3;22295:5;22288:12;;22246:60;;;:::o;22312:142::-;22362:9;22395:53;22413:34;22422:24;22440:5;22422:24;:::i;:::-;22413:34;:::i;:::-;22395:53;:::i;:::-;22382:66;;22312:142;;;:::o;22460:75::-;22503:3;22524:5;22517:12;;22460:75;;;:::o;22541:269::-;22651:39;22682:7;22651:39;:::i;:::-;22712:91;22761:41;22785:16;22761:41;:::i;:::-;22753:6;22746:4;22740:11;22712:91;:::i;:::-;22706:4;22699:105;22617:193;22541:269;;;:::o;22816:73::-;22861:3;22816:73;:::o;22895:189::-;22972:32;;:::i;:::-;23013:65;23071:6;23063;23057:4;23013:65;:::i;:::-;22948:136;22895:189;;:::o;23090:186::-;23150:120;23167:3;23160:5;23157:14;23150:120;;;23221:39;23258:1;23251:5;23221:39;:::i;:::-;23194:1;23187:5;23183:13;23174:22;;23150:120;;;23090:186;;:::o;23282:543::-;23383:2;23378:3;23375:11;23372:446;;;23417:38;23449:5;23417:38;:::i;:::-;23501:29;23519:10;23501:29;:::i;:::-;23491:8;23487:44;23684:2;23672:10;23669:18;23666:49;;;23705:8;23690:23;;23666:49;23728:80;23784:22;23802:3;23784:22;:::i;:::-;23774:8;23770:37;23757:11;23728:80;:::i;:::-;23387:431;;23372:446;23282:543;;;:::o;23831:117::-;23885:8;23935:5;23929:4;23925:16;23904:37;;23831:117;;;;:::o;23954:169::-;23998:6;24031:51;24079:1;24075:6;24067:5;24064:1;24060:13;24031:51;:::i;:::-;24027:56;24112:4;24106;24102:15;24092:25;;24005:118;23954:169;;;;:::o;24128:295::-;24204:4;24350:29;24375:3;24369:4;24350:29;:::i;:::-;24342:37;;24412:3;24409:1;24405:11;24399:4;24396:21;24388:29;;24128:295;;;;:::o;24428:1395::-;24545:37;24578:3;24545:37;:::i;:::-;24647:18;24639:6;24636:30;24633:56;;;24669:18;;:::i;:::-;24633:56;24713:38;24745:4;24739:11;24713:38;:::i;:::-;24798:67;24858:6;24850;24844:4;24798:67;:::i;:::-;24892:1;24916:4;24903:17;;24948:2;24940:6;24937:14;24965:1;24960:618;;;;25622:1;25639:6;25636:77;;;25688:9;25683:3;25679:19;25673:26;25664:35;;25636:77;25739:67;25799:6;25792:5;25739:67;:::i;:::-;25733:4;25726:81;25595:222;24930:887;;24960:618;25012:4;25008:9;25000:6;24996:22;25046:37;25078:4;25046:37;:::i;:::-;25105:1;25119:208;25133:7;25130:1;25127:14;25119:208;;;25212:9;25207:3;25203:19;25197:26;25189:6;25182:42;25263:1;25255:6;25251:14;25241:24;;25310:2;25299:9;25295:18;25282:31;;25156:4;25153:1;25149:12;25144:17;;25119:208;;;25355:6;25346:7;25343:19;25340:179;;;25413:9;25408:3;25404:19;25398:26;25456:48;25498:4;25490:6;25486:17;25475:9;25456:48;:::i;:::-;25448:6;25441:64;25363:156;25340:179;25565:1;25561;25553:6;25549:14;25545:22;25539:4;25532:36;24967:611;;;24930:887;;24520:1303;;;24428:1395;;:::o;25829:164::-;25969:16;25965:1;25957:6;25953:14;25946:40;25829:164;:::o;25999:366::-;26141:3;26162:67;26226:2;26221:3;26162:67;:::i;:::-;26155:74;;26238:93;26327:3;26238:93;:::i;:::-;26356:2;26351:3;26347:12;26340:19;;25999:366;;;:::o;26371:419::-;26537:4;26575:2;26564:9;26560:18;26552:26;;26624:9;26618:4;26614:20;26610:1;26599:9;26595:17;26588:47;26652:131;26778:4;26652:131;:::i;:::-;26644:139;;26371:419;;;:::o;26796:181::-;26936:33;26932:1;26924:6;26920:14;26913:57;26796:181;:::o;26983:366::-;27125:3;27146:67;27210:2;27205:3;27146:67;:::i;:::-;27139:74;;27222:93;27311:3;27222:93;:::i;:::-;27340:2;27335:3;27331:12;27324:19;;26983:366;;;:::o;27355:419::-;27521:4;27559:2;27548:9;27544:18;27536:26;;27608:9;27602:4;27598:20;27594:1;27583:9;27579:17;27572:47;27636:131;27762:4;27636:131;:::i;:::-;27628:139;;27355:419;;;:::o;27780:224::-;27920:34;27916:1;27908:6;27904:14;27897:58;27989:7;27984:2;27976:6;27972:15;27965:32;27780:224;:::o;28010:366::-;28152:3;28173:67;28237:2;28232:3;28173:67;:::i;:::-;28166:74;;28249:93;28338:3;28249:93;:::i;:::-;28367:2;28362:3;28358:12;28351:19;;28010:366;;;:::o;28382:419::-;28548:4;28586:2;28575:9;28571:18;28563:26;;28635:9;28629:4;28625:20;28621:1;28610:9;28606:17;28599:47;28663:131;28789:4;28663:131;:::i;:::-;28655:139;;28382:419;;;:::o;28807:191::-;28847:3;28866:20;28884:1;28866:20;:::i;:::-;28861:25;;28900:20;28918:1;28900:20;:::i;:::-;28895:25;;28943:1;28940;28936:9;28929:16;;28964:3;28961:1;28958:10;28955:36;;;28971:18;;:::i;:::-;28955:36;28807:191;;;;:::o;29004:194::-;29044:4;29064:20;29082:1;29064:20;:::i;:::-;29059:25;;29098:20;29116:1;29098:20;:::i;:::-;29093:25;;29142:1;29139;29135:9;29127:17;;29166:1;29160:4;29157:11;29154:37;;;29171:18;;:::i;:::-;29154:37;29004:194;;;;:::o;29204:180::-;29344:32;29340:1;29332:6;29328:14;29321:56;29204:180;:::o;29390:366::-;29532:3;29553:67;29617:2;29612:3;29553:67;:::i;:::-;29546:74;;29629:93;29718:3;29629:93;:::i;:::-;29747:2;29742:3;29738:12;29731:19;;29390:366;;;:::o;29762:419::-;29928:4;29966:2;29955:9;29951:18;29943:26;;30015:9;30009:4;30005:20;30001:1;29990:9;29986:17;29979:47;30043:131;30169:4;30043:131;:::i;:::-;30035:139;;29762:419;;;:::o;30187:182::-;30327:34;30323:1;30315:6;30311:14;30304:58;30187:182;:::o;30375:366::-;30517:3;30538:67;30602:2;30597:3;30538:67;:::i;:::-;30531:74;;30614:93;30703:3;30614:93;:::i;:::-;30732:2;30727:3;30723:12;30716:19;;30375:366;;;:::o;30747:419::-;30913:4;30951:2;30940:9;30936:18;30928:26;;31000:9;30994:4;30990:20;30986:1;30975:9;30971:17;30964:47;31028:131;31154:4;31028:131;:::i;:::-;31020:139;;30747:419;;;:::o;31172:85::-;31217:7;31246:5;31235:16;;31172:85;;;:::o;31263:158::-;31321:9;31354:61;31372:42;31381:32;31407:5;31381:32;:::i;:::-;31372:42;:::i;:::-;31354:61;:::i;:::-;31341:74;;31263:158;;;:::o;31427:147::-;31522:45;31561:5;31522:45;:::i;:::-;31517:3;31510:58;31427:147;;:::o;31580:348::-;31709:4;31747:2;31736:9;31732:18;31724:26;;31760:71;31828:1;31817:9;31813:17;31804:6;31760:71;:::i;:::-;31841:80;31917:2;31906:9;31902:18;31893:6;31841:80;:::i;:::-;31580:348;;;;;:::o;31934:143::-;31991:5;32022:6;32016:13;32007:22;;32038:33;32065:5;32038:33;:::i;:::-;31934:143;;;;:::o;32083:351::-;32153:6;32202:2;32190:9;32181:7;32177:23;32173:32;32170:119;;;32208:79;;:::i;:::-;32170:119;32328:1;32353:64;32409:7;32400:6;32389:9;32385:22;32353:64;:::i;:::-;32343:74;;32299:128;32083:351;;;;:::o;32440:85::-;32485:7;32514:5;32503:16;;32440:85;;;:::o;32531:158::-;32589:9;32622:61;32640:42;32649:32;32675:5;32649:32;:::i;:::-;32640:42;:::i;:::-;32622:61;:::i;:::-;32609:74;;32531:158;;;:::o;32695:147::-;32790:45;32829:5;32790:45;:::i;:::-;32785:3;32778:58;32695:147;;:::o;32848:348::-;32977:4;33015:2;33004:9;33000:18;32992:26;;33028:71;33096:1;33085:9;33081:17;33072:6;33028:71;:::i;:::-;33109:80;33185:2;33174:9;33170:18;33161:6;33109:80;:::i;:::-;32848:348;;;;;:::o;33202:171::-;33342:23;33338:1;33330:6;33326:14;33319:47;33202:171;:::o;33379:366::-;33521:3;33542:67;33606:2;33601:3;33542:67;:::i;:::-;33535:74;;33618:93;33707:3;33618:93;:::i;:::-;33736:2;33731:3;33727:12;33720:19;;33379:366;;;:::o;33751:419::-;33917:4;33955:2;33944:9;33940:18;33932:26;;34004:9;33998:4;33994:20;33990:1;33979:9;33975:17;33968:47;34032:131;34158:4;34032:131;:::i;:::-;34024:139;;33751:419;;;:::o;34176:231::-;34316:34;34312:1;34304:6;34300:14;34293:58;34385:14;34380:2;34372:6;34368:15;34361:39;34176:231;:::o;34413:366::-;34555:3;34576:67;34640:2;34635:3;34576:67;:::i;:::-;34569:74;;34652:93;34741:3;34652:93;:::i;:::-;34770:2;34765:3;34761:12;34754:19;;34413:366;;;:::o;34785:419::-;34951:4;34989:2;34978:9;34974:18;34966:26;;35038:9;35032:4;35028:20;35024:1;35013:9;35009:17;35002:47;35066:131;35192:4;35066:131;:::i;:::-;35058:139;;34785:419;;;:::o;35210:237::-;35350:34;35346:1;35338:6;35334:14;35327:58;35419:20;35414:2;35406:6;35402:15;35395:45;35210:237;:::o;35453:366::-;35595:3;35616:67;35680:2;35675:3;35616:67;:::i;:::-;35609:74;;35692:93;35781:3;35692:93;:::i;:::-;35810:2;35805:3;35801:12;35794:19;;35453:366;;;:::o;35825:419::-;35991:4;36029:2;36018:9;36014:18;36006:26;;36078:9;36072:4;36068:20;36064:1;36053:9;36049:17;36042:47;36106:131;36232:4;36106:131;:::i;:::-;36098:139;;35825:419;;;:::o;36250:233::-;36289:3;36312:24;36330:5;36312:24;:::i;:::-;36303:33;;36358:66;36351:5;36348:77;36345:103;;36428:18;;:::i;:::-;36345:103;36475:1;36468:5;36464:13;36457:20;;36250:233;;;:::o;36489:231::-;36629:34;36625:1;36617:6;36613:14;36606:58;36698:14;36693:2;36685:6;36681:15;36674:39;36489:231;:::o;36726:366::-;36868:3;36889:67;36953:2;36948:3;36889:67;:::i;:::-;36882:74;;36965:93;37054:3;36965:93;:::i;:::-;37083:2;37078:3;37074:12;37067:19;;36726:366;;;:::o;37098:419::-;37264:4;37302:2;37291:9;37287:18;37279:26;;37351:9;37345:4;37341:20;37337:1;37326:9;37322:17;37315:47;37379:131;37505:4;37379:131;:::i;:::-;37371:139;;37098:419;;;:::o;37523:180::-;37571:77;37568:1;37561:88;37668:4;37665:1;37658:15;37692:4;37689:1;37682:15;37709:174;37849:26;37845:1;37837:6;37833:14;37826:50;37709:174;:::o;37889:366::-;38031:3;38052:67;38116:2;38111:3;38052:67;:::i;:::-;38045:74;;38128:93;38217:3;38128:93;:::i;:::-;38246:2;38241:3;38237:12;38230:19;;37889:366;;;:::o;38261:419::-;38427:4;38465:2;38454:9;38450:18;38442:26;;38514:9;38508:4;38504:20;38500:1;38489:9;38485:17;38478:47;38542:131;38668:4;38542:131;:::i;:::-;38534:139;;38261:419;;;:::o;38686:228::-;38826:34;38822:1;38814:6;38810:14;38803:58;38895:11;38890:2;38882:6;38878:15;38871:36;38686:228;:::o;38920:366::-;39062:3;39083:67;39147:2;39142:3;39083:67;:::i;:::-;39076:74;;39159:93;39248:3;39159:93;:::i;:::-;39277:2;39272:3;39268:12;39261:19;;38920:366;;;:::o;39292:419::-;39458:4;39496:2;39485:9;39481:18;39473:26;;39545:9;39539:4;39535:20;39531:1;39520:9;39516:17;39509:47;39573:131;39699:4;39573:131;:::i;:::-;39565:139;;39292:419;;;:::o;39717:364::-;39859:3;39880:66;39944:1;39939:3;39880:66;:::i;:::-;39873:73;;39955:93;40044:3;39955:93;:::i;:::-;40073:1;40068:3;40064:11;40057:18;;39717:364;;;:::o;40087:419::-;40253:4;40291:2;40280:9;40276:18;40268:26;;40340:9;40334:4;40330:20;40326:1;40315:9;40311:17;40304:47;40368:131;40494:4;40368:131;:::i;:::-;40360:139;;40087:419;;;:::o;40512:148::-;40614:11;40651:3;40636:18;;40512:148;;;;:::o;40666:390::-;40772:3;40800:39;40833:5;40800:39;:::i;:::-;40855:89;40937:6;40932:3;40855:89;:::i;:::-;40848:96;;40953:65;41011:6;41006:3;40999:4;40992:5;40988:16;40953:65;:::i;:::-;41043:6;41038:3;41034:16;41027:23;;40776:280;40666:390;;;;:::o;41062:435::-;41242:3;41264:95;41355:3;41346:6;41264:95;:::i;:::-;41257:102;;41376:95;41467:3;41458:6;41376:95;:::i;:::-;41369:102;;41488:3;41481:10;;41062:435;;;;;:::o;41503:225::-;41643:34;41639:1;41631:6;41627:14;41620:58;41712:8;41707:2;41699:6;41695:15;41688:33;41503:225;:::o;41734:366::-;41876:3;41897:67;41961:2;41956:3;41897:67;:::i;:::-;41890:74;;41973:93;42062:3;41973:93;:::i;:::-;42091:2;42086:3;42082:12;42075:19;;41734:366;;;:::o;42106:419::-;42272:4;42310:2;42299:9;42295:18;42287:26;;42359:9;42353:4;42349:20;42345:1;42334:9;42330:17;42323:47;42387:131;42513:4;42387:131;:::i;:::-;42379:139;;42106:419;;;:::o;42531:182::-;42671:34;42667:1;42659:6;42655:14;42648:58;42531:182;:::o;42719:366::-;42861:3;42882:67;42946:2;42941:3;42882:67;:::i;:::-;42875:74;;42958:93;43047:3;42958:93;:::i;:::-;43076:2;43071:3;43067:12;43060:19;;42719:366;;;:::o;43091:419::-;43257:4;43295:2;43284:9;43280:18;43272:26;;43344:9;43338:4;43334:20;43330:1;43319:9;43315:17;43308:47;43372:131;43498:4;43372:131;:::i;:::-;43364:139;;43091:419;;;:::o;43516:224::-;43656:34;43652:1;43644:6;43640:14;43633:58;43725:7;43720:2;43712:6;43708:15;43701:32;43516:224;:::o;43746:366::-;43888:3;43909:67;43973:2;43968:3;43909:67;:::i;:::-;43902:74;;43985:93;44074:3;43985:93;:::i;:::-;44103:2;44098:3;44094:12;44087:19;;43746:366;;;:::o;44118:419::-;44284:4;44322:2;44311:9;44307:18;44299:26;;44371:9;44365:4;44361:20;44357:1;44346:9;44342:17;44335:47;44399:131;44525:4;44399:131;:::i;:::-;44391:139;;44118:419;;;:::o;44543:223::-;44683:34;44679:1;44671:6;44667:14;44660:58;44752:6;44747:2;44739:6;44735:15;44728:31;44543:223;:::o;44772:366::-;44914:3;44935:67;44999:2;44994:3;44935:67;:::i;:::-;44928:74;;45011:93;45100:3;45011:93;:::i;:::-;45129:2;45124:3;45120:12;45113:19;;44772:366;;;:::o;45144:419::-;45310:4;45348:2;45337:9;45333:18;45325:26;;45397:9;45391:4;45387:20;45383:1;45372:9;45368:17;45361:47;45425:131;45551:4;45425:131;:::i;:::-;45417:139;;45144:419;;;:::o;45569:182::-;45709:34;45705:1;45697:6;45693:14;45686:58;45569:182;:::o;45757:366::-;45899:3;45920:67;45984:2;45979:3;45920:67;:::i;:::-;45913:74;;45996:93;46085:3;45996:93;:::i;:::-;46114:2;46109:3;46105:12;46098:19;;45757:366;;;:::o;46129:419::-;46295:4;46333:2;46322:9;46318:18;46310:26;;46382:9;46376:4;46372:20;46368:1;46357:9;46353:17;46346:47;46410:131;46536:4;46410:131;:::i;:::-;46402:139;;46129:419;;;:::o;46554:178::-;46694:30;46690:1;46682:6;46678:14;46671:54;46554:178;:::o;46738:366::-;46880:3;46901:67;46965:2;46960:3;46901:67;:::i;:::-;46894:74;;46977:93;47066:3;46977:93;:::i;:::-;47095:2;47090:3;47086:12;47079:19;;46738:366;;;:::o;47110:419::-;47276:4;47314:2;47303:9;47299:18;47291:26;;47363:9;47357:4;47353:20;47349:1;47338:9;47334:17;47327:47;47391:131;47517:4;47391:131;:::i;:::-;47383:139;;47110:419;;;:::o;47535:175::-;47675:27;47671:1;47663:6;47659:14;47652:51;47535:175;:::o;47716:366::-;47858:3;47879:67;47943:2;47938:3;47879:67;:::i;:::-;47872:74;;47955:93;48044:3;47955:93;:::i;:::-;48073:2;48068:3;48064:12;48057:19;;47716:366;;;:::o;48088:419::-;48254:4;48292:2;48281:9;48277:18;48269:26;;48341:9;48335:4;48331:20;48327:1;48316:9;48312:17;48305:47;48369:131;48495:4;48369:131;:::i;:::-;48361:139;;48088:419;;;:::o;48513:237::-;48653:34;48649:1;48641:6;48637:14;48630:58;48722:20;48717:2;48709:6;48705:15;48698:45;48513:237;:::o;48756:366::-;48898:3;48919:67;48983:2;48978:3;48919:67;:::i;:::-;48912:74;;48995:93;49084:3;48995:93;:::i;:::-;49113:2;49108:3;49104:12;49097:19;;48756:366;;;:::o;49128:419::-;49294:4;49332:2;49321:9;49317:18;49309:26;;49381:9;49375:4;49371:20;49367:1;49356:9;49352:17;49345:47;49409:131;49535:4;49409:131;:::i;:::-;49401:139;;49128:419;;;:::o;49553:180::-;49601:77;49598:1;49591:88;49698:4;49695:1;49688:15;49722:4;49719:1;49712:15;49739:98;49790:6;49824:5;49818:12;49808:22;;49739:98;;;:::o;49843:168::-;49926:11;49960:6;49955:3;49948:19;50000:4;49995:3;49991:14;49976:29;;49843:168;;;;:::o;50017:373::-;50103:3;50131:38;50163:5;50131:38;:::i;:::-;50185:70;50248:6;50243:3;50185:70;:::i;:::-;50178:77;;50264:65;50322:6;50317:3;50310:4;50303:5;50299:16;50264:65;:::i;:::-;50354:29;50376:6;50354:29;:::i;:::-;50349:3;50345:39;50338:46;;50107:283;50017:373;;;;:::o;50396:640::-;50591:4;50629:3;50618:9;50614:19;50606:27;;50643:71;50711:1;50700:9;50696:17;50687:6;50643:71;:::i;:::-;50724:72;50792:2;50781:9;50777:18;50768:6;50724:72;:::i;:::-;50806;50874:2;50863:9;50859:18;50850:6;50806:72;:::i;:::-;50925:9;50919:4;50915:20;50910:2;50899:9;50895:18;50888:48;50953:76;51024:4;51015:6;50953:76;:::i;:::-;50945:84;;50396:640;;;;;;;:::o;51042:141::-;51098:5;51129:6;51123:13;51114:22;;51145:32;51171:5;51145:32;:::i;:::-;51042:141;;;;:::o;51189:349::-;51258:6;51307:2;51295:9;51286:7;51282:23;51278:32;51275:119;;;51313:79;;:::i;:::-;51275:119;51433:1;51458:63;51513:7;51504:6;51493:9;51489:22;51458:63;:::i;:::-;51448:73;;51404:127;51189:349;;;;:::o;51544:240::-;51684:34;51680:1;51672:6;51668:14;51661:58;51753:23;51748:2;51740:6;51736:15;51729:48;51544:240;:::o;51790:366::-;51932:3;51953:67;52017:2;52012:3;51953:67;:::i;:::-;51946:74;;52029:93;52118:3;52029:93;:::i;:::-;52147:2;52142:3;52138:12;52131:19;;51790:366;;;:::o;52162:419::-;52328:4;52366:2;52355:9;52351:18;52343:26;;52415:9;52409:4;52405:20;52401:1;52390:9;52386:17;52379:47;52443:131;52569:4;52443:131;:::i;:::-;52435:139;;52162:419;;;:::o;52587:180::-;52635:77;52632:1;52625:88;52732:4;52729:1;52722:15;52756:4;52753:1;52746:15
Swarm Source
ipfs://8e8b0a22eaf3a0ba70f6af50ea4b8965e8922992a28ac0d217cbae093ac11e08
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.