Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PadEvolved
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-15 */ // SPDX-License-Identifier: MIT /** * @author - Roi Di Segni (@sheeeev66 of @thecoredevs) */ pragma solidity ^0.8.7; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/OperatorFilterer.sol /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); function __initialize_OperatorFilterer(address subscriptionOrRegistrantToCopy, bool subscribe) internal { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: contracts/DefaultOperatorFilterer.sol /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); function __initialize_DefaultOperatorFilterer() internal {__initialize_OperatorFilterer(DEFAULT_SUBSCRIPTION, true);} } // File: contracts/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. * * Source: openzeppelin */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @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() == msg.sender, "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() external 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) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Strings.sol /** * Source: Openzeppelin */ /** * @dev String operations. */ library Strings { /** * @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); } } // File: ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: Address.sol0 /** * Source: Openzeppelin */ /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } } // File: IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: IERC165.sol // https://eips.ethereum.org/EIPS/eip-165 interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); } // File: IERC2981.sol /** * Source: Openzeppelin */ /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: ERC165.sol /** * Source: Openzeppelin */ /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: IERC721.sol // https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } // File: IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension * Made for efficiancy! */ contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable, DefaultOperatorFilterer { using Address for address; using Strings for uint256; bool public initialized; uint16 public totalSupply; string public baseURI; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _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 See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) external view 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 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() external pure override returns (string memory) { return "PAD Evolved"; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() external pure override returns (string memory) { return "PADEVO"; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) external view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } function setBaseURI(string memory uri) external onlyOwner { baseURI = uri; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) external override onlyAllowedOperatorApproval(to) { address owner = _owners[tokenId]; require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view 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) external override onlyAllowedOperatorApproval(operator) { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external override onlyAllowedOperator(from) { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, 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 ) external override { // modifier already executed by the called contract safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override onlyAllowedOperator(from) { require(_isApprovedOrOwner(msg.sender, 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 */ 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 = _owners[tokenId]; return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _mintID(address to, uint tokenId) internal { _owners[tokenId] = to; unchecked { ++_balances[to]; } emit Transfer(address(0), to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @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(_owners[tokenId] == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); unchecked { --_balances[from]; ++_balances[to]; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } } interface IShroomies { function burnShroomies(uint[] memory ids, address addr) external; function burnShroomie(uint id, address addr) external; } interface IPAD { function ownerOf(uint tokenId) external view returns(address); } // File: PadEvolved.sol contract PadEvolved is Ownable, IERC2981, ERC721 { bool public evolvingEnabled; uint private EIP2981RoyaltyPercent; IPAD PAD; IShroomies SHROOMIES; function initialize( address shroomies, address pad, uint _royalty, string memory _baseURI ) external { require(!initialized, "contract already initialized"); _setOwner(msg.sender); __initialize_DefaultOperatorFilterer(); SHROOMIES = IShroomies(shroomies); PAD = IPAD(pad); EIP2981RoyaltyPercent = _royalty; baseURI = _baseURI; initialized = true; } function evolve(uint id, uint shroomie) external { require(evolvingEnabled, "Evolving is not enabled!"); require(PAD.ownerOf(id) == msg.sender, "caller not PAD owner!"); require(_owners[id] == address(0), "allready evolved!"); SHROOMIES.burnShroomie(shroomie, msg.sender); _mintID(msg.sender, id); } function evolveBatch(uint[] memory ids, uint[] memory shroomies) external { require(evolvingEnabled, "Evolving is not enabled!"); uint amount = ids.length; require(amount == shroomies.length, "array length missmatch!"); SHROOMIES.burnShroomies(shroomies, msg.sender); _batchMintID(msg.sender, ids, amount); } function _batchMintID(address to, uint[] memory ids, uint amount) internal { uint cId; unchecked { _balances[to] += amount; } for (uint i; i < amount;) { assembly { cId := mload(add(add(ids, 0x20), mul(i, 0x20))) } require(_owners[cId] == address(0), "PAD id already evolved"); _owners[cId] = to; emit Transfer(address(0), to, cId); unchecked { ++i; } require(PAD.ownerOf(cId) == to, "PAD owner id missmatch!"); require( _checkOnERC721Received(address(0), to, cId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); } } /** * @notice returns royalty info for EIP2981 supporting marketplaces * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Royality querry for non-existant token!"); return(owner(), salePrice * EIP2981RoyaltyPercent / 10000); } /** * @notice sets the royalty percentage for EIP2981 supporting marketplaces * @dev percentage is in bassis points (parts per 10,000). Example: 5% = 500, 0.5% = 50 * @param amount - percent amount */ function setRoyaltyPercent(uint256 amount) external onlyOwner { EIP2981RoyaltyPercent = amount; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function withdraw() onlyOwner external { uint bal = address(this).balance; bool success; (success, ) = payable(msg.sender).call{value: bal, gas: 3000}(""); require(success, "Transfer to contract owner failed!"); } /** * @notice toggles minting */ function toggleMinting() external onlyOwner { evolvingEnabled = !evolvingEnabled; } function tokensOfOwner(address owner) external view returns(uint[] memory) { uint[] memory tokens = new uint[](_balances[owner]); uint y = totalSupply + 1; uint x; for (uint i = 1; i < y;) { if (ownerOf(i) == owner) { tokens[x] = i; unchecked{ ++x; } } unchecked{ ++i; } } return tokens; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"shroomie","type":"uint256"}],"name":"evolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"shroomies","type":"uint256[]"}],"name":"evolveBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evolvingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shroomies","type":"address"},{"internalType":"address","name":"pad","type":"address"},{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","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":"pure","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613299806100206000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636c0360eb116101045780639a4fc640116100a2578063b88d4fde11610071578063b88d4fde14610492578063c87b56dd146104a5578063e985e9c5146104b8578063f2fde38b146104f457600080fd5b80639a4fc640146104465780639fec600b14610459578063a22cb4651461046c578063b84662d91461047f57600080fd5b80637d55094d116100de5780637d55094d146103d45780638462151c146103dc5780638da5cb5b146103fc57806395d89b411461040d57600080fd5b80636c0360eb146103a357806370a08231146103ab578063715018a6146103cc57600080fd5b80632a55205a1161017c57806345f14e421161014b57806345f14e421461035d57806350ccda0c1461036a57806355f804b31461037d5780636352211e1461039057600080fd5b80632a55205a146102fb5780633ccfd60b1461032d57806341f434341461033557806342842e0e1461034a57600080fd5b8063095ea7b3116101b8578063095ea7b314610274578063158ef93e1461028957806318160ddd146102ae57806323b872dd146102e857600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc14610249575b600080fd5b6101f26101ed366004612cb2565b610507565b60405190151581526020015b60405180910390f35b60408051808201909152600b81527f5041442045766f6c76656400000000000000000000000000000000000000000060208201525b6040516101fe9190612f81565b61025c610257366004612d21565b610563565b6040516001600160a01b0390911681526020016101fe565b610287610282366004612c05565b61060e565b005b6000546101f29074010000000000000000000000000000000000000000900460ff1681565b6000546102d5907501000000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101fe565b6102876102f6366004612ab6565b610857565b61030e610309366004612d3a565b610a64565b604080516001600160a01b0390931683526020830191909152016101fe565b610287610b22565b61025c6daaeb6d7670e522a718067333cd4e81565b610287610358366004612ab6565b610c56565b6006546101f29060ff1681565b610287610378366004612d3a565b610c76565b61028761038b366004612cec565b610e9f565b61025c61039e366004612d21565b610f1b565b61023c610fa6565b6103be6103b9366004612a43565b611034565b6040519081526020016101fe565b6102876110ce565b610287611143565b6103ef6103ea366004612a43565b6111de565b6040516101fe9190612f43565b6000546001600160a01b031661025c565b60408051808201909152600681527f50414445564f0000000000000000000000000000000000000000000000000000602082015261023c565b610287610454366004612d21565b6112da565b610287610467366004612b77565b611348565b61028761047a366004612bd7565b61146a565b61028761048d366004612c31565b611570565b6102876104a0366004612af7565b61169c565b61023c6104b3366004612d21565b6118b2565b6101f26104c6366004612a7d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610287610502366004612a43565b611971565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061055d575061055d82611a62565b92915050565b6000818152600260205260408120546001600160a01b03166105f25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610709576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561069057600080fd5b505afa1580156106a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c89190612c95565b610709576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105e9565b6000828152600260205260409020546001600160a01b0390811690841681141561079b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105e9565b336001600160a01b03821614806107d557506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108475760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105e9565b6108518484611b45565b50505050565b826daaeb6d7670e522a718067333cd4e3b156109dd576001600160a01b03811633141561090a576108883383611bcb565b6108fa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b610905848484611cd0565b610851565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561096d57600080fd5b505afa158015610981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a59190612c95565b6109dd576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016105e9565b6109e73383611bcb565b610a595760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b610851848484611cd0565b60008281526002602052604081205481906001600160a01b0316610af05760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016105e9565b6000546001600160a01b031661271060075485610b0d9190613035565b610b179190613021565b915091509250929050565b33610b356000546001600160a01b031690565b6001600160a01b031614610b8b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b60405147906000903390610bb890849084818181858888f193505050503d8060008114610bd4576040519150601f19603f3d011682016040523d82523d6000602084013e610bd9565b606091505b50508091505080610c525760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f642100000000000000000000000000000000000000000000000000000000000060648201526084016105e9565b5050565b610c718383836040518060200160405280600081525061169c565b505050565b60065460ff16610cc85760405162461bcd60e51b815260206004820152601860248201527f45766f6c76696e67206973206e6f7420656e61626c656421000000000000000060448201526064016105e9565b6008546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610d2557600080fd5b505afa158015610d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5d9190612a60565b6001600160a01b031614610db35760405162461bcd60e51b815260206004820152601560248201527f63616c6c6572206e6f7420504144206f776e657221000000000000000000000060448201526064016105e9565b6000828152600260205260409020546001600160a01b031615610e185760405162461bcd60e51b815260206004820152601160248201527f616c6c72656164792065766f6c7665642100000000000000000000000000000060448201526064016105e9565b6009546040517f2b8a5e0e000000000000000000000000000000000000000000000000000000008152600481018390523360248201526001600160a01b0390911690632b8a5e0e90604401600060405180830381600087803b158015610e7d57600080fd5b505af1158015610e91573d6000803e3d6000fd5b50505050610c523383611e98565b33610eb26000546001600160a01b031690565b6001600160a01b031614610f085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b8051610c52906001906020840190612887565b6000818152600260205260408120546001600160a01b03168061055d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016105e9565b60018054610fb3906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdf906130b5565b801561102c5780601f106110015761010080835404028352916020019161102c565b820191906000526020600020905b81548152906001019060200180831161100f57829003601f168201915b505050505081565b60006001600160a01b0382166110b25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016105e9565b506001600160a01b031660009081526003602052604090205490565b336110e16000546001600160a01b031690565b6001600160a01b0316146111375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b6111416000611fa6565b565b336111566000546001600160a01b031690565b6001600160a01b0316146111ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b0381166000908152600360205260408120546060919067ffffffffffffffff811115611213576112136131e3565b60405190808252806020026020018201604052801561123c578160200160208202803683370190505b50600080549192509061126d907501000000000000000000000000000000000000000000900461ffff166001612fe3565b61ffff169050600060015b828110156112d057856001600160a01b031661129382610f1b565b6001600160a01b031614156112c857808483815181106112b5576112b56131b4565b6020026020010181815250508160010191505b600101611278565b5091949350505050565b336112ed6000546001600160a01b031690565b6001600160a01b0316146113435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b600755565b60005474010000000000000000000000000000000000000000900460ff16156113b35760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a65640000000060448201526064016105e9565b6113bc33611fa6565b6113c461200e565b600980546001600160a01b038087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600880549286169290911691909117905560078290558051611424906001906020840190612887565b5050600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050565b816daaeb6d7670e522a718067333cd4e3b15611565576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156114ec57600080fd5b505afa158015611500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115249190612c95565b611565576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105e9565b610c7133848461202d565b60065460ff166115c25760405162461bcd60e51b815260206004820152601860248201527f45766f6c76696e67206973206e6f7420656e61626c656421000000000000000060448201526064016105e9565b8151815181146116145760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d6973736d617463682100000000000000000060448201526064016105e9565b6009546040517fbce187970000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bce187979061165f9085903390600401612f56565b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b50505050610c7133848361211a565b836daaeb6d7670e522a718067333cd4e3b15611823576001600160a01b038116331415611750576116cd3384611bcb565b61173f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b61174b858585856123a9565b6118ab565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156117b357600080fd5b505afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612c95565b611823576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016105e9565b61182d3384611bcb565b61189f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b6118ab858585856123a9565b5050505050565b6000818152600260205260409020546060906001600160a01b031661193f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016105e9565b600161194a83612432565b60405160200161195b929190612dfd565b6040516020818303038152906040529050919050565b336119846000546001600160a01b031690565b6001600160a01b0316146119da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b6001600160a01b038116611a565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105e9565b611a5f81611fa6565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611af557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061055d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461055d565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611b9282610f1b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c555760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016105e9565b6000828152600260205260409020546001600160a01b03908116908416811480611c985750836001600160a01b0316611c8d84610563565b6001600160a01b0316145b80611cc857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6000818152600260205260409020546001600160a01b03848116911614611d5f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016105e9565b6001600160a01b038216611dda5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105e9565b611de5600082611b45565b6001600160a01b03808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600290915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260026020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038716908117909155808452600390925280832080546001019055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f346000838360405180602001604052806000815250612564565b610c525760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611141733cc6cdda760b79bafa08df41ecfa224f810dceb6600161272f565b816001600160a01b0316836001600160a01b0316141561208f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105e9565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383166000908152600360205260408120805483019055805b828110156118ab5760208181028501810151600081815260029092526040909120549092506001600160a01b0316156121b55760405162461bcd60e51b815260206004820152601660248201527f50414420696420616c72656164792065766f6c7665640000000000000000000060448201526064016105e9565b60008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891690811790915590518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46008546040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101849052600192909201916001600160a01b03878116921690636352211e9060240160206040518083038186803b15801561228857600080fd5b505afa15801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c09190612a60565b6001600160a01b0316146123165760405162461bcd60e51b815260206004820152601760248201527f504144206f776e6572206964206d6973736d617463682100000000000000000060448201526064016105e9565b6123326000868460405180602001604052806000815250612564565b6123a45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b61213a565b6123b4848484611cd0565b6123c084848484612564565b6108515760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b60608161247257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561249c578061248681613109565b91506124959050600a83613021565b9150612476565b60008167ffffffffffffffff8111156124b7576124b76131e3565b6040519080825280601f01601f1916602001820160405280156124e1576020820181803683370190505b5090505b8415611cc8576124f6600183613072565b9150612503600a86613142565b61250e906030613009565b60f81b818381518110612523576125236131b4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061255d600a86613021565b94506124e5565b60006001600160a01b0384163b15612724576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906125c1903390899088908890600401612f07565b602060405180830381600087803b1580156125db57600080fd5b505af1925050508015612629575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261262691810190612ccf565b60015b6126d9573d808015612657576040519150601f19603f3d011682016040523d82523d6000602084013e61265c565b606091505b5080516126d15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611cc8565b506001949350505050565b6daaeb6d7670e522a718067333cd4e3b15610c525780156127d5576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156127b957600080fd5b505af11580156127cd573d6000803e3d6000fd5b505050505050565b6001600160a01b0382161561283d576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440161279f565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e4869060240161279f565b828054612893906130b5565b90600052602060002090601f0160209004810192826128b557600085556128fb565b82601f106128ce57805160ff19168380011785556128fb565b828001600101855582156128fb579182015b828111156128fb5782518255916020019190600101906128e0565b5061290792915061290b565b5090565b5b80821115612907576000815560010161290c565b600067ffffffffffffffff83111561293a5761293a6131e3565b61296b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601612f94565b905082815283838301111561297f57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126129a757600080fd5b8135602067ffffffffffffffff8211156129c3576129c36131e3565b8160051b6129d2828201612f94565b8381528281019086840183880185018910156129ed57600080fd5b600093505b85841015612a105780358352600193909301929184019184016129f2565b50979650505050505050565b600082601f830112612a2d57600080fd5b612a3c83833560208501612920565b9392505050565b600060208284031215612a5557600080fd5b8135612a3c81613212565b600060208284031215612a7257600080fd5b8151612a3c81613212565b60008060408385031215612a9057600080fd5b8235612a9b81613212565b91506020830135612aab81613212565b809150509250929050565b600080600060608486031215612acb57600080fd5b8335612ad681613212565b92506020840135612ae681613212565b929592945050506040919091013590565b60008060008060808587031215612b0d57600080fd5b8435612b1881613212565b93506020850135612b2881613212565b925060408501359150606085013567ffffffffffffffff811115612b4b57600080fd5b8501601f81018713612b5c57600080fd5b612b6b87823560208401612920565b91505092959194509250565b60008060008060808587031215612b8d57600080fd5b8435612b9881613212565b93506020850135612ba881613212565b925060408501359150606085013567ffffffffffffffff811115612bcb57600080fd5b612b6b87828801612a1c565b60008060408385031215612bea57600080fd5b8235612bf581613212565b91506020830135612aab81613227565b60008060408385031215612c1857600080fd5b8235612c2381613212565b946020939093013593505050565b60008060408385031215612c4457600080fd5b823567ffffffffffffffff80821115612c5c57600080fd5b612c6886838701612996565b93506020850135915080821115612c7e57600080fd5b50612c8b85828601612996565b9150509250929050565b600060208284031215612ca757600080fd5b8151612a3c81613227565b600060208284031215612cc457600080fd5b8135612a3c81613235565b600060208284031215612ce157600080fd5b8151612a3c81613235565b600060208284031215612cfe57600080fd5b813567ffffffffffffffff811115612d1557600080fd5b611cc884828501612a1c565b600060208284031215612d3357600080fd5b5035919050565b60008060408385031215612d4d57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015612d8c57815187529582019590820190600101612d70565b509495945050505050565b60008151808452612daf816020860160208601613089565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612df3818560208601613089565b9290920192915050565b600080845481600182811c915080831680612e1957607f831692505b6020808410821415612e52577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612e665760018114612e9557612ec2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612ec2565b60008b81526020902060005b86811015612eba5781548b820152908501908301612ea1565b505084890196505b505050505050612efe612ed58286612de1565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612f396080830184612d97565b9695505050505050565b602081526000612a3c6020830184612d5c565b604081526000612f696040830185612d5c565b90506001600160a01b03831660208301529392505050565b602081526000612a3c6020830184612d97565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fdb57612fdb6131e3565b604052919050565b600061ffff80831681851680830382111561300057613000613156565b01949350505050565b6000821982111561301c5761301c613156565b500190565b60008261303057613030613185565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561306d5761306d613156565b500290565b60008282101561308457613084613156565b500390565b60005b838110156130a457818101518382015260200161308c565b838111156108515750506000910152565b600181811c908216806130c957607f821691505b60208210811415613103577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561313b5761313b613156565b5060010190565b60008261315157613151613185565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114611a5f57600080fd5b8015158114611a5f57600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611a5f57600080fdfea2646970667358221220369d6973f83dc0bfa9ae094368e22617d4684290e342e14323195104a56c1fca64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636c0360eb116101045780639a4fc640116100a2578063b88d4fde11610071578063b88d4fde14610492578063c87b56dd146104a5578063e985e9c5146104b8578063f2fde38b146104f457600080fd5b80639a4fc640146104465780639fec600b14610459578063a22cb4651461046c578063b84662d91461047f57600080fd5b80637d55094d116100de5780637d55094d146103d45780638462151c146103dc5780638da5cb5b146103fc57806395d89b411461040d57600080fd5b80636c0360eb146103a357806370a08231146103ab578063715018a6146103cc57600080fd5b80632a55205a1161017c57806345f14e421161014b57806345f14e421461035d57806350ccda0c1461036a57806355f804b31461037d5780636352211e1461039057600080fd5b80632a55205a146102fb5780633ccfd60b1461032d57806341f434341461033557806342842e0e1461034a57600080fd5b8063095ea7b3116101b8578063095ea7b314610274578063158ef93e1461028957806318160ddd146102ae57806323b872dd146102e857600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc14610249575b600080fd5b6101f26101ed366004612cb2565b610507565b60405190151581526020015b60405180910390f35b60408051808201909152600b81527f5041442045766f6c76656400000000000000000000000000000000000000000060208201525b6040516101fe9190612f81565b61025c610257366004612d21565b610563565b6040516001600160a01b0390911681526020016101fe565b610287610282366004612c05565b61060e565b005b6000546101f29074010000000000000000000000000000000000000000900460ff1681565b6000546102d5907501000000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101fe565b6102876102f6366004612ab6565b610857565b61030e610309366004612d3a565b610a64565b604080516001600160a01b0390931683526020830191909152016101fe565b610287610b22565b61025c6daaeb6d7670e522a718067333cd4e81565b610287610358366004612ab6565b610c56565b6006546101f29060ff1681565b610287610378366004612d3a565b610c76565b61028761038b366004612cec565b610e9f565b61025c61039e366004612d21565b610f1b565b61023c610fa6565b6103be6103b9366004612a43565b611034565b6040519081526020016101fe565b6102876110ce565b610287611143565b6103ef6103ea366004612a43565b6111de565b6040516101fe9190612f43565b6000546001600160a01b031661025c565b60408051808201909152600681527f50414445564f0000000000000000000000000000000000000000000000000000602082015261023c565b610287610454366004612d21565b6112da565b610287610467366004612b77565b611348565b61028761047a366004612bd7565b61146a565b61028761048d366004612c31565b611570565b6102876104a0366004612af7565b61169c565b61023c6104b3366004612d21565b6118b2565b6101f26104c6366004612a7d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610287610502366004612a43565b611971565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061055d575061055d82611a62565b92915050565b6000818152600260205260408120546001600160a01b03166105f25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610709576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561069057600080fd5b505afa1580156106a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c89190612c95565b610709576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105e9565b6000828152600260205260409020546001600160a01b0390811690841681141561079b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105e9565b336001600160a01b03821614806107d557506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108475760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105e9565b6108518484611b45565b50505050565b826daaeb6d7670e522a718067333cd4e3b156109dd576001600160a01b03811633141561090a576108883383611bcb565b6108fa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b610905848484611cd0565b610851565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561096d57600080fd5b505afa158015610981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a59190612c95565b6109dd576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016105e9565b6109e73383611bcb565b610a595760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b610851848484611cd0565b60008281526002602052604081205481906001600160a01b0316610af05760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016105e9565b6000546001600160a01b031661271060075485610b0d9190613035565b610b179190613021565b915091509250929050565b33610b356000546001600160a01b031690565b6001600160a01b031614610b8b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b60405147906000903390610bb890849084818181858888f193505050503d8060008114610bd4576040519150601f19603f3d011682016040523d82523d6000602084013e610bd9565b606091505b50508091505080610c525760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f642100000000000000000000000000000000000000000000000000000000000060648201526084016105e9565b5050565b610c718383836040518060200160405280600081525061169c565b505050565b60065460ff16610cc85760405162461bcd60e51b815260206004820152601860248201527f45766f6c76696e67206973206e6f7420656e61626c656421000000000000000060448201526064016105e9565b6008546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610d2557600080fd5b505afa158015610d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5d9190612a60565b6001600160a01b031614610db35760405162461bcd60e51b815260206004820152601560248201527f63616c6c6572206e6f7420504144206f776e657221000000000000000000000060448201526064016105e9565b6000828152600260205260409020546001600160a01b031615610e185760405162461bcd60e51b815260206004820152601160248201527f616c6c72656164792065766f6c7665642100000000000000000000000000000060448201526064016105e9565b6009546040517f2b8a5e0e000000000000000000000000000000000000000000000000000000008152600481018390523360248201526001600160a01b0390911690632b8a5e0e90604401600060405180830381600087803b158015610e7d57600080fd5b505af1158015610e91573d6000803e3d6000fd5b50505050610c523383611e98565b33610eb26000546001600160a01b031690565b6001600160a01b031614610f085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b8051610c52906001906020840190612887565b6000818152600260205260408120546001600160a01b03168061055d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016105e9565b60018054610fb3906130b5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdf906130b5565b801561102c5780601f106110015761010080835404028352916020019161102c565b820191906000526020600020905b81548152906001019060200180831161100f57829003601f168201915b505050505081565b60006001600160a01b0382166110b25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016105e9565b506001600160a01b031660009081526003602052604090205490565b336110e16000546001600160a01b031690565b6001600160a01b0316146111375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b6111416000611fa6565b565b336111566000546001600160a01b031690565b6001600160a01b0316146111ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b0381166000908152600360205260408120546060919067ffffffffffffffff811115611213576112136131e3565b60405190808252806020026020018201604052801561123c578160200160208202803683370190505b50600080549192509061126d907501000000000000000000000000000000000000000000900461ffff166001612fe3565b61ffff169050600060015b828110156112d057856001600160a01b031661129382610f1b565b6001600160a01b031614156112c857808483815181106112b5576112b56131b4565b6020026020010181815250508160010191505b600101611278565b5091949350505050565b336112ed6000546001600160a01b031690565b6001600160a01b0316146113435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b600755565b60005474010000000000000000000000000000000000000000900460ff16156113b35760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a65640000000060448201526064016105e9565b6113bc33611fa6565b6113c461200e565b600980546001600160a01b038087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600880549286169290911691909117905560078290558051611424906001906020840190612887565b5050600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050565b816daaeb6d7670e522a718067333cd4e3b15611565576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156114ec57600080fd5b505afa158015611500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115249190612c95565b611565576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105e9565b610c7133848461202d565b60065460ff166115c25760405162461bcd60e51b815260206004820152601860248201527f45766f6c76696e67206973206e6f7420656e61626c656421000000000000000060448201526064016105e9565b8151815181146116145760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d6973736d617463682100000000000000000060448201526064016105e9565b6009546040517fbce187970000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bce187979061165f9085903390600401612f56565b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b50505050610c7133848361211a565b836daaeb6d7670e522a718067333cd4e3b15611823576001600160a01b038116331415611750576116cd3384611bcb565b61173f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b61174b858585856123a9565b6118ab565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156117b357600080fd5b505afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612c95565b611823576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016105e9565b61182d3384611bcb565b61189f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105e9565b6118ab858585856123a9565b5050505050565b6000818152600260205260409020546060906001600160a01b031661193f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016105e9565b600161194a83612432565b60405160200161195b929190612dfd565b6040516020818303038152906040529050919050565b336119846000546001600160a01b031690565b6001600160a01b0316146119da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105e9565b6001600160a01b038116611a565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105e9565b611a5f81611fa6565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611af557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061055d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461055d565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611b9282610f1b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c555760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016105e9565b6000828152600260205260409020546001600160a01b03908116908416811480611c985750836001600160a01b0316611c8d84610563565b6001600160a01b0316145b80611cc857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6000818152600260205260409020546001600160a01b03848116911614611d5f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016105e9565b6001600160a01b038216611dda5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105e9565b611de5600082611b45565b6001600160a01b03808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600290915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260026020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038716908117909155808452600390925280832080546001019055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f346000838360405180602001604052806000815250612564565b610c525760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611141733cc6cdda760b79bafa08df41ecfa224f810dceb6600161272f565b816001600160a01b0316836001600160a01b0316141561208f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105e9565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383166000908152600360205260408120805483019055805b828110156118ab5760208181028501810151600081815260029092526040909120549092506001600160a01b0316156121b55760405162461bcd60e51b815260206004820152601660248201527f50414420696420616c72656164792065766f6c7665640000000000000000000060448201526064016105e9565b60008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891690811790915590518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46008546040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101849052600192909201916001600160a01b03878116921690636352211e9060240160206040518083038186803b15801561228857600080fd5b505afa15801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c09190612a60565b6001600160a01b0316146123165760405162461bcd60e51b815260206004820152601760248201527f504144206f776e6572206964206d6973736d617463682100000000000000000060448201526064016105e9565b6123326000868460405180602001604052806000815250612564565b6123a45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b61213a565b6123b4848484611cd0565b6123c084848484612564565b6108515760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b60608161247257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561249c578061248681613109565b91506124959050600a83613021565b9150612476565b60008167ffffffffffffffff8111156124b7576124b76131e3565b6040519080825280601f01601f1916602001820160405280156124e1576020820181803683370190505b5090505b8415611cc8576124f6600183613072565b9150612503600a86613142565b61250e906030613009565b60f81b818381518110612523576125236131b4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061255d600a86613021565b94506124e5565b60006001600160a01b0384163b15612724576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906125c1903390899088908890600401612f07565b602060405180830381600087803b1580156125db57600080fd5b505af1925050508015612629575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261262691810190612ccf565b60015b6126d9573d808015612657576040519150601f19603f3d011682016040523d82523d6000602084013e61265c565b606091505b5080516126d15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105e9565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611cc8565b506001949350505050565b6daaeb6d7670e522a718067333cd4e3b15610c525780156127d5576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156127b957600080fd5b505af11580156127cd573d6000803e3d6000fd5b505050505050565b6001600160a01b0382161561283d576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440161279f565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e4869060240161279f565b828054612893906130b5565b90600052602060002090601f0160209004810192826128b557600085556128fb565b82601f106128ce57805160ff19168380011785556128fb565b828001600101855582156128fb579182015b828111156128fb5782518255916020019190600101906128e0565b5061290792915061290b565b5090565b5b80821115612907576000815560010161290c565b600067ffffffffffffffff83111561293a5761293a6131e3565b61296b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601612f94565b905082815283838301111561297f57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126129a757600080fd5b8135602067ffffffffffffffff8211156129c3576129c36131e3565b8160051b6129d2828201612f94565b8381528281019086840183880185018910156129ed57600080fd5b600093505b85841015612a105780358352600193909301929184019184016129f2565b50979650505050505050565b600082601f830112612a2d57600080fd5b612a3c83833560208501612920565b9392505050565b600060208284031215612a5557600080fd5b8135612a3c81613212565b600060208284031215612a7257600080fd5b8151612a3c81613212565b60008060408385031215612a9057600080fd5b8235612a9b81613212565b91506020830135612aab81613212565b809150509250929050565b600080600060608486031215612acb57600080fd5b8335612ad681613212565b92506020840135612ae681613212565b929592945050506040919091013590565b60008060008060808587031215612b0d57600080fd5b8435612b1881613212565b93506020850135612b2881613212565b925060408501359150606085013567ffffffffffffffff811115612b4b57600080fd5b8501601f81018713612b5c57600080fd5b612b6b87823560208401612920565b91505092959194509250565b60008060008060808587031215612b8d57600080fd5b8435612b9881613212565b93506020850135612ba881613212565b925060408501359150606085013567ffffffffffffffff811115612bcb57600080fd5b612b6b87828801612a1c565b60008060408385031215612bea57600080fd5b8235612bf581613212565b91506020830135612aab81613227565b60008060408385031215612c1857600080fd5b8235612c2381613212565b946020939093013593505050565b60008060408385031215612c4457600080fd5b823567ffffffffffffffff80821115612c5c57600080fd5b612c6886838701612996565b93506020850135915080821115612c7e57600080fd5b50612c8b85828601612996565b9150509250929050565b600060208284031215612ca757600080fd5b8151612a3c81613227565b600060208284031215612cc457600080fd5b8135612a3c81613235565b600060208284031215612ce157600080fd5b8151612a3c81613235565b600060208284031215612cfe57600080fd5b813567ffffffffffffffff811115612d1557600080fd5b611cc884828501612a1c565b600060208284031215612d3357600080fd5b5035919050565b60008060408385031215612d4d57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015612d8c57815187529582019590820190600101612d70565b509495945050505050565b60008151808452612daf816020860160208601613089565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612df3818560208601613089565b9290920192915050565b600080845481600182811c915080831680612e1957607f831692505b6020808410821415612e52577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612e665760018114612e9557612ec2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612ec2565b60008b81526020902060005b86811015612eba5781548b820152908501908301612ea1565b505084890196505b505050505050612efe612ed58286612de1565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612f396080830184612d97565b9695505050505050565b602081526000612a3c6020830184612d5c565b604081526000612f696040830185612d5c565b90506001600160a01b03831660208301529392505050565b602081526000612a3c6020830184612d97565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fdb57612fdb6131e3565b604052919050565b600061ffff80831681851680830382111561300057613000613156565b01949350505050565b6000821982111561301c5761301c613156565b500190565b60008261303057613030613185565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561306d5761306d613156565b500290565b60008282101561308457613084613156565b500390565b60005b838110156130a457818101518382015260200161308c565b838111156108515750506000910152565b600181811c908216806130c957607f821691505b60208210811415613103577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561313b5761313b613156565b5060010190565b60008261315157613151613185565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114611a5f57600080fd5b8015158114611a5f57600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611a5f57600080fdfea2646970667358221220369d6973f83dc0bfa9ae094368e22617d4684290e342e14323195104a56c1fca64736f6c63430008070033
Deployed Bytecode Sourcemap
37839:4445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41190:241;;;;;;:::i;:::-;;:::i;:::-;;;11995:14:1;;11988:22;11970:41;;11958:2;11943:18;41190:241:0;;;;;;;;29005:102;29079:20;;;;;;;;;;;;;;;;;29005:102;;;;;;;:::i;30257:213::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9961:55:1;;;9943:74;;9931:2;9916:18;30257:213:0;9797:226:1;29765:426:0;;;;;;:::i;:::-;;:::i;:::-;;27471:23;;;;;;;;;;;;27507:25;;;;;;;;;;;;;;;21614:6:1;21602:19;;;21584:38;;21572:2;21557:18;27507:25:0;21440:188:1;31021:357:0;;;;;;:::i;:::-;;:::i;40477:279::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;11068:55:1;;;11050:74;;11155:2;11140:18;;11133:34;;;;11023:18;40477:279:0;10876:297:1;41439:254:0;;;:::i;2907:143::-;;3007:42;2907:143;;31449:231;;;;;;:::i;:::-;;:::i;37897:27::-;;;;;;;;;38495:349;;;;;;:::i;:::-;;:::i;29613:90::-;;;;;;:::i;:::-;;:::i;28707:231::-;;;;;;:::i;:::-;;:::i;27541:21::-;;;:::i;28443:202::-;;;;;;:::i;:::-;;:::i;:::-;;;21779:25:1;;;21767:2;21752:18;28443:202:0;21633:177:1;7132:96:0;;;:::i;41751:97::-;;;:::i;41856:425::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6483:87::-;6529:7;6556:6;-1:-1:-1;;;;;6556:6:0;6483:87;;29176:99;29252:15;;;;;;;;;;;;;;;;;29176:99;;41007:111;;;;;;:::i;:::-;;:::i;38020:467::-;;;;;;:::i;:::-;;:::i;30542:185::-;;;;;;:::i;:::-;;:::i;38852:358::-;;;;;;:::i;:::-;;:::i;31751:344::-;;;;;;:::i;:::-;;:::i;29346:259::-;;;;;;:::i;:::-;;:::i;30798:156::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30911:25:0;;;30887:4;30911:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30798:156;7383:194;;;;;;:::i;:::-;;:::i;41190:241::-;41292:4;41329:41;;;41344:26;41329:41;;:94;;;41387:36;41411:11;41387:23;:36::i;:::-;41309:114;41190:241;-1:-1:-1;;41190:241:0:o;30257:213::-;30325:7;33625:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33625:16:0;30345:73;;;;-1:-1:-1;;;30345:73:0;;18583:2:1;30345:73:0;;;18565:21:1;18622:2;18602:18;;;18595:30;18661:34;18641:18;;;18634:62;18732:14;18712:18;;;18705:42;18764:19;;30345:73:0;;;;;;;;;-1:-1:-1;30438:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30438:24:0;;30257:213::o;29765:426::-;29857:2;3007:42;4937:45;:49;4933:225;;5008:67;;;;;5059:4;5008:67;;;10263:34:1;-1:-1:-1;;;;;10333:15:1;;10313:18;;;10306:43;3007:42:0;;5008;;10175:18:1;;5008:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5003:144;;5103:28;;;;;-1:-1:-1;;;;;9961:55:1;;5103:28:0;;;9943:74:1;9916:18;;5103:28:0;9797:226:1;5003:144:0;29872:13:::1;29888:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;29888:16:0;;::::1;::::0;29923:11;::::1;::::0;::::1;;29915:57;;;::::0;-1:-1:-1;;;29915:57:0;;19773:2:1;29915:57:0::1;::::0;::::1;19755:21:1::0;19812:2;19792:18;;;19785:30;19851:34;19831:18;;;19824:62;19922:3;19902:18;;;19895:31;19943:19;;29915:57:0::1;19571:397:1::0;29915:57:0::1;30007:10;-1:-1:-1::0;;;;;30007:19:0;::::1;;::::0;:58:::1;;-1:-1:-1::0;;;;;;30911:25:0;;30887:4;30911:25;;;:18;:25;;;;;;;;30054:10:::1;30911:35:::0;;;;;;;;;;30030::::1;29985:164;;;::::0;-1:-1:-1;;;29985:164:0;;16929:2:1;29985:164:0::1;::::0;::::1;16911:21:1::0;16968:2;16948:18;;;16941:30;17007:34;16987:18;;;16980:62;17078:26;17058:18;;;17051:54;17122:19;;29985:164:0::1;16727:420:1::0;29985:164:0::1;30162:21;30171:2;30175:7;30162:8;:21::i;:::-;29861:330;29765:426:::0;;;:::o;31021:357::-;31158:4;3007:42;4191:45;:49;4187:539;;-1:-1:-1;;;;;4472:18:0;;4480:10;4472:18;4468:85;;;31236:39:::1;31255:10;31267:7;31236:18;:39::i;:::-;31228:101;;;::::0;-1:-1:-1;;;31228:101:0;;20526:2:1;31228:101:0::1;::::0;::::1;20508:21:1::0;20565:2;20545:18;;;20538:30;20604:34;20584:18;;;20577:62;20675:19;20655:18;;;20648:47;20712:19;;31228:101:0::1;20324:413:1::0;31228:101:0::1;31342:28;31352:4;31358:2;31362:7;31342:9;:28::i;:::-;4531:7:::0;;4468:85;4572:69;;;;;4623:4;4572:69;;;10263:34:1;4630:10:0;10313:18:1;;;10306:43;3007:42:0;;4572;;10175:18:1;;4572:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4567:148;;4669:30;;;;;4688:10;4669:30;;;9943:74:1;9916:18;;4669:30:0;9797:226:1;4567:148:0;31236:39:::1;31255:10;31267:7;31236:18;:39::i;:::-;31228:101;;;::::0;-1:-1:-1;;;31228:101:0;;20526:2:1;31228:101:0::1;::::0;::::1;20508:21:1::0;20565:2;20545:18;;;20538:30;20604:34;20584:18;;;20577:62;20675:19;20655:18;;;20648:47;20712:19;;31228:101:0::1;20324:413:1::0;31228:101:0::1;31342:28;31352:4;31358:2;31362:7;31342:9;:28::i;40477:279::-:0;40559:16;33625;;;:7;:16;;;;;;40559;;-1:-1:-1;;;;;33625:16:0;40611:68;;;;-1:-1:-1;;;40611:68:0;;18175:2:1;40611:68:0;;;18157:21:1;18214:2;18194:18;;;18187:30;18253:34;18233:18;;;18226:62;18324:9;18304:18;;;18297:37;18351:19;;40611:68:0;17973:403:1;40611:68:0;6529:7;6556:6;-1:-1:-1;;;;;6556:6:0;40742:5;40718:21;;40706:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;40690:58;;;;40477:279;;;;;:::o;41439:254::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;18996:2:1;6695:66:0;;;18978:21:1;;;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;19126:18;;6695:66:0;18794:356:1;6695:66:0;41569:51:::1;::::0;41500:21:::1;::::0;41489:8:::1;::::0;41577:10:::1;::::0;41611:4:::1;::::0;41500:21;;41489:8;41569:51;41489:8;41569:51;41500:21;41577:10;41611:4;41569:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41555:65;;;;;41639:7;41631:54;;;::::0;-1:-1:-1;;;41631:54:0;;15001:2:1;41631:54:0::1;::::0;::::1;14983:21:1::0;15040:2;15020:18;;;15013:30;15079:34;15059:18;;;15052:62;15150:4;15130:18;;;15123:32;15172:19;;41631:54:0::1;14799:398:1::0;41631:54:0::1;41478:215;;41439:254::o:0;31449:231::-;31633:39;31650:4;31656:2;31660:7;31633:39;;;;;;;;;;;;:16;:39::i;:::-;31449:231;;;:::o;38495:349::-;38563:15;;;;38555:52;;;;-1:-1:-1;;;38555:52:0;;16576:2:1;38555:52:0;;;16558:21:1;16615:2;16595:18;;;16588:30;16654:26;16634:18;;;16627:54;16698:18;;38555:52:0;16374:348:1;38555:52:0;38626:3;;:15;;;;;;;;21779:25:1;;;38645:10:0;;-1:-1:-1;;;;;38626:3:0;;:11;;21752:18:1;;38626:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38626:29:0;;38618:63;;;;-1:-1:-1;;;38618:63:0;;13067:2:1;38618:63:0;;;13049:21:1;13106:2;13086:18;;;13079:30;13145:23;13125:18;;;13118:51;13186:18;;38618:63:0;12865:345:1;38618:63:0;38723:1;38700:11;;;:7;:11;;;;;;-1:-1:-1;;;;;38700:11:0;:25;38692:55;;;;-1:-1:-1;;;38692:55:0;;21296:2:1;38692:55:0;;;21278:21:1;21335:2;21315:18;;;21308:30;21374:19;21354:18;;;21347:47;21411:18;;38692:55:0;21094:341:1;38692:55:0;38758:9;;:44;;;;;;;;21989:25:1;;;38791:10:0;22030:18:1;;;22023:83;-1:-1:-1;;;;;38758:9:0;;;;:22;;21962:18:1;;38758:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38813:23;38821:10;38833:2;38813:7;:23::i;29613:90::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;18996:2:1;6695:66:0;;;18978:21:1;;;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;19126:18;;6695:66:0;18794:356:1;6695:66:0;29682:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;28707:231::-:0;28771:7;28807:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28807:16:0;28842:19;28834:73;;;;-1:-1:-1;;;28834:73:0;;17765:2:1;28834:73:0;;;17747:21:1;17804:2;17784:18;;;17777:30;17843:34;17823:18;;;17816:62;17914:11;17894:18;;;17887:39;17943:19;;28834:73:0;17563:405:1;27541:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28443:202::-;28509:7;-1:-1:-1;;;;;28537:19:0;;28529:74;;;;-1:-1:-1;;;28529:74:0;;17354:2:1;28529:74:0;;;17336:21:1;17393:2;17373:18;;;17366:30;17432:34;17412:18;;;17405:62;17503:12;17483:18;;;17476:40;17533:19;;28529:74:0;17152:406:1;28529:74:0;-1:-1:-1;;;;;;28621:16:0;;;;;:9;:16;;;;;;;28443:202::o;7132:96::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;18996:2:1;6695:66:0;;;18978:21:1;;;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;19126:18;;6695:66:0;18794:356:1;6695:66:0;7199:21:::1;7217:1;7199:9;:21::i;:::-;7132:96::o:0;41751:97::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;18996:2:1;6695:66:0;;;18978:21:1;;;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;19126:18;;6695:66:0;18794:356:1;6695:66:0;41825:15:::1;::::0;;41806:34;;::::1;41825:15;::::0;;::::1;41824:16;41806:34;::::0;;41751:97::o;41856:425::-;-1:-1:-1;;;;;41976:16:0;;41942:20;41976:16;;;:9;:16;;;;;;41916:13;;41942:20;41965:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41965:28:0;-1:-1:-1;42004:6:0;42013:11;;41942:51;;-1:-1:-1;42004:6:0;42013:15;;:11;;;;;42027:1;42013:15;:::i;:::-;42004:24;;;-1:-1:-1;42039:6:0;42072:1;42058:190;42079:1;42075;:5;42058:190;;;42116:5;-1:-1:-1;;;;;42102:19:0;:10;42110:1;42102:7;:10::i;:::-;-1:-1:-1;;;;;42102:19:0;;42098:108;;;42154:1;42142:6;42149:1;42142:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;42185:3;;;;;42098:108;42231:3;;42058:190;;;-1:-1:-1;42267:6:0;;41856:425;-1:-1:-1;;;;41856:425:0:o;41007:111::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;18996:2:1;6695:66:0;;;18978:21:1;;;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;19126:18;;6695:66:0;18794:356:1;6695:66:0;41080:21:::1;:30:::0;41007:111::o;38020:467::-;38183:11;;;;;;;38182:12;38174:53;;;;-1:-1:-1;;;38174:53:0;;12710:2:1;38174:53:0;;;12692:21:1;12749:2;12729:18;;;12722:30;12788;12768:18;;;12761:58;12836:18;;38174:53:0;12508:352:1;38174:53:0;38238:21;38248:10;38238:9;:21::i;:::-;38270:38;:36;:38::i;:::-;38319:9;:33;;-1:-1:-1;;;;;38319:33:0;;;;;;;;;;;38363:3;:15;;;;;;;;;;;;;;;38389:21;:32;;;38432:18;;;;38319:33;;38432:18;;;;;:::i;:::-;-1:-1:-1;;38461:11:0;:18;;;;;;;;-1:-1:-1;;;38020:467:0:o;30542:185::-;30648:8;3007:42;4937:45;:49;4933:225;;5008:67;;;;;5059:4;5008:67;;;10263:34:1;-1:-1:-1;;;;;10333:15:1;;10313:18;;;10306:43;3007:42:0;;5008;;10175:18:1;;5008:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5003:144;;5103:28;;;;;-1:-1:-1;;;;;9961:55:1;;5103:28:0;;;9943:74:1;9916:18;;5103:28:0;9797:226:1;5003:144:0;30669:50:::1;30688:10;30700:8;30710;30669:18;:50::i;38852:358::-:0;38945:15;;;;38937:52;;;;-1:-1:-1;;;38937:52:0;;16576:2:1;38937:52:0;;;16558:21:1;16615:2;16595:18;;;16588:30;16654:26;16634:18;;;16627:54;16698:18;;38937:52:0;16374:348:1;38937:52:0;39014:10;;39053:16;;39043:26;;39035:62;;;;-1:-1:-1;;;39035:62:0;;20944:2:1;39035:62:0;;;20926:21:1;20983:2;20963:18;;;20956:30;21022:25;21002:18;;;20995:53;21065:18;;39035:62:0;20742:347:1;39035:62:0;39108:9;;:46;;;;;-1:-1:-1;;;;;39108:9:0;;;;:23;;:46;;39132:9;;39143:10;;39108:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39165:37;39178:10;39190:3;39195:6;39165:12;:37::i;31751:344::-;31919:4;3007:42;4191:45;:49;4187:539;;-1:-1:-1;;;;;4472:18:0;;4480:10;4472:18;4468:85;;;31944:39:::1;31963:10;31975:7;31944:18;:39::i;:::-;31936:101;;;::::0;-1:-1:-1;;;31936:101:0;;20526:2:1;31936:101:0::1;::::0;::::1;20508:21:1::0;20565:2;20545:18;;;20538:30;20604:34;20584:18;;;20577:62;20675:19;20655:18;;;20648:47;20712:19;;31936:101:0::1;20324:413:1::0;31936:101:0::1;32048:39;32062:4;32068:2;32072:7;32081:5;32048:13;:39::i;:::-;4531:7:::0;;4468:85;4572:69;;;;;4623:4;4572:69;;;10263:34:1;4630:10:0;10313:18:1;;;10306:43;3007:42:0;;4572;;10175:18:1;;4572:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4567:148;;4669:30;;;;;4688:10;4669:30;;;9943:74:1;9916:18;;4669:30:0;9797:226:1;4567:148:0;31944:39:::1;31963:10;31975:7;31944:18;:39::i;:::-;31936:101;;;::::0;-1:-1:-1;;;31936:101:0;;20526:2:1;31936:101:0::1;::::0;::::1;20508:21:1::0;20565:2;20545:18;;;20538:30;20604:34;20584:18;;;20577:62;20675:19;20655:18;;;20648:47;20712:19;;31936:101:0::1;20324:413:1::0;31936:101:0::1;32048:39;32062:4;32068:2;32072:7;32081:5;32048:13;:39::i;:::-;31751:344:::0;;;;;:::o;29346:259::-;33601:4;33625:16;;;:7;:16;;;;;;29413:13;;-1:-1:-1;;;;;33625:16:0;29439:76;;;;-1:-1:-1;;;29439:76:0;;19357:2:1;29439:76:0;;;19339:21:1;19396:2;19376:18;;;19369:30;19435:34;19415:18;;;19408:62;19506:17;19486:18;;;19479:45;19541:19;;29439:76:0;19155:411:1;29439:76:0;29559:7;29568:18;:7;:16;:18::i;:::-;29542:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29528:69;;29346:259;;;:::o;7383:194::-;6714:10;6703:7;6529;6556:6;-1:-1:-1;;;;;6556:6:0;;6483:87;6703:7;-1:-1:-1;;;;;6703:21:0;;6695:66;;;;-1:-1:-1;;;6695:66:0;;18996:2:1;6695:66:0;;;18978:21:1;;;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;19126:18;;6695:66:0;18794:356:1;6695:66:0;-1:-1:-1;;;;;7474:22:0;::::1;7466:73;;;::::0;-1:-1:-1;;;7466:73:0;;14188:2:1;7466:73:0::1;::::0;::::1;14170:21:1::0;14227:2;14207:18;;;14200:30;14266:34;14246:18;;;14239:62;14337:8;14317:18;;;14310:36;14363:19;;7466:73:0::1;13986:402:1::0;7466:73:0::1;7550:19;7560:8;7550:9;:19::i;:::-;7383:194:::0;:::o;28074:305::-;28176:4;28213:40;;;28228:25;28213:40;;:105;;-1:-1:-1;28270:48:0;;;28285:33;28270:48;28213:105;:158;;;-1:-1:-1;20535:25:0;20520:40;;;;28335:36;20411:157;35558:174;35633:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;35633:29:0;;;;;;;;:24;;35687:23;35633:24;35687:14;:23::i;:::-;-1:-1:-1;;;;;35678:46:0;;;;;;;;;;;35558:174;;:::o;33830:341::-;33923:4;33625:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33625:16:0;33940:73;;;;-1:-1:-1;;;33940:73:0;;16163:2:1;33940:73:0;;;16145:21:1;16202:2;16182:18;;;16175:30;16241:34;16221:18;;;16214:62;16312:14;16292:18;;;16285:42;16344:19;;33940:73:0;15961:408:1;33940:73:0;34024:13;34040:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34040:16:0;;;;34075;;;;;:51;;;34119:7;-1:-1:-1;;;;;34095:31:0;:20;34107:7;34095:11;:20::i;:::-;-1:-1:-1;;;;;34095:31:0;;34075:51;:87;;;-1:-1:-1;;;;;;30911:25:0;;;30887:4;30911:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34130:32;34067:96;33830:341;-1:-1:-1;;;;33830:341:0:o;34885:555::-;35017:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;35017:24:0;;;:16;;:24;35009:74;;;;-1:-1:-1;;;35009:74:0;;14595:2:1;35009:74:0;;;14577:21:1;14634:2;14614:18;;;14607:30;14673:34;14653:18;;;14646:62;14744:7;14724:18;;;14717:35;14769:19;;35009:74:0;14393:401:1;35009:74:0;-1:-1:-1;;;;;35102:16:0;;35094:65;;;;-1:-1:-1;;;35094:65:0;;15404:2:1;35094:65:0;;;15386:21:1;15443:2;15423:18;;;15416:30;15482:34;15462:18;;;15455:62;15553:6;15533:18;;;15526:34;15577:19;;35094:65:0;15202:400:1;35094:65:0;35224:29;35241:1;35245:7;35224:8;:29::i;:::-;-1:-1:-1;;;;;35297:15:0;;;;;;;:9;:15;;;;;;;;35295:17;;;;;;35329:13;;;;;;;;;35327:15;;35295:17;35327:15;;;35366:16;;;:7;:16;;;;;;:21;;;;;;;;35405:27;;35374:7;;35329:13;35297:15;35405:27;;;34885:555;;;:::o;34179:369::-;34242:16;;;;:7;:16;;;;;;;;:21;;;;-1:-1:-1;;;;;34242:21:0;;;;;;;;34301:13;;;:9;:13;;;;;;34299:15;;-1:-1:-1;34299:15:0;;;34343:33;34242:16;;;34343:33;;34242:16;;34343:33;34411:51;34442:1;34446:2;34450:7;34411:51;;;;;;;;;;;;:22;:51::i;:::-;34389:151;;;;-1:-1:-1;;;34389:151:0;;13769:2:1;34389:151:0;;;13751:21:1;13808:2;13788:18;;;13781:30;13847:34;13827:18;;;13820:62;13918:20;13898:18;;;13891:48;13956:19;;34389:151:0;13567:414:1;7585:174:0;7642:16;7661:6;;-1:-1:-1;;;;;7678:17:0;;;;;;;;;;7711:40;;7661:6;;;;;;;7711:40;;7642:16;7711:40;7631:128;7585:174;:::o;5558:117::-;5616:57;5506:42;5668:4;5616:29;:57::i;35874:315::-;36029:8;-1:-1:-1;;;;;36020:17:0;:5;-1:-1:-1;;;;;36020:17:0;;;36012:55;;;;-1:-1:-1;;;36012:55:0;;15809:2:1;36012:55:0;;;15791:21:1;15848:2;15828:18;;;15821:30;15887:27;15867:18;;;15860:55;15932:18;;36012:55:0;15607:349:1;36012:55:0;-1:-1:-1;;;;;36078:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;36140:41;;11970::1;;;36140::0;;11943:18:1;36140:41:0;;;;;;;35874:315;;;:::o;39218:764::-;-1:-1:-1;;;;;39337:13:0;;39304:8;39337:13;;;:9;:13;;;;;:23;;;;;;39304:8;39375:600;39392:6;39388:1;:10;39375:600;;;39484:4;39477:12;;;39457:33;;;;39451:40;39554:1;39530:12;;;:7;:12;;;;;;;;39451:40;;-1:-1:-1;;;;;;39530:12:0;:26;39522:61;;;;-1:-1:-1;;;39522:61:0;;20175:2:1;39522:61:0;;;20157:21:1;20214:2;20194:18;;;20187:30;20253:24;20233:18;;;20226:52;20295:18;;39522:61:0;19973:346:1;39522:61:0;39600:12;;;;:7;:12;;;;;;:17;;;;-1:-1:-1;;;;;39600:17:0;;;;;;;;39637:29;;39600:12;;;39637:29;;39600:12;;39637:29;39737:3;;:16;;;;;;;;21779:25:1;;;39707:3:0;;;;;;-1:-1:-1;;;;;39737:22:0;;;;:3;;:11;;21752:18:1;;39737:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39737:22:0;;39729:58;;;;-1:-1:-1;;;39729:58:0;;13417:2:1;39729:58:0;;;13399:21:1;13456:2;13436:18;;;13429:30;13495:25;13475:18;;;13468:53;13538:18;;39729:58:0;13215:347:1;39729:58:0;39830:47;39861:1;39865:2;39869:3;39830:47;;;;;;;;;;;;:22;:47::i;:::-;39804:159;;;;-1:-1:-1;;;39804:159:0;;13769:2:1;39804:159:0;;;13751:21:1;13808:2;13788:18;;;13781:30;13847:34;13827:18;;;13820:62;13918:20;13898:18;;;13891:48;13956:19;;39804:159:0;13567:414:1;39804:159:0;39375:600;;32977:315;33134:28;33144:4;33150:2;33154:7;33134:9;:28::i;:::-;33181:48;33204:4;33210:2;33214:7;33223:5;33181:22;:48::i;:::-;33173:111;;;;-1:-1:-1;;;33173:111:0;;13769:2:1;33173:111:0;;;13751:21:1;13808:2;13788:18;;;13781:30;13847:34;13827:18;;;13820:62;13918:20;13898:18;;;13891:48;13956:19;;33173:111:0;13567:414:1;7988:723:0;8044:13;8265:10;8261:53;;-1:-1:-1;;8292:10:0;;;;;;;;;;;;;;;;;;7988:723::o;8261:53::-;8339:5;8324:12;8380:78;8387:9;;8380:78;;8413:8;;;;:::i;:::-;;-1:-1:-1;8436:10:0;;-1:-1:-1;8444:2:0;8436:10;;:::i;:::-;;;8380:78;;;8468:19;8500:6;8490:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8490:17:0;;8468:39;;8518:154;8525:10;;8518:154;;8552:11;8562:1;8552:11;;:::i;:::-;;-1:-1:-1;8621:10:0;8629:2;8621:5;:10;:::i;:::-;8608:24;;:2;:24;:::i;:::-;8595:39;;8578:6;8585;8578:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;8649:11:0;8658:2;8649:11;;:::i;:::-;;;8518:154;;36754:798;36910:4;-1:-1:-1;;;;;36931:13:0;;17391:20;17439:8;36927:618;;36967:70;;;;;-1:-1:-1;;;;;36967:36:0;;;;;:70;;37004:10;;37016:4;;37022:7;;37031:5;;36967:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36967:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36963:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37207:13:0;;37203:272;;37250:60;;-1:-1:-1;;;37250:60:0;;13769:2:1;37250:60:0;;;13751:21:1;13808:2;13788:18;;;13781:30;13847:34;13827:18;;;13820:62;13918:20;13898:18;;;13891:48;13956:19;;37250:60:0;13567:414:1;37203:272:0;37425:6;37419:13;37410:6;37406:2;37402:15;37395:38;36963:527;37088:51;;37098:41;37088:51;;-1:-1:-1;37081:58:0;;36927:618;-1:-1:-1;37529:4:0;36754:798;;;;;;:::o;3059:952::-;3007:42;3461:45;:49;3457:547;;3531:9;3527:466;;;3561:92;;;;;3615:4;3561:92;;;10263:34:1;-1:-1:-1;;;;;10333:15:1;;10313:18;;;10306:43;3007:42:0;;3561:45;;10175:18:1;;3561:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41478:215:::1;;41439:254::o:0;3527:466::-;-1:-1:-1;;;;;3698:44:0;;;3694:284;;3767:94;;;;;3823:4;3767:94;;;10263:34:1;-1:-1:-1;;;;;10333:15:1;;10313:18;;;10306:43;3007:42:0;;3767:47;;10175:18:1;;3767:94:0;10028:327:1;3694:284:0;3910:48;;;;;3952:4;3910:48;;;9943:74:1;3007:42:0;;3910:33;;9916:18:1;;3910:48:0;9797:226:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:723::-;538:5;591:3;584:4;576:6;572:17;568:27;558:55;;609:1;606;599:12;558:55;645:6;632:20;671:4;694:18;690:2;687:26;684:52;;;716:18;;:::i;:::-;762:2;759:1;755:10;785:28;809:2;805;801:11;785:28;:::i;:::-;847:15;;;878:12;;;;910:15;;;944;;;940:24;;937:33;-1:-1:-1;934:53:1;;;983:1;980;973:12;934:53;1005:1;996:10;;1015:163;1029:2;1026:1;1023:9;1015:163;;;1086:17;;1074:30;;1047:1;1040:9;;;;;1124:12;;;;1156;;1015:163;;;-1:-1:-1;1196:5:1;484:723;-1:-1:-1;;;;;;;484:723:1:o;1212:221::-;1255:5;1308:3;1301:4;1293:6;1289:17;1285:27;1275:55;;1326:1;1323;1316:12;1275:55;1348:79;1423:3;1414:6;1401:20;1394:4;1386:6;1382:17;1348:79;:::i;:::-;1339:88;1212:221;-1:-1:-1;;;1212:221:1:o;1438:247::-;1497:6;1550:2;1538:9;1529:7;1525:23;1521:32;1518:52;;;1566:1;1563;1556:12;1518:52;1605:9;1592:23;1624:31;1649:5;1624:31;:::i;1690:251::-;1760:6;1813:2;1801:9;1792:7;1788:23;1784:32;1781:52;;;1829:1;1826;1819:12;1781:52;1861:9;1855:16;1880:31;1905:5;1880:31;:::i;1946:388::-;2014:6;2022;2075:2;2063:9;2054:7;2050:23;2046:32;2043:52;;;2091:1;2088;2081:12;2043:52;2130:9;2117:23;2149:31;2174:5;2149:31;:::i;:::-;2199:5;-1:-1:-1;2256:2:1;2241:18;;2228:32;2269:33;2228:32;2269:33;:::i;:::-;2321:7;2311:17;;;1946:388;;;;;:::o;2339:456::-;2416:6;2424;2432;2485:2;2473:9;2464:7;2460:23;2456:32;2453:52;;;2501:1;2498;2491:12;2453:52;2540:9;2527:23;2559:31;2584:5;2559:31;:::i;:::-;2609:5;-1:-1:-1;2666:2:1;2651:18;;2638:32;2679:33;2638:32;2679:33;:::i;:::-;2339:456;;2731:7;;-1:-1:-1;;;2785:2:1;2770:18;;;;2757:32;;2339:456::o;2800:794::-;2895:6;2903;2911;2919;2972:3;2960:9;2951:7;2947:23;2943:33;2940:53;;;2989:1;2986;2979:12;2940:53;3028:9;3015:23;3047:31;3072:5;3047:31;:::i;:::-;3097:5;-1:-1:-1;3154:2:1;3139:18;;3126:32;3167:33;3126:32;3167:33;:::i;:::-;3219:7;-1:-1:-1;3273:2:1;3258:18;;3245:32;;-1:-1:-1;3328:2:1;3313:18;;3300:32;3355:18;3344:30;;3341:50;;;3387:1;3384;3377:12;3341:50;3410:22;;3463:4;3455:13;;3451:27;-1:-1:-1;3441:55:1;;3492:1;3489;3482:12;3441:55;3515:73;3580:7;3575:2;3562:16;3557:2;3553;3549:11;3515:73;:::i;:::-;3505:83;;;2800:794;;;;;;;:::o;3599:667::-;3695:6;3703;3711;3719;3772:3;3760:9;3751:7;3747:23;3743:33;3740:53;;;3789:1;3786;3779:12;3740:53;3828:9;3815:23;3847:31;3872:5;3847:31;:::i;:::-;3897:5;-1:-1:-1;3954:2:1;3939:18;;3926:32;3967:33;3926:32;3967:33;:::i;:::-;4019:7;-1:-1:-1;4073:2:1;4058:18;;4045:32;;-1:-1:-1;4128:2:1;4113:18;;4100:32;4155:18;4144:30;;4141:50;;;4187:1;4184;4177:12;4141:50;4210;4252:7;4243:6;4232:9;4228:22;4210:50;:::i;4271:382::-;4336:6;4344;4397:2;4385:9;4376:7;4372:23;4368:32;4365:52;;;4413:1;4410;4403:12;4365:52;4452:9;4439:23;4471:31;4496:5;4471:31;:::i;:::-;4521:5;-1:-1:-1;4578:2:1;4563:18;;4550:32;4591:30;4550:32;4591:30;:::i;4658:315::-;4726:6;4734;4787:2;4775:9;4766:7;4762:23;4758:32;4755:52;;;4803:1;4800;4793:12;4755:52;4842:9;4829:23;4861:31;4886:5;4861:31;:::i;:::-;4911:5;4963:2;4948:18;;;;4935:32;;-1:-1:-1;;;4658:315:1:o;4978:595::-;5096:6;5104;5157:2;5145:9;5136:7;5132:23;5128:32;5125:52;;;5173:1;5170;5163:12;5125:52;5213:9;5200:23;5242:18;5283:2;5275:6;5272:14;5269:34;;;5299:1;5296;5289:12;5269:34;5322:61;5375:7;5366:6;5355:9;5351:22;5322:61;:::i;:::-;5312:71;;5436:2;5425:9;5421:18;5408:32;5392:48;;5465:2;5455:8;5452:16;5449:36;;;5481:1;5478;5471:12;5449:36;;5504:63;5559:7;5548:8;5537:9;5533:24;5504:63;:::i;:::-;5494:73;;;4978:595;;;;;:::o;5578:245::-;5645:6;5698:2;5686:9;5677:7;5673:23;5669:32;5666:52;;;5714:1;5711;5704:12;5666:52;5746:9;5740:16;5765:28;5787:5;5765:28;:::i;5828:245::-;5886:6;5939:2;5927:9;5918:7;5914:23;5910:32;5907:52;;;5955:1;5952;5945:12;5907:52;5994:9;5981:23;6013:30;6037:5;6013:30;:::i;6078:249::-;6147:6;6200:2;6188:9;6179:7;6175:23;6171:32;6168:52;;;6216:1;6213;6206:12;6168:52;6248:9;6242:16;6267:30;6291:5;6267:30;:::i;6332:322::-;6401:6;6454:2;6442:9;6433:7;6429:23;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6510:9;6497:23;6543:18;6535:6;6532:30;6529:50;;;6575:1;6572;6565:12;6529:50;6598;6640:7;6631:6;6620:9;6616:22;6598:50;:::i;6659:180::-;6718:6;6771:2;6759:9;6750:7;6746:23;6742:32;6739:52;;;6787:1;6784;6777:12;6739:52;-1:-1:-1;6810:23:1;;6659:180;-1:-1:-1;6659:180:1:o;6844:248::-;6912:6;6920;6973:2;6961:9;6952:7;6948:23;6944:32;6941:52;;;6989:1;6986;6979:12;6941:52;-1:-1:-1;;7012:23:1;;;7082:2;7067:18;;;7054:32;;-1:-1:-1;6844:248:1:o;7097:435::-;7150:3;7188:5;7182:12;7215:6;7210:3;7203:19;7241:4;7270:2;7265:3;7261:12;7254:19;;7307:2;7300:5;7296:14;7328:1;7338:169;7352:6;7349:1;7346:13;7338:169;;;7413:13;;7401:26;;7447:12;;;;7482:15;;;;7374:1;7367:9;7338:169;;;-1:-1:-1;7523:3:1;;7097:435;-1:-1:-1;;;;;7097:435:1:o;7537:316::-;7578:3;7616:5;7610:12;7643:6;7638:3;7631:19;7659:63;7715:6;7708:4;7703:3;7699:14;7692:4;7685:5;7681:16;7659:63;:::i;:::-;7767:2;7755:15;7772:66;7751:88;7742:98;;;;7842:4;7738:109;;7537:316;-1:-1:-1;;7537:316:1:o;7858:185::-;7900:3;7938:5;7932:12;7953:52;7998:6;7993:3;7986:4;7979:5;7975:16;7953:52;:::i;:::-;8021:16;;;;;7858:185;-1:-1:-1;;7858:185:1:o;8166:1416::-;8443:3;8472:1;8505:6;8499:13;8535:3;8557:1;8585:9;8581:2;8577:18;8567:28;;8645:2;8634:9;8630:18;8667;8657:61;;8711:4;8703:6;8699:17;8689:27;;8657:61;8737:2;8785;8777:6;8774:14;8754:18;8751:38;8748:222;;;8824:77;8819:3;8812:90;8925:4;8922:1;8915:15;8955:4;8950:3;8943:17;8748:222;8986:18;9013:162;;;;9189:1;9184:320;;;;8979:525;;9013:162;9061:66;9050:9;9046:82;9041:3;9034:95;9158:6;9153:3;9149:16;9142:23;;9013:162;;9184:320;22529:1;22522:14;;;22566:4;22553:18;;9279:1;9293:165;9307:6;9304:1;9301:13;9293:165;;;9385:14;;9372:11;;;9365:35;9428:16;;;;9322:10;;9293:165;;;9297:3;;9487:6;9482:3;9478:16;9471:23;;8979:525;;;;;;;9520:56;9545:30;9571:3;9563:6;9545:30;:::i;:::-;8120:7;8108:20;;8153:1;8144:11;;8048:113;9520:56;9513:63;8166:1416;-1:-1:-1;;;;;8166:1416:1:o;10360:511::-;10554:4;-1:-1:-1;;;;;10664:2:1;10656:6;10652:15;10641:9;10634:34;10716:2;10708:6;10704:15;10699:2;10688:9;10684:18;10677:43;;10756:6;10751:2;10740:9;10736:18;10729:34;10799:3;10794:2;10783:9;10779:18;10772:31;10820:45;10860:3;10849:9;10845:19;10837:6;10820:45;:::i;:::-;10812:53;10360:511;-1:-1:-1;;;;;;10360:511:1:o;11178:261::-;11357:2;11346:9;11339:21;11320:4;11377:56;11429:2;11418:9;11414:18;11406:6;11377:56;:::i;11444:381::-;11651:2;11640:9;11633:21;11614:4;11671:56;11723:2;11712:9;11708:18;11700:6;11671:56;:::i;:::-;11663:64;;-1:-1:-1;;;;;11767:6:1;11763:55;11758:2;11747:9;11743:18;11736:83;11444:381;;;;;:::o;12284:219::-;12433:2;12422:9;12415:21;12396:4;12453:44;12493:2;12482:9;12478:18;12470:6;12453:44;:::i;22117:334::-;22188:2;22182:9;22244:2;22234:13;;22249:66;22230:86;22218:99;;22347:18;22332:34;;22368:22;;;22329:62;22326:88;;;22394:18;;:::i;:::-;22430:2;22423:22;22117:334;;-1:-1:-1;22117:334:1:o;22582:224::-;22621:3;22649:6;22682:2;22679:1;22675:10;22712:2;22709:1;22705:10;22743:3;22739:2;22735:12;22730:3;22727:21;22724:47;;;22751:18;;:::i;:::-;22787:13;;22582:224;-1:-1:-1;;;;22582:224:1:o;22811:128::-;22851:3;22882:1;22878:6;22875:1;22872:13;22869:39;;;22888:18;;:::i;:::-;-1:-1:-1;22924:9:1;;22811:128::o;22944:120::-;22984:1;23010;23000:35;;23015:18;;:::i;:::-;-1:-1:-1;23049:9:1;;22944:120::o;23069:228::-;23109:7;23235:1;23167:66;23163:74;23160:1;23157:81;23152:1;23145:9;23138:17;23134:105;23131:131;;;23242:18;;:::i;:::-;-1:-1:-1;23282:9:1;;23069:228::o;23302:125::-;23342:4;23370:1;23367;23364:8;23361:34;;;23375:18;;:::i;:::-;-1:-1:-1;23412:9:1;;23302:125::o;23432:258::-;23504:1;23514:113;23528:6;23525:1;23522:13;23514:113;;;23604:11;;;23598:18;23585:11;;;23578:39;23550:2;23543:10;23514:113;;;23645:6;23642:1;23639:13;23636:48;;;-1:-1:-1;;23680:1:1;23662:16;;23655:27;23432:258::o;23695:437::-;23774:1;23770:12;;;;23817;;;23838:61;;23892:4;23884:6;23880:17;23870:27;;23838:61;23945:2;23937:6;23934:14;23914:18;23911:38;23908:218;;;23982:77;23979:1;23972:88;24083:4;24080:1;24073:15;24111:4;24108:1;24101:15;23908:218;;23695:437;;;:::o;24137:195::-;24176:3;24207:66;24200:5;24197:77;24194:103;;;24277:18;;:::i;:::-;-1:-1:-1;24324:1:1;24313:13;;24137:195::o;24337:112::-;24369:1;24395;24385:35;;24400:18;;:::i;:::-;-1:-1:-1;24434:9:1;;24337:112::o;24454:184::-;24506:77;24503:1;24496:88;24603:4;24600:1;24593:15;24627:4;24624:1;24617:15;24643:184;24695:77;24692:1;24685:88;24792:4;24789:1;24782:15;24816:4;24813:1;24806:15;24832:184;24884:77;24881:1;24874:88;24981:4;24978:1;24971:15;25005:4;25002:1;24995:15;25021:184;25073:77;25070:1;25063:88;25170:4;25167:1;25160:15;25194:4;25191:1;25184:15;25210:154;-1:-1:-1;;;;;25289:5:1;25285:54;25278:5;25275:65;25265:93;;25354:1;25351;25344:12;25369:118;25455:5;25448:13;25441:21;25434:5;25431:32;25421:60;;25477:1;25474;25467:12;25492:177;25577:66;25570:5;25566:78;25559:5;25556:89;25546:117;;25659:1;25656;25649:12
Swarm Source
ipfs://369d6973f83dc0bfa9ae094368e22617d4684290e342e14323195104a56c1fca
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.