Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OogaVerseERC721
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @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); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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); } /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev 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); } } } } /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } /** * @dev String operations. */ library StringsUpgradeable { 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); } } /** * @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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } /** * @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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable 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. */ function __ERC721_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.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 {} uint256[44] private __gap; } /** * @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); } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @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; } /** * @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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } interface IDMT_ERC20 { function mint(address account, uint256 amount) external; function burn(address account, uint256 amount) external; } contract OogaVerseERC721 is ERC721Upgradeable, OwnableUpgradeable { struct TokenAttributes { string name; string description; bool isEgg; bool isOG; bool isGenesis; bool isLegendary; bool summonedNewLegendary; } mapping(uint256 => TokenAttributes) public tokenAttributes; mapping(uint256 => bool) public legendaryTokenIdMap; mapping(address => uint256) public currentUserReward; mapping(address => uint256) public lastRewardCalculationAtTimestamp; mapping(address => uint256) public numberOfGenesisOwned; mapping(address => uint256) public numberOfOGOwned; address public constant BURN_ADDRESS = address(0x000000000000000000000000000000000000dEaD); IERC1155 public openSeaContract; uint256 public breedingPrice; uint256 public breedingLegendaryPrice; uint256 public changeNamePrice; uint256 public changeDescriptionPrice; uint256 public revealBeginTimestamp; IDMT_ERC20 public erc20token; uint256 public erc20genesisRewardPerSecond; uint256 public erc20gen2RewardPerSecond; uint256 public doubleOGRewardStartTimestamp; uint256 public doubleOGRewardUntilTimestamp; uint256 public rewardsUntilTimestamp; uint256 public gen1OldIndex; uint256 public startGen2Index; uint256 public totalNumberOfGen2Tokens; uint256 public maxNumberOfGen2Tokens; string public BASE_URI; event Migrate(address indexed fromAddress, uint256 indexed openSeaTokenId, uint256 indexed newTokenId); event Breed(address indexed fromAddress, uint256 indexed newTokenId); event SummonLegendary(address indexed fromAddress, uint256 newTokenId, uint256 indexed tokenId); event Reveal(uint256 indexed tokenId); event ChangeName(uint256 indexed tokenId, string newName); event ChangeDescription(uint256 indexed tokenId, string newDescription); string private _contractURI; mapping(string => bool) private _nameUsed; address private _proxyContractAddress; function initialize( string memory name_, string memory symbol_, uint256 revealBeginTimestamp_, uint256 doubleOGRewardStartTimestamp_, uint256 doubleOGRewardUntilTimestamp_, uint256 rewardsUntilTimestamp_, string memory baseURI_, IDMT_ERC20 erc20token_, IERC1155 openSeaContract_, string memory contractURI_ ) public initializer { __ERC721_init(name_, symbol_); __Ownable_init(); totalNumberOfGen2Tokens = 0; maxNumberOfGen2Tokens = 6000; startGen2Index = 2002001; gen1OldIndex = 1389420; breedingPrice = 2000 * (10 ** 18); breedingLegendaryPrice = 2000 * (10 ** 18); changeNamePrice = 200 * (10 ** 18); changeDescriptionPrice = 200 * (10 ** 18); erc20genesisRewardPerSecond = uint(20 * (10 ** 18)) / uint(1 days); erc20gen2RewardPerSecond = uint(5 * (10 ** 18)) / uint(1 days); BASE_URI = baseURI_; revealBeginTimestamp = revealBeginTimestamp_; doubleOGRewardStartTimestamp = doubleOGRewardStartTimestamp_; doubleOGRewardUntilTimestamp = doubleOGRewardUntilTimestamp_; rewardsUntilTimestamp = rewardsUntilTimestamp_; erc20token = erc20token_; openSeaContract = openSeaContract_; _contractURI = contractURI_; } function _baseURI() internal view virtual override returns (string memory) { return BASE_URI; } 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, uintToStr(tokenId), ".json")) : ""; } function changeBaseURI(string memory baseURI_) external onlyOwner { BASE_URI = baseURI_; } function changeErc20token(IDMT_ERC20 erc20token_) external onlyOwner { erc20token = erc20token_; } function changeOpenSeaContract(IERC1155 openSeaContract_) external onlyOwner { openSeaContract = openSeaContract_; } function changeRevealBeginTimestamp(uint256 revealBeginTimestamp_) external onlyOwner { revealBeginTimestamp = revealBeginTimestamp_; } function changeRenamePrices(uint256 changeNamePrice_, uint256 changeDescriptionPrice_) external onlyOwner { changeNamePrice = changeNamePrice_; changeDescriptionPrice = changeDescriptionPrice_; } function changeBreedingPrices(uint256 breedingPrice_, uint256 breedingLegendaryPrice_) external onlyOwner { breedingPrice = breedingPrice_; breedingLegendaryPrice = breedingLegendaryPrice_; } function changeERC20Rewards(uint256 erc20genesisRewardPerSecond_, uint256 erc20gen2RewardPerSecond_) external onlyOwner { erc20genesisRewardPerSecond = erc20genesisRewardPerSecond_; erc20gen2RewardPerSecond = erc20gen2RewardPerSecond_; } function changeProxyContractAddress(address newProxyContractAddress) external onlyOwner { _proxyContractAddress = newProxyContractAddress; } function _mintNewToken( address mintTo, uint256 newTokenId, bool _isEgg, bool _isOG, bool _isGenesis, bool _isLegendary, bool _summonedNewLegendary ) private returns(uint256) { TokenAttributes storage newToken = tokenAttributes[newTokenId]; if (_isGenesis == false) { require(totalNumberOfGen2Tokens < maxNumberOfGen2Tokens, "01"); totalNumberOfGen2Tokens++; } newToken.name = "Ooga"; newToken.description = ""; newToken.isEgg = _isEgg; newToken.isOG = _isOG; newToken.isGenesis = _isGenesis; newToken.isLegendary = _isLegendary; newToken.summonedNewLegendary = _summonedNewLegendary; _safeMint(mintTo, newTokenId); return newTokenId; } function _passedTime(uint256 begin, uint256 end, uint256 max) private pure returns(uint256) { uint256 end_ = end; if (end_ > max) end_ = max; if (begin >= end_) return 0; return end_ - begin; } function _calculateRemainingReward(address user, uint256 currentTimestamp) private view returns(uint256) { uint256 genesisOwned = numberOfGenesisOwned[user]; uint256 remainingReward = 0; uint256 time = _passedTime(lastRewardCalculationAtTimestamp[user], currentTimestamp, rewardsUntilTimestamp); remainingReward+= time * erc20genesisRewardPerSecond * genesisOwned; if (genesisOwned >= 2) { uint256 gen2count = balanceOf(user) - genesisOwned; remainingReward += time * erc20gen2RewardPerSecond * gen2count; } if (numberOfOGOwned[user] > 0) { time = _passedTime(lastRewardCalculationAtTimestamp[user], currentTimestamp, doubleOGRewardUntilTimestamp); remainingReward += time * erc20genesisRewardPerSecond * numberOfOGOwned[user]; } return remainingReward; } function _updateRewards(address user, uint256 currentTimestamp) private { if (user == address(0)) return; if (numberOfGenesisOwned[user] > 0) { currentUserReward[user] += _calculateRemainingReward(user, currentTimestamp); } lastRewardCalculationAtTimestamp[user] = currentTimestamp; } function claimReward() external { _updateRewards(_msgSender(), block.timestamp); uint256 tmpReward = currentUserReward[_msgSender()]; currentUserReward[_msgSender()] = 0; if(tmpReward > 0) erc20token.mint(_msgSender(), tmpReward); } function calculateUserCurrentReward(address user, uint256 currentTimestamp) external view returns(uint256) { return currentUserReward[user] + _calculateRemainingReward(user, currentTimestamp); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721Upgradeable) { super._beforeTokenTransfer(from, to, tokenId); TokenAttributes storage token = tokenAttributes[tokenId]; _updateRewards(from, block.timestamp); _updateRewards(to, block.timestamp); if (token.isOG == true) { if (from != address(0)) numberOfOGOwned[from] -= 1; numberOfOGOwned[to] += 1; } if (token.isGenesis == true) { if (from != address(0)) numberOfGenesisOwned[from] -= 1; numberOfGenesisOwned[to] += 1; } } function addGenesisLegendaryIds(uint256[] calldata legendaryOpenSeaIds) external onlyOwner { for (uint i = 0; i < legendaryOpenSeaIds.length; i++) { legendaryTokenIdMap[legendaryOpenSeaIds[i]] = true; } } function getAddressFromOpenseaTokenId(uint256 openseaTokenId) pure public returns(uint256) { return openseaTokenId >> 96; } function getCIDFromOpenseaTokenId(uint256 openseaTokenId) pure public returns(uint256) { return openseaTokenId & 0xffffffffff; } function getIndexFromOpenseaTokenId(uint256 openseaTokenId) pure public returns(uint256) { return (openseaTokenId >> 40) & 0xffffffffffffff; } function getNewIdFromOpenseaTokenId(uint256 openseaTokenId) pure public returns(uint256) { if (getAddressFromOpenseaTokenId(openseaTokenId) != 0x000001605a306502bd0c3e9ade8e1afff2809b4c237ed) return 0; if (getCIDFromOpenseaTokenId(openseaTokenId) != 1) return 0; uint256 newId = getIndexFromOpenseaTokenId(openseaTokenId); if (newId > 2045) return 0; return newId; } function migrate(uint256 openseaTokenId) external { uint256 newTokenId = getNewIdFromOpenseaTokenId(openseaTokenId); require(newTokenId > 0, "91"); bool og = newTokenId <= 100; openSeaContract.safeTransferFrom(_msgSender(), BURN_ADDRESS, openseaTokenId, 1, ""); newTokenId = newTokenId + gen1OldIndex; if (og) { uint256 time = _passedTime(doubleOGRewardStartTimestamp, block.timestamp, doubleOGRewardUntilTimestamp); currentUserReward[_msgSender()] += time * erc20genesisRewardPerSecond; } _mintNewToken( _msgSender(), newTokenId, false, // egg og, // og true, // genesis legendaryTokenIdMap[openseaTokenId], // legendary false // summonedLegendary ); emit Migrate(_msgSender(), openseaTokenId, newTokenId); } function _payerc20(uint256 amount) private { _updateRewards(_msgSender(), block.timestamp); if (currentUserReward[_msgSender()] >= amount) { currentUserReward[_msgSender()] -= amount; } else { uint256 currReward = currentUserReward[_msgSender()]; currentUserReward[_msgSender()] = 0; erc20token.burn(_msgSender(), amount - currReward); } } function breed() external { require(numberOfGenesisOwned[_msgSender()] >= 2, "41"); _payerc20(breedingPrice); uint256 newTokenId = _mintNewToken( _msgSender(), startGen2Index + totalNumberOfGen2Tokens, true, // egg false, // og false, // genesis false, // legendary false // summonedLegendary ); emit Breed(_msgSender(), newTokenId); } function summonLegendary(uint256 tokenId) external { require(ownerOf(tokenId) == _msgSender(), "51"); TokenAttributes storage token = tokenAttributes[tokenId]; require(token.isGenesis == true, "52"); require(token.summonedNewLegendary == false, "53"); require(token.isLegendary == true, "54"); token.summonedNewLegendary = true; _payerc20(breedingLegendaryPrice); uint256 newTokenId = _mintNewToken( _msgSender(), startGen2Index + totalNumberOfGen2Tokens, false, // egg false, // og false, // genesis true, // legendary false // summonedLegendary ); emit SummonLegendary(_msgSender(), newTokenId, tokenId); } function reveal(uint256 tokenId) external { require(ownerOf(tokenId) == _msgSender(), "61"); TokenAttributes storage token = tokenAttributes[tokenId]; require(token.isEgg == true, "62"); require(block.timestamp >= revealBeginTimestamp, "63"); token.isEgg = false; emit Reveal(tokenId); } function isValidName(string memory name) public pure returns(bool) { bytes memory b = bytes(name); if(b.length < 1) return false; if(b.length > 30) return false; for(uint i; i<b.length; i++){ bytes1 char = b[i]; if( !(char >= 0x41 && char <= 0x5A) && //A-Z !(char >= 0x61 && char <= 0x7A) //a-z ) return false; } return true; } function _isNameUsed(string memory name) internal view returns(bool) { return _nameUsed[toLower(name)]; } function _setUsedNameName(string memory name, bool flag) internal { _nameUsed[toLower(name)] = flag; } function changeName(uint256 tokenId, string memory newName) external { require(ownerOf(tokenId) == _msgSender(), "71"); require(tokenAttributes[tokenId].isEgg == false, "72"); require(isValidName(newName), "73"); require(_isNameUsed(newName) == false, "75"); _payerc20(changeNamePrice); _setUsedNameName(tokenAttributes[tokenId].name, false); _setUsedNameName(newName, true); tokenAttributes[tokenId].name = newName; emit ChangeName(tokenId, newName); } function changeDescription(uint256 tokenId, string memory newDescription) external { require(ownerOf(tokenId) == _msgSender(), "81"); require(tokenAttributes[tokenId].isEgg == false, "82"); tokenAttributes[tokenId].description = newDescription; _payerc20(changeDescriptionPrice); emit ChangeDescription(tokenId, newDescription); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable) returns (bool) { return super.supportsInterface(interfaceId); } function uintToStr(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string memory contractURI_) external onlyOwner { _contractURI = contractURI_; } function toLower(string memory str) internal pure returns (string memory){ bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } function withdrawETH(address payable toAddress, uint256 amount) external onlyOwner { toAddress.transfer(amount); } function withdrawERC20(IERC20 token, address toAddress, uint256 amount) external onlyOwner { token.transfer(toAddress, amount); } function withdrawERC721(IERC721 token, address toAddress, uint256 tokenId) external onlyOwner { token.transferFrom(_proxyContractAddress, toAddress, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"Breed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newDescription","type":"string"}],"name":"ChangeDescription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"ChangeName","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"openSeaTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"Migrate","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":"uint256","name":"tokenId","type":"uint256"}],"name":"Reveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SummonLegendary","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"legendaryOpenSeaIds","type":"uint256[]"}],"name":"addGenesisLegendaryIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"breedingLegendaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"}],"name":"calculateUserCurrentReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"breedingPrice_","type":"uint256"},{"internalType":"uint256","name":"breedingLegendaryPrice_","type":"uint256"}],"name":"changeBreedingPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newDescription","type":"string"}],"name":"changeDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeDescriptionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"erc20genesisRewardPerSecond_","type":"uint256"},{"internalType":"uint256","name":"erc20gen2RewardPerSecond_","type":"uint256"}],"name":"changeERC20Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IDMT_ERC20","name":"erc20token_","type":"address"}],"name":"changeErc20token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeNamePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155","name":"openSeaContract_","type":"address"}],"name":"changeOpenSeaContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProxyContractAddress","type":"address"}],"name":"changeProxyContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"changeNamePrice_","type":"uint256"},{"internalType":"uint256","name":"changeDescriptionPrice_","type":"uint256"}],"name":"changeRenamePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealBeginTimestamp_","type":"uint256"}],"name":"changeRevealBeginTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentUserReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doubleOGRewardStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doubleOGRewardUntilTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20gen2RewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20genesisRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20token","outputs":[{"internalType":"contract IDMT_ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gen1OldIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"openseaTokenId","type":"uint256"}],"name":"getAddressFromOpenseaTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"openseaTokenId","type":"uint256"}],"name":"getCIDFromOpenseaTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"openseaTokenId","type":"uint256"}],"name":"getIndexFromOpenseaTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"openseaTokenId","type":"uint256"}],"name":"getNewIdFromOpenseaTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"revealBeginTimestamp_","type":"uint256"},{"internalType":"uint256","name":"doubleOGRewardStartTimestamp_","type":"uint256"},{"internalType":"uint256","name":"doubleOGRewardUntilTimestamp_","type":"uint256"},{"internalType":"uint256","name":"rewardsUntilTimestamp_","type":"uint256"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"contract IDMT_ERC20","name":"erc20token_","type":"address"},{"internalType":"contract IERC1155","name":"openSeaContract_","type":"address"},{"internalType":"string","name":"contractURI_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"isValidName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastRewardCalculationAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"legendaryTokenIdMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNumberOfGen2Tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"openseaTokenId","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberOfGenesisOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberOfOGOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSeaContract","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealBeginTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsUntilTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startGen2Index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"summonLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAttributes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"bool","name":"isEgg","type":"bool"},{"internalType":"bool","name":"isOG","type":"bool"},{"internalType":"bool","name":"isGenesis","type":"bool"},{"internalType":"bool","name":"isLegendary","type":"bool"},{"internalType":"bool","name":"summonedNewLegendary","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNumberOfGen2Tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"token","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506148c2806100206000396000f3fe608060405234801561001057600080fd5b506004361061043b5760003560e01c80636b3e60a111610235578063b5a1a60d11610135578063e1611f41116100c8578063f2824b5311610097578063f6d3e1971161007c578063f6d3e19714610905578063fab728fb14610925578063fccc28131461093857600080fd5b8063f2824b53146108cc578063f2fde38b146108f257600080fd5b8063e1611f4114610845578063e417be1a14610868578063e8a3d48514610888578063e985e9c51461089057600080fd5b8063c39cbef111610104578063c39cbef114610804578063c87b56dd14610817578063dbddb26a1461082a578063de6a06ed1461083257600080fd5b8063b5a1a60d146107be578063b88a802f146107d6578063b88d4fde146107de578063c2ca0ac5146107f157600080fd5b80638da5cb5b116101c8578063955904261161019757806395d89b411161017c57806395d89b4114610790578063a22cb46514610798578063a90005ed146107ab57600080fd5b8063955904261461076a57806395c7f01a1461077d57600080fd5b80638da5cb5b1461072a5780638fa988e01461073b578063938e3d7b1461074e57806394e1c0221461076157600080fd5b806372d25f3a1161020457806372d25f3a146106f25780637f3a44c7146106fb57806385f73149146107045780638b6fe9701461072157600080fd5b80636b3e60a1146106bb5780636cf01c69146106c457806370a08231146106d7578063715018a6146106ea57600080fd5b806342842e0e1161034057806354816d2f116102d357806363997114116102a257806368b85fb11161028757806368b85fb1146106975780636971ee371461069f57806369ec9982146106a857600080fd5b8063639971141461067b5780636411140a1461068e57600080fd5b806354816d2f146106395780635cb26e6c146106425780636301e0c4146106555780636352211e1461066857600080fd5b80634782f7791161030f5780634782f779146105dd5780634ee9cc82146105f05780634f1ad2571461061057806352b9421b1461061957600080fd5b806342842e0e1461059157806344004cc1146105a4578063454b0608146105b7578063456459dc146105ca57600080fd5b80631e30397f116103d35780632ff3d10f116103a25780633a7fa345116103875780633a7fa3451461056c5780633f327275146105755780634025feb21461057e57600080fd5b80632ff3d10f1461055057806339a0c6f91461055957600080fd5b80631e30397f1461050357806323b872dd1461051657806326a83456146105295780632f75d5501461053d57600080fd5b8063081812fc1161040f578063081812fc146104bf578063095ea7b3146104d25780630dbdca96146104e75780631dcea427146104f057600080fd5b8062182f4c1461044057806301ffc9a71461047057806304c993531461049357806306fdde03146104aa575b600080fd5b60cf54610453906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61048361047e366004614383565b610941565b6040519015158152602001610467565b61049c60d75481565b604051908152602001610467565b6104b2610952565b6040516104679190614657565b6104536104cd3660046144e0565b6109e4565b6104e56104e03660046142e5565b610a8f565b005b61049c60db5481565b60d554610453906001600160a01b031681565b6104836105113660046143bb565b610bc1565b6104e56105243660046141fb565b610d81565b61049c6105373660046144e0565b60601c90565b61049c61054b3660046144e0565b610e08565b61049c60d35481565b6104e56105673660046143bb565b610e6e565b61049c60da5481565b61049c60d25481565b6104e561058c3660046141fb565b610edf565b6104e561059f3660046141fb565b610fc5565b6104e56105b23660046141fb565b610fe0565b6104e56105c53660046144e0565b6110db565b6104e56105d836600461453d565b61129b565b6104e56105eb366004614198565b611300565b61049c6105fe36600461417c565b60ce6020526000908152604090205481565b61049c60dc5481565b61049c61062736600461417c565b60cc6020526000908152604090205481565b61049c60de5481565b6104e561065036600461453d565b611390565b6104e561066336600461417c565b6113f5565b6104536106763660046144e0565b611489565b6104e561068936600461417c565b611514565b61049c60d05481565b6104e56115a8565b61049c60dd5481565b6104e56106b63660046144e0565b611669565b61049c60d95481565b6104e56106d236600461417c565b6116c8565b61049c6106e536600461417c565b61175c565b6104e56117f6565b61049c60d65481565b61049c60d85481565b61049c6107123660046144e0565b60281c66ffffffffffffff1690565b61049c60d15481565b6097546001600160a01b0316610453565b61049c6107493660046142e5565b61185c565b6104e561075c3660046143bb565b611892565b61049c60d45481565b6104e56107783660046143ee565b6118ff565b6104e561078b3660046142f7565b611acf565b6104b2611b99565b6104e56107a63660046142b8565b611ba8565b6104e56107b936600461453d565b611c8b565b61049c6107cc3660046144e0565b64ffffffffff1690565b6104e5611cf0565b6104e56107ec36600461423b565b611da3565b6104e56107ff3660046144e0565b611e2b565b6104e56108123660046144f8565b611f9d565b6104b26108253660046144e0565b61221f565b6104b2612307565b6104e56108403660046144f8565b612395565b6104836108533660046144e0565b60ca6020526000908152604090205460ff1681565b61049c61087636600461417c565b60cd6020526000908152604090205481565b6104b26124b8565b61048361089e3660046141c3565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6108df6108da3660046144e0565b6124c7565b604051610467979695949392919061466a565b6104e561090036600461417c565b612624565b61049c61091336600461417c565b60cb6020526000908152604090205481565b6104e56109333660046144e0565b612703565b61045361dead81565b600061094c82612939565b92915050565b6060606580546109619061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461098d9061479b565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b0316610a735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610a9a82611489565b9050806001600160a01b0316836001600160a01b03161415610b245760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a6a565b336001600160a01b0382161480610b405750610b40813361089e565b610bb25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a6a565b610bbc8383612a1c565b505050565b600080829050600181511015610bda5750600092915050565b601e81511115610bed5750600092915050565b60005b8151811015610d77576000828281518110610c1b57634e487b7160e01b600052603260045260246000fd5b01602001517fff000000000000000000000000000000000000000000000000000000000000001690507f41000000000000000000000000000000000000000000000000000000000000008110801590610cb657507f5a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b158015610d5457507f61000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610801590610d5257507f7a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b155b15610d6457506000949350505050565b5080610d6f816147d6565b915050610bf0565b5060019392505050565b610d8b3382612aa2565b610dfd5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a6a565b610bbc838383612baa565b6000610e148260601c90565b731605a306502bd0c3e9ade8e1afff2809b4c237ed14610e3657506000919050565b64ffffffffff8216600114610e4d57506000919050565b66ffffffffffffff602883901c166107fd81111561094c5750600092915050565b6097546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b8051610edb9060df906020840190614020565b5050565b6097546001600160a01b03163314610f395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60e2546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152838216602482015260448101839052908416906323b872dd90606401600060405180830381600087803b158015610fa857600080fd5b505af1158015610fbc573d6000803e3d6000fd5b50505050505050565b610bbc83838360405180602001604052806000815250611da3565b6097546001600160a01b0316331461103a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d59190614367565b50505050565b60006110e682610e08565b9050600081116111385760405162461bcd60e51b815260206004820152600260248201527f39310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60cf546064821115906001600160a01b031663f242432a336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015261dead6024820152604481018690526001606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156111cd57600080fd5b505af11580156111e1573d6000803e3d6000fd5b5050505060db54826111f391906146be565b9150801561124257600061120c60d8544260d954612d9a565b905060d6548161121c919061471b565b33600090815260cb60205260408120805490919061123b9084906146be565b9091555050505b61126633600085815260ca6020526040812054859190859060019060ff1683612dcc565b506040518290849033907fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c90600090a4505050565b6097546001600160a01b031633146112f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d69190915560d755565b6097546001600160a01b0316331461135a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bbc573d6000803e3d6000fd5b6097546001600160a01b031633146113ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d09190915560d155565b6097546001600160a01b0316331461144f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60cf80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152606760205260408120546001600160a01b03168061094c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a6a565b6097546001600160a01b0316331461156e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60e280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b33600090815260cd6020526040902054600211156116085760405162461bcd60e51b815260206004820152600260248201527f34310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b61161360d054612f66565b60006116363360dd5460dc5461162991906146be565b6001600080600080612dcc565b604051909150819033907fd5859f7b34c949fe46d0343d829c412a548f201375e0d2e6da15aa44aa5c41ad90600090a350565b6097546001600160a01b031633146116c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d455565b6097546001600160a01b031633146117225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006001600160a01b0382166117da5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a6a565b506001600160a01b031660009081526068602052604090205490565b6097546001600160a01b031633146118505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b61185a600061305e565b565b600061186883836130c8565b6001600160a01b038416600090815260cb602052604090205461188b91906146be565b9392505050565b6097546001600160a01b031633146118ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b8051610edb9060e0906020840190614020565b600054610100900460ff1680611918575060005460ff16155b61198a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff161580156119ac576000805461ffff19166101011790555b6119b68b8b6131fd565b6119be6132da565b600060dd5561177060de55621e8c5160dc556215336c60db55686c6b935b8bbd40000060d081905560d155680ad78ebc5ac620000060d281905560d355611a11620151806801158e460913d000006146fb565b60d655611a2962015180674563918244f400006146fb565b60d7558451611a3f9060df906020880190614020565b5060d489905560d888905560d987905560da86905560d580546001600160a01b038087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560cf8054928616929091169190911790558151611aaf9060e0906020850190614020565b508015611ac2576000805461ff00191690555b5050505050505050505050565b6097546001600160a01b03163314611b295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60005b81811015610bbc57600160ca6000858585818110611b5a57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b91906147d6565b915050611b2c565b6060606680546109619061479b565b6001600160a01b038216331415611c015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a6a565b336000818152606a602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6097546001600160a01b03163314611ce55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d29190915560d355565b611cfb335b426133ab565b33600090815260cb6020526040812080549190558015611da05760d5546001600160a01b03166340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611d8757600080fd5b505af1158015611d9b573d6000803e3d6000fd5b505050505b50565b611dad3383612aa2565b611e1f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a6a565b6110d58484848461342f565b33611e3582611489565b6001600160a01b031614611e8b5760405162461bcd60e51b815260206004820152600260248201527f36310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600081815260c960205260409020600281015460ff161515600114611ef25760405162461bcd60e51b815260206004820152600260248201527f36320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60d454421015611f445760405162461bcd60e51b815260206004820152600260248201527f36330000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405182907f1747b48b6ade85d7dc97c0f523e0e780795930a468c01b18a51546791fdd3ac090600090a25050565b33611fa783611489565b6001600160a01b031614611ffd5760405162461bcd60e51b815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600082815260c9602052604090206002015460ff161561205f5760405162461bcd60e51b815260206004820152600260248201527f37320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b61206881610bc1565b6120b45760405162461bcd60e51b815260206004820152600260248201527f37330000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6120bd816134b8565b1561210a5760405162461bcd60e51b815260206004820152600260248201527f37350000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b61211560d254612f66565b600082815260c96020526040902080546121b891906121339061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461215f9061479b565b80156121ac5780601f10612181576101008083540402835291602001916121ac565b820191906000526020600020905b81548152906001019060200180831161218f57829003601f168201915b505050505060006134eb565b6121c38160016134eb565b600082815260c96020908152604090912082516121e292840190614020565b50817f355e6037a3f9c646870e44d77364164d02ab85580efdbb66363b503c3a25f5af826040516122139190614657565b60405180910390a25050565b6000818152606760205260409020546060906001600160a01b03166122ac5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a6a565b60006122b6613546565b905060008151116122d6576040518060200160405280600081525061188b565b806122e084613555565b6040516020016122f19291906145c4565b6040516020818303038152906040529392505050565b60df80546123149061479b565b80601f01602080910402602001604051908101604052809291908181526020018280546123409061479b565b801561238d5780601f106123625761010080835404028352916020019161238d565b820191906000526020600020905b81548152906001019060200180831161237057829003601f168201915b505050505081565b3361239f83611489565b6001600160a01b0316146123f55760405162461bcd60e51b815260206004820152600260248201527f38310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600082815260c9602052604090206002015460ff16156124575760405162461bcd60e51b815260206004820152600260248201527f38320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600082815260c960209081526040909120825161247c92600190920191840190614020565b5061248860d354612f66565b817fe72a0fdc67c78145d43ca3ff95dee8fbcb620d013214e0c88e1039c9e6eed65f826040516122139190614657565b606060e080546109619061479b565b60c9602052600090815260409020805481906124e29061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461250e9061479b565b801561255b5780601f106125305761010080835404028352916020019161255b565b820191906000526020600020905b81548152906001019060200180831161253e57829003601f168201915b5050505050908060010180546125709061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461259c9061479b565b80156125e95780601f106125be576101008083540402835291602001916125e9565b820191906000526020600020905b8154815290600101906020018083116125cc57829003601f168201915b5050506002909301549192505060ff808216916101008104821691620100008204811691630100000081048216916401000000009091041687565b6097546001600160a01b0316331461267e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b6001600160a01b0381166126fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a6a565b611da08161305e565b3361270d82611489565b6001600160a01b0316146127635760405162461bcd60e51b815260206004820152600260248201527f35310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600081815260c960205260409020600281015462010000900460ff1615156001146127d05760405162461bcd60e51b815260206004820152600260248201527f35320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6002810154640100000000900460ff161561282d5760405162461bcd60e51b815260206004820152600260248201527f35330000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60028101546301000000900460ff16151560011461288d5760405162461bcd60e51b815260206004820152600260248201527f35340000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000017905560d1546128ca90612f66565b60006128ee3360dd5460dc546128e091906146be565b600080600060016000612dcc565b905082336001600160a01b03167f06fcf597aab0a48e66c7ac47a0c6b5602f66a538ff517096d2622675955b32978360405161292c91815260200190565b60405180910390a3505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806129cc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061094c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461094c565b600081815260696020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612a6982611489565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152606760205260408120546001600160a01b0316612b2c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a6a565b6000612b3783611489565b9050806001600160a01b0316846001600160a01b03161480612b725750836001600160a01b0316612b67846109e4565b6001600160a01b0316145b80612ba257506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612bbd82611489565b6001600160a01b031614612c395760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a6a565b6001600160a01b038216612cb45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a6a565b612cbf8383836136c5565b612cca600082612a1c565b6001600160a01b0383166000908152606860205260408120805460019290612cf3908490614758565b90915550506001600160a01b0382166000908152606860205260408120805460019290612d219084906146be565b909155505060008181526067602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008282811115612da85750815b808510612db957600091505061188b565b612dc38582614758565b95945050505050565b600086815260c96020526040812084612e485760de5460dd5410612e325760405162461bcd60e51b815260206004820152600260248201527f30310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60dd8054906000612e42836147d6565b91905055505b6040805180820190915260048082527f4f6f6761000000000000000000000000000000000000000000000000000000006020909201918252612e8b918391614020565b50604080516020810191829052600090819052612eac916001840191614020565b5060028101805461ffff191688151561ff0019161761010088151502177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000871515027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff1617630100000086151502177fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000085151502179055612f5989896137f6565b5095979650505050505050565b612f6f33611cf5565b33600090815260cb60205260409020548111612faf5733600090815260cb602052604081208054839290612fa4908490614758565b90915550611da09050565b33600081815260cb60205260408120805491905560d55490916001600160a01b0390911690639dc29fac90612fe48486614758565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561304257600080fd5b505af1158015613056573d6000803e3d6000fd5b505050505050565b609780546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260cd602090815260408083205460cc90925282205460da54839182916130ff91908790612d9a565b90508260d65482613110919061471b565b61311a919061471b565b61312490836146be565b91506002831061316d5760008361313a8861175c565b6131449190614758565b90508060d75483613155919061471b565b61315f919061471b565b61316990846146be565b9250505b6001600160a01b038616600090815260ce6020526040902054156131f4576001600160a01b038616600090815260cc602052604090205460d9546131b391908790612d9a565b6001600160a01b038716600090815260ce602052604090205460d654919250906131dd908361471b565b6131e7919061471b565b6131f190836146be565b91505b50949350505050565b600054610100900460ff1680613216575060005460ff16155b6132885760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff161580156132aa576000805461ffff19166101011790555b6132b2613810565b6132ba613810565b6132c483836138d0565b8015610bbc576000805461ff0019169055505050565b600054610100900460ff16806132f3575060005460ff16155b6133655760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff16158015613387576000805461ffff19166101011790555b61338f613810565b6133976139bb565b8015611da0576000805461ff001916905550565b6001600160a01b0382166133bd575050565b6001600160a01b038216600090815260cd602052604090205415613413576133e582826130c8565b6001600160a01b038316600090815260cb60205260408120805490919061340d9084906146be565b90915550505b6001600160a01b03909116600090815260cc6020526040902055565b61343a848484612baa565b61344684848484613a71565b6110d55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a6a565b600060e16134c583613c3c565b6040516134d291906145a8565b9081526040519081900360200190205460ff1692915050565b8060e16134f784613c3c565b60405161350491906145a8565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790555050565b606060df80546109619061479b565b60608161359557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156135bf57806135a9816147d6565b91506135b89050600a836146fb565b9150613599565b60008167ffffffffffffffff8111156135e857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613612576020820181803683370190505b509050815b85156131f457613628600182614758565b90506000613637600a886146fb565b61364290600a61471b565b61364c9088614758565b6136579060306146d6565b905060008160f81b90508084848151811061368257634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506136bc600a896146fb565b97505050613617565b600081815260c9602052604090206136dd84426133ab565b6136e783426133ab565b600281015460ff6101009091041615156001141561376c576001600160a01b0384161561373d576001600160a01b038416600090815260ce60205260408120805460019290613737908490614758565b90915550505b6001600160a01b038316600090815260ce602052604081208054600192906137669084906146be565b90915550505b600281015462010000900460ff161515600114156110d5576001600160a01b038416156137c2576001600160a01b038416600090815260cd602052604081208054600192906137bc908490614758565b90915550505b6001600160a01b038316600090815260cd602052604081208054600192906137eb9084906146be565b909155505050505050565b610edb828260405180602001604052806000815250613e31565b600054610100900460ff1680613829575060005460ff16155b61389b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff16158015613397576000805461ffff19166101011790558015611da0576000805461ff001916905550565b600054610100900460ff16806138e9575060005460ff16155b61395b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff1615801561397d576000805461ffff19166101011790555b8251613990906065906020860190614020565b5081516139a4906066906020850190614020565b508015610bbc576000805461ff0019169055505050565b600054610100900460ff16806139d4575060005460ff16155b613a465760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff16158015613a68576000805461ffff19166101011790555b6133973361305e565b60006001600160a01b0384163b15613c31576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290613ace90339089908890889060040161461b565b602060405180830381600087803b158015613ae857600080fd5b505af1925050508015613b36575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613b339181019061439f565b60015b613be6573d808015613b64576040519150601f19603f3d011682016040523d82523d6000602084013e613b69565b606091505b508051613bde5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a6a565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612ba2565b506001949350505050565b606060008290506000815167ffffffffffffffff811115613c6d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613c97576020820181803683370190505b50905060005b8251811015613e29576041838281518110613cc857634e487b7160e01b600052603260045260246000fd5b016020015160f81c10801590613d065750605a838281518110613cfb57634e487b7160e01b600052603260045260246000fd5b016020015160f81c11155b15613d9c57828181518110613d2b57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b60f81c6020613d4591906146d6565b60f81b828281518110613d6857634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613e17565b828181518110613dbc57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b828281518110613de757634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80613e21816147d6565b915050613c9d565b509392505050565b613e3b8383613eba565b613e486000848484613a71565b610bbc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a6a565b6001600160a01b038216613f105760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a6a565b6000818152606760205260409020546001600160a01b031615613f755760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a6a565b613f81600083836136c5565b6001600160a01b0382166000908152606860205260408120805460019290613faa9084906146be565b909155505060008181526067602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461402c9061479b565b90600052602060002090601f01602090048101928261404e5760008555614094565b82601f1061406757805160ff1916838001178555614094565b82800160010185558215614094579182015b82811115614094578251825591602001919060010190614079565b506140a09291506140a4565b5090565b5b808211156140a057600081556001016140a5565b600067ffffffffffffffff808411156140d4576140d4614825565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561411a5761411a614825565b8160405280935085815286868601111561413357600080fd5b858560208301376000602087830101525050509392505050565b80356141588161483b565b919050565b600082601f83011261416d578081fd5b61188b838335602085016140b9565b60006020828403121561418d578081fd5b813561188b8161483b565b600080604083850312156141aa578081fd5b82356141b58161483b565b946020939093013593505050565b600080604083850312156141d5578182fd5b82356141e08161483b565b915060208301356141f08161483b565b809150509250929050565b60008060006060848603121561420f578081fd5b833561421a8161483b565b9250602084013561422a8161483b565b929592945050506040919091013590565b60008060008060808587031215614250578081fd5b843561425b8161483b565b9350602085013561426b8161483b565b925060408501359150606085013567ffffffffffffffff81111561428d578182fd5b8501601f8101871361429d578182fd5b6142ac878235602084016140b9565b91505092959194509250565b600080604083850312156142ca578182fd5b82356142d58161483b565b915060208301356141f081614850565b600080604083850312156141aa578182fd5b60008060208385031215614309578182fd5b823567ffffffffffffffff80821115614320578384fd5b818501915085601f830112614333578384fd5b813581811115614341578485fd5b8660208260051b8501011115614355578485fd5b60209290920196919550909350505050565b600060208284031215614378578081fd5b815161188b81614850565b600060208284031215614394578081fd5b813561188b8161485e565b6000602082840312156143b0578081fd5b815161188b8161485e565b6000602082840312156143cc578081fd5b813567ffffffffffffffff8111156143e2578182fd5b612ba28482850161415d565b6000806000806000806000806000806101408b8d03121561440d578788fd5b8a3567ffffffffffffffff8082111561442457898afd5b6144308e838f0161415d565b9b5060208d013591508082111561444557898afd5b6144518e838f0161415d565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d0135915080821115614482578586fd5b61448e8e838f0161415d565b955061449c60e08e0161414d565b94506144ab6101008e0161414d565b93506101208d01359150808211156144c1578283fd5b506144ce8d828e0161415d565b9150509295989b9194979a5092959850565b6000602082840312156144f1578081fd5b5035919050565b6000806040838503121561450a578182fd5b82359150602083013567ffffffffffffffff811115614527578182fd5b6145338582860161415d565b9150509250929050565b6000806040838503121561454f578182fd5b50508035926020909101359150565b6000815180845261457681602086016020860161476f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516145ba81846020870161476f565b9190910192915050565b600083516145d681846020880161476f565b8351908301906145ea81836020880161476f565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261464d608083018461455e565b9695505050505050565b60208152600061188b602083018461455e565b60e08152600061467d60e083018a61455e565b828103602084015261468f818a61455e565b9715156040840152505093151560608501529115156080840152151560a0830152151560c09091015292915050565b600082198211156146d1576146d161480f565b500190565b600060ff821660ff84168060ff038211156146f3576146f361480f565b019392505050565b60008261471657634e487b7160e01b81526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147535761475361480f565b500290565b60008282101561476a5761476a61480f565b500390565b60005b8381101561478a578181015183820152602001614772565b838111156110d55750506000910152565b600181811c908216806147af57607f821691505b602082108114156147d057634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148085761480861480f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611da057600080fd5b8015158114611da057600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611da057600080fdfea2646970667358221220fdd41809d529922554563b66098db8b6950b26a66ed79e5857748143c861cb9164736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061043b5760003560e01c80636b3e60a111610235578063b5a1a60d11610135578063e1611f41116100c8578063f2824b5311610097578063f6d3e1971161007c578063f6d3e19714610905578063fab728fb14610925578063fccc28131461093857600080fd5b8063f2824b53146108cc578063f2fde38b146108f257600080fd5b8063e1611f4114610845578063e417be1a14610868578063e8a3d48514610888578063e985e9c51461089057600080fd5b8063c39cbef111610104578063c39cbef114610804578063c87b56dd14610817578063dbddb26a1461082a578063de6a06ed1461083257600080fd5b8063b5a1a60d146107be578063b88a802f146107d6578063b88d4fde146107de578063c2ca0ac5146107f157600080fd5b80638da5cb5b116101c8578063955904261161019757806395d89b411161017c57806395d89b4114610790578063a22cb46514610798578063a90005ed146107ab57600080fd5b8063955904261461076a57806395c7f01a1461077d57600080fd5b80638da5cb5b1461072a5780638fa988e01461073b578063938e3d7b1461074e57806394e1c0221461076157600080fd5b806372d25f3a1161020457806372d25f3a146106f25780637f3a44c7146106fb57806385f73149146107045780638b6fe9701461072157600080fd5b80636b3e60a1146106bb5780636cf01c69146106c457806370a08231146106d7578063715018a6146106ea57600080fd5b806342842e0e1161034057806354816d2f116102d357806363997114116102a257806368b85fb11161028757806368b85fb1146106975780636971ee371461069f57806369ec9982146106a857600080fd5b8063639971141461067b5780636411140a1461068e57600080fd5b806354816d2f146106395780635cb26e6c146106425780636301e0c4146106555780636352211e1461066857600080fd5b80634782f7791161030f5780634782f779146105dd5780634ee9cc82146105f05780634f1ad2571461061057806352b9421b1461061957600080fd5b806342842e0e1461059157806344004cc1146105a4578063454b0608146105b7578063456459dc146105ca57600080fd5b80631e30397f116103d35780632ff3d10f116103a25780633a7fa345116103875780633a7fa3451461056c5780633f327275146105755780634025feb21461057e57600080fd5b80632ff3d10f1461055057806339a0c6f91461055957600080fd5b80631e30397f1461050357806323b872dd1461051657806326a83456146105295780632f75d5501461053d57600080fd5b8063081812fc1161040f578063081812fc146104bf578063095ea7b3146104d25780630dbdca96146104e75780631dcea427146104f057600080fd5b8062182f4c1461044057806301ffc9a71461047057806304c993531461049357806306fdde03146104aa575b600080fd5b60cf54610453906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61048361047e366004614383565b610941565b6040519015158152602001610467565b61049c60d75481565b604051908152602001610467565b6104b2610952565b6040516104679190614657565b6104536104cd3660046144e0565b6109e4565b6104e56104e03660046142e5565b610a8f565b005b61049c60db5481565b60d554610453906001600160a01b031681565b6104836105113660046143bb565b610bc1565b6104e56105243660046141fb565b610d81565b61049c6105373660046144e0565b60601c90565b61049c61054b3660046144e0565b610e08565b61049c60d35481565b6104e56105673660046143bb565b610e6e565b61049c60da5481565b61049c60d25481565b6104e561058c3660046141fb565b610edf565b6104e561059f3660046141fb565b610fc5565b6104e56105b23660046141fb565b610fe0565b6104e56105c53660046144e0565b6110db565b6104e56105d836600461453d565b61129b565b6104e56105eb366004614198565b611300565b61049c6105fe36600461417c565b60ce6020526000908152604090205481565b61049c60dc5481565b61049c61062736600461417c565b60cc6020526000908152604090205481565b61049c60de5481565b6104e561065036600461453d565b611390565b6104e561066336600461417c565b6113f5565b6104536106763660046144e0565b611489565b6104e561068936600461417c565b611514565b61049c60d05481565b6104e56115a8565b61049c60dd5481565b6104e56106b63660046144e0565b611669565b61049c60d95481565b6104e56106d236600461417c565b6116c8565b61049c6106e536600461417c565b61175c565b6104e56117f6565b61049c60d65481565b61049c60d85481565b61049c6107123660046144e0565b60281c66ffffffffffffff1690565b61049c60d15481565b6097546001600160a01b0316610453565b61049c6107493660046142e5565b61185c565b6104e561075c3660046143bb565b611892565b61049c60d45481565b6104e56107783660046143ee565b6118ff565b6104e561078b3660046142f7565b611acf565b6104b2611b99565b6104e56107a63660046142b8565b611ba8565b6104e56107b936600461453d565b611c8b565b61049c6107cc3660046144e0565b64ffffffffff1690565b6104e5611cf0565b6104e56107ec36600461423b565b611da3565b6104e56107ff3660046144e0565b611e2b565b6104e56108123660046144f8565b611f9d565b6104b26108253660046144e0565b61221f565b6104b2612307565b6104e56108403660046144f8565b612395565b6104836108533660046144e0565b60ca6020526000908152604090205460ff1681565b61049c61087636600461417c565b60cd6020526000908152604090205481565b6104b26124b8565b61048361089e3660046141c3565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6108df6108da3660046144e0565b6124c7565b604051610467979695949392919061466a565b6104e561090036600461417c565b612624565b61049c61091336600461417c565b60cb6020526000908152604090205481565b6104e56109333660046144e0565b612703565b61045361dead81565b600061094c82612939565b92915050565b6060606580546109619061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461098d9061479b565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b0316610a735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610a9a82611489565b9050806001600160a01b0316836001600160a01b03161415610b245760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a6a565b336001600160a01b0382161480610b405750610b40813361089e565b610bb25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a6a565b610bbc8383612a1c565b505050565b600080829050600181511015610bda5750600092915050565b601e81511115610bed5750600092915050565b60005b8151811015610d77576000828281518110610c1b57634e487b7160e01b600052603260045260246000fd5b01602001517fff000000000000000000000000000000000000000000000000000000000000001690507f41000000000000000000000000000000000000000000000000000000000000008110801590610cb657507f5a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b158015610d5457507f61000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610801590610d5257507f7a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b155b15610d6457506000949350505050565b5080610d6f816147d6565b915050610bf0565b5060019392505050565b610d8b3382612aa2565b610dfd5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a6a565b610bbc838383612baa565b6000610e148260601c90565b731605a306502bd0c3e9ade8e1afff2809b4c237ed14610e3657506000919050565b64ffffffffff8216600114610e4d57506000919050565b66ffffffffffffff602883901c166107fd81111561094c5750600092915050565b6097546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b8051610edb9060df906020840190614020565b5050565b6097546001600160a01b03163314610f395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60e2546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152838216602482015260448101839052908416906323b872dd90606401600060405180830381600087803b158015610fa857600080fd5b505af1158015610fbc573d6000803e3d6000fd5b50505050505050565b610bbc83838360405180602001604052806000815250611da3565b6097546001600160a01b0316331461103a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d59190614367565b50505050565b60006110e682610e08565b9050600081116111385760405162461bcd60e51b815260206004820152600260248201527f39310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60cf546064821115906001600160a01b031663f242432a336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015261dead6024820152604481018690526001606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156111cd57600080fd5b505af11580156111e1573d6000803e3d6000fd5b5050505060db54826111f391906146be565b9150801561124257600061120c60d8544260d954612d9a565b905060d6548161121c919061471b565b33600090815260cb60205260408120805490919061123b9084906146be565b9091555050505b61126633600085815260ca6020526040812054859190859060019060ff1683612dcc565b506040518290849033907fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c90600090a4505050565b6097546001600160a01b031633146112f55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d69190915560d755565b6097546001600160a01b0316331461135a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bbc573d6000803e3d6000fd5b6097546001600160a01b031633146113ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d09190915560d155565b6097546001600160a01b0316331461144f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60cf80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152606760205260408120546001600160a01b03168061094c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a6a565b6097546001600160a01b0316331461156e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60e280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b33600090815260cd6020526040902054600211156116085760405162461bcd60e51b815260206004820152600260248201527f34310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b61161360d054612f66565b60006116363360dd5460dc5461162991906146be565b6001600080600080612dcc565b604051909150819033907fd5859f7b34c949fe46d0343d829c412a548f201375e0d2e6da15aa44aa5c41ad90600090a350565b6097546001600160a01b031633146116c35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d455565b6097546001600160a01b031633146117225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006001600160a01b0382166117da5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a6a565b506001600160a01b031660009081526068602052604090205490565b6097546001600160a01b031633146118505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b61185a600061305e565b565b600061186883836130c8565b6001600160a01b038416600090815260cb602052604090205461188b91906146be565b9392505050565b6097546001600160a01b031633146118ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b8051610edb9060e0906020840190614020565b600054610100900460ff1680611918575060005460ff16155b61198a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff161580156119ac576000805461ffff19166101011790555b6119b68b8b6131fd565b6119be6132da565b600060dd5561177060de55621e8c5160dc556215336c60db55686c6b935b8bbd40000060d081905560d155680ad78ebc5ac620000060d281905560d355611a11620151806801158e460913d000006146fb565b60d655611a2962015180674563918244f400006146fb565b60d7558451611a3f9060df906020880190614020565b5060d489905560d888905560d987905560da86905560d580546001600160a01b038087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560cf8054928616929091169190911790558151611aaf9060e0906020850190614020565b508015611ac2576000805461ff00191690555b5050505050505050505050565b6097546001600160a01b03163314611b295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60005b81811015610bbc57600160ca6000858585818110611b5a57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b91906147d6565b915050611b2c565b6060606680546109619061479b565b6001600160a01b038216331415611c015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a6a565b336000818152606a602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6097546001600160a01b03163314611ce55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b60d29190915560d355565b611cfb335b426133ab565b33600090815260cb6020526040812080549190558015611da05760d5546001600160a01b03166340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611d8757600080fd5b505af1158015611d9b573d6000803e3d6000fd5b505050505b50565b611dad3383612aa2565b611e1f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a6a565b6110d58484848461342f565b33611e3582611489565b6001600160a01b031614611e8b5760405162461bcd60e51b815260206004820152600260248201527f36310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600081815260c960205260409020600281015460ff161515600114611ef25760405162461bcd60e51b815260206004820152600260248201527f36320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60d454421015611f445760405162461bcd60e51b815260206004820152600260248201527f36330000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405182907f1747b48b6ade85d7dc97c0f523e0e780795930a468c01b18a51546791fdd3ac090600090a25050565b33611fa783611489565b6001600160a01b031614611ffd5760405162461bcd60e51b815260206004820152600260248201527f37310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600082815260c9602052604090206002015460ff161561205f5760405162461bcd60e51b815260206004820152600260248201527f37320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b61206881610bc1565b6120b45760405162461bcd60e51b815260206004820152600260248201527f37330000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6120bd816134b8565b1561210a5760405162461bcd60e51b815260206004820152600260248201527f37350000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b61211560d254612f66565b600082815260c96020526040902080546121b891906121339061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461215f9061479b565b80156121ac5780601f10612181576101008083540402835291602001916121ac565b820191906000526020600020905b81548152906001019060200180831161218f57829003601f168201915b505050505060006134eb565b6121c38160016134eb565b600082815260c96020908152604090912082516121e292840190614020565b50817f355e6037a3f9c646870e44d77364164d02ab85580efdbb66363b503c3a25f5af826040516122139190614657565b60405180910390a25050565b6000818152606760205260409020546060906001600160a01b03166122ac5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a6a565b60006122b6613546565b905060008151116122d6576040518060200160405280600081525061188b565b806122e084613555565b6040516020016122f19291906145c4565b6040516020818303038152906040529392505050565b60df80546123149061479b565b80601f01602080910402602001604051908101604052809291908181526020018280546123409061479b565b801561238d5780601f106123625761010080835404028352916020019161238d565b820191906000526020600020905b81548152906001019060200180831161237057829003601f168201915b505050505081565b3361239f83611489565b6001600160a01b0316146123f55760405162461bcd60e51b815260206004820152600260248201527f38310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600082815260c9602052604090206002015460ff16156124575760405162461bcd60e51b815260206004820152600260248201527f38320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600082815260c960209081526040909120825161247c92600190920191840190614020565b5061248860d354612f66565b817fe72a0fdc67c78145d43ca3ff95dee8fbcb620d013214e0c88e1039c9e6eed65f826040516122139190614657565b606060e080546109619061479b565b60c9602052600090815260409020805481906124e29061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461250e9061479b565b801561255b5780601f106125305761010080835404028352916020019161255b565b820191906000526020600020905b81548152906001019060200180831161253e57829003601f168201915b5050505050908060010180546125709061479b565b80601f016020809104026020016040519081016040528092919081815260200182805461259c9061479b565b80156125e95780601f106125be576101008083540402835291602001916125e9565b820191906000526020600020905b8154815290600101906020018083116125cc57829003601f168201915b5050506002909301549192505060ff808216916101008104821691620100008204811691630100000081048216916401000000009091041687565b6097546001600160a01b0316331461267e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6a565b6001600160a01b0381166126fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a6a565b611da08161305e565b3361270d82611489565b6001600160a01b0316146127635760405162461bcd60e51b815260206004820152600260248201527f35310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b600081815260c960205260409020600281015462010000900460ff1615156001146127d05760405162461bcd60e51b815260206004820152600260248201527f35320000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6002810154640100000000900460ff161561282d5760405162461bcd60e51b815260206004820152600260248201527f35330000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60028101546301000000900460ff16151560011461288d5760405162461bcd60e51b815260206004820152600260248201527f35340000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000017905560d1546128ca90612f66565b60006128ee3360dd5460dc546128e091906146be565b600080600060016000612dcc565b905082336001600160a01b03167f06fcf597aab0a48e66c7ac47a0c6b5602f66a538ff517096d2622675955b32978360405161292c91815260200190565b60405180910390a3505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806129cc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061094c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461094c565b600081815260696020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612a6982611489565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152606760205260408120546001600160a01b0316612b2c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a6a565b6000612b3783611489565b9050806001600160a01b0316846001600160a01b03161480612b725750836001600160a01b0316612b67846109e4565b6001600160a01b0316145b80612ba257506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612bbd82611489565b6001600160a01b031614612c395760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a6a565b6001600160a01b038216612cb45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a6a565b612cbf8383836136c5565b612cca600082612a1c565b6001600160a01b0383166000908152606860205260408120805460019290612cf3908490614758565b90915550506001600160a01b0382166000908152606860205260408120805460019290612d219084906146be565b909155505060008181526067602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008282811115612da85750815b808510612db957600091505061188b565b612dc38582614758565b95945050505050565b600086815260c96020526040812084612e485760de5460dd5410612e325760405162461bcd60e51b815260206004820152600260248201527f30310000000000000000000000000000000000000000000000000000000000006044820152606401610a6a565b60dd8054906000612e42836147d6565b91905055505b6040805180820190915260048082527f4f6f6761000000000000000000000000000000000000000000000000000000006020909201918252612e8b918391614020565b50604080516020810191829052600090819052612eac916001840191614020565b5060028101805461ffff191688151561ff0019161761010088151502177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000871515027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff1617630100000086151502177fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000085151502179055612f5989896137f6565b5095979650505050505050565b612f6f33611cf5565b33600090815260cb60205260409020548111612faf5733600090815260cb602052604081208054839290612fa4908490614758565b90915550611da09050565b33600081815260cb60205260408120805491905560d55490916001600160a01b0390911690639dc29fac90612fe48486614758565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561304257600080fd5b505af1158015613056573d6000803e3d6000fd5b505050505050565b609780546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260cd602090815260408083205460cc90925282205460da54839182916130ff91908790612d9a565b90508260d65482613110919061471b565b61311a919061471b565b61312490836146be565b91506002831061316d5760008361313a8861175c565b6131449190614758565b90508060d75483613155919061471b565b61315f919061471b565b61316990846146be565b9250505b6001600160a01b038616600090815260ce6020526040902054156131f4576001600160a01b038616600090815260cc602052604090205460d9546131b391908790612d9a565b6001600160a01b038716600090815260ce602052604090205460d654919250906131dd908361471b565b6131e7919061471b565b6131f190836146be565b91505b50949350505050565b600054610100900460ff1680613216575060005460ff16155b6132885760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff161580156132aa576000805461ffff19166101011790555b6132b2613810565b6132ba613810565b6132c483836138d0565b8015610bbc576000805461ff0019169055505050565b600054610100900460ff16806132f3575060005460ff16155b6133655760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff16158015613387576000805461ffff19166101011790555b61338f613810565b6133976139bb565b8015611da0576000805461ff001916905550565b6001600160a01b0382166133bd575050565b6001600160a01b038216600090815260cd602052604090205415613413576133e582826130c8565b6001600160a01b038316600090815260cb60205260408120805490919061340d9084906146be565b90915550505b6001600160a01b03909116600090815260cc6020526040902055565b61343a848484612baa565b61344684848484613a71565b6110d55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a6a565b600060e16134c583613c3c565b6040516134d291906145a8565b9081526040519081900360200190205460ff1692915050565b8060e16134f784613c3c565b60405161350491906145a8565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009092169190911790555050565b606060df80546109619061479b565b60608161359557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156135bf57806135a9816147d6565b91506135b89050600a836146fb565b9150613599565b60008167ffffffffffffffff8111156135e857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613612576020820181803683370190505b509050815b85156131f457613628600182614758565b90506000613637600a886146fb565b61364290600a61471b565b61364c9088614758565b6136579060306146d6565b905060008160f81b90508084848151811061368257634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506136bc600a896146fb565b97505050613617565b600081815260c9602052604090206136dd84426133ab565b6136e783426133ab565b600281015460ff6101009091041615156001141561376c576001600160a01b0384161561373d576001600160a01b038416600090815260ce60205260408120805460019290613737908490614758565b90915550505b6001600160a01b038316600090815260ce602052604081208054600192906137669084906146be565b90915550505b600281015462010000900460ff161515600114156110d5576001600160a01b038416156137c2576001600160a01b038416600090815260cd602052604081208054600192906137bc908490614758565b90915550505b6001600160a01b038316600090815260cd602052604081208054600192906137eb9084906146be565b909155505050505050565b610edb828260405180602001604052806000815250613e31565b600054610100900460ff1680613829575060005460ff16155b61389b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff16158015613397576000805461ffff19166101011790558015611da0576000805461ff001916905550565b600054610100900460ff16806138e9575060005460ff16155b61395b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff1615801561397d576000805461ffff19166101011790555b8251613990906065906020860190614020565b5081516139a4906066906020850190614020565b508015610bbc576000805461ff0019169055505050565b600054610100900460ff16806139d4575060005460ff16155b613a465760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a6a565b600054610100900460ff16158015613a68576000805461ffff19166101011790555b6133973361305e565b60006001600160a01b0384163b15613c31576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290613ace90339089908890889060040161461b565b602060405180830381600087803b158015613ae857600080fd5b505af1925050508015613b36575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613b339181019061439f565b60015b613be6573d808015613b64576040519150601f19603f3d011682016040523d82523d6000602084013e613b69565b606091505b508051613bde5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a6a565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612ba2565b506001949350505050565b606060008290506000815167ffffffffffffffff811115613c6d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613c97576020820181803683370190505b50905060005b8251811015613e29576041838281518110613cc857634e487b7160e01b600052603260045260246000fd5b016020015160f81c10801590613d065750605a838281518110613cfb57634e487b7160e01b600052603260045260246000fd5b016020015160f81c11155b15613d9c57828181518110613d2b57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b60f81c6020613d4591906146d6565b60f81b828281518110613d6857634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613e17565b828181518110613dbc57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b828281518110613de757634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80613e21816147d6565b915050613c9d565b509392505050565b613e3b8383613eba565b613e486000848484613a71565b610bbc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a6a565b6001600160a01b038216613f105760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a6a565b6000818152606760205260409020546001600160a01b031615613f755760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a6a565b613f81600083836136c5565b6001600160a01b0382166000908152606860205260408120805460019290613faa9084906146be565b909155505060008181526067602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461402c9061479b565b90600052602060002090601f01602090048101928261404e5760008555614094565b82601f1061406757805160ff1916838001178555614094565b82800160010185558215614094579182015b82811115614094578251825591602001919060010190614079565b506140a09291506140a4565b5090565b5b808211156140a057600081556001016140a5565b600067ffffffffffffffff808411156140d4576140d4614825565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561411a5761411a614825565b8160405280935085815286868601111561413357600080fd5b858560208301376000602087830101525050509392505050565b80356141588161483b565b919050565b600082601f83011261416d578081fd5b61188b838335602085016140b9565b60006020828403121561418d578081fd5b813561188b8161483b565b600080604083850312156141aa578081fd5b82356141b58161483b565b946020939093013593505050565b600080604083850312156141d5578182fd5b82356141e08161483b565b915060208301356141f08161483b565b809150509250929050565b60008060006060848603121561420f578081fd5b833561421a8161483b565b9250602084013561422a8161483b565b929592945050506040919091013590565b60008060008060808587031215614250578081fd5b843561425b8161483b565b9350602085013561426b8161483b565b925060408501359150606085013567ffffffffffffffff81111561428d578182fd5b8501601f8101871361429d578182fd5b6142ac878235602084016140b9565b91505092959194509250565b600080604083850312156142ca578182fd5b82356142d58161483b565b915060208301356141f081614850565b600080604083850312156141aa578182fd5b60008060208385031215614309578182fd5b823567ffffffffffffffff80821115614320578384fd5b818501915085601f830112614333578384fd5b813581811115614341578485fd5b8660208260051b8501011115614355578485fd5b60209290920196919550909350505050565b600060208284031215614378578081fd5b815161188b81614850565b600060208284031215614394578081fd5b813561188b8161485e565b6000602082840312156143b0578081fd5b815161188b8161485e565b6000602082840312156143cc578081fd5b813567ffffffffffffffff8111156143e2578182fd5b612ba28482850161415d565b6000806000806000806000806000806101408b8d03121561440d578788fd5b8a3567ffffffffffffffff8082111561442457898afd5b6144308e838f0161415d565b9b5060208d013591508082111561444557898afd5b6144518e838f0161415d565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d0135915080821115614482578586fd5b61448e8e838f0161415d565b955061449c60e08e0161414d565b94506144ab6101008e0161414d565b93506101208d01359150808211156144c1578283fd5b506144ce8d828e0161415d565b9150509295989b9194979a5092959850565b6000602082840312156144f1578081fd5b5035919050565b6000806040838503121561450a578182fd5b82359150602083013567ffffffffffffffff811115614527578182fd5b6145338582860161415d565b9150509250929050565b6000806040838503121561454f578182fd5b50508035926020909101359150565b6000815180845261457681602086016020860161476f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516145ba81846020870161476f565b9190910192915050565b600083516145d681846020880161476f565b8351908301906145ea81836020880161476f565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261464d608083018461455e565b9695505050505050565b60208152600061188b602083018461455e565b60e08152600061467d60e083018a61455e565b828103602084015261468f818a61455e565b9715156040840152505093151560608501529115156080840152151560a0830152151560c09091015292915050565b600082198211156146d1576146d161480f565b500190565b600060ff821660ff84168060ff038211156146f3576146f361480f565b019392505050565b60008261471657634e487b7160e01b81526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147535761475361480f565b500290565b60008282101561476a5761476a61480f565b500390565b60005b8381101561478a578181015183820152602001614772565b838111156110d55750506000910152565b600181811c908216806147af57607f821691505b602082108114156147d057634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148085761480861480f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611da057600080fd5b8015158114611da057600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611da057600080fdfea2646970667358221220fdd41809d529922554563b66098db8b6950b26a66ed79e5857748143c861cb9164736f6c63430008040033
Deployed Bytecode Sourcemap
48629:16718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49411:31;;;;;-1:-1:-1;;;;;49411:31:0;;;;;;-1:-1:-1;;;;;11224:55:1;;;11206:74;;11194:2;11179:18;49411:31:0;;;;;;;;63468:172;;;;;;:::i;:::-;;:::i;:::-;;;13343:14:1;;13336:22;13318:41;;13306:2;13291:18;63468:172:0;13273:92:1;49741:39:0;;;;;;;;;27111:25:1;;;27099:2;27084:18;49741:39:0;27066:76:1;22527:100:0;;;:::i;:::-;;;;;;;:::i;24097:221::-;;;;;;:::i;:::-;;:::i;23609:422::-;;;;;;:::i;:::-;;:::i;:::-;;49932:27;;;;;;49657:28;;;;;-1:-1:-1;;;;;49657:28:0;;;61864:387;;;;;;:::i;:::-;;:::i;24987:339::-;;;;;;:::i;:::-;;:::i;57893:137::-;;;;;;:::i;:::-;58020:2;58002:20;;57893:137;58352:420;;;;;;:::i;:::-;;:::i;49567:37::-;;;;;;52631:104;;;;;;:::i;:::-;;:::i;49887:36::-;;;;;;49530:30;;;;;;65170:174;;;;;;:::i;:::-;;:::i;25397:185::-;;;;;;:::i;:::-;;:::i;65019:143::-;;;;;;:::i;:::-;;:::i;58780:944::-;;;;;;:::i;:::-;;:::i;53606:260::-;;;;;;:::i;:::-;;:::i;64883:128::-;;;;;;:::i;:::-;;:::i;49255:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;49966:29;;;;;;49117:67;;;;;;:::i;:::-;;;;;;;;;;;;;;50047:36;;;;;;53384:214;;;;;;:::i;:::-;;:::i;52863:130::-;;;;;;:::i;:::-;;:::i;22221:239::-;;;;;;:::i;:::-;;:::i;53874:154::-;;;;;;:::i;:::-;;:::i;49451:28::-;;;;;;60174:498;;;:::i;50002:38::-;;;;;;53001:149;;;;;;:::i;:::-;;:::i;49837:43::-;;;;;;52743:112;;;;;;:::i;:::-;;:::i;21951:208::-;;;;;;:::i;:::-;;:::i;47815:94::-;;;:::i;49692:42::-;;;;;;49787:43;;;;;;58188:156;;;;;;:::i;:::-;58314:2;58296:20;58320:16;58295:41;;58188:156;49486:37;;;;;;47164:87;47237:6;;-1:-1:-1;;;;;47237:6:0;47164:87;;56712:208;;;;;;:::i;:::-;;:::i;64335:117::-;;;;;;:::i;:::-;;:::i;49613:35::-;;;;;;50729:1422;;;;;;:::i;:::-;;:::i;57644:240::-;;;;;;:::i;:::-;;:::i;22696:104::-;;;:::i;24390:295::-;;;;;;:::i;:::-;;:::i;53158:218::-;;;;;;:::i;:::-;;:::i;58038:142::-;;;;;;:::i;:::-;58160:12;58143:29;;58038:142;56412:292;;;:::i;25653:328::-;;;;;;:::i;:::-;;:::i;61502:354::-;;;;;;:::i;:::-;;:::i;62511:553::-;;;;;;:::i;:::-;;:::i;52280:343::-;;;;;;:::i;:::-;;:::i;50092:22::-;;;:::i;63072:388::-;;;;;;:::i;:::-;;:::i;48994:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49193:55;;;;;;:::i;:::-;;;;;;;;;;;;;;64230:97;;;:::i;24756:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24877:25:0;;;24853:4;24877:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24756:164;48927:58;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;48064:192::-;;;;;;:::i;:::-;;:::i;49058:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;60680:814;;;;;;:::i;:::-;;:::i;49314:90::-;;49361:42;49314:90;;63468:172;63572:4;63596:36;63620:11;63596:23;:36::i;:::-;63589:43;63468:172;-1:-1:-1;;63468:172:0:o;22527:100::-;22581:13;22614:5;22607:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22527:100;:::o;24097:221::-;24173:7;27580:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27580:16:0;24193:73;;;;-1:-1:-1;;;24193:73:0;;22767:2:1;24193:73:0;;;22749:21:1;22806:2;22786:18;;;22779:30;22845:34;22825:18;;;22818:62;22916:14;22896:18;;;22889:42;22948:19;;24193:73:0;;;;;;;;;-1:-1:-1;24286:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24286:24:0;;24097:221::o;23609:422::-;23690:13;23706:34;23732:7;23706:25;:34::i;:::-;23690:50;;23765:5;-1:-1:-1;;;;;23759:11:0;:2;-1:-1:-1;;;;;23759:11:0;;;23751:57;;;;-1:-1:-1;;;23751:57:0;;24697:2:1;23751:57:0;;;24679:21:1;24736:2;24716:18;;;24709:30;24775:34;24755:18;;;24748:62;24846:3;24826:18;;;24819:31;24867:19;;23751:57:0;24669:223:1;23751:57:0;16660:10;-1:-1:-1;;;;;23843:21:0;;;;:62;;-1:-1:-1;23868:37:0;23885:5;16660:10;24756:164;:::i;23868:37::-;23821:168;;;;-1:-1:-1;;;23821:168:0;;20085:2:1;23821:168:0;;;20067:21:1;20124:2;20104:18;;;20097:30;20163:34;20143:18;;;20136:62;20234:26;20214:18;;;20207:54;20278:19;;23821:168:0;20057:246:1;23821:168:0;24002:21;24011:2;24015:7;24002:8;:21::i;:::-;23609:422;;;:::o;61864:387::-;61925:4;61937:14;61960:4;61937:28;;61984:1;61973;:8;:12;61970:29;;;-1:-1:-1;61994:5:0;;61864:387;-1:-1:-1;;61864:387:0:o;61970:29::-;62018:2;62007:1;:8;:13;62004:30;;;-1:-1:-1;62029:5:0;;61864:387;-1:-1:-1;;61864:387:0:o;62004:30::-;62045:6;62041:185;62055:1;:8;62053:1;:10;62041:185;;;62075:11;62089:1;62091;62089:4;;;;;;-1:-1:-1;;;62089:4:0;;;;;;;;;;;;;;;;-1:-1:-1;62112:12:0;;;;;;:28;;-1:-1:-1;62128:12:0;;;;;;62112:28;62110:31;:77;;;;-1:-1:-1;62158:12:0;;;;;;;;:28;;-1:-1:-1;62174:12:0;;;;;;62158:28;62156:31;62110:77;62101:119;;;-1:-1:-1;62215:5:0;;61864:387;-1:-1:-1;;;;61864:387:0:o;62101:119::-;-1:-1:-1;62065:3:0;;;;:::i;:::-;;;;62041:185;;;-1:-1:-1;62239:4:0;;61864:387;-1:-1:-1;;;61864:387:0:o;24987:339::-;25182:41;16660:10;25215:7;25182:18;:41::i;:::-;25174:103;;;;-1:-1:-1;;;25174:103:0;;25429:2:1;25174:103:0;;;25411:21:1;25468:2;25448:18;;;25441:30;25507:34;25487:18;;;25480:62;25578:19;25558:18;;;25551:47;25615:19;;25174:103:0;25401:239:1;25174:103:0;25290:28;25300:4;25306:2;25310:7;25290:9;:28::i;58352:420::-;58432:7;58456:44;58485:14;58020:2;58002:20;;57893:137;58456:44;58504:47;58456:95;58452:109;;-1:-1:-1;58560:1:0;;58352:420;-1:-1:-1;58352:420:0:o;58452:109::-;58160:12;58143:29;;58620:1;58576:45;58572:59;;-1:-1:-1;58630:1:0;;58352:420;-1:-1:-1;58352:420:0:o;58572:59::-;58320:16;58314:2;58296:20;;;58295:41;58725:4;58717:12;;58713:26;;;-1:-1:-1;58738:1:0;;58352:420;-1:-1:-1;;58352:420:0:o;52631:104::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;52708:19;;::::1;::::0;:8:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52631:104:::0;:::o;65170:174::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;65294:21:::1;::::0;65275:61:::1;::::0;;;;-1:-1:-1;;;;;65294:21:0;;::::1;65275:61;::::0;::::1;11554:34:1::0;11624:15;;;11604:18;;;11597:43;11656:18;;;11649:34;;;65275:18:0;;::::1;::::0;::::1;::::0;11466::1;;65275:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65170:174:::0;;;:::o;25397:185::-;25535:39;25552:4;25558:2;25562:7;25535:39;;;;;;;;;;;;:16;:39::i;65019:143::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;65121:33:::1;::::0;;;;-1:-1:-1;;;;;13068:55:1;;;65121:33:0::1;::::0;::::1;13050:74:1::0;13140:18;;;13133:34;;;65121:14:0;::::1;::::0;::::1;::::0;13023:18:1;;65121:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65019:143:::0;;;:::o;58780:944::-;58841:18;58862:42;58889:14;58862:26;:42::i;:::-;58841:63;;58936:1;58923:10;:14;58915:29;;;;-1:-1:-1;;;58915:29:0;;17263:2:1;58915:29:0;;;17245:21:1;17302:1;17282:18;;;17275:29;17340:4;17320:18;;;17313:32;17362:18;;58915:29:0;17235:151:1;58915:29:0;58997:15;;58981:3;58967:17;;;;-1:-1:-1;;;;;58997:15:0;:32;16660:10;58997:83;;;;;;;;;;-1:-1:-1;;;;;12592:15:1;;;58997:83:0;;;12574:34:1;49361:42:0;12624:18:1;;;12617:43;12676:18;;;12669:34;;;59074:1:0;12719:18:1;;;12712:34;12783:3;12762:19;;;12755:32;-1:-1:-1;12803:19:1;;;12796:33;12846:19;;58997:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59119:12;;59106:10;:25;;;;:::i;:::-;59093:38;;59148:2;59144:222;;;59167:12;59182:88;59194:28;;59224:15;59241:28;;59182:11;:88::i;:::-;59167:103;;59327:27;;59320:4;:34;;;;:::i;:::-;16660:10;59285:31;;;;:17;:31;;;;;:69;;:31;;;:69;;;;;:::i;:::-;;;;-1:-1:-1;;;59144:222:0;59378:271;16660:10;59459:5;59546:35;;;:19;:35;;;;;;59434:10;;59459:5;59487:2;;59514:4;;59546:35;;59459:5;59378:13;:271::i;:::-;-1:-1:-1;59667:49:0;;59705:10;;59689:14;;16660:10;;59667:49;;;;;58780:944;;;:::o;53606:260::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;53737:27:::1;:58:::0;;;;53806:24:::1;:52:::0;53606:260::o;64883:128::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;64977:26:::1;::::0;-1:-1:-1;;;;;64977:18:0;::::1;::::0;:26;::::1;;;::::0;64996:6;;64977:26:::1;::::0;;;64996:6;64977:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;53384:214:::0;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;53501:13:::1;:30:::0;;;;53542:22:::1;:48:::0;53384:214::o;52863:130::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;52951:15:::1;:34:::0;;;::::1;-1:-1:-1::0;;;;;52951:34:0;;;::::1;::::0;;;::::1;::::0;;52863:130::o;22221:239::-;22293:7;22329:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22329:16:0;22364:19;22356:73;;;;-1:-1:-1;;;22356:73:0;;21251:2:1;22356:73:0;;;21233:21:1;21290:2;21270:18;;;21263:30;21329:34;21309:18;;;21302:62;21400:11;21380:18;;;21373:39;21429:19;;22356:73:0;21223:231:1;53874:154:0;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;53973:21:::1;:47:::0;;;::::1;-1:-1:-1::0;;;;;53973:47:0;;;::::1;::::0;;;::::1;::::0;;53874:154::o;60174:498::-;16660:10;60219:34;;;;:20;:34;;;;;;60257:1;-1:-1:-1;60219:39:0;60211:54;;;;-1:-1:-1;;;60211:54:0;;19755:2:1;60211:54:0;;;19737:21:1;19794:1;19774:18;;;19767:29;19832:4;19812:18;;;19805:32;19854:18;;60211:54:0;19727:151:1;60211:54:0;60278:24;60288:13;;60278:9;:24::i;:::-;60323:18;60344:271;16660:10;60417:23;;60400:14;;:40;;;;:::i;:::-;60455:4;60483:5;60510;60542;60576;60344:13;:271::i;:::-;60633:31;;60323:292;;-1:-1:-1;60323:292:0;;16660:10;;60633:31;;;;;60174:498;:::o;53001:149::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;53098:20:::1;:44:::0;53001:149::o;52743:112::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;52823:10:::1;:24:::0;;;::::1;-1:-1:-1::0;;;;;52823:24:0;;;::::1;::::0;;;::::1;::::0;;52743:112::o;21951:208::-;22023:7;-1:-1:-1;;;;;22051:19:0;;22043:74;;;;-1:-1:-1;;;22043:74:0;;20840:2:1;22043:74:0;;;20822:21:1;20879:2;20859:18;;;20852:30;20918:34;20898:18;;;20891:62;20989:12;20969:18;;;20962:40;21019:19;;22043:74:0;20812:232:1;22043:74:0;-1:-1:-1;;;;;;22135:16:0;;;;;:9;:16;;;;;;;21951:208::o;47815:94::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;47880:21:::1;47898:1;47880:9;:21::i;:::-;47815:94::o:0;56712:208::-;56810:7;56863:49;56889:4;56895:16;56863:25;:49::i;:::-;-1:-1:-1;;;;;56837:23:0;;;;;;:17;:23;;;;;;:75;;;;:::i;:::-;56830:82;56712:208;-1:-1:-1;;;56712:208:0:o;64335:117::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;64417:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;50729:1422::-:0;15489:13;;;;;;;;:30;;-1:-1:-1;15507:12:0;;;;15506:13;15489:30;15481:89;;;;-1:-1:-1;;;15481:89:0;;21661:2:1;15481:89:0;;;21643:21:1;21700:2;21680:18;;;21673:30;21739:34;21719:18;;;21712:62;21810:16;21790:18;;;21783:44;21844:19;;15481:89:0;21633:236:1;15481:89:0;15583:19;15606:13;;;;;;15605:14;15630:101;;;;15665:13;:20;;-1:-1:-1;;15700:19:0;;;;;15630:101;51168:29:::1;51182:5;51189:7;51168:13;:29::i;:::-;51208:16;:14;:16::i;:::-;51263:1;51237:23;:27:::0;51299:4:::1;51275:21;:28:::0;51332:7:::1;51314:14;:25:::0;51368:7:::1;51350:12;:25:::0;51412:17:::1;51396:13;:33:::0;;;51440:22:::1;:42:::0;51513:16:::1;51495:15;:34:::0;;;51540:22:::1;:41:::0;51624:36:::1;51653:6;51629:15;51624:36;:::i;:::-;51594:27;:66:::0;51698:35:::1;51726:6;51703:14;51698:35;:::i;:::-;51671:24;:62:::0;51746:19;;::::1;::::0;:8:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51778:20:0::1;:44:::0;;;51835:28:::1;:60:::0;;;51906:28:::1;:60:::0;;;51977:21:::1;:46:::0;;;52034:10:::1;:24:::0;;-1:-1:-1;;;;;52034:24:0;;::::1;::::0;;;::::1;;::::0;;;52069:15:::1;:34:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;52116:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;15761:14:::0;15757:68;;;15808:5;15792:21;;-1:-1:-1;;15792:21:0;;;15757:68;50729:1422;;;;;;;;;;;:::o;57644:240::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;57751:6:::1;57746:131;57763:30:::0;;::::1;57746:131;;;57861:4;57815:19;:43;57835:19;;57855:1;57835:22;;;;;-1:-1:-1::0;;;57835:22:0::1;;;;;;;;;;;;;;;57815:43;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;57795:3;;;;;:::i;:::-;;;;57746:131;;22696:104:::0;22752:13;22785:7;22778:14;;;;;:::i;24390:295::-;-1:-1:-1;;;;;24493:24:0;;16660:10;24493:24;;24485:62;;;;-1:-1:-1;;;24485:62:0;;18328:2:1;24485:62:0;;;18310:21:1;18367:2;18347:18;;;18340:30;18406:27;18386:18;;;18379:55;18451:18;;24485:62:0;18300:175:1;24485:62:0;16660:10;24560:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24560:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;24629:48;;13318:41:1;;;24560:42:0;;16660:10;24629:48;;13291:18:1;24629:48:0;;;;;;;24390:295;;:::o;53158:218::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;53275:15:::1;:34:::0;;;;53320:22:::1;:48:::0;53158:218::o;56412:292::-;56457:45;16660:10;56472:12;56486:15;56457:14;:45::i;:::-;16660:10;56515:17;56535:31;;;:17;:31;;;;;;;56577:35;;;56628:13;;56625:71;;56656:10;;-1:-1:-1;;;;;56656:10:0;:15;16660:10;56656:40;;;;;;;;;;-1:-1:-1;;;;;13068:55:1;;;56656:40:0;;;13050:74:1;13140:18;;;13133:34;;;13023:18;;56656:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56625:71;56412:292;:::o;25653:328::-;25828:41;16660:10;25861:7;25828:18;:41::i;:::-;25820:103;;;;-1:-1:-1;;;25820:103:0;;25429:2:1;25820:103:0;;;25411:21:1;25468:2;25448:18;;;25441:30;25507:34;25487:18;;;25480:62;25578:19;25558:18;;;25551:47;25615:19;;25820:103:0;25401:239:1;25820:103:0;25934:39;25948:4;25954:2;25958:7;25967:5;25934:13;:39::i;61502:354::-;16660:10;61563:16;61571:7;61563;:16::i;:::-;-1:-1:-1;;;;;61563:32:0;;61555:47;;;;-1:-1:-1;;;61555:47:0;;19425:2:1;61555:47:0;;;19407:21:1;19464:1;19444:18;;;19437:29;19502:4;19482:18;;;19475:32;19524:18;;61555:47:0;19397:151:1;61555:47:0;61615:29;61647:24;;;:15;:24;;;;;61690:11;;;;;;:19;;:11;:19;61682:34;;;;-1:-1:-1;;;61682:34:0;;26177:2:1;61682:34:0;;;26159:21:1;26216:1;26196:18;;;26189:29;26254:4;26234:18;;;26227:32;26276:18;;61682:34:0;26149:151:1;61682:34:0;61756:20;;61737:15;:39;;61729:54;;;;-1:-1:-1;;;61729:54:0;;17998:2:1;61729:54:0;;;17980:21:1;18037:1;18017:18;;;18010:29;18075:4;18055:18;;;18048:32;18097:18;;61729:54:0;17970:151:1;61729:54:0;61796:11;;;:19;;;;;;61833:15;;61840:7;;61833:15;;61810:5;;61833:15;61502:354;;:::o;62511:553::-;16660:10;62599:16;62607:7;62599;:16::i;:::-;-1:-1:-1;;;;;62599:32:0;;62591:47;;;;-1:-1:-1;;;62591:47:0;;16603:2:1;62591:47:0;;;16585:21:1;16642:1;16622:18;;;16615:29;16680:4;16660:18;;;16653:32;16702:18;;62591:47:0;16575:151:1;62591:47:0;62659:24;;;;:15;:24;;;;;:30;;;;;:39;62651:54;;;;-1:-1:-1;;;62651:54:0;;22437:2:1;62651:54:0;;;22419:21:1;22476:1;22456:18;;;22449:29;22514:4;22494:18;;;22487:32;22536:18;;62651:54:0;22409:151:1;62651:54:0;62726:20;62738:7;62726:11;:20::i;:::-;62718:35;;;;-1:-1:-1;;;62718:35:0;;24367:2:1;62718:35:0;;;24349:21:1;24406:1;24386:18;;;24379:29;24444:4;24424:18;;;24417:32;24466:18;;62718:35:0;24339:151:1;62718:35:0;62774:20;62786:7;62774:11;:20::i;:::-;:29;62766:44;;;;-1:-1:-1;;;62766:44:0;;20510:2:1;62766:44:0;;;20492:21:1;20549:1;20529:18;;;20522:29;20587:4;20567:18;;;20560:32;20609:18;;62766:44:0;20482:151:1;62766:44:0;62823:26;62833:15;;62823:9;:26::i;:::-;62879:24;;;;:15;:24;;;;;62862:54;;;;62879:24;62862:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62910:5;62862:16;:54::i;:::-;62927:31;62944:7;62953:4;62927:16;:31::i;:::-;62971:24;;;;:15;:24;;;;;;;;:39;;;;;;;;:::i;:::-;;63039:7;63028:28;63048:7;63028:28;;;;;;:::i;:::-;;;;;;;;62511:553;;:::o;52280:343::-;27556:4;27580:16;;;:7;:16;;;;;;52353:13;;-1:-1:-1;;;;;27580:16:0;52379:76;;;;-1:-1:-1;;;52379:76:0;;23951:2:1;52379:76:0;;;23933:21:1;23990:2;23970:18;;;23963:30;24029:34;24009:18;;;24002:62;24100:17;24080:18;;;24073:45;24135:19;;52379:76:0;23923:237:1;52379:76:0;52468:21;52492:10;:8;:10::i;:::-;52468:34;;52544:1;52526:7;52520:21;:25;:95;;;;;;;;;;;;;;;;;52572:7;52581:18;52591:7;52581:9;:18::i;:::-;52555:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52513:102;52280:343;-1:-1:-1;;;52280:343:0:o;50092:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63072:388::-;16660:10;63174:16;63182:7;63174;:16::i;:::-;-1:-1:-1;;;;;63174:32:0;;63166:47;;;;-1:-1:-1;;;63166:47:0;;26507:2:1;63166:47:0;;;26489:21:1;26546:1;26526:18;;;26519:29;26584:4;26564:18;;;26557:32;26606:18;;63166:47:0;26479:151:1;63166:47:0;63234:24;;;;:15;:24;;;;;:30;;;;;:39;63226:54;;;;-1:-1:-1;;;63226:54:0;;18682:2:1;63226:54:0;;;18664:21:1;18721:1;18701:18;;;18694:29;18759:4;18739:18;;;18732:32;18781:18;;63226:54:0;18654:151:1;63226:54:0;63293:24;;;;:15;:24;;;;;;;;:53;;;;:36;;;;;:53;;;;:::i;:::-;;63359:33;63369:22;;63359:9;:33::i;:::-;63428:7;63410:42;63437:14;63410:42;;;;;;:::i;64230:97::-;64274:13;64307:12;64300:19;;;;;:::i;48927:58::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48927:58:0;;;;;;;-1:-1:-1;;48927:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48064:192::-;47237:6;;-1:-1:-1;;;;;47237:6:0;16660:10;47384:23;47376:68;;;;-1:-1:-1;;;47376:68:0;;23180:2:1;47376:68:0;;;23162:21:1;;;23199:18;;;23192:30;23258:34;23238:18;;;23231:62;23310:18;;47376:68:0;23152:182:1;47376:68:0;-1:-1:-1;;;;;48153:22:0;::::1;48145:73;;;::::0;-1:-1:-1;;;48145:73:0;;15839:2:1;48145:73:0::1;::::0;::::1;15821:21:1::0;15878:2;15858:18;;;15851:30;15917:34;15897:18;;;15890:62;15988:8;15968:18;;;15961:36;16014:19;;48145:73:0::1;15811:228:1::0;48145:73:0::1;48229:19;48239:8;48229:9;:19::i;60680:814::-:0;16660:10;60752:16;60760:7;60752;:16::i;:::-;-1:-1:-1;;;;;60752:32:0;;60744:47;;;;-1:-1:-1;;;60744:47:0;;26837:2:1;60744:47:0;;;26819:21:1;26876:1;26856:18;;;26849:29;26914:4;26894:18;;;26887:32;26936:18;;60744:47:0;26809:151:1;60744:47:0;60804:29;60836:24;;;:15;:24;;;;;60879:15;;;;;;;;;:23;;60898:4;60879:23;60871:38;;;;-1:-1:-1;;;60871:38:0;;25847:2:1;60871:38:0;;;25829:21:1;25886:1;25866:18;;;25859:29;25924:4;25904:18;;;25897:32;25946:18;;60871:38:0;25819:151:1;60871:38:0;60928:26;;;;;;;;;:35;60920:50;;;;-1:-1:-1;;;60920:50:0;;25099:2:1;60920:50:0;;;25081:21:1;25138:1;25118:18;;;25111:29;25176:4;25156:18;;;25149:32;25198:18;;60920:50:0;25071:151:1;60920:50:0;60989:17;;;;;;;;;:25;;61010:4;60989:25;60981:40;;;;-1:-1:-1;;;60981:40:0;;15090:2:1;60981:40:0;;;15072:21:1;15129:1;15109:18;;;15102:29;15167:4;15147:18;;;15140:32;15189:18;;60981:40:0;15062:151:1;60981:40:0;61034:26;;;:33;;;;;;;;61090:22;;61080:33;;:9;:33::i;:::-;61126:18;61147:271;16660:10;61220:23;;61203:14;;:40;;;;:::i;:::-;61258:5;61286;61313;61345:4;61379:5;61147:13;:271::i;:::-;61126:292;-1:-1:-1;61478:7:0;16660:10;-1:-1:-1;;;;;61436:50:0;;61466:10;61436:50;;;;27111:25:1;;27099:2;27084:18;;27066:76;61436:50:0;;;;;;;;60680:814;;;:::o;21538:349::-;21662:4;21699:51;;;21714:36;21699:51;;:127;;-1:-1:-1;21767:59:0;;;21782:44;21767:59;21699:127;:180;;;-1:-1:-1;19851:36:0;19836:51;;;;21843:36;19727:168;31506:185;31581:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;31581:29:0;;;;;;;;:24;;31635:34;31581:24;31635:25;:34::i;:::-;-1:-1:-1;;;;;31626:57:0;;;;;;;;;;;31506:185;;:::o;27785:359::-;27878:4;27580:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27580:16:0;27895:73;;;;-1:-1:-1;;;27895:73:0;;19012:2:1;27895:73:0;;;18994:21:1;19051:2;19031:18;;;19024:30;19090:34;19070:18;;;19063:62;19161:14;19141:18;;;19134:42;19193:19;;27895:73:0;18984:234:1;27895:73:0;27979:13;27995:34;28021:7;27995:25;:34::i;:::-;27979:50;;28059:5;-1:-1:-1;;;;;28048:16:0;:7;-1:-1:-1;;;;;28048:16:0;;:51;;;;28092:7;-1:-1:-1;;;;;28068:31:0;:20;28080:7;28068:11;:20::i;:::-;-1:-1:-1;;;;;28068:31:0;;28048:51;:87;;;-1:-1:-1;;;;;;24877:25:0;;;24853:4;24877:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28103:32;28040:96;27785:359;-1:-1:-1;;;;27785:359:0:o;30799:589::-;30969:4;-1:-1:-1;;;;;30931:42:0;:34;30957:7;30931:25;:34::i;:::-;-1:-1:-1;;;;;30931:42:0;;30923:96;;;;-1:-1:-1;;;30923:96:0;;23541:2:1;30923:96:0;;;23523:21:1;23580:2;23560:18;;;23553:30;23619:34;23599:18;;;23592:62;23690:11;23670:18;;;23663:39;23719:19;;30923:96:0;23513:231:1;30923:96:0;-1:-1:-1;;;;;31038:16:0;;31030:65;;;;-1:-1:-1;;;31030:65:0;;17593:2:1;31030:65:0;;;17575:21:1;17632:2;17612:18;;;17605:30;17671:34;17651:18;;;17644:62;17742:6;17722:18;;;17715:34;17766:19;;31030:65:0;17565:226:1;31030:65:0;31108:39;31129:4;31135:2;31139:7;31108:20;:39::i;:::-;31212:29;31229:1;31233:7;31212:8;:29::i;:::-;-1:-1:-1;;;;;31254:15:0;;;;;;:9;:15;;;;;:20;;31273:1;;31254:15;:20;;31273:1;;31254:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31285:13:0;;;;;;:9;:13;;;;;:18;;31302:1;;31285:13;:18;;31302:1;;31285:18;:::i;:::-;;;;-1:-1:-1;;31314:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;31314:21:0;;;;;;;;;31353:27;;31314:16;;31353:27;;;;;;;30799:589;;;:::o;54899:244::-;54982:7;55017:3;55035:10;;;55031:26;;;-1:-1:-1;55054:3:0;55031:26;55091:4;55082:5;:13;55078:27;;55104:1;55097:8;;;;;55078:27;55123:12;55130:5;55123:4;:12;:::i;:::-;55116:19;54899:244;-1:-1:-1;;;;;54899:244:0:o;54036:855::-;54270:7;54327:27;;;:15;:27;;;;;54371:19;54367:154;;54441:21;;54415:23;;:47;54407:62;;;;-1:-1:-1;;;54407:62:0;;16933:2:1;54407:62:0;;;16915:21:1;16972:1;16952:18;;;16945:29;17010:4;16990:18;;;16983:32;17032:18;;54407:62:0;16905:151:1;54407:62:0;54484:23;:25;;;:23;:25;;;:::i;:::-;;;;;;54367:154;54533:22;;;;;;;;;;;;;;;;;;;;;;;:8;;:22;:::i;:::-;-1:-1:-1;54566:25:0;;;;;;;;;;-1:-1:-1;54566:25:0;;;;;;:20;;;;:25;:::i;:::-;-1:-1:-1;54604:14:0;;;:23;;-1:-1:-1;;54638:21:0;54604:23;;;-1:-1:-1;;54638:21:0;;54604:23;54638:21;;;;;54712:35;;54670:31;;;;;54712:35;;;;;;;;;54758:53;;;;;;;;;;54824:29;54834:6;54842:10;54824:9;:29::i;:::-;-1:-1:-1;54873:10:0;;54036:855;-1:-1:-1;;;;;;;54036:855:0:o;59732:434::-;59786:45;16660:10;59801:12;16580:98;59786:45;16660:10;59848:31;;;;:17;:31;;;;;;:41;-1:-1:-1;59844:315:0;;16660:10;59906:31;;;;:17;:31;;;;;:41;;59941:6;;59906:31;:41;;59941:6;;59906:41;:::i;:::-;;;;-1:-1:-1;59844:315:0;;-1:-1:-1;59844:315:0;;16660:10;59980:18;60001:31;;;:17;:31;;;;;;;60047:35;;;60097:10;;60001:31;;-1:-1:-1;;;;;60097:10:0;;;;:15;;60127:19;60001:31;60127:6;:19;:::i;:::-;60097:50;;;;;;;;;;-1:-1:-1;;;;;13068:55:1;;;60097:50:0;;;13050:74:1;13140:18;;;13133:34;13023:18;;60097:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59844:315;59732:434;:::o;48264:173::-;48339:6;;;-1:-1:-1;;;;;48356:17:0;;;;;;;;;;;48389:40;;48339:6;;;48356:17;48339:6;;48389:40;;48320:16;;48389:40;48264:173;;:::o;55151:903::-;-1:-1:-1;;;;;55290:26:0;;55247:7;55290:26;;;:20;:26;;;;;;;;;55394:32;:38;;;;;;55452:21;;55247:7;;;;55382:92;;55394:38;55434:16;;55382:11;:92::i;:::-;55367:107;;55542:12;55512:27;;55505:4;:34;;;;:::i;:::-;:49;;;;:::i;:::-;55487:67;;;;:::i;:::-;;;55587:1;55571:12;:17;55567:177;;55605:17;55643:12;55625:15;55635:4;55625:9;:15::i;:::-;:30;;;;:::i;:::-;55605:50;;55723:9;55696:24;;55689:4;:31;;;;:::i;:::-;:43;;;;:::i;:::-;55670:62;;;;:::i;:::-;;;55567:177;;-1:-1:-1;;;;;55760:21:0;;55784:1;55760:21;;;:15;:21;;;;;;:25;55756:256;;-1:-1:-1;;;;;55821:38:0;;;;;;:32;:38;;;;;;55879:28;;55809:99;;55821:38;55861:16;;55809:11;:99::i;:::-;-1:-1:-1;;;;;55979:21:0;;;;;;:15;:21;;;;;;55949:27;;55802:106;;-1:-1:-1;55979:21:0;55942:34;;55802:106;55942:34;:::i;:::-;:58;;;;:::i;:::-;55923:77;;;;:::i;:::-;;;55756:256;-1:-1:-1;56031:15:0;55151:903;-1:-1:-1;;;;55151:903:0:o;21081:219::-;15489:13;;;;;;;;:30;;-1:-1:-1;15507:12:0;;;;15506:13;15489:30;15481:89;;;;-1:-1:-1;;;15481:89:0;;21661:2:1;15481:89:0;;;21643:21:1;21700:2;21680:18;;;21673:30;21739:34;21719:18;;;21712:62;21810:16;21790:18;;;21783:44;21844:19;;15481:89:0;21633:236:1;15481:89:0;15583:19;15606:13;;;;;;15605:14;15630:101;;;;15665:13;:20;;-1:-1:-1;;15700:19:0;;;;;15630:101;21180:26:::1;:24;:26::i;:::-;21217:25;:23;:25::i;:::-;21253:39;21277:5;21284:7;21253:23;:39::i;:::-;15761:14:::0;15757:68;;;15808:5;15792:21;;-1:-1:-1;;15792:21:0;;;21081:219;;;:::o;46847:129::-;15489:13;;;;;;;;:30;;-1:-1:-1;15507:12:0;;;;15506:13;15489:30;15481:89;;;;-1:-1:-1;;;15481:89:0;;21661:2:1;15481:89:0;;;21643:21:1;21700:2;21680:18;;;21673:30;21739:34;21719:18;;;21712:62;21810:16;21790:18;;;21783:44;21844:19;;15481:89:0;21633:236:1;15481:89:0;15583:19;15606:13;;;;;;15605:14;15630:101;;;;15665:13;:20;;-1:-1:-1;;15700:19:0;;;;;15630:101;46905:26:::1;:24;:26::i;:::-;46942;:24;:26::i;:::-;15761:14:::0;15757:68;;;15808:5;15792:21;;-1:-1:-1;;15792:21:0;;;46847:129;:::o;56062:342::-;-1:-1:-1;;;;;56149:18:0;;56145:31;;56062:342;;:::o;56145:31::-;-1:-1:-1;;;;;56192:26:0;;56221:1;56192:26;;;:20;:26;;;;;;:30;56188:139;;56266:49;56292:4;56298:16;56266:25;:49::i;:::-;-1:-1:-1;;;;;56239:23:0;;;;;;:17;:23;;;;;:76;;:23;;;:76;;;;;:::i;:::-;;;;-1:-1:-1;;56188:139:0;-1:-1:-1;;;;;56339:38:0;;;;;;;:32;:38;;;;;:57;56062:342::o;26863:315::-;27020:28;27030:4;27036:2;27040:7;27020:9;:28::i;:::-;27067:48;27090:4;27096:2;27100:7;27109:5;27067:22;:48::i;:::-;27059:111;;;;-1:-1:-1;;;27059:111:0;;15420:2:1;27059:111:0;;;15402:21:1;15459:2;15439:18;;;15432:30;15498:34;15478:18;;;15471:62;15569:20;15549:18;;;15542:48;15607:19;;27059:111:0;15392:240:1;62259:119:0;62322:4;62346:9;62356:13;62364:4;62356:7;:13::i;:::-;62346:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62259:119;-1:-1:-1;;62259:119:0:o;62386:117::-;62491:4;62464:9;62474:13;62482:4;62474:7;:13::i;:::-;62464:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;-1:-1:-1;;62386:117:0:o;52159:109::-;52219:13;52252:8;52245:15;;;;;:::i;63648:574::-;63699:27;63743:7;63739:50;;-1:-1:-1;;63767:10:0;;;;;;;;;;;;;;;;;;63648:574::o;63739:50::-;63808:2;63799:6;63840:69;63847:6;;63840:69;;63870:5;;;;:::i;:::-;;-1:-1:-1;63890:7:0;;-1:-1:-1;63895:2:0;63890:7;;:::i;:::-;;;63840:69;;;63919:17;63949:3;63939:14;;;;;;-1:-1:-1;;;63939:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63939:14:0;-1:-1:-1;63919:34:0;-1:-1:-1;63973:3:0;63987:198;63994:7;;63987:198;;64022:3;64024:1;64022;:3;:::i;:::-;64018:7;-1:-1:-1;64040:10:0;64070:7;64075:2;64070;:7;:::i;:::-;:12;;64080:2;64070:12;:::i;:::-;64065:17;;:2;:17;:::i;:::-;64054:29;;:2;:29;:::i;:::-;64040:44;;64099:9;64118:4;64111:12;;64099:24;;64148:2;64138:4;64143:1;64138:7;;;;;;-1:-1:-1;;;64138:7:0;;;;;;;;;;;;:12;;;;;;;;;;-1:-1:-1;64165:8:0;64171:2;64165:8;;:::i;:::-;;;63987:198;;;;56928:708;57149:29;57181:24;;;:15;:24;;;;;57218:37;57233:4;57239:15;57218:14;:37::i;:::-;57266:35;57281:2;57285:15;57266:14;:35::i;:::-;57326:10;;;;;;;;;;:18;;:10;:18;57322:140;;;-1:-1:-1;;;;;57365:18:0;;;57361:50;;-1:-1:-1;;;;;57385:21:0;;;;;;:15;:21;;;;;:26;;57410:1;;57385:21;:26;;57410:1;;57385:26;:::i;:::-;;;;-1:-1:-1;;57361:50:0;-1:-1:-1;;;;;57426:19:0;;;;;;:15;:19;;;;;:24;;57449:1;;57426:19;:24;;57449:1;;57426:24;:::i;:::-;;;;-1:-1:-1;;57322:140:0;57478:15;;;;;;;;;:23;;57497:4;57478:23;57474:155;;;-1:-1:-1;;;;;57522:18:0;;;57518:55;;-1:-1:-1;;;;;57542:26:0;;;;;;:20;:26;;;;;:31;;57572:1;;57542:26;:31;;57572:1;;57542:31;:::i;:::-;;;;-1:-1:-1;;57518:55:0;-1:-1:-1;;;;;57588:24:0;;;;;;:20;:24;;;;;:29;;57616:1;;57588:24;:29;;57616:1;;57588:29;:::i;:::-;;;;-1:-1:-1;;56928:708:0;;;;:::o;28486:110::-;28562:26;28572:2;28576:7;28562:26;;;;;;;;;;;;:9;:26::i;16509:65::-;15489:13;;;;;;;;:30;;-1:-1:-1;15507:12:0;;;;15506:13;15489:30;15481:89;;;;-1:-1:-1;;;15481:89:0;;21661:2:1;15481:89:0;;;21643:21:1;21700:2;21680:18;;;21673:30;21739:34;21719:18;;;21712:62;21810:16;21790:18;;;21783:44;21844:19;;15481:89:0;21633:236:1;15481:89:0;15583:19;15606:13;;;;;;15605:14;15630:101;;;;15665:13;:20;;-1:-1:-1;;15700:19:0;;;;;15757:68;;;;15808:5;15792:21;;-1:-1:-1;;15792:21:0;;;16509:65;:::o;21308:158::-;15489:13;;;;;;;;:30;;-1:-1:-1;15507:12:0;;;;15506:13;15489:30;15481:89;;;;-1:-1:-1;;;15481:89:0;;21661:2:1;15481:89:0;;;21643:21:1;21700:2;21680:18;;;21673:30;21739:34;21719:18;;;21712:62;21810:16;21790:18;;;21783:44;21844:19;;15481:89:0;21633:236:1;15481:89:0;15583:19;15606:13;;;;;;15605:14;15630:101;;;;15665:13;:20;;-1:-1:-1;;15700:19:0;;;;;15630:101;21417:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;21441:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;15761:14:::0;15757:68;;;15808:5;15792:21;;-1:-1:-1;;15792:21:0;;;21308:158;;;:::o;46984:99::-;15489:13;;;;;;;;:30;;-1:-1:-1;15507:12:0;;;;15506:13;15489:30;15481:89;;;;-1:-1:-1;;;15481:89:0;;21661:2:1;15481:89:0;;;21643:21:1;21700:2;21680:18;;;21673:30;21739:34;21719:18;;;21712:62;21810:16;21790:18;;;21783:44;21844:19;;15481:89:0;21633:236:1;15481:89:0;15583:19;15606:13;;;;;;15605:14;15630:101;;;;15665:13;:20;;-1:-1:-1;;15700:19:0;;;;;15630:101;47052:23:::1;16660:10:::0;47052:9:::1;:23::i;32256:821::-:0;32411:4;-1:-1:-1;;;;;32432:13:0;;8080:20;8128:8;32428:642;;32468:83;;;;;-1:-1:-1;;;;;32468:47:0;;;;;:83;;16660:10;;32530:4;;32536:7;;32545:5;;32468:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32468:83:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32464:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32732:13:0;;32728:272;;32775:60;;-1:-1:-1;;;32775:60:0;;15420:2:1;32775:60:0;;;15402:21:1;15459:2;15439:18;;;15432:30;15498:34;15478:18;;;15471:62;15569:20;15549:18;;;15542:48;15607:19;;32775:60:0;15392:240:1;32728:272:0;32950:6;32944:13;32935:6;32931:2;32927:15;32920:38;32464:551;32602:62;;32612:52;32602:62;;-1:-1:-1;32595:69:0;;32428:642;-1:-1:-1;33054:4:0;32256:821;;;;;;:::o;64460:415::-;64519:13;64538:17;64564:3;64538:30;;64573:19;64605:4;:11;64595:22;;;;;;-1:-1:-1;;;64595:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64595:22:0;;64573:44;;64627:6;64622:223;64643:4;:11;64639:1;:15;64622:223;;;64717:2;64705:4;64710:1;64705:7;;;;;;-1:-1:-1;;;64705:7:0;;;;;;;;;;;;;;;64699:20;;;;64698:48;;;64743:2;64731:4;64736:1;64731:7;;;;;;-1:-1:-1;;;64731:7:0;;;;;;;;;;;;;;;64725:20;;64698:48;64694:146;;;64780:4;64785:1;64780:7;;;;;;-1:-1:-1;;;64780:7:0;;;;;;;;;;;;;;;;;64774:14;;64791:2;64774:19;;;;:::i;:::-;64767:27;;64755:6;64762:1;64755:9;;;;;;-1:-1:-1;;;64755:9:0;;;;;;;;;;;;:39;;;;;;;;;;;64694:146;;;64826:4;64831:1;64826:7;;;;;;-1:-1:-1;;;64826:7:0;;;;;;;;;;;;;;;;;64814:6;64821:1;64814:9;;;;;;-1:-1:-1;;;64814:9:0;;;;;;;;;;;;:19;;;;;;;;;;;64694:146;64656:3;;;;:::i;:::-;;;;64622:223;;;-1:-1:-1;64863:6:0;64460:415;-1:-1:-1;;;64460:415:0:o;28823:321::-;28953:18;28959:2;28963:7;28953:5;:18::i;:::-;29004:54;29035:1;29039:2;29043:7;29052:5;29004:22;:54::i;:::-;28982:154;;;;-1:-1:-1;;;28982:154:0;;15420:2:1;28982:154:0;;;15402:21:1;15459:2;15439:18;;;15432:30;15498:34;15478:18;;;15471:62;15569:20;15549:18;;;15542:48;15607:19;;28982:154:0;15392:240:1;29480:382:0;-1:-1:-1;;;;;29560:16:0;;29552:61;;;;-1:-1:-1;;;29552:61:0;;22076:2:1;29552:61:0;;;22058:21:1;;;22095:18;;;22088:30;22154:34;22134:18;;;22127:62;22206:18;;29552:61:0;22048:182:1;29552:61:0;27556:4;27580:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27580:16:0;:30;29624:58;;;;-1:-1:-1;;;29624:58:0;;16246:2:1;29624:58:0;;;16228:21:1;16285:2;16265:18;;;16258:30;16324;16304:18;;;16297:58;16372:18;;29624:58:0;16218:178:1;29624:58:0;29695:45;29724:1;29728:2;29732:7;29695:20;:45::i;:::-;-1:-1:-1;;;;;29753:13:0;;;;;;:9;:13;;;;;:18;;29770:1;;29753:13;:18;;29770:1;;29753:18;:::i;:::-;;;;-1:-1:-1;;29782:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29782:21:0;;;;;;;;29821:33;;29782:16;;;29821:33;;29782:16;;29821:33;29480:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;194:66;339:24;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:2;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:2;;;591:1;588;581:12;550:2;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;88:616;;;;;:::o;709:146::-;789:20;;818:31;789:20;818:31;:::i;:::-;770:85;;;:::o;860:229::-;903:5;956:3;949:4;941:6;937:17;933:27;923:2;;978:5;971;964:20;923:2;1004:79;1079:3;1070:6;1057:20;1050:4;1042:6;1038:17;1004:79;:::i;1094:257::-;1153:6;1206:2;1194:9;1185:7;1181:23;1177:32;1174:2;;;1227:6;1219;1212:22;1174:2;1271:9;1258:23;1290:31;1315:5;1290:31;:::i;1356:333::-;1432:6;1440;1493:2;1481:9;1472:7;1468:23;1464:32;1461:2;;;1514:6;1506;1499:22;1461:2;1558:9;1545:23;1577:31;1602:5;1577:31;:::i;:::-;1627:5;1679:2;1664:18;;;;1651:32;;-1:-1:-1;;;1451:238:1:o;1694:398::-;1762:6;1770;1823:2;1811:9;1802:7;1798:23;1794:32;1791:2;;;1844:6;1836;1829:22;1791:2;1888:9;1875:23;1907:31;1932:5;1907:31;:::i;:::-;1957:5;-1:-1:-1;2014:2:1;1999:18;;1986:32;2027:33;1986:32;2027:33;:::i;:::-;2079:7;2069:17;;;1781:311;;;;;:::o;2097:466::-;2174:6;2182;2190;2243:2;2231:9;2222:7;2218:23;2214:32;2211:2;;;2264:6;2256;2249:22;2211:2;2308:9;2295:23;2327:31;2352:5;2327:31;:::i;:::-;2377:5;-1:-1:-1;2434:2:1;2419:18;;2406:32;2447:33;2406:32;2447:33;:::i;:::-;2201:362;;2499:7;;-1:-1:-1;;;2553:2:1;2538:18;;;;2525:32;;2201:362::o;2568:824::-;2663:6;2671;2679;2687;2740:3;2728:9;2719:7;2715:23;2711:33;2708:2;;;2762:6;2754;2747:22;2708:2;2806:9;2793:23;2825:31;2850:5;2825:31;:::i;:::-;2875:5;-1:-1:-1;2932:2:1;2917:18;;2904:32;2945:33;2904:32;2945:33;:::i;:::-;2997:7;-1:-1:-1;3051:2:1;3036:18;;3023:32;;-1:-1:-1;3106:2:1;3091:18;;3078:32;3133:18;3122:30;;3119:2;;;3170:6;3162;3155:22;3119:2;3198:22;;3251:4;3243:13;;3239:27;-1:-1:-1;3229:2:1;;3285:6;3277;3270:22;3229:2;3313:73;3378:7;3373:2;3360:16;3355:2;3351;3347:11;3313:73;:::i;:::-;3303:83;;;2698:694;;;;;;;:::o;3397:392::-;3462:6;3470;3523:2;3511:9;3502:7;3498:23;3494:32;3491:2;;;3544:6;3536;3529:22;3491:2;3588:9;3575:23;3607:31;3632:5;3607:31;:::i;:::-;3657:5;-1:-1:-1;3714:2:1;3699:18;;3686:32;3727:30;3686:32;3727:30;:::i;3794:325::-;3862:6;3870;3923:2;3911:9;3902:7;3898:23;3894:32;3891:2;;;3944:6;3936;3929:22;4124:665;4210:6;4218;4271:2;4259:9;4250:7;4246:23;4242:32;4239:2;;;4292:6;4284;4277:22;4239:2;4337:9;4324:23;4366:18;4407:2;4399:6;4396:14;4393:2;;;4428:6;4420;4413:22;4393:2;4471:6;4460:9;4456:22;4446:32;;4516:7;4509:4;4505:2;4501:13;4497:27;4487:2;;4543:6;4535;4528:22;4487:2;4588;4575:16;4614:2;4606:6;4603:14;4600:2;;;4635:6;4627;4620:22;4600:2;4693:7;4688:2;4678:6;4675:1;4671:14;4667:2;4663:23;4659:32;4656:45;4653:2;;;4719:6;4711;4704:22;4653:2;4755;4747:11;;;;;4777:6;;-1:-1:-1;4229:560:1;;-1:-1:-1;;;;4229:560:1:o;4794:255::-;4861:6;4914:2;4902:9;4893:7;4889:23;4885:32;4882:2;;;4935:6;4927;4920:22;4882:2;4972:9;4966:16;4991:28;5013:5;4991:28;:::i;5054:255::-;5112:6;5165:2;5153:9;5144:7;5140:23;5136:32;5133:2;;;5186:6;5178;5171:22;5133:2;5230:9;5217:23;5249:30;5273:5;5249:30;:::i;5314:259::-;5383:6;5436:2;5424:9;5415:7;5411:23;5407:32;5404:2;;;5457:6;5449;5442:22;5404:2;5494:9;5488:16;5513:30;5537:5;5513:30;:::i;7111:342::-;7180:6;7233:2;7221:9;7212:7;7208:23;7204:32;7201:2;;;7254:6;7246;7239:22;7201:2;7299:9;7286:23;7332:18;7324:6;7321:30;7318:2;;;7369:6;7361;7354:22;7318:2;7397:50;7439:7;7430:6;7419:9;7415:22;7397:50;:::i;7458:1480::-;7674:6;7682;7690;7698;7706;7714;7722;7730;7738;7746;7799:3;7787:9;7778:7;7774:23;7770:33;7767:2;;;7821:6;7813;7806:22;7767:2;7866:9;7853:23;7895:18;7936:2;7928:6;7925:14;7922:2;;;7957:6;7949;7942:22;7922:2;7985:50;8027:7;8018:6;8007:9;8003:22;7985:50;:::i;:::-;7975:60;;8088:2;8077:9;8073:18;8060:32;8044:48;;8117:2;8107:8;8104:16;8101:2;;;8138:6;8130;8123:22;8101:2;8166:52;8210:7;8199:8;8188:9;8184:24;8166:52;:::i;:::-;8156:62;;8265:2;8254:9;8250:18;8237:32;8227:42;;8316:2;8305:9;8301:18;8288:32;8278:42;;8367:3;8356:9;8352:19;8339:33;8329:43;;8419:3;8408:9;8404:19;8391:33;8381:43;;8477:3;8466:9;8462:19;8449:33;8433:49;;8507:2;8497:8;8494:16;8491:2;;;8528:6;8520;8513:22;8491:2;8556:52;8600:7;8589:8;8578:9;8574:24;8556:52;:::i;:::-;8546:62;;8627:51;8673:3;8662:9;8658:19;8627:51;:::i;:::-;8617:61;;8697:51;8743:3;8732:9;8728:19;8697:51;:::i;:::-;8687:61;;8801:3;8790:9;8786:19;8773:33;8757:49;;8831:2;8821:8;8818:16;8815:2;;;8852:6;8844;8837:22;8815:2;;8880:52;8924:7;8913:8;8902:9;8898:24;8880:52;:::i;:::-;8870:62;;;7757:1181;;;;;;;;;;;;;:::o;8943:190::-;9002:6;9055:2;9043:9;9034:7;9030:23;9026:32;9023:2;;;9076:6;9068;9061:22;9023:2;-1:-1:-1;9104:23:1;;9013:120;-1:-1:-1;9013:120:1:o;9138:410::-;9216:6;9224;9277:2;9265:9;9256:7;9252:23;9248:32;9245:2;;;9298:6;9290;9283:22;9245:2;9339:9;9326:23;9316:33;;9400:2;9389:9;9385:18;9372:32;9427:18;9419:6;9416:30;9413:2;;;9464:6;9456;9449:22;9413:2;9492:50;9534:7;9525:6;9514:9;9510:22;9492:50;:::i;:::-;9482:60;;;9235:313;;;;;:::o;9553:258::-;9621:6;9629;9682:2;9670:9;9661:7;9657:23;9653:32;9650:2;;;9703:6;9695;9688:22;9650:2;-1:-1:-1;;9731:23:1;;;9801:2;9786:18;;;9773:32;;-1:-1:-1;9640:171:1:o;9816:316::-;9857:3;9895:5;9889:12;9922:6;9917:3;9910:19;9938:63;9994:6;9987:4;9982:3;9978:14;9971:4;9964:5;9960:16;9938:63;:::i;:::-;10046:2;10034:15;10051:66;10030:88;10021:98;;;;10121:4;10017:109;;9865:267;-1:-1:-1;;9865:267:1:o;10137:276::-;10268:3;10306:6;10300:13;10322:53;10368:6;10363:3;10356:4;10348:6;10344:17;10322:53;:::i;:::-;10391:16;;;;;10276:137;-1:-1:-1;;10276:137:1:o;10418:637::-;10698:3;10736:6;10730:13;10752:53;10798:6;10793:3;10786:4;10778:6;10774:17;10752:53;:::i;:::-;10868:13;;10827:16;;;;10890:57;10868:13;10827:16;10924:4;10912:17;;10890:57;:::i;:::-;11012:7;10969:20;;10998:22;;;11047:1;11036:13;;10706:349;-1:-1:-1;;;;10706:349:1:o;11694:511::-;11888:4;-1:-1:-1;;;;;11998:2:1;11990:6;11986:15;11975:9;11968:34;12050:2;12042:6;12038:15;12033:2;12022:9;12018:18;12011:43;;12090:6;12085:2;12074:9;12070:18;12063:34;12133:3;12128:2;12117:9;12113:18;12106:31;12154:45;12194:3;12183:9;12179:19;12171:6;12154:45;:::i;:::-;12146:53;11897:308;-1:-1:-1;;;;;;11897:308:1:o;13868:219::-;14017:2;14006:9;13999:21;13980:4;14037:44;14077:2;14066:9;14062:18;14054:6;14037:44;:::i;14092:791::-;14399:3;14388:9;14381:22;14362:4;14426:45;14466:3;14455:9;14451:19;14443:6;14426:45;:::i;:::-;14519:9;14511:6;14507:22;14502:2;14491:9;14487:18;14480:50;14547:32;14572:6;14564;14547:32;:::i;:::-;14622:14;;14615:22;14610:2;14595:18;;14588:50;-1:-1:-1;;14681:14:1;;14674:22;14669:2;14654:18;;14647:50;14741:14;;14734:22;14728:3;14713:19;;14706:51;14801:14;14794:22;14788:3;14773:19;;14766:51;14861:14;14854:22;14848:3;14833:19;;;14826:51;14539:40;14371:512;-1:-1:-1;;14371:512:1:o;27147:128::-;27187:3;27218:1;27214:6;27211:1;27208:13;27205:2;;;27224:18;;:::i;:::-;-1:-1:-1;27260:9:1;;27195:80::o;27280:204::-;27318:3;27354:4;27351:1;27347:12;27386:4;27383:1;27379:12;27421:3;27415:4;27411:14;27406:3;27403:23;27400:2;;;27429:18;;:::i;:::-;27465:13;;27326:158;-1:-1:-1;;;27326:158:1:o;27489:274::-;27529:1;27555;27545:2;;-1:-1:-1;;;27587:1:1;27580:88;27691:4;27688:1;27681:15;27719:4;27716:1;27709:15;27545:2;-1:-1:-1;27748:9:1;;27535:228::o;27768:::-;27808:7;27934:1;27866:66;27862:74;27859:1;27856:81;27851:1;27844:9;27837:17;27833:105;27830:2;;;27941:18;;:::i;:::-;-1:-1:-1;27981:9:1;;27820:176::o;28001:125::-;28041:4;28069:1;28066;28063:8;28060:2;;;28074:18;;:::i;:::-;-1:-1:-1;28111:9:1;;28050:76::o;28131:258::-;28203:1;28213:113;28227:6;28224:1;28221:13;28213:113;;;28303:11;;;28297:18;28284:11;;;28277:39;28249:2;28242:10;28213:113;;;28344:6;28341:1;28338:13;28335:2;;;-1:-1:-1;;28379:1:1;28361:16;;28354:27;28184:205::o;28394:437::-;28473:1;28469:12;;;;28516;;;28537:2;;28591:4;28583:6;28579:17;28569:27;;28537:2;28644;28636:6;28633:14;28613:18;28610:38;28607:2;;;-1:-1:-1;;;28678:1:1;28671:88;28782:4;28779:1;28772:15;28810:4;28807:1;28800:15;28607:2;;28449:382;;;:::o;28836:195::-;28875:3;28906:66;28899:5;28896:77;28893:2;;;28976:18;;:::i;:::-;-1:-1:-1;29023:1:1;29012:13;;28883:148::o;29036:184::-;-1:-1:-1;;;29085:1:1;29078:88;29185:4;29182:1;29175:15;29209:4;29206:1;29199:15;29225:184;-1:-1:-1;;;29274:1:1;29267:88;29374:4;29371:1;29364:15;29398:4;29395:1;29388:15;29414:154;-1:-1:-1;;;;;29493:5:1;29489:54;29482:5;29479:65;29469:2;;29558:1;29555;29548:12;29573:118;29659:5;29652:13;29645:21;29638:5;29635:32;29625:2;;29681:1;29678;29671:12;29696:177;29781:66;29774:5;29770:78;29763:5;29760:89;29750:2;;29863:1;29860;29853:12
Swarm Source
ipfs://fdd41809d529922554563b66098db8b6950b26a66ed79e5857748143c861cb91
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.