More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,003 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake721 | 21412001 | 12 days ago | IN | 0 ETH | 0.00242195 | ||||
Unstake721 | 21390961 | 15 days ago | IN | 0 ETH | 0.00426381 | ||||
Unstake721 | 21390956 | 15 days ago | IN | 0 ETH | 0.00257858 | ||||
Unstake721 | 21309557 | 26 days ago | IN | 0 ETH | 0.00244559 | ||||
Unstake721 | 21276404 | 31 days ago | IN | 0 ETH | 0.00142918 | ||||
Unstake721 | 21276400 | 31 days ago | IN | 0 ETH | 0.00116415 | ||||
Unstake721 | 21100005 | 55 days ago | IN | 0 ETH | 0.00070754 | ||||
Unstake721 | 21002928 | 69 days ago | IN | 0 ETH | 0.00103291 | ||||
Unstake721 | 21002916 | 69 days ago | IN | 0 ETH | 0.0013903 | ||||
Unstake721 | 21002914 | 69 days ago | IN | 0 ETH | 0.00096484 | ||||
Unstake721 | 20830985 | 93 days ago | IN | 0 ETH | 0.00200308 | ||||
Unstake721 | 20805905 | 96 days ago | IN | 0 ETH | 0.00118853 | ||||
Unstake721 | 20805767 | 96 days ago | IN | 0 ETH | 0.00192238 | ||||
Unstake721 | 20746500 | 105 days ago | IN | 0 ETH | 0.00025978 | ||||
Unstake721 | 20746498 | 105 days ago | IN | 0 ETH | 0.00021837 | ||||
Unstake721 | 20705622 | 110 days ago | IN | 0 ETH | 0.00037974 | ||||
Unstake721 | 20448071 | 146 days ago | IN | 0 ETH | 0.00018741 | ||||
Unstake721 | 20235273 | 176 days ago | IN | 0 ETH | 0.00120422 | ||||
Unstake721 | 20222512 | 178 days ago | IN | 0 ETH | 0.00028981 | ||||
Unstake721 | 20222505 | 178 days ago | IN | 0 ETH | 0.00026671 | ||||
Unstake721 | 20222068 | 178 days ago | IN | 0 ETH | 0.00040607 | ||||
Unstake721 | 20219658 | 178 days ago | IN | 0 ETH | 0.00090255 | ||||
Unstake721 | 20219649 | 178 days ago | IN | 0 ETH | 0.00204657 | ||||
Unstake721 | 20216056 | 179 days ago | IN | 0 ETH | 0.00032466 | ||||
Unstake721 | 20216034 | 179 days ago | IN | 0 ETH | 0.00038197 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MoonStakingForTax
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-16 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IPASS is IERC721{ function pass_value_in_apes(uint256 _tokenId) external view returns (uint256); // 1=green, 5=blue, 10=gold } interface IMAL { function depositMALFor(address user, uint256 amount) external; function totalTaxCollected() external view returns (uint256); function getUserBalance(address user) external view returns (uint256); function spendMAL(address user, uint256 amount) external; } interface ISTAKING { function balanceOf(address user) external view returns (uint256); } contract MoonStakingForTax is Ownable, ReentrancyGuard { IMAL public MAL; IERC721 public TreasuryNft; IPASS public PassNft; ISTAKING public Staking; IERC721 public APES; uint256 public constant SECONDS_IN_DAY = 86400; uint256 public MIN_MAL_BURN_AMOUNT = 5000 ether; bool public stakingLaunched; bool public depositPaused; bool public apeOwnershipRequired; bool public burn_enabled; struct Staker { uint256 accumulatedAmount; uint256 lastCheckpoint; uint256 taxCheckpoint; uint256[] stakedTREASURY; uint256[] stakedPASS; } mapping(address => Staker) private _stakers; enum ContractTypes { TREASURY, PASS } mapping(address => ContractTypes) private _contractTypes; mapping(address => mapping(uint256 => address)) private _ownerOfToken; mapping(address => uint256) private _dividers; mapping(uint256 => uint256) private _passMultipliers; uint256 public _treasuryDailyReward; mapping (address => bool) private _authorised; address[] public authorisedLog; event Stake721(address indexed staker,address contractAddress,uint256 tokensAmount); event Unstake721(address indexed staker,address contractAddress,uint256 tokensAmount); event ForceWithdraw721(address indexed receiver, address indexed tokenAddress, uint256 indexed tokenId); event Claim(address indexed staker, uint256 claimedAmount); event BurnMAL(address indexed burner, uint256 amount); constructor(address _apes, address _staking, address _mal, address _treasury, address _pass) { APES = IERC721(_apes); Staking = ISTAKING(_staking); MAL = IMAL(_mal); stakingLaunched = false; TreasuryNft = IERC721(_treasury); _contractTypes[_treasury] = ContractTypes.TREASURY; _dividers[_treasury] = 5000; _treasuryDailyReward = 200 ether; burn_enabled = false; PassNft = IPASS(_pass); _contractTypes[_pass] = ContractTypes.PASS; _dividers[_pass] = 1625; _passMultipliers[1] = 1; _passMultipliers[5] = 5; _passMultipliers[10] = 10; } modifier authorised() { require(_authorised[_msgSender()], "The token contract is not authorised"); _; } function stake721(address contractAddress, uint256[] memory tokenIds) public nonReentrant { require(address(TreasuryNft) != address(0) && address(PassNft) != address(0), "Treasuries and Passes staking is not yet enabled"); require(!depositPaused, "Staking paused"); require(stakingLaunched, "Treasuries and Passes staking is not yet enabled"); require(tokenIds.length > 0, "List cannot be emplty"); require(contractAddress != address(0) && contractAddress == address(TreasuryNft) || contractAddress == address(PassNft), "Unknown contract or staking is not yet enabled for this NFT"); ContractTypes contractType = _contractTypes[contractAddress]; Staker storage user = _stakers[_msgSender()]; if (user.stakedTREASURY.length == 0 && user.stakedPASS.length == 0) { uint256 totalCollectedTax = MAL.totalTaxCollected(); user.taxCheckpoint = totalCollectedTax; } accumulate(_msgSender()); for (uint256 i; i < tokenIds.length; i++) { require(IERC721(contractAddress).ownerOf(tokenIds[i]) == _msgSender(), "Not the owner of staking NFT"); IERC721(contractAddress).safeTransferFrom(_msgSender(), address(this), tokenIds[i]); _ownerOfToken[contractAddress][tokenIds[i]] = _msgSender(); if (contractType == ContractTypes.TREASURY) { user.stakedTREASURY.push(tokenIds[i]); } if (contractType == ContractTypes.PASS) { user.stakedPASS.push(tokenIds[i]); } } accumulate(_msgSender()); emit Stake721(_msgSender(), contractAddress, tokenIds.length); } function unstake721(address contractAddress, uint256[] memory tokenIds) public nonReentrant { require(tokenIds.length > 0, "List cannot be empty"); require(contractAddress != address(0) && contractAddress == address(TreasuryNft) || contractAddress == address(PassNft), "Unknown contract or staking is not yet enabled for this NFT"); ContractTypes contractType = _contractTypes[contractAddress]; Staker storage user = _stakers[_msgSender()]; accumulate(_msgSender()); for (uint256 i; i < tokenIds.length; i++) { require(IERC721(contractAddress).ownerOf(tokenIds[i]) == address(this), "Not the owner"); _ownerOfToken[contractAddress][tokenIds[i]] = address(0); if (contractType == ContractTypes.TREASURY) { user.stakedTREASURY = _prepareForDeletion(user.stakedTREASURY, tokenIds[i]); user.stakedTREASURY.pop(); } if (contractType == ContractTypes.PASS) { user.stakedPASS = _prepareForDeletion(user.stakedPASS, tokenIds[i]); user.stakedPASS.pop(); } IERC721(contractAddress).safeTransferFrom(address(this), _msgSender(), tokenIds[i]); } user.taxCheckpoint = MAL.totalTaxCollected(); emit Unstake721(_msgSender(), contractAddress, tokenIds.length); } function claimTaxAndReward() public nonReentrant{ Staker storage user = _stakers[_msgSender()]; accumulate(_msgSender()); require(user.accumulatedAmount > 0, "Insufficient funds"); require(_validateApeOwnership(_msgSender()), "You need at least 1 Ape to claim Tax and Treasury reward"); uint256 claimableAmount = getTotalClaimableAmount(_msgSender()); user.taxCheckpoint = MAL.totalTaxCollected(); user.accumulatedAmount = 0; MAL.depositMALFor(_msgSender(), claimableAmount); emit Claim(_msgSender(), claimableAmount); } function burnMAL(uint256 amount) public nonReentrant { require(burn_enabled, "Burning for leadboard points is not yet enabled"); require(MAL.getUserBalance(_msgSender()) >= amount, "Insuficcient balance"); require(amount >= MIN_MAL_BURN_AMOUNT, "Burning amount is too low."); require(amount % MIN_MAL_BURN_AMOUNT == 0, "Burning amount must be divisible by minimal burning amount"); MAL.spendMAL(_msgSender(), amount); emit BurnMAL(_msgSender(), amount); } function enableBurn() public onlyOwner{ require(burn_enabled == false, "Burning is already enabled"); burn_enabled = true; } function getStakerNFT(address staker) public view returns (uint256[] memory, uint256[] memory, uint256[] memory) { uint256 totalPasses = _stakers[staker].stakedPASS.length; uint256[] memory passTypes = new uint256[](totalPasses); for (uint256 i = 0; i < totalPasses; i++){ uint256 passType = PassNft.pass_value_in_apes(_stakers[staker].stakedPASS[i]); passTypes[i] = passType; } return (_stakers[staker].stakedTREASURY, _stakers[staker].stakedPASS, passTypes); } function _prepareForDeletion(uint256[] memory list, uint256 tokenId) internal pure returns (uint256[] memory) { uint256 tokenIndex = 0; uint256 lastTokenIndex = list.length - 1; uint256 length = list.length; for(uint256 i = 0; i < length; i++) { if (list[i] == tokenId) { tokenIndex = i + 1; break; } } require(tokenIndex != 0, "Not the owner or duplicate NFT in list"); tokenIndex -= 1; if (tokenIndex != lastTokenIndex) { list[tokenIndex] = list[lastTokenIndex]; list[lastTokenIndex] = tokenId; } return list; } function getCurrentClaimableAmount(address staker) public view returns (uint256) { if (_stakers[staker].lastCheckpoint == 0) { return 0; } return getClaimableTax(staker) + getClaimableReward(staker); } function getTotalClaimableAmount(address staker) public view returns (uint256) { return _stakers[staker].accumulatedAmount + getCurrentClaimableAmount(staker); } function accumulate(address staker) internal { _stakers[staker].accumulatedAmount += getCurrentClaimableAmount(staker); _stakers[staker].lastCheckpoint = block.timestamp; } function getClaimableTax(address staker) public view returns (uint256){ Staker memory user = _stakers[staker]; uint256 currentCollectedTax = MAL.totalTaxCollected(); uint256 prevCollectedTax = user.taxCheckpoint; uint256 change = currentCollectedTax - prevCollectedTax; uint256 claimableTax = 0; if (user.stakedTREASURY.length > 0){ claimableTax += change * 60 * user.stakedTREASURY.length / 100 / _dividers[address(TreasuryNft)]; } for (uint256 i = 0; i < user.stakedPASS.length; i++){ uint256 pass_type = PassNft.pass_value_in_apes(user.stakedPASS[i]); uint256 pass_mult = _passMultipliers[pass_type]; claimableTax += change * 40 * pass_mult / 100 / _dividers[address(PassNft)]; } return claimableTax; } function getClaimableReward(address _staker) public view returns (uint256){ Staker memory user = _stakers[_staker]; return (block.timestamp - user.lastCheckpoint) * (_treasuryDailyReward * user.stakedTREASURY.length) / SECONDS_IN_DAY; } function _validateApeOwnership(address user) internal view returns (bool) { if (!apeOwnershipRequired) return true; if (Staking.balanceOf(user) > 0) { return true; } return APES.balanceOf(user) > 0; } /** * CONTRACTS */ function ownerOf(address contractAddress, uint256 tokenId) public view returns (address) { return _ownerOfToken[contractAddress][tokenId]; } function treasuryBalanceOf(address user) public view returns (uint256){ return _stakers[user].stakedTREASURY.length; } function getStakedPasses(address user) public view returns (uint256[] memory, uint256[] memory){ uint256 totalPasses = _stakers[user].stakedPASS.length; uint256[] memory passTypes = new uint256[](totalPasses); for (uint256 i = 0; i < totalPasses; i++){ uint256 passType = PassNft.pass_value_in_apes(_stakers[user].stakedPASS[i]); passTypes[i] = passType; } return (_stakers[user].stakedPASS, passTypes); } function setTREASURYContract(address _treasury, uint256 _divider, uint256 _treasuryReward) public onlyOwner { TreasuryNft = IERC721(_treasury); _contractTypes[_treasury] = ContractTypes.TREASURY; _dividers[_treasury] = _divider; _treasuryDailyReward = _treasuryReward; } function setPASSContract(address _pass, uint256 _divider) public onlyOwner { PassNft = IPASS(_pass); _contractTypes[_pass] = ContractTypes.PASS; _dividers[_pass] = _divider; } function setPassTypesMultipliers(uint256[] memory pass_types, uint256[] memory pass_multipliers) public onlyOwner{ require(pass_types.length == pass_multipliers.length, "Lists not same length"); for (uint256 i = 0; i < pass_types.length; i++){ require(pass_types[i] == 1 || pass_types[i] == 5 || pass_types[i] == 10, "Invalid pass type. Valid pass types are 1, 5 and 10."); require(pass_multipliers[i] > 0, "Multiplier must be larger than 0."); _passMultipliers[pass_types[i]] = pass_multipliers[i]; } } /** * ADMIN */ function authorise(address toAuth) public onlyOwner { _authorised[toAuth] = true; authorisedLog.push(toAuth); } function unauthorise(address addressToUnAuth) public onlyOwner { _authorised[addressToUnAuth] = false; } function updateApeOwnershipRequirement(bool _isOwnershipRequired) public onlyOwner { apeOwnershipRequired = _isOwnershipRequired; } function forceWithdraw721(address tokenAddress, uint256[] memory tokenIds) public onlyOwner { require(tokenIds.length <= 50, "50 is max per tx"); pauseDeposit(true); for (uint256 i; i < tokenIds.length; i++) { address receiver = _ownerOfToken[tokenAddress][tokenIds[i]]; if (receiver != address(0) && IERC721(tokenAddress).ownerOf(tokenIds[i]) == address(this)) { IERC721(tokenAddress).transferFrom(address(this), receiver, tokenIds[i]); emit ForceWithdraw721(receiver, tokenAddress, tokenIds[i]); } } } function pauseDeposit(bool _pause) public onlyOwner { depositPaused = _pause; } function launchStaking() public onlyOwner { require(!stakingLaunched, "Staking has been launched already"); stakingLaunched = true; } function onERC721Received(address, address, uint256, bytes calldata) external pure returns(bytes4){ return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } function withdrawETH() external onlyOwner { payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_apes","type":"address"},{"internalType":"address","name":"_staking","type":"address"},{"internalType":"address","name":"_mal","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_pass","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnMAL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ForceWithdraw721","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":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"Stake721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"Unstake721","type":"event"},{"inputs":[],"name":"APES","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAL","outputs":[{"internalType":"contract IMAL","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_MAL_BURN_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PassNft","outputs":[{"internalType":"contract IPASS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Staking","outputs":[{"internalType":"contract ISTAKING","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TreasuryNft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_treasuryDailyReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apeOwnershipRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAuth","type":"address"}],"name":"authorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorisedLog","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn_enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTaxAndReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"forceWithdraw721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getClaimableReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getClaimableTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getCurrentClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakedPasses","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakerNFT","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTotalClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pass","type":"address"},{"internalType":"uint256","name":"_divider","type":"uint256"}],"name":"setPASSContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pass_types","type":"uint256[]"},{"internalType":"uint256[]","name":"pass_multipliers","type":"uint256[]"}],"name":"setPassTypesMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_divider","type":"uint256"},{"internalType":"uint256","name":"_treasuryReward","type":"uint256"}],"name":"setTREASURYContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"treasuryBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToUnAuth","type":"address"}],"name":"unauthorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOwnershipRequired","type":"bool"}],"name":"updateApeOwnershipRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405269010f0cf064dd592000006007553480156200001f57600080fd5b506040516200345c3803806200345c8339810160408190526200004291620001fb565b6200004d336200018e565b6001808055600680546001600160a01b03199081166001600160a01b0398891617909155600580548216968816969096178655600280548216958816959095179094556008805460ff19908116825560038054871695891695861790556000948552600a60208181526040808820805485169055600c8083528189206113889055680ad78ebc5ac6200000600e55855463ff00000019169095556004805497909b1696909816861790995593855283885285852080549091168317905586529282206106599055600d9094527ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5919091557fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149919091558190527fba9d637f252776d5e1b3534bbd7554a1265a4ef0539d9ca50abe118598a6973c556200026b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001f657600080fd5b919050565b600080600080600060a086880312156200021457600080fd5b6200021f86620001de565b94506200022f60208701620001de565b93506200023f60408701620001de565b92506200024f60608701620001de565b91506200025f60808701620001de565b90509295509295909350565b6131e1806200027b6000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c80638c1a271f1161013b578063da355612116100b8578063f2fde38b1161007c578063f2fde38b14610550578063f31121d714610563578063f374511e14610576578063f4461fc814610597578063f57df22e146105aa57600080fd5b8063da355612146104fd578063e086e5ec14610510578063e1af569814610518578063eb4426b614610525578063f0b632001461054757600080fd5b80639fed610d116100ff5780639fed610d146104b3578063a30a2474146104c6578063c82bc61d146104ce578063cd79b454146104e1578063d76745a3146104f457600080fd5b80638c1a271f146104615780638da5cb5b14610474578063922fab05146104855780639c27b6de146104985780639f16e8fc146104ab57600080fd5b80635ff329af116101c9578063715018a61161018d578063715018a61461040c5780637bdadbcf146104145780637f4a67bf1461042757806380833d781461043a578063838b7b3e1461044d57600080fd5b80635ff329af146103b6578063605d52eb146103c957806361a52a36146103dc57806366e6c8af146103e6578063708c94c7146103f957600080fd5b80632e81ef17116102105780632e81ef17146103605780633b37d1d614610375578063415855d61461037d5780634d2fb9701461039057806356278915146103a357600080fd5b806302befd241461024d578063039eedb1146102745780630ad067a414610295578063150b7a02146102c15780631f29d2dc14610312575b600080fd5b60085461025f90610100900460ff1681565b60405190151581526020015b60405180910390f35b610287610282366004612c84565b6105bd565b60405190815260200161026b565b6102876102a3366004612c84565b6001600160a01b031660009081526009602052604090206003015490565b6102f96102cf366004612cbe565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b0319909116815260200161026b565b610348610320366004612dad565b6001600160a01b039182166000908152600b6020908152604080832093835292905220541690565b6040516001600160a01b03909116815260200161026b565b61037361036e366004612dd9565b6108e9565b005b610373610962565b61037361038b366004612e68565b6109fb565b61037361039e366004612e0e565b610a3f565b600454610348906001600160a01b031681565b6102876103c4366004612c84565b610c61565b6102876103d7366004612c84565b610d8f565b6102876201518081565b6103736103f4366004612c84565b610dc3565b610373610407366004612d5d565b610e53565b6103736113d3565b600254610348906001600160a01b031681565b610373610435366004612d5d565b611409565b610373610448366004612c84565b61196a565b60085461025f906301000000900460ff1681565b61028761046f366004612c84565b6119b5565b6000546001600160a01b0316610348565b600654610348906001600160a01b031681565b6103736104a6366004612dad565b6119f9565b610373611a69565b6103736104c1366004612e8a565b611cc9565b610373611fc6565b6103486104dc366004612e8a565b61205c565b6103736104ef366004612d5d565b612086565b61028760075481565b600354610348906001600160a01b031681565b61037361231d565b60085461025f9060ff1681565b610538610533366004612c84565b612384565b60405161026b93929190612f25565b610287600e5481565b61037361055e366004612c84565b6125b6565b60085461025f9062010000900460ff1681565b610589610584366004612c84565b61264e565b60405161026b929190612ef7565b6103736105a5366004612e68565b612830565b600554610348906001600160a01b031681565b6001600160a01b0381166000908152600960209081526040808320815160a081018352815481526001820154818501526002820154818401526003820180548451818702810187019095528085528695929460608601939092919083018282801561064757602002820191906000526020600020905b815481526020019060010190808311610633575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561069f57602002820191906000526020600020905b81548152602001906001019080831161068b575b50505050508152505090506000600260009054906101000a90046001600160a01b03166001600160a01b031663d8454a826040518163ffffffff1660e01b815260040160206040518083038186803b1580156106fa57600080fd5b505afa15801561070e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107329190612ea3565b6040830151909150600061074682846130cc565b905060008085606001515111156107b1576003546001600160a01b03166000908152600c602052604090205460608601515160649061078685603c6130ad565b61079091906130ad565b61079a9190613099565b6107a49190613099565b6107ae9082613081565b90505b60005b8560800151518110156108de57600454608087015180516000926001600160a01b03169163e876b6f591859081106107ee576107ee61316a565b60200260200101516040518263ffffffff1660e01b815260040161081491815260200190565b60206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108649190612ea3565b6000818152600d60209081526040808320546004546001600160a01b03168452600c909252909120549192509060648261089f8860286130ad565b6108a991906130ad565b6108b39190613099565b6108bd9190613099565b6108c79085613081565b9350505080806108d6906130e3565b9150506107b4565b509695505050505050565b6000546001600160a01b0316331461091c5760405162461bcd60e51b815260040161091390613015565b60405180910390fd5b600380546001600160a01b0319166001600160a01b039490941693841790556000928352600a60209081526040808520805460ff19169055600c90915290922055600e55565b6000546001600160a01b0316331461098c5760405162461bcd60e51b815260040161091390613015565b6008546301000000900460ff16156109e65760405162461bcd60e51b815260206004820152601a60248201527f4275726e696e6720697320616c726561647920656e61626c65640000000000006044820152606401610913565b6008805463ff00000019166301000000179055565b6000546001600160a01b03163314610a255760405162461bcd60e51b815260040161091390613015565b600880549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610a695760405162461bcd60e51b815260040161091390613015565b8051825114610ab25760405162461bcd60e51b8152602060048201526015602482015274098d2e6e8e640dcdee840e6c2daca40d8cadccee8d605b1b6044820152606401610913565b60005b8251811015610c5c57828181518110610ad057610ad061316a565b602002602001015160011480610aff5750828181518110610af357610af361316a565b60200260200101516005145b80610b235750828181518110610b1757610b1761316a565b6020026020010151600a145b610b8c5760405162461bcd60e51b815260206004820152603460248201527f496e76616c6964207061737320747970652e2056616c696420706173732074796044820152733832b99030b932901896101a9030b7321018981760611b6064820152608401610913565b6000828281518110610ba057610ba061316a565b602002602001015111610bff5760405162461bcd60e51b815260206004820152602160248201527f4d756c7469706c696572206d757374206265206c6172676572207468616e20306044820152601760f91b6064820152608401610913565b818181518110610c1157610c1161316a565b6020026020010151600d6000858481518110610c2f57610c2f61316a565b60200260200101518152602001908152602001600020819055508080610c54906130e3565b915050610ab5565b505050565b6001600160a01b0381166000908152600960209081526040808320815160a0810183528154815260018201548185015260028201548184015260038201805484518187028101870190955280855286959294606086019390929190830182828015610ceb57602002820191906000526020600020905b815481526020019060010190808311610cd7575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020018280548015610d4357602002820191906000526020600020905b815481526020019060010190808311610d2f575b505050505081525050905062015180816060015151600e54610d6591906130ad565b6020830151610d7490426130cc565b610d7e91906130ad565b610d889190613099565b9392505050565b6000610d9a826119b5565b6001600160a01b038316600090815260096020526040902054610dbd9190613081565b92915050565b6000546001600160a01b03163314610ded5760405162461bcd60e51b815260040161091390613015565b6001600160a01b03166000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b60026001541415610e765760405162461bcd60e51b81526004016109139061304a565b60026001558051610ec05760405162461bcd60e51b81526020600482015260146024820152734c6973742063616e6e6f7420626520656d70747960601b6044820152606401610913565b6001600160a01b03821615801590610ee557506003546001600160a01b038381169116145b80610efd57506004546001600160a01b038381169116145b610f195760405162461bcd60e51b815260040161091390612f68565b6001600160a01b0382166000908152600a6020908152604080832054338085526009909352922060ff9092169190610f5090612876565b60005b83518110156112f557306001600160a01b0316856001600160a01b0316636352211e868481518110610f8757610f8761316a565b60200260200101516040518263ffffffff1660e01b8152600401610fad91815260200190565b60206040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd9190612ca1565b6001600160a01b0316146110435760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b6044820152606401610913565b6001600160a01b0385166000908152600b60205260408120855182908790859081106110715761107161316a565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600060018111156110be576110be61313e565b8360018111156110d0576110d061313e565b141561118c5761114b8260030180548060200260200160405190810160405280929190818152602001828054801561112757602002820191906000526020600020905b815481526020019060010190808311611113575b505050505085838151811061113e5761113e61316a565b60200260200101516128cc565b8051611161916003850191602090910190612b83565b508160030180548061117557611175613154565b600190038181906000526020600020016000905590555b60018360018111156111a0576111a061313e565b141561124d5761120c82600401805480602002602001604051908101604052809291908181526020018280548015611127576020028201919060005260206000209081548152602001906001019080831161111357505050505085838151811061113e5761113e61316a565b8051611222916004850191602090910190612b83565b508160040180548061123657611236613154565b600190038181906000526020600020016000905590555b6001600160a01b0385166342842e0e30338785815181106112705761127061316a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156112ca57600080fd5b505af11580156112de573d6000803e3d6000fd5b5050505080806112ed906130e3565b915050610f53565b50600260009054906101000a90046001600160a01b03166001600160a01b031663d8454a826040518163ffffffff1660e01b815260040160206040518083038186803b15801561134457600080fd5b505afa158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190612ea3565b60028201558251604080516001600160a01b0387168152602081019290925233917f4ba5edd9b1f5ba1a48c7179f325e7dcbd7f63c4eb006f8ebf5e46cbe6fbfc36091015b60405180910390a25050600180555050565b6000546001600160a01b031633146113fd5760405162461bcd60e51b815260040161091390613015565b6114076000612a07565b565b6002600154141561142c5760405162461bcd60e51b81526004016109139061304a565b60026001556003546001600160a01b03161580159061145557506004546001600160a01b031615155b6114715760405162461bcd60e51b815260040161091390612fc5565b600854610100900460ff16156114ba5760405162461bcd60e51b815260206004820152600e60248201526d14dd185ada5b99c81c185d5cd95960921b6044820152606401610913565b60085460ff166114dc5760405162461bcd60e51b815260040161091390612fc5565b60008151116115255760405162461bcd60e51b81526020600482015260156024820152744c6973742063616e6e6f7420626520656d706c747960581b6044820152606401610913565b6001600160a01b0382161580159061154a57506003546001600160a01b038381169116145b8061156257506004546001600160a01b038381169116145b61157e5760405162461bcd60e51b815260040161091390612f68565b6001600160a01b0382166000908152600a60209081526040808320543384526009909252909120600381015460ff909216911580156115bf57506004810154155b156116485760025460408051636c22a54160e11b815290516000926001600160a01b03169163d8454a82916004808301926020929190829003018186803b15801561160957600080fd5b505afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116419190612ea3565b6002830155505b61165133612876565b60005b835181101561191c57336001600160a01b0316856001600160a01b0316636352211e8684815181106116885761168861316a565b60200260200101516040518263ffffffff1660e01b81526004016116ae91815260200190565b60206040518083038186803b1580156116c657600080fd5b505afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe9190612ca1565b6001600160a01b0316146117545760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746865206f776e6572206f66207374616b696e67204e4654000000006044820152606401610913565b6001600160a01b0385166342842e0e33308785815181106117775761177761316a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156117d157600080fd5b505af11580156117e5573d6000803e3d6000fd5b505050506117f03390565b6001600160a01b0386166000908152600b60205260408120865190919087908590811061181f5761181f61316a565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600181111561186c5761186c61313e565b83600181111561187e5761187e61313e565b14156118ba578160030184828151811061189a5761189a61316a565b602090810291909101810151825460018101845560009384529190922001555b60018360018111156118ce576118ce61313e565b141561190a57816004018482815181106118ea576118ea61316a565b602090810291909101810151825460018101845560009384529190922001555b80611914816130e3565b915050611654565b5061192633612876565b8251604080516001600160a01b0387168152602081019290925233917fe7de321cbdf2d1b2d2e5e22013ef745d72ebdc806ec3b664584b1cc8dc9abe8191016113c1565b6000546001600160a01b031633146119945760405162461bcd60e51b815260040161091390613015565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6001600160a01b0381166000908152600960205260408120600101546119dd57506000919050565b6119e682610c61565b6119ef836105bd565b610dbd9190613081565b6000546001600160a01b03163314611a235760405162461bcd60e51b815260040161091390613015565b600480546001600160a01b0319166001600160a01b039390931692831790556000918252600a60209081526040808420805460ff19166001179055600c90915290912055565b60026001541415611a8c5760405162461bcd60e51b81526004016109139061304a565b600260015533600081815260096020526040902090611aaa90612876565b8054611aed5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610913565b611af633612a57565b611b685760405162461bcd60e51b815260206004820152603860248201527f596f75206e656564206174206c6561737420312041706520746f20636c61696d60448201527f2054617820616e642054726561737572792072657761726400000000000000006064820152608401610913565b6000611b7333610d8f565b9050600260009054906101000a90046001600160a01b03166001600160a01b031663d8454a826040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190612ea3565b60028381019190915560008355546001600160a01b03166374c8ac0b336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611c6057600080fd5b505af1158015611c74573d6000803e3d6000fd5b50505050611c7f3390565b6001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d482604051611cb991815260200190565b60405180910390a2505060018055565b60026001541415611cec5760405162461bcd60e51b81526004016109139061304a565b60026001556008546301000000900460ff16611d625760405162461bcd60e51b815260206004820152602f60248201527f4275726e696e6720666f72206c656164626f61726420706f696e74732069732060448201526e1b9bdd081e595d08195b98589b1959608a1b6064820152608401610913565b60025481906001600160a01b03166347734892336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190612ea3565b1015611e325760405162461bcd60e51b8152602060048201526014602482015273496e73756669636369656e742062616c616e636560601b6044820152606401610913565b600754811015611e845760405162461bcd60e51b815260206004820152601a60248201527f4275726e696e6720616d6f756e7420697320746f6f206c6f772e0000000000006044820152606401610913565b600754611e9190826130fe565b15611f045760405162461bcd60e51b815260206004820152603a60248201527f4275726e696e6720616d6f756e74206d75737420626520646976697369626c6560448201527f206279206d696e696d616c206275726e696e6720616d6f756e740000000000006064820152608401610913565b6002546001600160a01b03166384a85b0d336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611f5e57600080fd5b505af1158015611f72573d6000803e3d6000fd5b50505050611f7d3390565b6001600160a01b03167f2256ffc65c148631ded63479cd80f4480c3fb28bd1d8c7e7cf48c1a7f5d7c78782604051611fb791815260200190565b60405180910390a25060018055565b6000546001600160a01b03163314611ff05760405162461bcd60e51b815260040161091390613015565b60085460ff161561204d5760405162461bcd60e51b815260206004820152602160248201527f5374616b696e6720686173206265656e206c61756e6368656420616c726561646044820152607960f81b6064820152608401610913565b6008805460ff19166001179055565b6010818154811061206c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146120b05760405162461bcd60e51b815260040161091390613015565b6032815111156120f55760405162461bcd60e51b815260206004820152601060248201526f06a6040d2e640dac2f040e0cae440e8f60831b6044820152606401610913565b6120ff60016109fb565b60005b8151811015610c5c576001600160a01b0383166000908152600b60205260408120835182908590859081106121395761213961316a565b6020908102919091018101518252810191909152604001600020546001600160a01b0316905080158015906122155750306001600160a01b0316846001600160a01b0316636352211e8585815181106121945761219461316a565b60200260200101516040518263ffffffff1660e01b81526004016121ba91815260200190565b60206040518083038186803b1580156121d257600080fd5b505afa1580156121e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220a9190612ca1565b6001600160a01b0316145b1561230a57836001600160a01b03166323b872dd308386868151811061223d5761223d61316a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561229757600080fd5b505af11580156122ab573d6000803e3d6000fd5b505050508282815181106122c1576122c161316a565b6020026020010151846001600160a01b0316826001600160a01b03167f639cf5a59a0ba34d5cf248cfcc10a75f2fdbc9f613ff75acffb80269dbed612860405160405180910390a45b5080612315816130e3565b915050612102565b6000546001600160a01b031633146123475760405162461bcd60e51b815260040161091390613015565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015612381573d6000803e3d6000fd5b50565b6001600160a01b038116600090815260096020526040812060040154606091829182918167ffffffffffffffff8111156123c0576123c0613180565b6040519080825280602002602001820160405280156123e9578160200160208202803683370190505b50905060005b828110156124e057600480546001600160a01b0389811660009081526009602052604081209093018054919092169163e876b6f591859081106124345761243461316a565b90600052602060002001546040518263ffffffff1660e01b815260040161245d91815260200190565b60206040518083038186803b15801561247557600080fd5b505afa158015612489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ad9190612ea3565b9050808383815181106124c2576124c261316a565b602090810291909101015250806124d8816130e3565b9150506123ef565b506001600160a01b0386166000908152600960209081526040918290206003810180548451818502810185019095528085529093600490920192859291859183018282801561254e57602002820191906000526020600020905b81548152602001906001019080831161253a575b50505050509250818054806020026020016040519081016040528092919081815260200182805480156125a057602002820191906000526020600020905b81548152602001906001019080831161258c575b5050505050915094509450945050509193909250565b6000546001600160a01b031633146125e05760405162461bcd60e51b815260040161091390613015565b6001600160a01b0381166126455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610913565b61238181612a07565b6001600160a01b0381166000908152600960205260408120600401546060918291908167ffffffffffffffff81111561268957612689613180565b6040519080825280602002602001820160405280156126b2578160200160208202803683370190505b50905060005b828110156127a957600480546001600160a01b0388811660009081526009602052604081209093018054919092169163e876b6f591859081106126fd576126fd61316a565b90600052602060002001546040518263ffffffff1660e01b815260040161272691815260200190565b60206040518083038186803b15801561273e57600080fd5b505afa158015612752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127769190612ea3565b90508083838151811061278b5761278b61316a565b602090810291909101015250806127a1816130e3565b9150506126b8565b5060096000866001600160a01b03166001600160a01b03168152602001908152602001600020600401818180548060200260200160405190810160405280929190818152602001828054801561281e57602002820191906000526020600020905b81548152602001906001019080831161280a575b50505050509150935093505050915091565b6000546001600160a01b0316331461285a5760405162461bcd60e51b815260040161091390613015565b60088054911515620100000262ff000019909216919091179055565b61287f816119b5565b6001600160a01b038216600090815260096020526040812080549091906128a7908490613081565b90915550506001600160a01b0316600090815260096020526040902042600190910155565b6060600080600185516128df91906130cc565b855190915060005b8181101561293457858782815181106129025761290261316a565b602002602001015114156129225761291b816001613081565b9350612934565b8061292c816130e3565b9150506128e7565b50826129915760405162461bcd60e51b815260206004820152602660248201527f4e6f7420746865206f776e6572206f72206475706c6963617465204e465420696044820152651b881b1a5cdd60d21b6064820152608401610913565b61299c6001846130cc565b92508183146129fd578582815181106129b7576129b761316a565b60200260200101518684815181106129d1576129d161316a565b602002602001018181525050848683815181106129f0576129f061316a565b6020026020010181815250505b5093949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60085460009062010000900460ff16612a7257506001919050565b6005546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015612ab857600080fd5b505afa158015612acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af09190612ea3565b1115612afe57506001919050565b6006546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015612b4457600080fd5b505afa158015612b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7c9190612ea3565b1192915050565b828054828255906000526020600020908101928215612bbe579160200282015b82811115612bbe578251825591602001919060010190612ba3565b50612bca929150612bce565b5090565b5b80821115612bca5760008155600101612bcf565b600082601f830112612bf457600080fd5b8135602067ffffffffffffffff80831115612c1157612c11613180565b8260051b604051601f19603f83011681018181108482111715612c3657612c36613180565b60405284815283810192508684018288018501891015612c5557600080fd5b600092505b85831015612c78578035845292840192600192909201918401612c5a565b50979650505050505050565b600060208284031215612c9657600080fd5b8135610d8881613196565b600060208284031215612cb357600080fd5b8151610d8881613196565b600080600080600060808688031215612cd657600080fd5b8535612ce181613196565b94506020860135612cf181613196565b935060408601359250606086013567ffffffffffffffff80821115612d1557600080fd5b818801915088601f830112612d2957600080fd5b813581811115612d3857600080fd5b896020828501011115612d4a57600080fd5b9699959850939650602001949392505050565b60008060408385031215612d7057600080fd5b8235612d7b81613196565b9150602083013567ffffffffffffffff811115612d9757600080fd5b612da385828601612be3565b9150509250929050565b60008060408385031215612dc057600080fd5b8235612dcb81613196565b946020939093013593505050565b600080600060608486031215612dee57600080fd5b8335612df981613196565b95602085013595506040909401359392505050565b60008060408385031215612e2157600080fd5b823567ffffffffffffffff80821115612e3957600080fd5b612e4586838701612be3565b93506020850135915080821115612e5b57600080fd5b50612da385828601612be3565b600060208284031215612e7a57600080fd5b81358015158114610d8857600080fd5b600060208284031215612e9c57600080fd5b5035919050565b600060208284031215612eb557600080fd5b5051919050565b600081518084526020808501945080840160005b83811015612eec57815187529582019590820190600101612ed0565b509495945050505050565b604081526000612f0a6040830185612ebc565b8281036020840152612f1c8185612ebc565b95945050505050565b606081526000612f386060830186612ebc565b8281036020840152612f4a8186612ebc565b90508281036040840152612f5e8185612ebc565b9695505050505050565b6020808252603b908201527f556e6b6e6f776e20636f6e7472616374206f72207374616b696e67206973206e60408201527f6f742079657420656e61626c656420666f722074686973204e46540000000000606082015260800190565b60208082526030908201527f5472656173757269657320616e6420506173736573207374616b696e6720697360408201526f081b9bdd081e595d08195b98589b195960821b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561309457613094613112565b500190565b6000826130a8576130a8613128565b500490565b60008160001904831182151516156130c7576130c7613112565b500290565b6000828210156130de576130de613112565b500390565b60006000198214156130f7576130f7613112565b5060010190565b60008261310d5761310d613128565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461238157600080fdfea2646970667358221220676c337e2697eb02682c9b7a330781f24aba7e8f7b26dd3ac9d3d7d94d87671064736f6c6343000807003300000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a231200000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e94600000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93000000000000000000000000e3a10ce1d69ac6e378ad5cc2ce4215787daaba1e000000000000000000000000bbccbd7bd5601232334cd64846e0cc64dfe37b4e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c80638c1a271f1161013b578063da355612116100b8578063f2fde38b1161007c578063f2fde38b14610550578063f31121d714610563578063f374511e14610576578063f4461fc814610597578063f57df22e146105aa57600080fd5b8063da355612146104fd578063e086e5ec14610510578063e1af569814610518578063eb4426b614610525578063f0b632001461054757600080fd5b80639fed610d116100ff5780639fed610d146104b3578063a30a2474146104c6578063c82bc61d146104ce578063cd79b454146104e1578063d76745a3146104f457600080fd5b80638c1a271f146104615780638da5cb5b14610474578063922fab05146104855780639c27b6de146104985780639f16e8fc146104ab57600080fd5b80635ff329af116101c9578063715018a61161018d578063715018a61461040c5780637bdadbcf146104145780637f4a67bf1461042757806380833d781461043a578063838b7b3e1461044d57600080fd5b80635ff329af146103b6578063605d52eb146103c957806361a52a36146103dc57806366e6c8af146103e6578063708c94c7146103f957600080fd5b80632e81ef17116102105780632e81ef17146103605780633b37d1d614610375578063415855d61461037d5780634d2fb9701461039057806356278915146103a357600080fd5b806302befd241461024d578063039eedb1146102745780630ad067a414610295578063150b7a02146102c15780631f29d2dc14610312575b600080fd5b60085461025f90610100900460ff1681565b60405190151581526020015b60405180910390f35b610287610282366004612c84565b6105bd565b60405190815260200161026b565b6102876102a3366004612c84565b6001600160a01b031660009081526009602052604090206003015490565b6102f96102cf366004612cbe565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b0319909116815260200161026b565b610348610320366004612dad565b6001600160a01b039182166000908152600b6020908152604080832093835292905220541690565b6040516001600160a01b03909116815260200161026b565b61037361036e366004612dd9565b6108e9565b005b610373610962565b61037361038b366004612e68565b6109fb565b61037361039e366004612e0e565b610a3f565b600454610348906001600160a01b031681565b6102876103c4366004612c84565b610c61565b6102876103d7366004612c84565b610d8f565b6102876201518081565b6103736103f4366004612c84565b610dc3565b610373610407366004612d5d565b610e53565b6103736113d3565b600254610348906001600160a01b031681565b610373610435366004612d5d565b611409565b610373610448366004612c84565b61196a565b60085461025f906301000000900460ff1681565b61028761046f366004612c84565b6119b5565b6000546001600160a01b0316610348565b600654610348906001600160a01b031681565b6103736104a6366004612dad565b6119f9565b610373611a69565b6103736104c1366004612e8a565b611cc9565b610373611fc6565b6103486104dc366004612e8a565b61205c565b6103736104ef366004612d5d565b612086565b61028760075481565b600354610348906001600160a01b031681565b61037361231d565b60085461025f9060ff1681565b610538610533366004612c84565b612384565b60405161026b93929190612f25565b610287600e5481565b61037361055e366004612c84565b6125b6565b60085461025f9062010000900460ff1681565b610589610584366004612c84565b61264e565b60405161026b929190612ef7565b6103736105a5366004612e68565b612830565b600554610348906001600160a01b031681565b6001600160a01b0381166000908152600960209081526040808320815160a081018352815481526001820154818501526002820154818401526003820180548451818702810187019095528085528695929460608601939092919083018282801561064757602002820191906000526020600020905b815481526020019060010190808311610633575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561069f57602002820191906000526020600020905b81548152602001906001019080831161068b575b50505050508152505090506000600260009054906101000a90046001600160a01b03166001600160a01b031663d8454a826040518163ffffffff1660e01b815260040160206040518083038186803b1580156106fa57600080fd5b505afa15801561070e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107329190612ea3565b6040830151909150600061074682846130cc565b905060008085606001515111156107b1576003546001600160a01b03166000908152600c602052604090205460608601515160649061078685603c6130ad565b61079091906130ad565b61079a9190613099565b6107a49190613099565b6107ae9082613081565b90505b60005b8560800151518110156108de57600454608087015180516000926001600160a01b03169163e876b6f591859081106107ee576107ee61316a565b60200260200101516040518263ffffffff1660e01b815260040161081491815260200190565b60206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108649190612ea3565b6000818152600d60209081526040808320546004546001600160a01b03168452600c909252909120549192509060648261089f8860286130ad565b6108a991906130ad565b6108b39190613099565b6108bd9190613099565b6108c79085613081565b9350505080806108d6906130e3565b9150506107b4565b509695505050505050565b6000546001600160a01b0316331461091c5760405162461bcd60e51b815260040161091390613015565b60405180910390fd5b600380546001600160a01b0319166001600160a01b039490941693841790556000928352600a60209081526040808520805460ff19169055600c90915290922055600e55565b6000546001600160a01b0316331461098c5760405162461bcd60e51b815260040161091390613015565b6008546301000000900460ff16156109e65760405162461bcd60e51b815260206004820152601a60248201527f4275726e696e6720697320616c726561647920656e61626c65640000000000006044820152606401610913565b6008805463ff00000019166301000000179055565b6000546001600160a01b03163314610a255760405162461bcd60e51b815260040161091390613015565b600880549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610a695760405162461bcd60e51b815260040161091390613015565b8051825114610ab25760405162461bcd60e51b8152602060048201526015602482015274098d2e6e8e640dcdee840e6c2daca40d8cadccee8d605b1b6044820152606401610913565b60005b8251811015610c5c57828181518110610ad057610ad061316a565b602002602001015160011480610aff5750828181518110610af357610af361316a565b60200260200101516005145b80610b235750828181518110610b1757610b1761316a565b6020026020010151600a145b610b8c5760405162461bcd60e51b815260206004820152603460248201527f496e76616c6964207061737320747970652e2056616c696420706173732074796044820152733832b99030b932901896101a9030b7321018981760611b6064820152608401610913565b6000828281518110610ba057610ba061316a565b602002602001015111610bff5760405162461bcd60e51b815260206004820152602160248201527f4d756c7469706c696572206d757374206265206c6172676572207468616e20306044820152601760f91b6064820152608401610913565b818181518110610c1157610c1161316a565b6020026020010151600d6000858481518110610c2f57610c2f61316a565b60200260200101518152602001908152602001600020819055508080610c54906130e3565b915050610ab5565b505050565b6001600160a01b0381166000908152600960209081526040808320815160a0810183528154815260018201548185015260028201548184015260038201805484518187028101870190955280855286959294606086019390929190830182828015610ceb57602002820191906000526020600020905b815481526020019060010190808311610cd7575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020018280548015610d4357602002820191906000526020600020905b815481526020019060010190808311610d2f575b505050505081525050905062015180816060015151600e54610d6591906130ad565b6020830151610d7490426130cc565b610d7e91906130ad565b610d889190613099565b9392505050565b6000610d9a826119b5565b6001600160a01b038316600090815260096020526040902054610dbd9190613081565b92915050565b6000546001600160a01b03163314610ded5760405162461bcd60e51b815260040161091390613015565b6001600160a01b03166000818152600f60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b60026001541415610e765760405162461bcd60e51b81526004016109139061304a565b60026001558051610ec05760405162461bcd60e51b81526020600482015260146024820152734c6973742063616e6e6f7420626520656d70747960601b6044820152606401610913565b6001600160a01b03821615801590610ee557506003546001600160a01b038381169116145b80610efd57506004546001600160a01b038381169116145b610f195760405162461bcd60e51b815260040161091390612f68565b6001600160a01b0382166000908152600a6020908152604080832054338085526009909352922060ff9092169190610f5090612876565b60005b83518110156112f557306001600160a01b0316856001600160a01b0316636352211e868481518110610f8757610f8761316a565b60200260200101516040518263ffffffff1660e01b8152600401610fad91815260200190565b60206040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd9190612ca1565b6001600160a01b0316146110435760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b6044820152606401610913565b6001600160a01b0385166000908152600b60205260408120855182908790859081106110715761107161316a565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600060018111156110be576110be61313e565b8360018111156110d0576110d061313e565b141561118c5761114b8260030180548060200260200160405190810160405280929190818152602001828054801561112757602002820191906000526020600020905b815481526020019060010190808311611113575b505050505085838151811061113e5761113e61316a565b60200260200101516128cc565b8051611161916003850191602090910190612b83565b508160030180548061117557611175613154565b600190038181906000526020600020016000905590555b60018360018111156111a0576111a061313e565b141561124d5761120c82600401805480602002602001604051908101604052809291908181526020018280548015611127576020028201919060005260206000209081548152602001906001019080831161111357505050505085838151811061113e5761113e61316a565b8051611222916004850191602090910190612b83565b508160040180548061123657611236613154565b600190038181906000526020600020016000905590555b6001600160a01b0385166342842e0e30338785815181106112705761127061316a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156112ca57600080fd5b505af11580156112de573d6000803e3d6000fd5b5050505080806112ed906130e3565b915050610f53565b50600260009054906101000a90046001600160a01b03166001600160a01b031663d8454a826040518163ffffffff1660e01b815260040160206040518083038186803b15801561134457600080fd5b505afa158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190612ea3565b60028201558251604080516001600160a01b0387168152602081019290925233917f4ba5edd9b1f5ba1a48c7179f325e7dcbd7f63c4eb006f8ebf5e46cbe6fbfc36091015b60405180910390a25050600180555050565b6000546001600160a01b031633146113fd5760405162461bcd60e51b815260040161091390613015565b6114076000612a07565b565b6002600154141561142c5760405162461bcd60e51b81526004016109139061304a565b60026001556003546001600160a01b03161580159061145557506004546001600160a01b031615155b6114715760405162461bcd60e51b815260040161091390612fc5565b600854610100900460ff16156114ba5760405162461bcd60e51b815260206004820152600e60248201526d14dd185ada5b99c81c185d5cd95960921b6044820152606401610913565b60085460ff166114dc5760405162461bcd60e51b815260040161091390612fc5565b60008151116115255760405162461bcd60e51b81526020600482015260156024820152744c6973742063616e6e6f7420626520656d706c747960581b6044820152606401610913565b6001600160a01b0382161580159061154a57506003546001600160a01b038381169116145b8061156257506004546001600160a01b038381169116145b61157e5760405162461bcd60e51b815260040161091390612f68565b6001600160a01b0382166000908152600a60209081526040808320543384526009909252909120600381015460ff909216911580156115bf57506004810154155b156116485760025460408051636c22a54160e11b815290516000926001600160a01b03169163d8454a82916004808301926020929190829003018186803b15801561160957600080fd5b505afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116419190612ea3565b6002830155505b61165133612876565b60005b835181101561191c57336001600160a01b0316856001600160a01b0316636352211e8684815181106116885761168861316a565b60200260200101516040518263ffffffff1660e01b81526004016116ae91815260200190565b60206040518083038186803b1580156116c657600080fd5b505afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe9190612ca1565b6001600160a01b0316146117545760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746865206f776e6572206f66207374616b696e67204e4654000000006044820152606401610913565b6001600160a01b0385166342842e0e33308785815181106117775761177761316a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156117d157600080fd5b505af11580156117e5573d6000803e3d6000fd5b505050506117f03390565b6001600160a01b0386166000908152600b60205260408120865190919087908590811061181f5761181f61316a565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600181111561186c5761186c61313e565b83600181111561187e5761187e61313e565b14156118ba578160030184828151811061189a5761189a61316a565b602090810291909101810151825460018101845560009384529190922001555b60018360018111156118ce576118ce61313e565b141561190a57816004018482815181106118ea576118ea61316a565b602090810291909101810151825460018101845560009384529190922001555b80611914816130e3565b915050611654565b5061192633612876565b8251604080516001600160a01b0387168152602081019290925233917fe7de321cbdf2d1b2d2e5e22013ef745d72ebdc806ec3b664584b1cc8dc9abe8191016113c1565b6000546001600160a01b031633146119945760405162461bcd60e51b815260040161091390613015565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6001600160a01b0381166000908152600960205260408120600101546119dd57506000919050565b6119e682610c61565b6119ef836105bd565b610dbd9190613081565b6000546001600160a01b03163314611a235760405162461bcd60e51b815260040161091390613015565b600480546001600160a01b0319166001600160a01b039390931692831790556000918252600a60209081526040808420805460ff19166001179055600c90915290912055565b60026001541415611a8c5760405162461bcd60e51b81526004016109139061304a565b600260015533600081815260096020526040902090611aaa90612876565b8054611aed5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610913565b611af633612a57565b611b685760405162461bcd60e51b815260206004820152603860248201527f596f75206e656564206174206c6561737420312041706520746f20636c61696d60448201527f2054617820616e642054726561737572792072657761726400000000000000006064820152608401610913565b6000611b7333610d8f565b9050600260009054906101000a90046001600160a01b03166001600160a01b031663d8454a826040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190612ea3565b60028381019190915560008355546001600160a01b03166374c8ac0b336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611c6057600080fd5b505af1158015611c74573d6000803e3d6000fd5b50505050611c7f3390565b6001600160a01b03167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d482604051611cb991815260200190565b60405180910390a2505060018055565b60026001541415611cec5760405162461bcd60e51b81526004016109139061304a565b60026001556008546301000000900460ff16611d625760405162461bcd60e51b815260206004820152602f60248201527f4275726e696e6720666f72206c656164626f61726420706f696e74732069732060448201526e1b9bdd081e595d08195b98589b1959608a1b6064820152608401610913565b60025481906001600160a01b03166347734892336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190612ea3565b1015611e325760405162461bcd60e51b8152602060048201526014602482015273496e73756669636369656e742062616c616e636560601b6044820152606401610913565b600754811015611e845760405162461bcd60e51b815260206004820152601a60248201527f4275726e696e6720616d6f756e7420697320746f6f206c6f772e0000000000006044820152606401610913565b600754611e9190826130fe565b15611f045760405162461bcd60e51b815260206004820152603a60248201527f4275726e696e6720616d6f756e74206d75737420626520646976697369626c6560448201527f206279206d696e696d616c206275726e696e6720616d6f756e740000000000006064820152608401610913565b6002546001600160a01b03166384a85b0d336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611f5e57600080fd5b505af1158015611f72573d6000803e3d6000fd5b50505050611f7d3390565b6001600160a01b03167f2256ffc65c148631ded63479cd80f4480c3fb28bd1d8c7e7cf48c1a7f5d7c78782604051611fb791815260200190565b60405180910390a25060018055565b6000546001600160a01b03163314611ff05760405162461bcd60e51b815260040161091390613015565b60085460ff161561204d5760405162461bcd60e51b815260206004820152602160248201527f5374616b696e6720686173206265656e206c61756e6368656420616c726561646044820152607960f81b6064820152608401610913565b6008805460ff19166001179055565b6010818154811061206c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146120b05760405162461bcd60e51b815260040161091390613015565b6032815111156120f55760405162461bcd60e51b815260206004820152601060248201526f06a6040d2e640dac2f040e0cae440e8f60831b6044820152606401610913565b6120ff60016109fb565b60005b8151811015610c5c576001600160a01b0383166000908152600b60205260408120835182908590859081106121395761213961316a565b6020908102919091018101518252810191909152604001600020546001600160a01b0316905080158015906122155750306001600160a01b0316846001600160a01b0316636352211e8585815181106121945761219461316a565b60200260200101516040518263ffffffff1660e01b81526004016121ba91815260200190565b60206040518083038186803b1580156121d257600080fd5b505afa1580156121e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220a9190612ca1565b6001600160a01b0316145b1561230a57836001600160a01b03166323b872dd308386868151811061223d5761223d61316a565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561229757600080fd5b505af11580156122ab573d6000803e3d6000fd5b505050508282815181106122c1576122c161316a565b6020026020010151846001600160a01b0316826001600160a01b03167f639cf5a59a0ba34d5cf248cfcc10a75f2fdbc9f613ff75acffb80269dbed612860405160405180910390a45b5080612315816130e3565b915050612102565b6000546001600160a01b031633146123475760405162461bcd60e51b815260040161091390613015565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015612381573d6000803e3d6000fd5b50565b6001600160a01b038116600090815260096020526040812060040154606091829182918167ffffffffffffffff8111156123c0576123c0613180565b6040519080825280602002602001820160405280156123e9578160200160208202803683370190505b50905060005b828110156124e057600480546001600160a01b0389811660009081526009602052604081209093018054919092169163e876b6f591859081106124345761243461316a565b90600052602060002001546040518263ffffffff1660e01b815260040161245d91815260200190565b60206040518083038186803b15801561247557600080fd5b505afa158015612489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ad9190612ea3565b9050808383815181106124c2576124c261316a565b602090810291909101015250806124d8816130e3565b9150506123ef565b506001600160a01b0386166000908152600960209081526040918290206003810180548451818502810185019095528085529093600490920192859291859183018282801561254e57602002820191906000526020600020905b81548152602001906001019080831161253a575b50505050509250818054806020026020016040519081016040528092919081815260200182805480156125a057602002820191906000526020600020905b81548152602001906001019080831161258c575b5050505050915094509450945050509193909250565b6000546001600160a01b031633146125e05760405162461bcd60e51b815260040161091390613015565b6001600160a01b0381166126455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610913565b61238181612a07565b6001600160a01b0381166000908152600960205260408120600401546060918291908167ffffffffffffffff81111561268957612689613180565b6040519080825280602002602001820160405280156126b2578160200160208202803683370190505b50905060005b828110156127a957600480546001600160a01b0388811660009081526009602052604081209093018054919092169163e876b6f591859081106126fd576126fd61316a565b90600052602060002001546040518263ffffffff1660e01b815260040161272691815260200190565b60206040518083038186803b15801561273e57600080fd5b505afa158015612752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127769190612ea3565b90508083838151811061278b5761278b61316a565b602090810291909101015250806127a1816130e3565b9150506126b8565b5060096000866001600160a01b03166001600160a01b03168152602001908152602001600020600401818180548060200260200160405190810160405280929190818152602001828054801561281e57602002820191906000526020600020905b81548152602001906001019080831161280a575b50505050509150935093505050915091565b6000546001600160a01b0316331461285a5760405162461bcd60e51b815260040161091390613015565b60088054911515620100000262ff000019909216919091179055565b61287f816119b5565b6001600160a01b038216600090815260096020526040812080549091906128a7908490613081565b90915550506001600160a01b0316600090815260096020526040902042600190910155565b6060600080600185516128df91906130cc565b855190915060005b8181101561293457858782815181106129025761290261316a565b602002602001015114156129225761291b816001613081565b9350612934565b8061292c816130e3565b9150506128e7565b50826129915760405162461bcd60e51b815260206004820152602660248201527f4e6f7420746865206f776e6572206f72206475706c6963617465204e465420696044820152651b881b1a5cdd60d21b6064820152608401610913565b61299c6001846130cc565b92508183146129fd578582815181106129b7576129b761316a565b60200260200101518684815181106129d1576129d161316a565b602002602001018181525050848683815181106129f0576129f061316a565b6020026020010181815250505b5093949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60085460009062010000900460ff16612a7257506001919050565b6005546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015612ab857600080fd5b505afa158015612acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af09190612ea3565b1115612afe57506001919050565b6006546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015612b4457600080fd5b505afa158015612b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7c9190612ea3565b1192915050565b828054828255906000526020600020908101928215612bbe579160200282015b82811115612bbe578251825591602001919060010190612ba3565b50612bca929150612bce565b5090565b5b80821115612bca5760008155600101612bcf565b600082601f830112612bf457600080fd5b8135602067ffffffffffffffff80831115612c1157612c11613180565b8260051b604051601f19603f83011681018181108482111715612c3657612c36613180565b60405284815283810192508684018288018501891015612c5557600080fd5b600092505b85831015612c78578035845292840192600192909201918401612c5a565b50979650505050505050565b600060208284031215612c9657600080fd5b8135610d8881613196565b600060208284031215612cb357600080fd5b8151610d8881613196565b600080600080600060808688031215612cd657600080fd5b8535612ce181613196565b94506020860135612cf181613196565b935060408601359250606086013567ffffffffffffffff80821115612d1557600080fd5b818801915088601f830112612d2957600080fd5b813581811115612d3857600080fd5b896020828501011115612d4a57600080fd5b9699959850939650602001949392505050565b60008060408385031215612d7057600080fd5b8235612d7b81613196565b9150602083013567ffffffffffffffff811115612d9757600080fd5b612da385828601612be3565b9150509250929050565b60008060408385031215612dc057600080fd5b8235612dcb81613196565b946020939093013593505050565b600080600060608486031215612dee57600080fd5b8335612df981613196565b95602085013595506040909401359392505050565b60008060408385031215612e2157600080fd5b823567ffffffffffffffff80821115612e3957600080fd5b612e4586838701612be3565b93506020850135915080821115612e5b57600080fd5b50612da385828601612be3565b600060208284031215612e7a57600080fd5b81358015158114610d8857600080fd5b600060208284031215612e9c57600080fd5b5035919050565b600060208284031215612eb557600080fd5b5051919050565b600081518084526020808501945080840160005b83811015612eec57815187529582019590820190600101612ed0565b509495945050505050565b604081526000612f0a6040830185612ebc565b8281036020840152612f1c8185612ebc565b95945050505050565b606081526000612f386060830186612ebc565b8281036020840152612f4a8186612ebc565b90508281036040840152612f5e8185612ebc565b9695505050505050565b6020808252603b908201527f556e6b6e6f776e20636f6e7472616374206f72207374616b696e67206973206e60408201527f6f742079657420656e61626c656420666f722074686973204e46540000000000606082015260800190565b60208082526030908201527f5472656173757269657320616e6420506173736573207374616b696e6720697360408201526f081b9bdd081e595d08195b98589b195960821b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561309457613094613112565b500190565b6000826130a8576130a8613128565b500490565b60008160001904831182151516156130c7576130c7613112565b500290565b6000828210156130de576130de613112565b500390565b60006000198214156130f7576130f7613112565b5060010190565b60008261310d5761310d613128565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461238157600080fdfea2646970667358221220676c337e2697eb02682c9b7a330781f24aba7e8f7b26dd3ac9d3d7d94d87671064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a231200000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e94600000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93000000000000000000000000e3a10ce1d69ac6e378ad5cc2ce4215787daaba1e000000000000000000000000bbccbd7bd5601232334cd64846e0cc64dfe37b4e
-----Decoded View---------------
Arg [0] : _apes (address): 0x34c4EBA1966B502dfCF0868b6f271d85CC8A2312
Arg [1] : _staking (address): 0x00a103267A22971375C3C37d6E1f1BDfb548e946
Arg [2] : _mal (address): 0x65fd5d7eA09459c932Aa70eba22548cd16283c93
Arg [3] : _treasury (address): 0xE3a10cE1D69Ac6E378AD5Cc2Ce4215787dAAbA1e
Arg [4] : _pass (address): 0xbBCCBD7BD5601232334CD64846e0cC64dFE37b4E
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a2312
Arg [1] : 00000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e946
Arg [2] : 00000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93
Arg [3] : 000000000000000000000000e3a10ce1d69ac6e378ad5cc2ce4215787daaba1e
Arg [4] : 000000000000000000000000bbccbd7bd5601232334cd64846e0cc64dfe37b4e
Deployed Bytecode Sourcemap
54497:13353:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54842:25;;;;;;;;;;;;;;;7445:14:1;;7438:22;7420:41;;7408:2;7393:18;54842:25:0;;;;;;;;62937:858;;;;;;:::i;:::-;;:::i;:::-;;;17431:25:1;;;17419:2;17404:18;62937:858:0;17285:177:1;64514:130:0;;;;;;:::i;:::-;-1:-1:-1;;;;;64600:14:0;64576:7;64600:14;;;:8;:14;;;;;:29;;:36;;64514:130;67542:190;;;;;;:::i;:::-;67663:60;67542:190;;;;;;;;;;;-1:-1:-1;;;;;;7634:33:1;;;7616:52;;7604:2;7589:18;67542:190:0;7472:202:1;64354:152:0;;;;;;:::i;:::-;-1:-1:-1;;;;;64459:30:0;;;64434:7;64459:30;;;:13;:30;;;;;;;;:39;;;;;;;;;;64354:152;;;;-1:-1:-1;;;;;5433:32:1;;;5415:51;;5403:2;5388:18;64354:152:0;5269:203:1;65141:303:0;;;;;;:::i;:::-;;:::i;:::-;;60970:143;;;:::i;67283:91::-;;;;;;:::i;:::-;;:::i;65665:574::-;;;;;;:::i;:::-;;:::i;54614:20::-;;;;;-1:-1:-1;;;;;54614:20:0;;;63803:259;;;;;;:::i;:::-;;:::i;62557:173::-;;;;;;:::i;:::-;;:::i;54699:46::-;;54740:5;54699:46;;66277:130;;;;;;:::i;:::-;;:::i;58499:1333::-;;;;;;:::i;:::-;;:::i;43546:103::-;;;:::i;54559:15::-;;;;;-1:-1:-1;;;;;54559:15:0;;;56875:1616;;;;;;:::i;:::-;;:::i;66415:116::-;;;;;;:::i;:::-;;:::i;54913:24::-;;;;;;;;;;;;62329:220;;;;;;:::i;:::-;;:::i;42895:87::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;42895:87;;54671:19;;;;;-1:-1:-1;;;;;54671:19:0;;;65452:201;;;;;;:::i;:::-;;:::i;59840:612::-;;;:::i;60460:502::-;;;;;;:::i;:::-;;:::i;67382:152::-;;;:::i;55591:30::-;;;;;;:::i;:::-;;:::i;66690:585::-;;;;;;:::i;:::-;;:::i;54752:47::-;;;;;;54581:26;;;;;-1:-1:-1;;;;;54581:26:0;;;67740:107;;;:::i;54808:27::-;;;;;;;;;61121:538;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;55495:35::-;;;;;;43804:201;;;;;;:::i;:::-;;:::i;54874:32::-;;;;;;;;;;;;64652:481;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;66539:143::-;;;;;;:::i;:::-;;:::i;54641:23::-;;;;;-1:-1:-1;;;;;54641:23:0;;;62937:858;-1:-1:-1;;;;;63039:16:0;;62999:7;63039:16;;;:8;:16;;;;;;;;63018:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62999:7;;63018:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63068:27;63098:3;;;;;;;;;-1:-1:-1;;;;;63098:3:0;-1:-1:-1;;;;;63098:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63159:18;;;;63068:53;;-1:-1:-1;63132:24:0;63205:38;63159:18;63068:53;63205:38;:::i;:::-;63188:55;;63256:20;63324:1;63295:4;:19;;;:26;:30;63291:158;;;63424:11;;-1:-1:-1;;;;;63424:11:0;63406:31;;;;:9;:31;;;;;;63371:19;;;;:26;63400:3;;63357:11;:6;63366:2;63357:11;:::i;:::-;:40;;;;:::i;:::-;:46;;;;:::i;:::-;:80;;;;:::i;:::-;63341:96;;;;:::i;:::-;;;63291:158;63464:9;63459:297;63483:4;:15;;;:22;63479:1;:26;63459:297;;;63546:7;;63573:15;;;;:18;;63526:17;;-1:-1:-1;;;;;63546:7:0;;:26;;63589:1;;63573:18;;;;;;:::i;:::-;;;;;;;63546:46;;;;;;;;;;;;;17431:25:1;;17419:2;17404:18;;17285:177;63546:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63607:17;63627:27;;;:16;:27;;;;;;;;;63735:7;;-1:-1:-1;;;;;63735:7:0;63717:27;;:9;:27;;;;;;;63526:66;;-1:-1:-1;63627:27:0;63711:3;63627:27;63685:11;:6;63694:2;63685:11;:::i;:::-;:23;;;;:::i;:::-;:29;;;;:::i;:::-;:59;;;;:::i;:::-;63669:75;;;;:::i;:::-;;;63511:245;;63507:3;;;;;:::i;:::-;;;;63459:297;;;-1:-1:-1;63775:12:0;62937:858;-1:-1:-1;;;;;;62937:858:0:o;65141:303::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;;;;;;;;;65258:11:::1;:32:::0;;-1:-1:-1;;;;;;65258:32:0::1;-1:-1:-1::0;;;;;65258:32:0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;65299:25:0;;;:14:::1;:25;::::0;;;;;;;:50;;-1:-1:-1;;65299:50:0::1;::::0;;65358:9:::1;:20:::0;;;;;;:31;65398:20:::1;:38:::0;65141:303::o;60970:143::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;61025:12:::1;::::0;;;::::1;;;:21;61017:60;;;::::0;-1:-1:-1;;;61017:60:0;;10852:2:1;61017:60:0::1;::::0;::::1;10834:21:1::0;10891:2;10871:18;;;10864:30;10930:28;10910:18;;;10903:56;10976:18;;61017:60:0::1;10650:350:1::0;61017:60:0::1;61086:12;:19:::0;;-1:-1:-1;;61086:19:0::1;::::0;::::1;::::0;;60970:143::o;67283:91::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;67344:13:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;67344:22:0;;::::1;::::0;;;::::1;::::0;;67283:91::o;65665:574::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;65818:16:::1;:23;65797:10;:17;:44;65789:78;;;::::0;-1:-1:-1;;;65789:78:0;;15323:2:1;65789:78:0::1;::::0;::::1;15305:21:1::0;15362:2;15342:18;;;15335:30;-1:-1:-1;;;15381:18:1;;;15374:51;15442:18;;65789:78:0::1;15121:345:1::0;65789:78:0::1;65883:9;65878:354;65902:10;:17;65898:1;:21;65878:354;;;65948:10;65959:1;65948:13;;;;;;;;:::i;:::-;;;;;;;65965:1;65948:18;:40;;;;65970:10;65981:1;65970:13;;;;;;;;:::i;:::-;;;;;;;65987:1;65970:18;65948:40;:63;;;;65992:10;66003:1;65992:13;;;;;;;;:::i;:::-;;;;;;;66009:2;65992:19;65948:63;65940:128;;;::::0;-1:-1:-1;;;65940:128:0;;13350:2:1;65940:128:0::1;::::0;::::1;13332:21:1::0;13389:2;13369:18;;;13362:30;13428:34;13408:18;;;13401:62;-1:-1:-1;;;13479:18:1;;;13472:50;13539:19;;65940:128:0::1;13148:416:1::0;65940:128:0::1;66113:1;66091:16;66108:1;66091:19;;;;;;;;:::i;:::-;;;;;;;:23;66083:69;;;::::0;-1:-1:-1;;;66083:69:0;;17085:2:1;66083:69:0::1;::::0;::::1;17067:21:1::0;17124:2;17104:18;;;17097:30;17163:34;17143:18;;;17136:62;-1:-1:-1;;;17214:18:1;;;17207:31;17255:19;;66083:69:0::1;16883:397:1::0;66083:69:0::1;66201:16;66218:1;66201:19;;;;;;;;:::i;:::-;;;;;;;66167:16;:31;66184:10;66195:1;66184:13;;;;;;;;:::i;:::-;;;;;;;66167:31;;;;;;;;;;;:53;;;;65921:3;;;;;:::i;:::-;;;;65878:354;;;;65665:574:::0;;:::o;63803:259::-;-1:-1:-1;;;;;63909:17:0;;63869:7;63909:17;;;:8;:17;;;;;;;;63888:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63869:7;;63888:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54740:5;64010:4;:19;;;:26;63987:20;;:49;;;;:::i;:::-;63963:19;;;;63945:37;;:15;:37;:::i;:::-;63944:93;;;;:::i;:::-;:110;;;;:::i;:::-;63937:117;63803:259;-1:-1:-1;;;63803:259:0:o;62557:173::-;62627:7;62689:33;62715:6;62689:25;:33::i;:::-;-1:-1:-1;;;;;62652:16:0;;;;;;:8;:16;;;;;:34;:70;;;;:::i;:::-;62645:77;62557:173;-1:-1:-1;;62557:173:0:o;66277:130::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66338:19:0::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;66338:26:0::1;66360:4;66338:26:::0;;::::1;::::0;;;66373:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;66373:26:0::1;::::0;;::::1;::::0;;66277:130::o;58499:1333::-;53017:1;53615:7;;:19;;53607:63;;;;-1:-1:-1;;;53607:63:0;;;;;;;:::i;:::-;53017:1;53748:7;:18;58608:15;;58600:52:::1;;;::::0;-1:-1:-1;;;58600:52:0;;14196:2:1;58600:52:0::1;::::0;::::1;14178:21:1::0;14235:2;14215:18;;;14208:30;-1:-1:-1;;;14254:18:1;;;14247:50;14314:18;;58600:52:0::1;13994:344:1::0;58600:52:0::1;-1:-1:-1::0;;;;;58669:29:0;::::1;::::0;;::::1;::::0;:72:::1;;-1:-1:-1::0;58729:11:0::1;::::0;-1:-1:-1;;;;;58702:39:0;;::::1;58729:11:::0;::::1;58702:39;58669:72;:111;;;-1:-1:-1::0;58772:7:0::1;::::0;-1:-1:-1;;;;;58745:35:0;;::::1;58772:7:::0;::::1;58745:35;58669:111;58661:183;;;;-1:-1:-1::0;;;58661:183:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58882:31:0;::::1;58853:26;58882:31:::0;;;:14:::1;:31;::::0;;;;;;;;16383:10;58944:22;;;:8:::1;:22:::0;;;;;58882:31:::1;::::0;;::::1;::::0;58944:22;58977:24:::1;::::0;:10:::1;:24::i;:::-;59017:9;59012:684;59032:8;:15;59028:1;:19;59012:684;;;59130:4;-1:-1:-1::0;;;;;59073:62:0::1;59081:15;-1:-1:-1::0;;;;;59073:32:0::1;;59106:8;59115:1;59106:11;;;;;;;;:::i;:::-;;;;;;;59073:45;;;;;;;;;;;;;17431:25:1::0;;17419:2;17404:18;;17285:177;59073:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59073:62:0::1;;59065:88;;;::::0;-1:-1:-1;;;59065:88:0;;12665:2:1;59065:88:0::1;::::0;::::1;12647:21:1::0;12704:2;12684:18;;;12677:30;-1:-1:-1;;;12723:18:1;;;12716:43;12776:18;;59065:88:0::1;12463:337:1::0;59065:88:0::1;-1:-1:-1::0;;;;;59166:30:0;::::1;59220:1;59166:30:::0;;;:13:::1;:30;::::0;;;;59197:11;;59220:1;;59197:8;;59206:1;;59197:11;::::1;;;;;:::i;:::-;;;;;;;59166:43;;;;;;;;;;;;:56;;;;;-1:-1:-1::0;;;;;59166:56:0::1;;;;;-1:-1:-1::0;;;;;59166:56:0::1;;;;;;59255:22;59239:38;;;;;;;;:::i;:::-;:12;:38;;;;;;;;:::i;:::-;;59235:182;;;59314:53;59334:4;:19;;59314:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59355:8;59364:1;59355:11;;;;;;;;:::i;:::-;;;;;;;59314:19;:53::i;:::-;59292:75:::0;;::::1;::::0;:19:::1;::::0;::::1;::::0;:75:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;59380:4;:19;;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59235:182;59447:18;59431:12;:34;;;;;;;;:::i;:::-;;59427:166;;;59498:49;59518:4;:15;;59498:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59535:8;59544:1;59535:11;;;;;;;;:::i;59498:49::-;59480:67:::0;;::::1;::::0;:15:::1;::::0;::::1;::::0;:67:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;59560:4;:15;;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59427:166;-1:-1:-1::0;;;;;59603:41:0;::::1;;59653:4;16383:10:::0;59674:8:::1;59683:1;59674:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;59603:83:::1;::::0;-1:-1:-1;;;;;;59603:83:0::1;::::0;;;;;;-1:-1:-1;;;;;5735:15:1;;;59603:83:0::1;::::0;::::1;5717:34:1::0;5787:15;;;;5767:18;;;5760:43;5819:18;;;5812:34;5652:18;;59603:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59049:3;;;;;:::i;:::-;;;;59012:684;;;;59727:3;;;;;;;;;-1:-1:-1::0;;;;;59727:3:0::1;-1:-1:-1::0;;;;;59727:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59706:18;::::0;::::1;:44:::0;59808:15;;59766:58:::1;::::0;;-1:-1:-1;;;;;6049:32:1;;6031:51;;6113:2;6098:18;;6091:34;;;;16383:10:0;;59766:58:::1;::::0;6004:18:1;59766:58:0::1;;;;;;;;-1:-1:-1::0;;52973:1:0;53927:22;;-1:-1:-1;;58499:1333:0:o;43546:103::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;43611:30:::1;43638:1;43611:18;:30::i;:::-;43546:103::o:0;56875:1616::-;53017:1;53615:7;;:19;;53607:63;;;;-1:-1:-1;;;53607:63:0;;;;;;;:::i;:::-;53017:1;53748:7;:18;56990:11:::1;::::0;-1:-1:-1;;;;;56990:11:0::1;56982:34:::0;;::::1;::::0;:68:::1;;-1:-1:-1::0;57028:7:0::1;::::0;-1:-1:-1;;;;;57028:7:0::1;57020:30:::0;::::1;56982:68;56974:129;;;;-1:-1:-1::0;;;56974:129:0::1;;;;;;;:::i;:::-;57121:13;::::0;::::1;::::0;::::1;;;57120:14;57112:41;;;::::0;-1:-1:-1;;;57112:41:0;;13007:2:1;57112:41:0::1;::::0;::::1;12989:21:1::0;13046:2;13026:18;;;13019:30;-1:-1:-1;;;13065:18:1;;;13058:44;13119:18;;57112:41:0::1;12805:338:1::0;57112:41:0::1;57170:15;::::0;::::1;;57162:76;;;;-1:-1:-1::0;;;57162:76:0::1;;;;;;;:::i;:::-;57273:1;57255:8;:15;:19;57247:53;;;::::0;-1:-1:-1;;;57247:53:0;;15673:2:1;57247:53:0::1;::::0;::::1;15655:21:1::0;15712:2;15692:18;;;15685:30;-1:-1:-1;;;15731:18:1;;;15724:51;15792:18;;57247:53:0::1;15471:345:1::0;57247:53:0::1;-1:-1:-1::0;;;;;57317:29:0;::::1;::::0;;::::1;::::0;:72:::1;;-1:-1:-1::0;57377:11:0::1;::::0;-1:-1:-1;;;;;57350:39:0;;::::1;57377:11:::0;::::1;57350:39;57317:72;:111;;;-1:-1:-1::0;57420:7:0::1;::::0;-1:-1:-1;;;;;57393:35:0;;::::1;57420:7:::0;::::1;57393:35;57317:111;57309:183;;;;-1:-1:-1::0;;;57309:183:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57530:31:0;::::1;57501:26;57530:31:::0;;;:14:::1;:31;::::0;;;;;;;;16383:10;57594:22;;:8:::1;:22:::0;;;;;;57631:19:::1;::::0;::::1;:26:::0;57530:31:::1;::::0;;::::1;::::0;57631;:62;::::1;;;-1:-1:-1::0;57666:15:0::1;::::0;::::1;:22:::0;:27;57631:62:::1;57627:189;;;57734:3;::::0;:23:::1;::::0;;-1:-1:-1;;;57734:23:0;;;;57706:25:::1;::::0;-1:-1:-1;;;;;57734:3:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:3;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57768:18;::::0;::::1;:38:::0;-1:-1:-1;57627:189:0::1;57826:24;16383:10:::0;58977::::1;:24::i;57826:::-;57866:9;57861:516;57881:8;:15;57877:1;:19;57861:516;;;16383:10:::0;-1:-1:-1;;;;;57922:61:0::1;57930:15;-1:-1:-1::0;;;;;57922:32:0::1;;57955:8;57964:1;57955:11;;;;;;;;:::i;:::-;;;;;;;57922:45;;;;;;;;;;;;;17431:25:1::0;;17419:2;17404:18;;17285:177;57922:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57922:61:0::1;;57914:102;;;::::0;-1:-1:-1;;;57914:102:0;;16728:2:1;57914:102:0::1;::::0;::::1;16710:21:1::0;16767:2;16747:18;;;16740:30;16806;16786:18;;;16779:58;16854:18;;57914:102:0::1;16526:352:1::0;57914:102:0::1;-1:-1:-1::0;;;;;58027:41:0;::::1;;16383:10:::0;58091:4:::1;58098:8;58107:1;58098:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;58027:83:::1;::::0;-1:-1:-1;;;;;;58027:83:0::1;::::0;;;;;;-1:-1:-1;;;;;5735:15:1;;;58027:83:0::1;::::0;::::1;5717:34:1::0;5787:15;;;;5767:18;;;5760:43;5819:18;;;5812:34;5652:18;;58027:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58169:12;16383:10:::0;;16303:98;58169:12:::1;-1:-1:-1::0;;;;;58123:30:0;::::1;;::::0;;;:13:::1;:30;::::0;;;;58154:11;;58123:30;;;58154:8;;58163:1;;58154:11;::::1;;;;;:::i;:::-;;;;;;;58123:43;;;;;;;;;;;;:58;;;;;-1:-1:-1::0;;;;;58123:58:0::1;;;;;-1:-1:-1::0;;;;;58123:58:0::1;;;;;;58214:22;58198:38;;;;;;;;:::i;:::-;:12;:38;;;;;;;;:::i;:::-;;58194:86;;;58240:4;:19;;58265:8;58274:1;58265:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;58240:37;;::::1;::::0;::::1;::::0;;-1:-1:-1;58240:37:0;;;;;;;::::1;::::0;58194:86:::1;58310:18;58294:12;:34;;;;;;;;:::i;:::-;;58290:78;;;58332:4;:15;;58353:8;58362:1;58353:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;58332:33;;::::1;::::0;::::1;::::0;;-1:-1:-1;58332:33:0;;;;;;;::::1;::::0;58290:78:::1;57898:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57861:516;;;-1:-1:-1::0;58387:24:0::1;16383:10:::0;58977::::1;:24::i;58387:::-;58467:15:::0;;58427:56:::1;::::0;;-1:-1:-1;;;;;6049:32:1;;6031:51;;6113:2;6098:18;;6091:34;;;;16383:10:0;;58427:56:::1;::::0;6004:18:1;58427:56:0::1;5857:274:1::0;66415:116:0;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66487:28:0::1;66518:5;66487:28:::0;;;:11:::1;:28;::::0;;;;:36;;-1:-1:-1;;66487:36:0::1;::::0;;66415:116::o;62329:220::-;-1:-1:-1;;;;;62423:16:0;;62401:7;62423:16;;;:8;:16;;;;;:31;;;62419:55;;-1:-1:-1;62470:1:0;;62329:220;-1:-1:-1;62329:220:0:o;62419:55::-;62515:26;62534:6;62515:18;:26::i;:::-;62489:23;62505:6;62489:15;:23::i;:::-;:52;;;;:::i;65452:201::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;65536:7:::1;:22:::0;;-1:-1:-1;;;;;;65536:22:0::1;-1:-1:-1::0;;;;;65536:22:0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;65567:21:0;;;:14:::1;:21;::::0;;;;;;;:42;;-1:-1:-1;;65567:42:0::1;-1:-1:-1::0;65567:42:0::1;::::0;;65618:9:::1;:16:::0;;;;;;:27;65452:201::o;59840:612::-;53017:1;53615:7;;:19;;53607:63;;;;-1:-1:-1;;;53607:63:0;;;;;;;:::i;:::-;53017:1;53748:7;:18;16383:10;59899:19:::1;59921:22:::0;;;:8:::1;:22;::::0;;;;;59954:24:::1;::::0;58977:10:::1;:24::i;59954:::-;59999:22:::0;;59991:57:::1;;;::::0;-1:-1:-1;;;59991:57:0;;11562:2:1;59991:57:0::1;::::0;::::1;11544:21:1::0;11601:2;11581:18;;;11574:30;-1:-1:-1;;;11620:18:1;;;11613:48;11678:18;;59991:57:0::1;11360:342:1::0;59991:57:0::1;60067:35;16383:10:::0;60067:21:::1;:35::i;:::-;60059:104;;;::::0;-1:-1:-1;;;60059:104:0;;13771:2:1;60059:104:0::1;::::0;::::1;13753:21:1::0;13810:2;13790:18;;;13783:30;13849:34;13829:18;;;13822:62;13920:26;13900:18;;;13893:54;13964:19;;60059:104:0::1;13569:420:1::0;60059:104:0::1;60176:23;60202:37;16383:10:::0;62557:173;:::i;60202:37::-:1;60176:63;;60273:3;;;;;;;;;-1:-1:-1::0;;;;;60273:3:0::1;-1:-1:-1::0;;;;;60273:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60252:18;::::0;;::::1;:44:::0;;;;60332:1:::1;60307:26:::0;;60344:3;-1:-1:-1;;;;;60344:3:0::1;:17;16383:10:::0;60344:48:::1;::::0;-1:-1:-1;;;;;;60344:48:0::1;::::0;;;;;;-1:-1:-1;;;;;6049:32:1;;;60344:48:0::1;::::0;::::1;6031:51:1::0;6098:18;;;6091:34;;;6004:18;;60344:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60414:12;16383:10:::0;;16303:98;60414:12:::1;-1:-1:-1::0;;;;;60408:36:0::1;;60428:15;60408:36;;;;17431:25:1::0;;17419:2;17404:18;;17285:177;60408:36:0::1;;;;;;;;-1:-1:-1::0;;52973:1:0;53927:22;;59840:612::o;60460:502::-;53017:1;53615:7;;:19;;53607:63;;;;-1:-1:-1;;;53607:63:0;;;;;;;:::i;:::-;53017:1;53748:7;:18;60530:12:::1;::::0;;;::::1;;;60522:72;;;::::0;-1:-1:-1;;;60522:72:0;;8772:2:1;60522:72:0::1;::::0;::::1;8754:21:1::0;8811:2;8791:18;;;8784:30;8850:34;8830:18;;;8823:62;-1:-1:-1;;;8901:18:1;;;8894:45;8956:19;;60522:72:0::1;8570:411:1::0;60522:72:0::1;60611:3;::::0;60647:6;;-1:-1:-1;;;;;60611:3:0::1;:18;16383:10:::0;60611:32:::1;::::0;-1:-1:-1;;;;;;60611:32:0::1;::::0;;;;;;-1:-1:-1;;;;;5433:32:1;;;60611::0::1;::::0;::::1;5415:51:1::0;5388:18;;60611:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;60603:75;;;::::0;-1:-1:-1;;;60603:75:0;;12316:2:1;60603:75:0::1;::::0;::::1;12298:21:1::0;12355:2;12335:18;;;12328:30;-1:-1:-1;;;12374:18:1;;;12367:50;12434:18;;60603:75:0::1;12114:344:1::0;60603:75:0::1;60705:19;;60695:6;:29;;60687:68;;;::::0;-1:-1:-1;;;60687:68:0;;11207:2:1;60687:68:0::1;::::0;::::1;11189:21:1::0;11246:2;11226:18;;;11219:30;11285:28;11265:18;;;11258:56;11331:18;;60687:68:0::1;11005:350:1::0;60687:68:0::1;60781:19;::::0;60772:28:::1;::::0;:6;:28:::1;:::i;:::-;:33:::0;60764:104:::1;;;::::0;-1:-1:-1;;;60764:104:0;;9188:2:1;60764:104:0::1;::::0;::::1;9170:21:1::0;9227:2;9207:18;;;9200:30;9266:34;9246:18;;;9239:62;9337:28;9317:18;;;9310:56;9383:19;;60764:104:0::1;8986:422:1::0;60764:104:0::1;60877:3;::::0;-1:-1:-1;;;;;60877:3:0::1;:12;16383:10:::0;60877:34:::1;::::0;-1:-1:-1;;;;;;60877:34:0::1;::::0;;;;;;-1:-1:-1;;;;;6049:32:1;;;60877:34:0::1;::::0;::::1;6031:51:1::0;6098:18;;;6091:34;;;6004:18;;60877:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60933:12;16383:10:::0;;16303:98;60933:12:::1;-1:-1:-1::0;;;;;60925:29:0::1;;60947:6;60925:29;;;;17431:25:1::0;;17419:2;17404:18;;17285:177;60925:29:0::1;;;;;;;;-1:-1:-1::0;52973:1:0;53927:22;;60460:502::o;67382:152::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;67442:15:::1;::::0;::::1;;67441:16;67433:62;;;::::0;-1:-1:-1;;;67433:62:0;;10450:2:1;67433:62:0::1;::::0;::::1;10432:21:1::0;10489:2;10469:18;;;10462:30;10528:34;10508:18;;;10501:62;-1:-1:-1;;;10579:18:1;;;10572:31;10620:19;;67433:62:0::1;10248:397:1::0;67433:62:0::1;67504:15;:22:::0;;-1:-1:-1;;67504:22:0::1;67522:4;67504:22;::::0;;67382:152::o;55591:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55591:30:0;;-1:-1:-1;55591:30:0;:::o;66690:585::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;66818:2:::1;66799:8;:15;:21;;66791:50;;;::::0;-1:-1:-1;;;66791:50:0;;16023:2:1;66791:50:0::1;::::0;::::1;16005:21:1::0;16062:2;16042:18;;;16035:30;-1:-1:-1;;;16081:18:1;;;16074:46;16137:18;;66791:50:0::1;15821:340:1::0;66791:50:0::1;66850:18;66863:4;66850:12;:18::i;:::-;66882:9;66877:391;66897:8;:15;66893:1;:19;66877:391;;;-1:-1:-1::0;;;;;66949:27:0;::::1;66930:16;66949:27:::0;;;:13:::1;:27;::::0;;;;66977:11;;66930:16;;66977:8;;66986:1;;66977:11;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;66949:40;;;::::1;::::0;;;;;;-1:-1:-1;66949:40:0;;-1:-1:-1;;;;;66949:40:0::1;::::0;-1:-1:-1;67004:22:0;;;::::1;::::0;:85:::1;;;67084:4;-1:-1:-1::0;;;;;67030:59:0::1;67038:12;-1:-1:-1::0;;;;;67030:29:0::1;;67060:8;67069:1;67060:11;;;;;;;;:::i;:::-;;;;;;;67030:42;;;;;;;;;;;;;17431:25:1::0;;17419:2;17404:18;;17285:177;67030:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67030:59:0::1;;67004:85;67000:259;;;67112:12;-1:-1:-1::0;;;;;67104:34:0::1;;67147:4;67154:8;67164;67173:1;67164:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;67104:72:::1;::::0;-1:-1:-1;;;;;;67104:72:0::1;::::0;;;;;;-1:-1:-1;;;;;5735:15:1;;;67104:72:0::1;::::0;::::1;5717:34:1::0;5787:15;;;;5767:18;;;5760:43;5819:18;;;5812:34;5652:18;;67104:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67235:8;67244:1;67235:11;;;;;;;;:::i;:::-;;;;;;;67221:12;-1:-1:-1::0;;;;;67194:53:0::1;67211:8;-1:-1:-1::0;;;;;67194:53:0::1;;;;;;;;;;;67000:259;-1:-1:-1::0;66914:3:0;::::1;::::0;::::1;:::i;:::-;;;;66877:391;;67740:107:::0;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;42941:7;42968:6;;67791:48:::1;::::0;-1:-1:-1;;;;;42968:6:0;;;;67817:21:::1;67791:48:::0;::::1;;;::::0;67817:21;;67791:48;42941:7;67791:48;67817:21;42968:6;67791:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;67740:107::o:0;61121:538::-;-1:-1:-1;;;;;61267:16:0;;61245:19;61267:16;;;:8;:16;;;;;:27;;:34;61180:16;;;;;;61267:34;61341:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61341:26:0;;61312:55;;61383:9;61378:183;61402:11;61398:1;:15;61378:183;;;61453:7;;;-1:-1:-1;;;;;61480:16:0;;;61434;61480;;;:8;:16;;;;;:27;;;:30;;61453:7;;;;;:26;;61508:1;;61480:30;;;;;;:::i;:::-;;;;;;;;;61453:58;;;;;;;;;;;;;17431:25:1;;17419:2;17404:18;;17285:177;61453:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61434:77;;61541:8;61526:9;61536:1;61526:12;;;;;;;;:::i;:::-;;;;;;;;;;:23;-1:-1:-1;61415:3:0;;;;:::i;:::-;;;;61378:183;;;-1:-1:-1;;;;;;61579:16:0;;;;;;:8;:16;;;;;;;;;:31;;;61571:80;;;;;;;;;;;;;;;;;61579:31;;61612:27;;;;;61641:9;;61571:80;61579:31;;61571:80;;61579:31;61571:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61121:538;;;;;:::o;43804:201::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43893:22:0;::::1;43885:73;;;::::0;-1:-1:-1;;;43885:73:0;;10043:2:1;43885:73:0::1;::::0;::::1;10025:21:1::0;10082:2;10062:18;;;10055:30;10121:34;10101:18;;;10094:62;-1:-1:-1;;;10172:18:1;;;10165:36;10218:19;;43885:73:0::1;9841:402:1::0;43885:73:0::1;43969:28;43988:8;43969:18;:28::i;64652:481::-:0;-1:-1:-1;;;;;64780:14:0;;64758:19;64780:14;;;:8;:14;;;;;:25;;:32;64712:16;;;;64780:32;;64852:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64852:26:0;;64823:55;;64894:9;64889:181;64913:11;64909:1;:15;64889:181;;;64964:7;;;-1:-1:-1;;;;;64991:14:0;;;64945:16;64991:14;;;:8;:14;;;;;:25;;;:28;;64964:7;;;;;:26;;65017:1;;64991:28;;;;;;:::i;:::-;;;;;;;;;64964:56;;;;;;;;;;;;;17431:25:1;;17419:2;17404:18;;17285:177;64964:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64945:75;;65050:8;65035:9;65045:1;65035:12;;;;;;;;:::i;:::-;;;;;;;;;;:23;-1:-1:-1;64926:3:0;;;;:::i;:::-;;;;64889:181;;;;65088:8;:14;65097:4;-1:-1:-1;;;;;65088:14:0;-1:-1:-1;;;;;65088:14:0;;;;;;;;;;;;:25;;65115:9;65080:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64652:481;;;:::o;66539:143::-;42941:7;42968:6;-1:-1:-1;;;;;42968:6:0;16383:10;43115:23;43107:68;;;;-1:-1:-1;;;43107:68:0;;;;;;;:::i;:::-;66631:20:::1;:43:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;66631:43:0;;::::1;::::0;;;::::1;::::0;;66539:143::o;62738:191::-;62830:33;62856:6;62830:25;:33::i;:::-;-1:-1:-1;;;;;62792:16:0;;;;;;:8;:16;;;;;:71;;:16;;;:71;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;62872:16:0;;;;;:8;:16;;;;;62906:15;62872:31;;;;:49;62738:191::o;61667:654::-;61759:16;61786:18;61817:22;61856:1;61842:4;:11;:15;;;;:::i;:::-;61883:11;;61817:40;;-1:-1:-1;61866:14:0;61905:141;61928:6;61924:1;:10;61905:141;;;61967:7;61956:4;61961:1;61956:7;;;;;;;;:::i;:::-;;;;;;;:18;61952:85;;;62002:5;:1;62006;62002:5;:::i;:::-;61989:18;;62020:5;;61952:85;61936:3;;;;:::i;:::-;;;;61905:141;;;-1:-1:-1;62062:15:0;62054:66;;;;-1:-1:-1;;;62054:66:0;;11909:2:1;62054:66:0;;;11891:21:1;11948:2;11928:18;;;11921:30;11987:34;11967:18;;;11960:62;-1:-1:-1;;;12038:18:1;;;12031:36;12084:19;;62054:66:0;11707:402:1;62054:66:0;62131:15;62145:1;62131:15;;:::i;:::-;;;62175:14;62161:10;:28;62157:135;;62221:4;62226:14;62221:20;;;;;;;;:::i;:::-;;;;;;;62202:4;62207:10;62202:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;62275:7;62252:4;62257:14;62252:20;;;;;;;;:::i;:::-;;;;;;:30;;;;;62157:135;-1:-1:-1;62309:4:0;;61667:654;-1:-1:-1;;;;61667:654:0:o;44165:191::-;44239:16;44258:6;;-1:-1:-1;;;;;44275:17:0;;;-1:-1:-1;;;;;;44275:17:0;;;;;;44308:40;;44258:6;;;;;;;44308:40;;44239:16;44308:40;44228:128;44165:191;:::o;64070:242::-;64158:20;;64138:4;;64158:20;;;;;64153:38;;-1:-1:-1;64187:4:0;;64070:242;-1:-1:-1;64070:242:0:o;64153:38::-;64204:7;;:23;;-1:-1:-1;;;64204:23:0;;-1:-1:-1;;;;;5433:32:1;;;64204:23:0;;;5415:51:1;64230:1:0;;64204:7;;:17;;5388:18:1;;64204:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;64200:65;;;-1:-1:-1;64251:4:0;;64070:242;-1:-1:-1;64070:242:0:o;64200:65::-;64280:4;;:20;;-1:-1:-1;;;64280:20:0;;-1:-1:-1;;;;;5433:32:1;;;64280:20:0;;;5415:51:1;64303:1:0;;64280:4;;:14;;5388:18:1;;64280:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;;64070:242;-1:-1:-1;;64070:242:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:913:1;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;224:18;261:2;257;254:10;251:36;;;267:18;;:::i;:::-;313:2;310:1;306:10;345:2;339:9;408:2;404:7;399:2;395;391:11;387:25;379:6;375:38;463:6;451:10;448:22;443:2;431:10;428:18;425:46;422:72;;;474:18;;:::i;:::-;510:2;503:22;560:18;;;594:15;;;;-1:-1:-1;629:15:1;;;663;;;659:24;;656:33;-1:-1:-1;653:53:1;;;702:1;699;692:12;653:53;724:1;715:10;;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;766:1;759:9;;;;;875:12;;734:163;;;-1:-1:-1;915:6:1;14:913;-1:-1:-1;;;;;;;14:913:1:o;932:247::-;991:6;1044:2;1032:9;1023:7;1019:23;1015:32;1012:52;;;1060:1;1057;1050:12;1012:52;1099:9;1086:23;1118:31;1143:5;1118:31;:::i;1184:251::-;1254:6;1307:2;1295:9;1286:7;1282:23;1278:32;1275:52;;;1323:1;1320;1313:12;1275:52;1355:9;1349:16;1374:31;1399:5;1374:31;:::i;1440:936::-;1537:6;1545;1553;1561;1569;1622:3;1610:9;1601:7;1597:23;1593:33;1590:53;;;1639:1;1636;1629:12;1590:53;1678:9;1665:23;1697:31;1722:5;1697:31;:::i;:::-;1747:5;-1:-1:-1;1804:2:1;1789:18;;1776:32;1817:33;1776:32;1817:33;:::i;:::-;1869:7;-1:-1:-1;1923:2:1;1908:18;;1895:32;;-1:-1:-1;1978:2:1;1963:18;;1950:32;2001:18;2031:14;;;2028:34;;;2058:1;2055;2048:12;2028:34;2096:6;2085:9;2081:22;2071:32;;2141:7;2134:4;2130:2;2126:13;2122:27;2112:55;;2163:1;2160;2153:12;2112:55;2203:2;2190:16;2229:2;2221:6;2218:14;2215:34;;;2245:1;2242;2235:12;2215:34;2290:7;2285:2;2276:6;2272:2;2268:15;2264:24;2261:37;2258:57;;;2311:1;2308;2301:12;2258:57;1440:936;;;;-1:-1:-1;1440:936:1;;-1:-1:-1;2342:2:1;2334:11;;2364:6;1440:936;-1:-1:-1;;;1440:936:1:o;2381:483::-;2474:6;2482;2535:2;2523:9;2514:7;2510:23;2506:32;2503:52;;;2551:1;2548;2541:12;2503:52;2590:9;2577:23;2609:31;2634:5;2609:31;:::i;:::-;2659:5;-1:-1:-1;2715:2:1;2700:18;;2687:32;2742:18;2731:30;;2728:50;;;2774:1;2771;2764:12;2728:50;2797:61;2850:7;2841:6;2830:9;2826:22;2797:61;:::i;:::-;2787:71;;;2381:483;;;;;:::o;2869:315::-;2937:6;2945;2998:2;2986:9;2977:7;2973:23;2969:32;2966:52;;;3014:1;3011;3004:12;2966:52;3053:9;3040:23;3072:31;3097:5;3072:31;:::i;:::-;3122:5;3174:2;3159:18;;;;3146:32;;-1:-1:-1;;;2869:315:1:o;3189:383::-;3266:6;3274;3282;3335:2;3323:9;3314:7;3310:23;3306:32;3303:52;;;3351:1;3348;3341:12;3303:52;3390:9;3377:23;3409:31;3434:5;3409:31;:::i;:::-;3459:5;3511:2;3496:18;;3483:32;;-1:-1:-1;3562:2:1;3547:18;;;3534:32;;3189:383;-1:-1:-1;;;3189:383:1:o;3577:595::-;3695:6;3703;3756:2;3744:9;3735:7;3731:23;3727:32;3724:52;;;3772:1;3769;3762:12;3724:52;3812:9;3799:23;3841:18;3882:2;3874:6;3871:14;3868:34;;;3898:1;3895;3888:12;3868:34;3921:61;3974:7;3965:6;3954:9;3950:22;3921:61;:::i;:::-;3911:71;;4035:2;4024:9;4020:18;4007:32;3991:48;;4064:2;4054:8;4051:16;4048:36;;;4080:1;4077;4070:12;4048:36;;4103:63;4158:7;4147:8;4136:9;4132:24;4103:63;:::i;4177:273::-;4233:6;4286:2;4274:9;4265:7;4261:23;4257:32;4254:52;;;4302:1;4299;4292:12;4254:52;4341:9;4328:23;4394:5;4387:13;4380:21;4373:5;4370:32;4360:60;;4416:1;4413;4406:12;4455:180;4514:6;4567:2;4555:9;4546:7;4542:23;4538:32;4535:52;;;4583:1;4580;4573:12;4535:52;-1:-1:-1;4606:23:1;;4455:180;-1:-1:-1;4455:180:1:o;4640:184::-;4710:6;4763:2;4751:9;4742:7;4738:23;4734:32;4731:52;;;4779:1;4776;4769:12;4731:52;-1:-1:-1;4802:16:1;;4640:184;-1:-1:-1;4640:184:1:o;4829:435::-;4882:3;4920:5;4914:12;4947:6;4942:3;4935:19;4973:4;5002:2;4997:3;4993:12;4986:19;;5039:2;5032:5;5028:14;5060:1;5070:169;5084:6;5081:1;5078:13;5070:169;;;5145:13;;5133:26;;5179:12;;;;5214:15;;;;5106:1;5099:9;5070:169;;;-1:-1:-1;5255:3:1;;4829:435;-1:-1:-1;;;;;4829:435:1:o;6136:465::-;6393:2;6382:9;6375:21;6356:4;6419:56;6471:2;6460:9;6456:18;6448:6;6419:56;:::i;:::-;6523:9;6515:6;6511:22;6506:2;6495:9;6491:18;6484:50;6551:44;6588:6;6580;6551:44;:::i;:::-;6543:52;6136:465;-1:-1:-1;;;;;6136:465:1:o;6606:669::-;6941:2;6930:9;6923:21;6904:4;6967:56;7019:2;7008:9;7004:18;6996:6;6967:56;:::i;:::-;7071:9;7063:6;7059:22;7054:2;7043:9;7039:18;7032:50;7105:44;7142:6;7134;7105:44;:::i;:::-;7091:58;;7197:9;7189:6;7185:22;7180:2;7169:9;7165:18;7158:50;7225:44;7262:6;7254;7225:44;:::i;:::-;7217:52;6606:669;-1:-1:-1;;;;;;6606:669:1:o;9413:423::-;9615:2;9597:21;;;9654:2;9634:18;;;9627:30;9693:34;9688:2;9673:18;;9666:62;9764:29;9759:2;9744:18;;9737:57;9826:3;9811:19;;9413:423::o;14343:412::-;14545:2;14527:21;;;14584:2;14564:18;;;14557:30;14623:34;14618:2;14603:18;;14596:62;-1:-1:-1;;;14689:2:1;14674:18;;14667:46;14745:3;14730:19;;14343:412::o;14760:356::-;14962:2;14944:21;;;14981:18;;;14974:30;15040:34;15035:2;15020:18;;15013:62;15107:2;15092:18;;14760:356::o;16166:355::-;16368:2;16350:21;;;16407:2;16387:18;;;16380:30;16446:33;16441:2;16426:18;;16419:61;16512:2;16497:18;;16166:355::o;17467:128::-;17507:3;17538:1;17534:6;17531:1;17528:13;17525:39;;;17544:18;;:::i;:::-;-1:-1:-1;17580:9:1;;17467:128::o;17600:120::-;17640:1;17666;17656:35;;17671:18;;:::i;:::-;-1:-1:-1;17705:9:1;;17600:120::o;17725:168::-;17765:7;17831:1;17827;17823:6;17819:14;17816:1;17813:21;17808:1;17801:9;17794:17;17790:45;17787:71;;;17838:18;;:::i;:::-;-1:-1:-1;17878:9:1;;17725:168::o;17898:125::-;17938:4;17966:1;17963;17960:8;17957:34;;;17971:18;;:::i;:::-;-1:-1:-1;18008:9:1;;17898:125::o;18028:135::-;18067:3;-1:-1:-1;;18088:17:1;;18085:43;;;18108:18;;:::i;:::-;-1:-1:-1;18155:1:1;18144:13;;18028:135::o;18168:112::-;18200:1;18226;18216:35;;18231:18;;:::i;:::-;-1:-1:-1;18265:9:1;;18168:112::o;18285:127::-;18346:10;18341:3;18337:20;18334:1;18327:31;18377:4;18374:1;18367:15;18401:4;18398:1;18391:15;18417:127;18478:10;18473:3;18469:20;18466:1;18459:31;18509:4;18506:1;18499:15;18533:4;18530:1;18523:15;18549:127;18610:10;18605:3;18601:20;18598:1;18591:31;18641:4;18638:1;18631:15;18665:4;18662:1;18655:15;18681:127;18742:10;18737:3;18733:20;18730:1;18723:31;18773:4;18770:1;18763:15;18797:4;18794:1;18787:15;18813:127;18874:10;18869:3;18865:20;18862:1;18855:31;18905:4;18902:1;18895:15;18929:4;18926:1;18919:15;18945:127;19006:10;19001:3;18997:20;18994:1;18987:31;19037:4;19034:1;19027:15;19061:4;19058:1;19051:15;19077:131;-1:-1:-1;;;;;19152:31:1;;19142:42;;19132:70;;19198:1;19195;19188:12
Swarm Source
ipfs://676c337e2697eb02682c9b7a330781f24aba7e8f7b26dd3ac9d3d7d94d876710
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.