ERC-721
Overview
Max Total Supply
5,555 BULLY
Holders
229
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BULLYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
bullyapes
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-10 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/NFT.sol pragma solidity ^0.8.4; contract bullyapes is ERC721A, ERC2981, Ownable, ReentrancyGuard { using Strings for uint256; uint256 public constant maxSupply = 5555; //total NFTs available address public royaltyAddress = 0xca77410c4cFe7162971fD3a6f37a64e72615EeAE; //need to update before deploying uint96 public royaltyFee = 1000; //10% royalty string public _baseTokenURI = "ipfs://QmVPyA6TfyqX94m7y4u159ka7vbiShB3UXVCZSydMpKUrc/"; // IPFS link string public _baseTokenEXT = ".json"; constructor() ERC721A("BULLY' APES", "BULLY") { _setDefaultRoyalty(royaltyAddress, royaltyFee); } /** * @notice Mint tokens - owner only */ function mint(uint256 _mintAmount) external payable { uint256 supply = totalSupply(); require(supply + _mintAmount <= maxSupply , "Exceeds max supply"); _safeMint(msg.sender, _mintAmount); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @notice Obtains metadata url for token */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(),_baseTokenEXT)) : ""; } /** * @notice Updates the metadata url */ function changeURLParams(string memory _nURL, string memory _nBaseExt) external onlyOwner { _baseTokenURI = _nURL; _baseTokenEXT = _nBaseExt; emit baseTokenURI (_nURL, _nBaseExt); } /** * @notice Mint tokens via airdrop by owner only */ function gift(address _to, uint256 _mintAmount) external onlyOwner { uint256 supply = totalSupply(); require(supply + _mintAmount <= maxSupply, "Exceeds Max Supply"); _safeMint(_to, _mintAmount); } /** * @notice Change the royalty fee for the collection - denominator out of 10000 */ function setRoyaltyFee(uint96 _feeNumerator) external onlyOwner { royaltyFee = _feeNumerator; _setDefaultRoyalty(royaltyAddress, royaltyFee); emit RoyaltyFees(royaltyAddress, royaltyFee); } /** * @notice Change the royalty address where royalty payouts are sent */ function setRoyaltyAddress(address _royaltyAddress) external onlyOwner { royaltyAddress = _royaltyAddress; _setDefaultRoyalty(royaltyAddress, royaltyFee); emit RoyaltyFees(royaltyAddress, royaltyFee); } /** * @notice Withdraw any funds */ function withdrawFunds() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @notice Event listeners */ event RoyaltyFees(address, uint96); event baseTokenURI (string, string); event Received (address, uint256); /** * @notice Allow external funds */ receive() external payable { emit Received(msg.sender,msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","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":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint96","name":"","type":"uint96"}],"name":"RoyaltyFees","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"baseTokenURI","type":"event"},{"inputs":[],"name":"_baseTokenEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_nURL","type":"string"},{"internalType":"string","name":"_nBaseExt","type":"string"}],"name":"changeURLParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFee","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405273ca77410c4cfe7162971fd3a6f37a64e72615eeae600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8600c60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506040518060600160405280603681526020016200472060369139600d9080519060200190620000bd929190620004cd565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200010b929190620004cd565b503480156200011957600080fd5b506040518060400160405280600b81526020017f42554c4c592720415045530000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42554c4c5900000000000000000000000000000000000000000000000000000081525081600290805190602001906200019e929190620004cd565b508060039080519060200190620001b7929190620004cd565b50620001c86200024c60201b60201c565b6000819055505050620001f0620001e46200025160201b60201c565b6200025960201b60201c565b6001600b8190555062000246600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff166200031f60201b60201c565b620006fd565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200032f620004c360201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038790620005cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000403576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fa90620005ed565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b828054620004db9062000620565b90600052602060002090601f016020900481019282620004ff57600085556200054b565b82601f106200051a57805160ff19168380011785556200054b565b828001600101855582156200054b579182015b828111156200054a5782518255916020019190600101906200052d565b5b5090506200055a91906200055e565b5090565b5b80821115620005795760008160009055506001016200055f565b5090565b60006200058c602a836200060f565b9150620005998262000685565b604082019050919050565b6000620005b36019836200060f565b9150620005c082620006d4565b602082019050919050565b60006020820190508181036000830152620005e6816200057d565b9050919050565b600060208201905081810360008301526200060881620005a4565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200063957607f821691505b6020821081141562000650576200064f62000656565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b614013806200070d6000396000f3fe6080604052600436106101c65760003560e01c8063783fd922116100f7578063b88d4fde11610095578063cfc86f7b11610064578063cfc86f7b14610662578063d5abeb011461068d578063e985e9c5146106b8578063f2fde38b146106f557610206565b8063b88d4fde146105a8578063b8997a97146105d1578063c87b56dd146105fc578063cbce4c971461063957610206565b806395d89b41116100d157806395d89b411461050d578063a0712d6814610538578063a22cb46514610554578063ad2f852a1461057d57610206565b8063783fd9221461048e57806385fee168146104b75780638da5cb5b146104e257610206565b806324600fc31161016457806342842e0e1161013e57806342842e0e146103d45780636352211e146103fd57806370a082311461043a578063715018a61461047757610206565b806324600fc3146103565780632a55205a1461036d57806331faafb4146103ab57610206565b8063081812fc116101a0578063081812fc1461029c578063095ea7b3146102d957806318160ddd1461030257806323b872dd1461032d57610206565b806301ffc9a71461020b57806306d254da1461024857806306fdde031461027157610206565b36610206577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516101fc9291906136ae565b60405180910390a1005b600080fd5b34801561021757600080fd5b50610232600480360381019061022d91906131d9565b61071e565b60405161023f9190613700565b60405180910390f35b34801561025457600080fd5b5061026f600480360381019061026a9190613016565b610730565b005b34801561027d57600080fd5b506102866108ab565b604051610293919061371b565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be91906132ab565b61093d565b6040516102d09190613647565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190613199565b6109b9565b005b34801561030e57600080fd5b50610317610ac4565b6040516103249190613894565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613083565b610adb565b005b34801561036257600080fd5b5061036b610aeb565b005b34801561037957600080fd5b50610394600480360381019061038f91906132d8565b610c6c565b6040516103a29291906136ae565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613318565b610e57565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613083565b610fc2565b005b34801561040957600080fd5b50610424600480360381019061041f91906132ab565b610fe2565b6040516104319190613647565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613016565b610ff8565b60405161046e9190613894565b60405180910390f35b34801561048357600080fd5b5061048c6110c8565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613233565b611150565b005b3480156104c357600080fd5b506104cc611237565b6040516104d9919061371b565b60405180910390f35b3480156104ee57600080fd5b506104f76112c5565b6040516105049190613647565b60405180910390f35b34801561051957600080fd5b506105226112ef565b60405161052f919061371b565b60405180910390f35b610552600480360381019061054d91906132ab565b611381565b005b34801561056057600080fd5b5061057b60048036038101906105769190613159565b6113eb565b005b34801561058957600080fd5b50610592611563565b60405161059f9190613647565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca91906130d6565b611589565b005b3480156105dd57600080fd5b506105e6611605565b6040516105f391906138af565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906132ab565b611623565b604051610630919061371b565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613199565b6116cd565b005b34801561066e57600080fd5b506106776117b4565b604051610684919061371b565b60405180910390f35b34801561069957600080fd5b506106a2611842565b6040516106af9190613894565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613043565b611848565b6040516106ec9190613700565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190613016565b6118dc565b005b6000610729826119d4565b9050919050565b610738611a4e565b73ffffffffffffffffffffffffffffffffffffffff166107566112c5565b73ffffffffffffffffffffffffffffffffffffffff16146107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a3906137d4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610833600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff166040516108a09291906136d7565b60405180910390a150565b6060600280546108ba90613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546108e690613b97565b80156109335780601f1061090857610100808354040283529160200191610933565b820191906000526020600020905b81548152906001019060200180831161091657829003601f168201915b5050505050905090565b600061094882611bec565b61097e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c482610fe2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4b611a4e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a7d5750610a7b81610a76611a4e565b611848565b155b15610ab4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610abf838383611c3a565b505050565b6000610ace611cec565b6001546000540303905090565b610ae6838383611cf1565b505050565b610af3611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610b116112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e906137d4565b60405180910390fd5b6002600b541415610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613854565b60405180910390fd5b6002600b8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610bdb90613632565b60006040518083038185875af1925050503d8060008114610c18576040519150601f19603f3d011682016040523d82523d6000602084013e610c1d565b606091505b5050905080610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890613814565b60405180910390fd5b506001600b81905550565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610e025760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e0c6121a7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e389190613a3b565b610e429190613a0a565b90508160000151819350935050509250929050565b610e5f611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610e7d6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906137d4565b60405180910390fd5b80600c60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610f4a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16604051610fb79291906136d7565b60405180910390a150565b610fdd83838360405180602001604052806000815250611589565b505050565b6000610fed826121b1565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611060576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110d0611a4e565b73ffffffffffffffffffffffffffffffffffffffff166110ee6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906137d4565b60405180910390fd5b61114e6000612440565b565b611158611a4e565b73ffffffffffffffffffffffffffffffffffffffff166111766112c5565b73ffffffffffffffffffffffffffffffffffffffff16146111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906137d4565b60405180910390fd5b81600d90805190602001906111e2929190612dd2565b5080600e90805190602001906111f9929190612dd2565b507f5544cb0e3017f37e42ff90222f47bb6f1e6ee84c02d7c3d86d40fdd44058b3ee828260405161122b92919061373d565b60405180910390a15050565b600e805461124490613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461127090613b97565b80156112bd5780601f10611292576101008083540402835291602001916112bd565b820191906000526020600020905b8154815290600101906020018083116112a057829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112fe90613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461132a90613b97565b80156113775780601f1061134c57610100808354040283529160200191611377565b820191906000526020600020905b81548152906001019060200180831161135a57829003601f168201915b5050505050905090565b600061138b610ac4565b90506115b3828261139c91906139b4565b11156113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906137b4565b60405180910390fd5b6113e73383612506565b5050565b6113f3611a4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611458576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611465611a4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611512611a4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115579190613700565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611594848484611cf1565b6115b38373ffffffffffffffffffffffffffffffffffffffff16612524565b80156115c857506115c684848484612547565b155b156115ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c60149054906101000a90046bffffffffffffffffffffffff1681565b606061162e82611bec565b61166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906137f4565b60405180910390fd5b60006116776126a7565b9050600081511161169757604051806020016040528060008152506116c5565b806116a184612739565b600e6040516020016116b593929190613601565b6040516020818303038152906040525b915050919050565b6116d5611a4e565b73ffffffffffffffffffffffffffffffffffffffff166116f36112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906137d4565b60405180910390fd5b6000611753610ac4565b90506115b3828261176491906139b4565b11156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613774565b60405180910390fd5b6117af8383612506565b505050565b600d80546117c190613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546117ed90613b97565b801561183a5780601f1061180f5761010080835404028352916020019161183a565b820191906000526020600020905b81548152906001019060200180831161181d57829003601f168201915b505050505081565b6115b381565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118e4611a4e565b73ffffffffffffffffffffffffffffffffffffffff166119026112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906137d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90613794565b60405180910390fd5b6119d181612440565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a475750611a468261289a565b5b9050919050565b600033905090565b611a5e6121a7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613834565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390613874565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611bf7611cec565b11158015611c06575060005482105b8015611c33575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611cfc826121b1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d67576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611d88611a4e565b73ffffffffffffffffffffffffffffffffffffffff161480611db75750611db685611db1611a4e565b611848565b5b80611dfc5750611dc5611a4e565b73ffffffffffffffffffffffffffffffffffffffff16611de48461093d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e35576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e9c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ea9858585600161297c565b611eb560008487611c3a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561213557600054821461213457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a08585856001612982565b5050505050565b6000612710905090565b6121b9612e58565b6000829050806121c7611cec565b111580156121d6575060005481105b15612409576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161240757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122eb57809250505061243b565b5b60011561240657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461240157809250505061243b565b6122ec565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612520828260405180602001604052806000815250612988565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261256d611a4e565b8786866040518563ffffffff1660e01b815260040161258f9493929190613662565b602060405180830381600087803b1580156125a957600080fd5b505af19250505080156125da57506040513d601f19601f820116820180604052508101906125d79190613206565b60015b612654573d806000811461260a576040519150601f19603f3d011682016040523d82523d6000602084013e61260f565b606091505b5060008151141561264c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546126b690613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546126e290613b97565b801561272f5780601f106127045761010080835404028352916020019161272f565b820191906000526020600020905b81548152906001019060200180831161271257829003601f168201915b5050505050905090565b60606000821415612781576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612895565b600082905060005b600082146127b357808061279c90613bfa565b915050600a826127ac9190613a0a565b9150612789565b60008167ffffffffffffffff8111156127cf576127ce613d30565b5b6040519080825280601f01601f1916602001820160405280156128015781602001600182028036833780820191505090505b5090505b6000851461288e5760018261281a9190613a95565b9150600a856128299190613c43565b603061283591906139b4565b60f81b81838151811061284b5761284a613d01565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128879190613a0a565b9450612805565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061296557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061297557506129748261299a565b5b9050919050565b50505050565b50505050565b6129958383836001612a04565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a71576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612aac576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab9600086838761297c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c835750612c828773ffffffffffffffffffffffffffffffffffffffff16612524565b5b15612d49575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf86000888480600101955088612547565b612d2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c89578260005414612d4457600080fd5b612db5565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d4a575b816000819055505050612dcb6000868387612982565b5050505050565b828054612dde90613b97565b90600052602060002090601f016020900481019282612e005760008555612e47565b82601f10612e1957805160ff1916838001178555612e47565b82800160010185558215612e47579182015b82811115612e46578251825591602001919060010190612e2b565b5b509050612e549190612e9b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612eb4576000816000905550600101612e9c565b5090565b6000612ecb612ec6846138ef565b6138ca565b905082815260208101848484011115612ee757612ee6613d64565b5b612ef2848285613b55565b509392505050565b6000612f0d612f0884613920565b6138ca565b905082815260208101848484011115612f2957612f28613d64565b5b612f34848285613b55565b509392505050565b600081359050612f4b81613f6a565b92915050565b600081359050612f6081613f81565b92915050565b600081359050612f7581613f98565b92915050565b600081519050612f8a81613f98565b92915050565b600082601f830112612fa557612fa4613d5f565b5b8135612fb5848260208601612eb8565b91505092915050565b600082601f830112612fd357612fd2613d5f565b5b8135612fe3848260208601612efa565b91505092915050565b600081359050612ffb81613faf565b92915050565b60008135905061301081613fc6565b92915050565b60006020828403121561302c5761302b613d6e565b5b600061303a84828501612f3c565b91505092915050565b6000806040838503121561305a57613059613d6e565b5b600061306885828601612f3c565b925050602061307985828601612f3c565b9150509250929050565b60008060006060848603121561309c5761309b613d6e565b5b60006130aa86828701612f3c565b93505060206130bb86828701612f3c565b92505060406130cc86828701612fec565b9150509250925092565b600080600080608085870312156130f0576130ef613d6e565b5b60006130fe87828801612f3c565b945050602061310f87828801612f3c565b935050604061312087828801612fec565b925050606085013567ffffffffffffffff81111561314157613140613d69565b5b61314d87828801612f90565b91505092959194509250565b600080604083850312156131705761316f613d6e565b5b600061317e85828601612f3c565b925050602061318f85828601612f51565b9150509250929050565b600080604083850312156131b0576131af613d6e565b5b60006131be85828601612f3c565b92505060206131cf85828601612fec565b9150509250929050565b6000602082840312156131ef576131ee613d6e565b5b60006131fd84828501612f66565b91505092915050565b60006020828403121561321c5761321b613d6e565b5b600061322a84828501612f7b565b91505092915050565b6000806040838503121561324a57613249613d6e565b5b600083013567ffffffffffffffff81111561326857613267613d69565b5b61327485828601612fbe565b925050602083013567ffffffffffffffff81111561329557613294613d69565b5b6132a185828601612fbe565b9150509250929050565b6000602082840312156132c1576132c0613d6e565b5b60006132cf84828501612fec565b91505092915050565b600080604083850312156132ef576132ee613d6e565b5b60006132fd85828601612fec565b925050602061330e85828601612fec565b9150509250929050565b60006020828403121561332e5761332d613d6e565b5b600061333c84828501613001565b91505092915050565b61334e81613ac9565b82525050565b61335d81613adb565b82525050565b600061336e82613966565b613378818561397c565b9350613388818560208601613b64565b61339181613d73565b840191505092915050565b60006133a782613971565b6133b18185613998565b93506133c1818560208601613b64565b6133ca81613d73565b840191505092915050565b60006133e082613971565b6133ea81856139a9565b93506133fa818560208601613b64565b80840191505092915050565b6000815461341381613b97565b61341d81866139a9565b9450600182166000811461343857600181146134495761347c565b60ff1983168652818601935061347c565b61345285613951565b60005b8381101561347457815481890152600182019150602081019050613455565b838801955050505b50505092915050565b6000613492601283613998565b915061349d82613d84565b602082019050919050565b60006134b5602683613998565b91506134c082613dad565b604082019050919050565b60006134d8601283613998565b91506134e382613dfc565b602082019050919050565b60006134fb602083613998565b915061350682613e25565b602082019050919050565b600061351e602f83613998565b915061352982613e4e565b604082019050919050565b600061354160008361398d565b915061354c82613e9d565b600082019050919050565b6000613564601083613998565b915061356f82613ea0565b602082019050919050565b6000613587602a83613998565b915061359282613ec9565b604082019050919050565b60006135aa601f83613998565b91506135b582613f18565b602082019050919050565b60006135cd601983613998565b91506135d882613f41565b602082019050919050565b6135ec81613b33565b82525050565b6135fb81613b3d565b82525050565b600061360d82866133d5565b915061361982856133d5565b91506136258284613406565b9150819050949350505050565b600061363d82613534565b9150819050919050565b600060208201905061365c6000830184613345565b92915050565b60006080820190506136776000830187613345565b6136846020830186613345565b61369160408301856135e3565b81810360608301526136a38184613363565b905095945050505050565b60006040820190506136c36000830185613345565b6136d060208301846135e3565b9392505050565b60006040820190506136ec6000830185613345565b6136f960208301846135f2565b9392505050565b60006020820190506137156000830184613354565b92915050565b60006020820190508181036000830152613735818461339c565b905092915050565b60006040820190508181036000830152613757818561339c565b9050818103602083015261376b818461339c565b90509392505050565b6000602082019050818103600083015261378d81613485565b9050919050565b600060208201905081810360008301526137ad816134a8565b9050919050565b600060208201905081810360008301526137cd816134cb565b9050919050565b600060208201905081810360008301526137ed816134ee565b9050919050565b6000602082019050818103600083015261380d81613511565b9050919050565b6000602082019050818103600083015261382d81613557565b9050919050565b6000602082019050818103600083015261384d8161357a565b9050919050565b6000602082019050818103600083015261386d8161359d565b9050919050565b6000602082019050818103600083015261388d816135c0565b9050919050565b60006020820190506138a960008301846135e3565b92915050565b60006020820190506138c460008301846135f2565b92915050565b60006138d46138e5565b90506138e08282613bc9565b919050565b6000604051905090565b600067ffffffffffffffff82111561390a57613909613d30565b5b61391382613d73565b9050602081019050919050565b600067ffffffffffffffff82111561393b5761393a613d30565b5b61394482613d73565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139bf82613b33565b91506139ca83613b33565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139ff576139fe613c74565b5b828201905092915050565b6000613a1582613b33565b9150613a2083613b33565b925082613a3057613a2f613ca3565b5b828204905092915050565b6000613a4682613b33565b9150613a5183613b33565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8a57613a89613c74565b5b828202905092915050565b6000613aa082613b33565b9150613aab83613b33565b925082821015613abe57613abd613c74565b5b828203905092915050565b6000613ad482613b13565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613b82578082015181840152602081019050613b67565b83811115613b91576000848401525b50505050565b60006002820490506001821680613baf57607f821691505b60208210811415613bc357613bc2613cd2565b5b50919050565b613bd282613d73565b810181811067ffffffffffffffff82111715613bf157613bf0613d30565b5b80604052505050565b6000613c0582613b33565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c3857613c37613c74565b5b600182019050919050565b6000613c4e82613b33565b9150613c5983613b33565b925082613c6957613c68613ca3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473204d617820537570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b613f7381613ac9565b8114613f7e57600080fd5b50565b613f8a81613adb565b8114613f9557600080fd5b50565b613fa181613ae7565b8114613fac57600080fd5b50565b613fb881613b33565b8114613fc357600080fd5b50565b613fcf81613b3d565b8114613fda57600080fd5b5056fea26469706673582212209e46302eeb60a0b9cfcf9acee88a6797288b916c8ce407ab19e0b82cf91ca88a64736f6c63430008070033697066733a2f2f516d5650794136546679715839346d377934753135396b613776626953684233555856435a5379644d704b5572632f
Deployed Bytecode
0x6080604052600436106101c65760003560e01c8063783fd922116100f7578063b88d4fde11610095578063cfc86f7b11610064578063cfc86f7b14610662578063d5abeb011461068d578063e985e9c5146106b8578063f2fde38b146106f557610206565b8063b88d4fde146105a8578063b8997a97146105d1578063c87b56dd146105fc578063cbce4c971461063957610206565b806395d89b41116100d157806395d89b411461050d578063a0712d6814610538578063a22cb46514610554578063ad2f852a1461057d57610206565b8063783fd9221461048e57806385fee168146104b75780638da5cb5b146104e257610206565b806324600fc31161016457806342842e0e1161013e57806342842e0e146103d45780636352211e146103fd57806370a082311461043a578063715018a61461047757610206565b806324600fc3146103565780632a55205a1461036d57806331faafb4146103ab57610206565b8063081812fc116101a0578063081812fc1461029c578063095ea7b3146102d957806318160ddd1461030257806323b872dd1461032d57610206565b806301ffc9a71461020b57806306d254da1461024857806306fdde031461027157610206565b36610206577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516101fc9291906136ae565b60405180910390a1005b600080fd5b34801561021757600080fd5b50610232600480360381019061022d91906131d9565b61071e565b60405161023f9190613700565b60405180910390f35b34801561025457600080fd5b5061026f600480360381019061026a9190613016565b610730565b005b34801561027d57600080fd5b506102866108ab565b604051610293919061371b565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be91906132ab565b61093d565b6040516102d09190613647565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190613199565b6109b9565b005b34801561030e57600080fd5b50610317610ac4565b6040516103249190613894565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613083565b610adb565b005b34801561036257600080fd5b5061036b610aeb565b005b34801561037957600080fd5b50610394600480360381019061038f91906132d8565b610c6c565b6040516103a29291906136ae565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613318565b610e57565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613083565b610fc2565b005b34801561040957600080fd5b50610424600480360381019061041f91906132ab565b610fe2565b6040516104319190613647565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613016565b610ff8565b60405161046e9190613894565b60405180910390f35b34801561048357600080fd5b5061048c6110c8565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613233565b611150565b005b3480156104c357600080fd5b506104cc611237565b6040516104d9919061371b565b60405180910390f35b3480156104ee57600080fd5b506104f76112c5565b6040516105049190613647565b60405180910390f35b34801561051957600080fd5b506105226112ef565b60405161052f919061371b565b60405180910390f35b610552600480360381019061054d91906132ab565b611381565b005b34801561056057600080fd5b5061057b60048036038101906105769190613159565b6113eb565b005b34801561058957600080fd5b50610592611563565b60405161059f9190613647565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca91906130d6565b611589565b005b3480156105dd57600080fd5b506105e6611605565b6040516105f391906138af565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906132ab565b611623565b604051610630919061371b565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613199565b6116cd565b005b34801561066e57600080fd5b506106776117b4565b604051610684919061371b565b60405180910390f35b34801561069957600080fd5b506106a2611842565b6040516106af9190613894565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613043565b611848565b6040516106ec9190613700565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190613016565b6118dc565b005b6000610729826119d4565b9050919050565b610738611a4e565b73ffffffffffffffffffffffffffffffffffffffff166107566112c5565b73ffffffffffffffffffffffffffffffffffffffff16146107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a3906137d4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610833600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff166040516108a09291906136d7565b60405180910390a150565b6060600280546108ba90613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546108e690613b97565b80156109335780601f1061090857610100808354040283529160200191610933565b820191906000526020600020905b81548152906001019060200180831161091657829003601f168201915b5050505050905090565b600061094882611bec565b61097e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c482610fe2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4b611a4e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a7d5750610a7b81610a76611a4e565b611848565b155b15610ab4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610abf838383611c3a565b505050565b6000610ace611cec565b6001546000540303905090565b610ae6838383611cf1565b505050565b610af3611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610b116112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e906137d4565b60405180910390fd5b6002600b541415610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613854565b60405180910390fd5b6002600b8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610bdb90613632565b60006040518083038185875af1925050503d8060008114610c18576040519150601f19603f3d011682016040523d82523d6000602084013e610c1d565b606091505b5050905080610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890613814565b60405180910390fd5b506001600b81905550565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610e025760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e0c6121a7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e389190613a3b565b610e429190613a0a565b90508160000151819350935050509250929050565b610e5f611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610e7d6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906137d4565b60405180910390fd5b80600c60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610f4a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16604051610fb79291906136d7565b60405180910390a150565b610fdd83838360405180602001604052806000815250611589565b505050565b6000610fed826121b1565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611060576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110d0611a4e565b73ffffffffffffffffffffffffffffffffffffffff166110ee6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906137d4565b60405180910390fd5b61114e6000612440565b565b611158611a4e565b73ffffffffffffffffffffffffffffffffffffffff166111766112c5565b73ffffffffffffffffffffffffffffffffffffffff16146111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906137d4565b60405180910390fd5b81600d90805190602001906111e2929190612dd2565b5080600e90805190602001906111f9929190612dd2565b507f5544cb0e3017f37e42ff90222f47bb6f1e6ee84c02d7c3d86d40fdd44058b3ee828260405161122b92919061373d565b60405180910390a15050565b600e805461124490613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461127090613b97565b80156112bd5780601f10611292576101008083540402835291602001916112bd565b820191906000526020600020905b8154815290600101906020018083116112a057829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112fe90613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461132a90613b97565b80156113775780601f1061134c57610100808354040283529160200191611377565b820191906000526020600020905b81548152906001019060200180831161135a57829003601f168201915b5050505050905090565b600061138b610ac4565b90506115b3828261139c91906139b4565b11156113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906137b4565b60405180910390fd5b6113e73383612506565b5050565b6113f3611a4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611458576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611465611a4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611512611a4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115579190613700565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611594848484611cf1565b6115b38373ffffffffffffffffffffffffffffffffffffffff16612524565b80156115c857506115c684848484612547565b155b156115ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c60149054906101000a90046bffffffffffffffffffffffff1681565b606061162e82611bec565b61166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906137f4565b60405180910390fd5b60006116776126a7565b9050600081511161169757604051806020016040528060008152506116c5565b806116a184612739565b600e6040516020016116b593929190613601565b6040516020818303038152906040525b915050919050565b6116d5611a4e565b73ffffffffffffffffffffffffffffffffffffffff166116f36112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906137d4565b60405180910390fd5b6000611753610ac4565b90506115b3828261176491906139b4565b11156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613774565b60405180910390fd5b6117af8383612506565b505050565b600d80546117c190613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546117ed90613b97565b801561183a5780601f1061180f5761010080835404028352916020019161183a565b820191906000526020600020905b81548152906001019060200180831161181d57829003601f168201915b505050505081565b6115b381565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118e4611a4e565b73ffffffffffffffffffffffffffffffffffffffff166119026112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906137d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90613794565b60405180910390fd5b6119d181612440565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a475750611a468261289a565b5b9050919050565b600033905090565b611a5e6121a7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613834565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390613874565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611bf7611cec565b11158015611c06575060005482105b8015611c33575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611cfc826121b1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d67576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611d88611a4e565b73ffffffffffffffffffffffffffffffffffffffff161480611db75750611db685611db1611a4e565b611848565b5b80611dfc5750611dc5611a4e565b73ffffffffffffffffffffffffffffffffffffffff16611de48461093d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e35576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e9c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ea9858585600161297c565b611eb560008487611c3a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561213557600054821461213457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a08585856001612982565b5050505050565b6000612710905090565b6121b9612e58565b6000829050806121c7611cec565b111580156121d6575060005481105b15612409576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161240757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122eb57809250505061243b565b5b60011561240657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461240157809250505061243b565b6122ec565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612520828260405180602001604052806000815250612988565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261256d611a4e565b8786866040518563ffffffff1660e01b815260040161258f9493929190613662565b602060405180830381600087803b1580156125a957600080fd5b505af19250505080156125da57506040513d601f19601f820116820180604052508101906125d79190613206565b60015b612654573d806000811461260a576040519150601f19603f3d011682016040523d82523d6000602084013e61260f565b606091505b5060008151141561264c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546126b690613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546126e290613b97565b801561272f5780601f106127045761010080835404028352916020019161272f565b820191906000526020600020905b81548152906001019060200180831161271257829003601f168201915b5050505050905090565b60606000821415612781576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612895565b600082905060005b600082146127b357808061279c90613bfa565b915050600a826127ac9190613a0a565b9150612789565b60008167ffffffffffffffff8111156127cf576127ce613d30565b5b6040519080825280601f01601f1916602001820160405280156128015781602001600182028036833780820191505090505b5090505b6000851461288e5760018261281a9190613a95565b9150600a856128299190613c43565b603061283591906139b4565b60f81b81838151811061284b5761284a613d01565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128879190613a0a565b9450612805565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061296557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061297557506129748261299a565b5b9050919050565b50505050565b50505050565b6129958383836001612a04565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a71576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612aac576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab9600086838761297c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c835750612c828773ffffffffffffffffffffffffffffffffffffffff16612524565b5b15612d49575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf86000888480600101955088612547565b612d2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c89578260005414612d4457600080fd5b612db5565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d4a575b816000819055505050612dcb6000868387612982565b5050505050565b828054612dde90613b97565b90600052602060002090601f016020900481019282612e005760008555612e47565b82601f10612e1957805160ff1916838001178555612e47565b82800160010185558215612e47579182015b82811115612e46578251825591602001919060010190612e2b565b5b509050612e549190612e9b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612eb4576000816000905550600101612e9c565b5090565b6000612ecb612ec6846138ef565b6138ca565b905082815260208101848484011115612ee757612ee6613d64565b5b612ef2848285613b55565b509392505050565b6000612f0d612f0884613920565b6138ca565b905082815260208101848484011115612f2957612f28613d64565b5b612f34848285613b55565b509392505050565b600081359050612f4b81613f6a565b92915050565b600081359050612f6081613f81565b92915050565b600081359050612f7581613f98565b92915050565b600081519050612f8a81613f98565b92915050565b600082601f830112612fa557612fa4613d5f565b5b8135612fb5848260208601612eb8565b91505092915050565b600082601f830112612fd357612fd2613d5f565b5b8135612fe3848260208601612efa565b91505092915050565b600081359050612ffb81613faf565b92915050565b60008135905061301081613fc6565b92915050565b60006020828403121561302c5761302b613d6e565b5b600061303a84828501612f3c565b91505092915050565b6000806040838503121561305a57613059613d6e565b5b600061306885828601612f3c565b925050602061307985828601612f3c565b9150509250929050565b60008060006060848603121561309c5761309b613d6e565b5b60006130aa86828701612f3c565b93505060206130bb86828701612f3c565b92505060406130cc86828701612fec565b9150509250925092565b600080600080608085870312156130f0576130ef613d6e565b5b60006130fe87828801612f3c565b945050602061310f87828801612f3c565b935050604061312087828801612fec565b925050606085013567ffffffffffffffff81111561314157613140613d69565b5b61314d87828801612f90565b91505092959194509250565b600080604083850312156131705761316f613d6e565b5b600061317e85828601612f3c565b925050602061318f85828601612f51565b9150509250929050565b600080604083850312156131b0576131af613d6e565b5b60006131be85828601612f3c565b92505060206131cf85828601612fec565b9150509250929050565b6000602082840312156131ef576131ee613d6e565b5b60006131fd84828501612f66565b91505092915050565b60006020828403121561321c5761321b613d6e565b5b600061322a84828501612f7b565b91505092915050565b6000806040838503121561324a57613249613d6e565b5b600083013567ffffffffffffffff81111561326857613267613d69565b5b61327485828601612fbe565b925050602083013567ffffffffffffffff81111561329557613294613d69565b5b6132a185828601612fbe565b9150509250929050565b6000602082840312156132c1576132c0613d6e565b5b60006132cf84828501612fec565b91505092915050565b600080604083850312156132ef576132ee613d6e565b5b60006132fd85828601612fec565b925050602061330e85828601612fec565b9150509250929050565b60006020828403121561332e5761332d613d6e565b5b600061333c84828501613001565b91505092915050565b61334e81613ac9565b82525050565b61335d81613adb565b82525050565b600061336e82613966565b613378818561397c565b9350613388818560208601613b64565b61339181613d73565b840191505092915050565b60006133a782613971565b6133b18185613998565b93506133c1818560208601613b64565b6133ca81613d73565b840191505092915050565b60006133e082613971565b6133ea81856139a9565b93506133fa818560208601613b64565b80840191505092915050565b6000815461341381613b97565b61341d81866139a9565b9450600182166000811461343857600181146134495761347c565b60ff1983168652818601935061347c565b61345285613951565b60005b8381101561347457815481890152600182019150602081019050613455565b838801955050505b50505092915050565b6000613492601283613998565b915061349d82613d84565b602082019050919050565b60006134b5602683613998565b91506134c082613dad565b604082019050919050565b60006134d8601283613998565b91506134e382613dfc565b602082019050919050565b60006134fb602083613998565b915061350682613e25565b602082019050919050565b600061351e602f83613998565b915061352982613e4e565b604082019050919050565b600061354160008361398d565b915061354c82613e9d565b600082019050919050565b6000613564601083613998565b915061356f82613ea0565b602082019050919050565b6000613587602a83613998565b915061359282613ec9565b604082019050919050565b60006135aa601f83613998565b91506135b582613f18565b602082019050919050565b60006135cd601983613998565b91506135d882613f41565b602082019050919050565b6135ec81613b33565b82525050565b6135fb81613b3d565b82525050565b600061360d82866133d5565b915061361982856133d5565b91506136258284613406565b9150819050949350505050565b600061363d82613534565b9150819050919050565b600060208201905061365c6000830184613345565b92915050565b60006080820190506136776000830187613345565b6136846020830186613345565b61369160408301856135e3565b81810360608301526136a38184613363565b905095945050505050565b60006040820190506136c36000830185613345565b6136d060208301846135e3565b9392505050565b60006040820190506136ec6000830185613345565b6136f960208301846135f2565b9392505050565b60006020820190506137156000830184613354565b92915050565b60006020820190508181036000830152613735818461339c565b905092915050565b60006040820190508181036000830152613757818561339c565b9050818103602083015261376b818461339c565b90509392505050565b6000602082019050818103600083015261378d81613485565b9050919050565b600060208201905081810360008301526137ad816134a8565b9050919050565b600060208201905081810360008301526137cd816134cb565b9050919050565b600060208201905081810360008301526137ed816134ee565b9050919050565b6000602082019050818103600083015261380d81613511565b9050919050565b6000602082019050818103600083015261382d81613557565b9050919050565b6000602082019050818103600083015261384d8161357a565b9050919050565b6000602082019050818103600083015261386d8161359d565b9050919050565b6000602082019050818103600083015261388d816135c0565b9050919050565b60006020820190506138a960008301846135e3565b92915050565b60006020820190506138c460008301846135f2565b92915050565b60006138d46138e5565b90506138e08282613bc9565b919050565b6000604051905090565b600067ffffffffffffffff82111561390a57613909613d30565b5b61391382613d73565b9050602081019050919050565b600067ffffffffffffffff82111561393b5761393a613d30565b5b61394482613d73565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139bf82613b33565b91506139ca83613b33565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139ff576139fe613c74565b5b828201905092915050565b6000613a1582613b33565b9150613a2083613b33565b925082613a3057613a2f613ca3565b5b828204905092915050565b6000613a4682613b33565b9150613a5183613b33565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8a57613a89613c74565b5b828202905092915050565b6000613aa082613b33565b9150613aab83613b33565b925082821015613abe57613abd613c74565b5b828203905092915050565b6000613ad482613b13565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613b82578082015181840152602081019050613b67565b83811115613b91576000848401525b50505050565b60006002820490506001821680613baf57607f821691505b60208210811415613bc357613bc2613cd2565b5b50919050565b613bd282613d73565b810181811067ffffffffffffffff82111715613bf157613bf0613d30565b5b80604052505050565b6000613c0582613b33565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c3857613c37613c74565b5b600182019050919050565b6000613c4e82613b33565b9150613c5983613b33565b925082613c6957613c68613ca3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473204d617820537570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b613f7381613ac9565b8114613f7e57600080fd5b50565b613f8a81613adb565b8114613f9557600080fd5b50565b613fa181613ae7565b8114613fac57600080fd5b50565b613fb881613b33565b8114613fc357600080fd5b50565b613fcf81613b3d565b8114613fda57600080fd5b5056fea26469706673582212209e46302eeb60a0b9cfcf9acee88a6797288b916c8ce407ab19e0b82cf91ca88a64736f6c63430008070033
Deployed Bytecode Sourcemap
52678:3548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56171:30;56180:10;56191:9;56171:30;;;;;;;:::i;:::-;;;;;;;;52678:3548;;;;;55681:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55189:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37977:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39480:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39043:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34113:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40345:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55482:191;;;;;;;;;;;;;:::i;:::-;;22363:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;54868:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40586:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37785:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35233:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7489:103;;;;;;;;;;;;;:::i;:::-;;54235:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53125:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38146:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53360:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39756:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52852:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40842:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52967:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53785:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54528:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53019:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52782:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40114:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55681:204;55812:4;55841:36;55865:11;55841:23;:36::i;:::-;55834:43;;55681:204;;;:::o;55189:234::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55288:15:::1;55271:14;;:32;;;;;;;;;;;;;;;;;;55314:46;55333:14;;;;;;;;;;;55349:10;;;;;;;;;;;55314:18;:46::i;:::-;55376:39;55388:14;;;;;;;;;;;55404:10;;;;;;;;;;;55376:39;;;;;;;:::i;:::-;;;;;;;;55189:234:::0;:::o;37977:100::-;38031:13;38064:5;38057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37977:100;:::o;39480:204::-;39548:7;39573:16;39581:7;39573;:16::i;:::-;39568:64;;39598:34;;;;;;;;;;;;;;39568:64;39652:15;:24;39668:7;39652:24;;;;;;;;;;;;;;;;;;;;;39645:31;;39480:204;;;:::o;39043:371::-;39116:13;39132:24;39148:7;39132:15;:24::i;:::-;39116:40;;39177:5;39171:11;;:2;:11;;;39167:48;;;39191:24;;;;;;;;;;;;;;39167:48;39248:5;39232:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;39258:37;39275:5;39282:12;:10;:12::i;:::-;39258:16;:37::i;:::-;39257:38;39232:63;39228:138;;;39319:35;;;;;;;;;;;;;;39228:138;39378:28;39387:2;39391:7;39400:5;39378:8;:28::i;:::-;39105:309;39043:371;;:::o;34113:303::-;34157:7;34382:15;:13;:15::i;:::-;34367:12;;34351:13;;:28;:46;34344:53;;34113:303;:::o;40345:170::-;40479:28;40489:4;40495:2;40499:7;40479:9;:28::i;:::-;40345:170;;;:::o;55482:191::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;55551:12:::2;55569:10;:15;;55592:21;55569:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55550:68;;;55637:7;55629:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;55539:134;1768:1:::1;2722:7;:22;;;;55482:191::o:0;22363:442::-;22460:7;22469;22489:26;22518:17;:27;22536:8;22518:27;;;;;;;;;;;22489:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22590:1;22562:30;;:7;:16;;;:30;;;22558:92;;;22619:19;22609:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22558:92;22662:21;22727:17;:15;:17::i;:::-;22686:58;;22700:7;:23;;;22687:36;;:10;:36;;;;:::i;:::-;22686:58;;;;:::i;:::-;22662:82;;22765:7;:16;;;22783:13;22757:40;;;;;;22363:442;;;;;:::o;54868:221::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54956:13:::1;54943:10;;:26;;;;;;;;;;;;;;;;;;54980:46;54999:14;;;;;;;;;;;55015:10;;;;;;;;;;;54980:18;:46::i;:::-;55042:39;55054:14;;;;;;;;;;;55070:10;;;;;;;;;;;55042:39;;;;;;;:::i;:::-;;;;;;;;54868:221:::0;:::o;40586:185::-;40724:39;40741:4;40747:2;40751:7;40724:39;;;;;;;;;;;;:16;:39::i;:::-;40586:185;;;:::o;37785:125::-;37849:7;37876:21;37889:7;37876:12;:21::i;:::-;:26;;;37869:33;;37785:125;;;:::o;35233:206::-;35297:7;35338:1;35321:19;;:5;:19;;;35317:60;;;35349:28;;;;;;;;;;;;;;35317:60;35403:12;:19;35416:5;35403:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;35395:36;;35388:43;;35233:206;;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;54235:213::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54352:5:::1;54336:13;:21;;;;;;;;;;;;:::i;:::-;;54384:9;54368:13;:25;;;;;;;;;;;;:::i;:::-;;54409:31;54423:5;54430:9;54409:31;;;;;;;:::i;:::-;;;;;;;;54235:213:::0;;:::o;53125:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;38146:104::-;38202:13;38235:7;38228:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38146:104;:::o;53360:222::-;53423:14;53440:13;:11;:13::i;:::-;53423:30;;52818:4;53481:11;53472:6;:20;;;;:::i;:::-;:33;;53464:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53540:34;53550:10;53562:11;53540:9;:34::i;:::-;53412:170;53360:222;:::o;39756:287::-;39867:12;:10;:12::i;:::-;39855:24;;:8;:24;;;39851:54;;;39888:17;;;;;;;;;;;;;;39851:54;39963:8;39918:18;:32;39937:12;:10;:12::i;:::-;39918:32;;;;;;;;;;;;;;;:42;39951:8;39918:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40016:8;39987:48;;40002:12;:10;:12::i;:::-;39987:48;;;40026:8;39987:48;;;;;;:::i;:::-;;;;;;;;39756:287;;:::o;52852:74::-;;;;;;;;;;;;;:::o;40842:369::-;41009:28;41019:4;41025:2;41029:7;41009:9;:28::i;:::-;41052:15;:2;:13;;;:15::i;:::-;:76;;;;;41072:56;41103:4;41109:2;41113:7;41122:5;41072:30;:56::i;:::-;41071:57;41052:76;41048:156;;;41152:40;;;;;;;;;;;;;;41048:156;40842:369;;;;:::o;52967:31::-;;;;;;;;;;;;;:::o;53785:385::-;53858:13;53892:16;53900:7;53892;:16::i;:::-;53884:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53975:28;54006:10;:8;:10::i;:::-;53975:41;;54069:1;54044:14;54038:28;:32;:114;;;;;;;;;;;;;;;;;54097:14;54113:18;:7;:16;:18::i;:::-;54132:13;54080:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54038:114;54031:121;;;53785:385;;;:::o;54528:229::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54606:14:::1;54623:13;:11;:13::i;:::-;54606:30;;52818:4;54664:11;54655:6;:20;;;;:::i;:::-;:33;;54647:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54722:27;54732:3;54737:11;54722:9;:27::i;:::-;54595:162;54528:229:::0;;:::o;53019:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52782:40::-;52818:4;52782:40;:::o;40114:164::-;40211:4;40235:18;:25;40254:5;40235:25;;;;;;;;;;;;;;;:35;40261:8;40235:35;;;;;;;;;;;;;;;;;;;;;;;;;40228:42;;40114:164;;;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;22093:215::-;22195:4;22234:26;22219:41;;;:11;:41;;;;:81;;;;22264:36;22288:11;22264:23;:36::i;:::-;22219:81;22212:88;;22093:215;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;23455:332::-;23574:17;:15;:17::i;:::-;23558:33;;:12;:33;;;;23550:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;23677:1;23657:22;;:8;:22;;;;23649:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23744:35;;;;;;;;23756:8;23744:35;;;;;;23766:12;23744:35;;;;;23722:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23455:332;;:::o;41466:174::-;41523:4;41566:7;41547:15;:13;:15::i;:::-;:26;;:53;;;;;41587:13;;41577:7;:23;41547:53;:85;;;;;41605:11;:20;41617:7;41605:20;;;;;;;;;;;:27;;;;;;;;;;;;41604:28;41547:85;41540:92;;41466:174;;;:::o;49623:196::-;49765:2;49738:15;:24;49754:7;49738:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49803:7;49799:2;49783:28;;49792:5;49783:28;;;;;;;;;;;;49623:196;;;:::o;33887:92::-;33943:7;33887:92;:::o;44566:2130::-;44681:35;44719:21;44732:7;44719:12;:21::i;:::-;44681:59;;44779:4;44757:26;;:13;:18;;;:26;;;44753:67;;44792:28;;;;;;;;;;;;;;44753:67;44833:22;44875:4;44859:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;44896:36;44913:4;44919:12;:10;:12::i;:::-;44896:16;:36::i;:::-;44859:73;:126;;;;44973:12;:10;:12::i;:::-;44949:36;;:20;44961:7;44949:11;:20::i;:::-;:36;;;44859:126;44833:153;;45004:17;44999:66;;45030:35;;;;;;;;;;;;;;44999:66;45094:1;45080:16;;:2;:16;;;45076:52;;;45105:23;;;;;;;;;;;;;;45076:52;45141:43;45163:4;45169:2;45173:7;45182:1;45141:21;:43::i;:::-;45249:35;45266:1;45270:7;45279:4;45249:8;:35::i;:::-;45610:1;45580:12;:18;45593:4;45580:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45654:1;45626:12;:16;45639:2;45626:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45672:31;45706:11;:20;45718:7;45706:20;;;;;;;;;;;45672:54;;45757:2;45741:8;:13;;;:18;;;;;;;;;;;;;;;;;;45807:15;45774:8;:23;;;:49;;;;;;;;;;;;;;;;;;46075:19;46107:1;46097:7;:11;46075:33;;46123:31;46157:11;:24;46169:11;46157:24;;;;;;;;;;;46123:58;;46225:1;46200:27;;:8;:13;;;;;;;;;;;;:27;;;46196:384;;;46410:13;;46395:11;:28;46391:174;;46464:4;46448:8;:13;;;:20;;;;;;;;;;;;;;;;;;46517:13;:28;;;46491:8;:23;;;:54;;;;;;;;;;;;;;;;;;46391:174;46196:384;45555:1036;;;46627:7;46623:2;46608:27;;46617:4;46608:27;;;;;;;;;;;;46646:42;46667:4;46673:2;46677:7;46686:1;46646:20;:42::i;:::-;44670:2026;;44566:2130;;;:::o;23087:97::-;23145:6;23171:5;23164:12;;23087:97;:::o;36614:1109::-;36676:21;;:::i;:::-;36710:12;36725:7;36710:22;;36793:4;36774:15;:13;:15::i;:::-;:23;;:47;;;;;36808:13;;36801:4;:20;36774:47;36770:886;;;36842:31;36876:11;:17;36888:4;36876:17;;;;;;;;;;;36842:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36917:9;:16;;;36912:729;;36988:1;36962:28;;:9;:14;;;:28;;;36958:101;;37026:9;37019:16;;;;;;36958:101;37361:261;37368:4;37361:261;;;37401:6;;;;;;;;37446:11;:17;37458:4;37446:17;;;;;;;;;;;37434:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37520:1;37494:28;;:9;:14;;;:28;;;37490:109;;37562:9;37555:16;;;;;;37490:109;37361:261;;;36912:729;36823:833;36770:886;37684:31;;;;;;;;;;;;;;36614:1109;;;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8171:128;8108:191;:::o;41648:104::-;41717:27;41727:2;41731:8;41717:27;;;;;;;;;;;;:9;:27::i;:::-;41648:104;;:::o;9539:326::-;9599:4;9856:1;9834:7;:19;;;:23;9827:30;;9539:326;;;:::o;50311:667::-;50474:4;50511:2;50495:36;;;50532:12;:10;:12::i;:::-;50546:4;50552:7;50561:5;50495:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50491:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50746:1;50729:6;:13;:18;50725:235;;;50775:40;;;;;;;;;;;;;;50725:235;50918:6;50912:13;50903:6;50899:2;50895:15;50888:38;50491:480;50624:45;;;50614:55;;;:6;:55;;;;50607:62;;;50311:667;;;;;;:::o;53595:114::-;53655:13;53688;53681:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53595:114;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;34864:305::-;34966:4;35018:25;35003:40;;;:11;:40;;;;:105;;;;35075:33;35060:48;;;:11;:48;;;;35003:105;:158;;;;35125:36;35149:11;35125:23;:36::i;:::-;35003:158;34983:178;;34864:305;;;:::o;51626:159::-;;;;;:::o;52444:158::-;;;;;:::o;42115:163::-;42238:32;42244:2;42248:8;42258:5;42265:4;42238:5;:32::i;:::-;42115:163;;;:::o;20543:157::-;20628:4;20667:25;20652:40;;;:11;:40;;;;20645:47;;20543:157;;;:::o;42537:1775::-;42676:20;42699:13;;42676:36;;42741:1;42727:16;;:2;:16;;;42723:48;;;42752:19;;;;;;;;;;;;;;42723:48;42798:1;42786:8;:13;42782:44;;;42808:18;;;;;;;;;;;;;;42782:44;42839:61;42869:1;42873:2;42877:12;42891:8;42839:21;:61::i;:::-;43212:8;43177:12;:16;43190:2;43177:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43276:8;43236:12;:16;43249:2;43236:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43335:2;43302:11;:25;43314:12;43302:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43402:15;43352:11;:25;43364:12;43352:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;43435:20;43458:12;43435:35;;43485:11;43514:8;43499:12;:23;43485:37;;43543:4;:23;;;;;43551:15;:2;:13;;;:15::i;:::-;43543:23;43539:641;;;43587:314;43643:12;43639:2;43618:38;;43635:1;43618:38;;;;;;;;;;;;43684:69;43723:1;43727:2;43731:14;;;;;;43747:5;43684:30;:69::i;:::-;43679:174;;43789:40;;;;;;;;;;;;;;43679:174;43896:3;43880:12;:19;;43587:314;;43982:12;43965:13;;:29;43961:43;;43996:8;;;43961:43;43539:641;;;44045:120;44101:14;;;;;;44097:2;44076:40;;44093:1;44076:40;;;;;;;;;;;;44160:3;44144:12;:19;;44045:120;;43539:641;44210:12;44194:13;:28;;;;43152:1082;;44244:60;44273:1;44277:2;44281:12;44295:8;44244:20;:60::i;:::-;42665:1647;42537:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:137::-;2322:5;2360:6;2347:20;2338:29;;2376:32;2402:5;2376:32;:::i;:::-;2277:137;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:327::-;5821:6;5870:2;5858:9;5849:7;5845:23;5841:32;5838:119;;;5876:79;;:::i;:::-;5838:119;5996:1;6021:52;6065:7;6056:6;6045:9;6041:22;6021:52;:::i;:::-;6011:62;;5967:116;5763:327;;;;:::o;6096:349::-;6165:6;6214:2;6202:9;6193:7;6189:23;6185:32;6182:119;;;6220:79;;:::i;:::-;6182:119;6340:1;6365:63;6420:7;6411:6;6400:9;6396:22;6365:63;:::i;:::-;6355:73;;6311:127;6096:349;;;;:::o;6451:834::-;6539:6;6547;6596:2;6584:9;6575:7;6571:23;6567:32;6564:119;;;6602:79;;:::i;:::-;6564:119;6750:1;6739:9;6735:17;6722:31;6780:18;6772:6;6769:30;6766:117;;;6802:79;;:::i;:::-;6766:117;6907:63;6962:7;6953:6;6942:9;6938:22;6907:63;:::i;:::-;6897:73;;6693:287;7047:2;7036:9;7032:18;7019:32;7078:18;7070:6;7067:30;7064:117;;;7100:79;;:::i;:::-;7064:117;7205:63;7260:7;7251:6;7240:9;7236:22;7205:63;:::i;:::-;7195:73;;6990:288;6451:834;;;;;:::o;7291:329::-;7350:6;7399:2;7387:9;7378:7;7374:23;7370:32;7367:119;;;7405:79;;:::i;:::-;7367:119;7525:1;7550:53;7595:7;7586:6;7575:9;7571:22;7550:53;:::i;:::-;7540:63;;7496:117;7291:329;;;;:::o;7626:474::-;7694:6;7702;7751:2;7739:9;7730:7;7726:23;7722:32;7719:119;;;7757:79;;:::i;:::-;7719:119;7877:1;7902:53;7947:7;7938:6;7927:9;7923:22;7902:53;:::i;:::-;7892:63;;7848:117;8004:2;8030:53;8075:7;8066:6;8055:9;8051:22;8030:53;:::i;:::-;8020:63;;7975:118;7626:474;;;;;:::o;8106:327::-;8164:6;8213:2;8201:9;8192:7;8188:23;8184:32;8181:119;;;8219:79;;:::i;:::-;8181:119;8339:1;8364:52;8408:7;8399:6;8388:9;8384:22;8364:52;:::i;:::-;8354:62;;8310:116;8106:327;;;;:::o;8439:118::-;8526:24;8544:5;8526:24;:::i;:::-;8521:3;8514:37;8439:118;;:::o;8563:109::-;8644:21;8659:5;8644:21;:::i;:::-;8639:3;8632:34;8563:109;;:::o;8678:360::-;8764:3;8792:38;8824:5;8792:38;:::i;:::-;8846:70;8909:6;8904:3;8846:70;:::i;:::-;8839:77;;8925:52;8970:6;8965:3;8958:4;8951:5;8947:16;8925:52;:::i;:::-;9002:29;9024:6;9002:29;:::i;:::-;8997:3;8993:39;8986:46;;8768:270;8678:360;;;;:::o;9044:364::-;9132:3;9160:39;9193:5;9160:39;:::i;:::-;9215:71;9279:6;9274:3;9215:71;:::i;:::-;9208:78;;9295:52;9340:6;9335:3;9328:4;9321:5;9317:16;9295:52;:::i;:::-;9372:29;9394:6;9372:29;:::i;:::-;9367:3;9363:39;9356:46;;9136:272;9044:364;;;;:::o;9414:377::-;9520:3;9548:39;9581:5;9548:39;:::i;:::-;9603:89;9685:6;9680:3;9603:89;:::i;:::-;9596:96;;9701:52;9746:6;9741:3;9734:4;9727:5;9723:16;9701:52;:::i;:::-;9778:6;9773:3;9769:16;9762:23;;9524:267;9414:377;;;;:::o;9821:845::-;9924:3;9961:5;9955:12;9990:36;10016:9;9990:36;:::i;:::-;10042:89;10124:6;10119:3;10042:89;:::i;:::-;10035:96;;10162:1;10151:9;10147:17;10178:1;10173:137;;;;10324:1;10319:341;;;;10140:520;;10173:137;10257:4;10253:9;10242;10238:25;10233:3;10226:38;10293:6;10288:3;10284:16;10277:23;;10173:137;;10319:341;10386:38;10418:5;10386:38;:::i;:::-;10446:1;10460:154;10474:6;10471:1;10468:13;10460:154;;;10548:7;10542:14;10538:1;10533:3;10529:11;10522:35;10598:1;10589:7;10585:15;10574:26;;10496:4;10493:1;10489:12;10484:17;;10460:154;;;10643:6;10638:3;10634:16;10627:23;;10326:334;;10140:520;;9928:738;;9821:845;;;;:::o;10672:366::-;10814:3;10835:67;10899:2;10894:3;10835:67;:::i;:::-;10828:74;;10911:93;11000:3;10911:93;:::i;:::-;11029:2;11024:3;11020:12;11013:19;;10672:366;;;:::o;11044:::-;11186:3;11207:67;11271:2;11266:3;11207:67;:::i;:::-;11200:74;;11283:93;11372:3;11283:93;:::i;:::-;11401:2;11396:3;11392:12;11385:19;;11044:366;;;:::o;11416:::-;11558:3;11579:67;11643:2;11638:3;11579:67;:::i;:::-;11572:74;;11655:93;11744:3;11655:93;:::i;:::-;11773:2;11768:3;11764:12;11757:19;;11416:366;;;:::o;11788:::-;11930:3;11951:67;12015:2;12010:3;11951:67;:::i;:::-;11944:74;;12027:93;12116:3;12027:93;:::i;:::-;12145:2;12140:3;12136:12;12129:19;;11788:366;;;:::o;12160:::-;12302:3;12323:67;12387:2;12382:3;12323:67;:::i;:::-;12316:74;;12399:93;12488:3;12399:93;:::i;:::-;12517:2;12512:3;12508:12;12501:19;;12160:366;;;:::o;12532:398::-;12691:3;12712:83;12793:1;12788:3;12712:83;:::i;:::-;12705:90;;12804:93;12893:3;12804:93;:::i;:::-;12922:1;12917:3;12913:11;12906:18;;12532:398;;;:::o;12936:366::-;13078:3;13099:67;13163:2;13158:3;13099:67;:::i;:::-;13092:74;;13175:93;13264:3;13175:93;:::i;:::-;13293:2;13288:3;13284:12;13277:19;;12936:366;;;:::o;13308:::-;13450:3;13471:67;13535:2;13530:3;13471:67;:::i;:::-;13464:74;;13547:93;13636:3;13547:93;:::i;:::-;13665:2;13660:3;13656:12;13649:19;;13308:366;;;:::o;13680:::-;13822:3;13843:67;13907:2;13902:3;13843:67;:::i;:::-;13836:74;;13919:93;14008:3;13919:93;:::i;:::-;14037:2;14032:3;14028:12;14021:19;;13680:366;;;:::o;14052:::-;14194:3;14215:67;14279:2;14274:3;14215:67;:::i;:::-;14208:74;;14291:93;14380:3;14291:93;:::i;:::-;14409:2;14404:3;14400:12;14393:19;;14052:366;;;:::o;14424:118::-;14511:24;14529:5;14511:24;:::i;:::-;14506:3;14499:37;14424:118;;:::o;14548:115::-;14633:23;14650:5;14633:23;:::i;:::-;14628:3;14621:36;14548:115;;:::o;14669:589::-;14894:3;14916:95;15007:3;14998:6;14916:95;:::i;:::-;14909:102;;15028:95;15119:3;15110:6;15028:95;:::i;:::-;15021:102;;15140:92;15228:3;15219:6;15140:92;:::i;:::-;15133:99;;15249:3;15242:10;;14669:589;;;;;;:::o;15264:379::-;15448:3;15470:147;15613:3;15470:147;:::i;:::-;15463:154;;15634:3;15627:10;;15264:379;;;:::o;15649:222::-;15742:4;15780:2;15769:9;15765:18;15757:26;;15793:71;15861:1;15850:9;15846:17;15837:6;15793:71;:::i;:::-;15649:222;;;;:::o;15877:640::-;16072:4;16110:3;16099:9;16095:19;16087:27;;16124:71;16192:1;16181:9;16177:17;16168:6;16124:71;:::i;:::-;16205:72;16273:2;16262:9;16258:18;16249:6;16205:72;:::i;:::-;16287;16355:2;16344:9;16340:18;16331:6;16287:72;:::i;:::-;16406:9;16400:4;16396:20;16391:2;16380:9;16376:18;16369:48;16434:76;16505:4;16496:6;16434:76;:::i;:::-;16426:84;;15877:640;;;;;;;:::o;16523:332::-;16644:4;16682:2;16671:9;16667:18;16659:26;;16695:71;16763:1;16752:9;16748:17;16739:6;16695:71;:::i;:::-;16776:72;16844:2;16833:9;16829:18;16820:6;16776:72;:::i;:::-;16523:332;;;;;:::o;16861:328::-;16980:4;17018:2;17007:9;17003:18;16995:26;;17031:71;17099:1;17088:9;17084:17;17075:6;17031:71;:::i;:::-;17112:70;17178:2;17167:9;17163:18;17154:6;17112:70;:::i;:::-;16861:328;;;;;:::o;17195:210::-;17282:4;17320:2;17309:9;17305:18;17297:26;;17333:65;17395:1;17384:9;17380:17;17371:6;17333:65;:::i;:::-;17195:210;;;;:::o;17411:313::-;17524:4;17562:2;17551:9;17547:18;17539:26;;17611:9;17605:4;17601:20;17597:1;17586:9;17582:17;17575:47;17639:78;17712:4;17703:6;17639:78;:::i;:::-;17631:86;;17411:313;;;;:::o;17730:514::-;17891:4;17929:2;17918:9;17914:18;17906:26;;17978:9;17972:4;17968:20;17964:1;17953:9;17949:17;17942:47;18006:78;18079:4;18070:6;18006:78;:::i;:::-;17998:86;;18131:9;18125:4;18121:20;18116:2;18105:9;18101:18;18094:48;18159:78;18232:4;18223:6;18159:78;:::i;:::-;18151:86;;17730:514;;;;;:::o;18250:419::-;18416:4;18454:2;18443:9;18439:18;18431:26;;18503:9;18497:4;18493:20;18489:1;18478:9;18474:17;18467:47;18531:131;18657:4;18531:131;:::i;:::-;18523:139;;18250:419;;;:::o;18675:::-;18841:4;18879:2;18868:9;18864:18;18856:26;;18928:9;18922:4;18918:20;18914:1;18903:9;18899:17;18892:47;18956:131;19082:4;18956:131;:::i;:::-;18948:139;;18675:419;;;:::o;19100:::-;19266:4;19304:2;19293:9;19289:18;19281:26;;19353:9;19347:4;19343:20;19339:1;19328:9;19324:17;19317:47;19381:131;19507:4;19381:131;:::i;:::-;19373:139;;19100:419;;;:::o;19525:::-;19691:4;19729:2;19718:9;19714:18;19706:26;;19778:9;19772:4;19768:20;19764:1;19753:9;19749:17;19742:47;19806:131;19932:4;19806:131;:::i;:::-;19798:139;;19525:419;;;:::o;19950:::-;20116:4;20154:2;20143:9;20139:18;20131:26;;20203:9;20197:4;20193:20;20189:1;20178:9;20174:17;20167:47;20231:131;20357:4;20231:131;:::i;:::-;20223:139;;19950:419;;;:::o;20375:::-;20541:4;20579:2;20568:9;20564:18;20556:26;;20628:9;20622:4;20618:20;20614:1;20603:9;20599:17;20592:47;20656:131;20782:4;20656:131;:::i;:::-;20648:139;;20375:419;;;:::o;20800:::-;20966:4;21004:2;20993:9;20989:18;20981:26;;21053:9;21047:4;21043:20;21039:1;21028:9;21024:17;21017:47;21081:131;21207:4;21081:131;:::i;:::-;21073:139;;20800:419;;;:::o;21225:::-;21391:4;21429:2;21418:9;21414:18;21406:26;;21478:9;21472:4;21468:20;21464:1;21453:9;21449:17;21442:47;21506:131;21632:4;21506:131;:::i;:::-;21498:139;;21225:419;;;:::o;21650:::-;21816:4;21854:2;21843:9;21839:18;21831:26;;21903:9;21897:4;21893:20;21889:1;21878:9;21874:17;21867:47;21931:131;22057:4;21931:131;:::i;:::-;21923:139;;21650:419;;;:::o;22075:222::-;22168:4;22206:2;22195:9;22191:18;22183:26;;22219:71;22287:1;22276:9;22272:17;22263:6;22219:71;:::i;:::-;22075:222;;;;:::o;22303:218::-;22394:4;22432:2;22421:9;22417:18;22409:26;;22445:69;22511:1;22500:9;22496:17;22487:6;22445:69;:::i;:::-;22303:218;;;;:::o;22527:129::-;22561:6;22588:20;;:::i;:::-;22578:30;;22617:33;22645:4;22637:6;22617:33;:::i;:::-;22527:129;;;:::o;22662:75::-;22695:6;22728:2;22722:9;22712:19;;22662:75;:::o;22743:307::-;22804:4;22894:18;22886:6;22883:30;22880:56;;;22916:18;;:::i;:::-;22880:56;22954:29;22976:6;22954:29;:::i;:::-;22946:37;;23038:4;23032;23028:15;23020:23;;22743:307;;;:::o;23056:308::-;23118:4;23208:18;23200:6;23197:30;23194:56;;;23230:18;;:::i;:::-;23194:56;23268:29;23290:6;23268:29;:::i;:::-;23260:37;;23352:4;23346;23342:15;23334:23;;23056:308;;;:::o;23370:141::-;23419:4;23442:3;23434:11;;23465:3;23462:1;23455:14;23499:4;23496:1;23486:18;23478:26;;23370:141;;;:::o;23517:98::-;23568:6;23602:5;23596:12;23586:22;;23517:98;;;:::o;23621:99::-;23673:6;23707:5;23701:12;23691:22;;23621:99;;;:::o;23726:168::-;23809:11;23843:6;23838:3;23831:19;23883:4;23878:3;23874:14;23859:29;;23726:168;;;;:::o;23900:147::-;24001:11;24038:3;24023:18;;23900:147;;;;:::o;24053:169::-;24137:11;24171:6;24166:3;24159:19;24211:4;24206:3;24202:14;24187:29;;24053:169;;;;:::o;24228:148::-;24330:11;24367:3;24352:18;;24228:148;;;;:::o;24382:305::-;24422:3;24441:20;24459:1;24441:20;:::i;:::-;24436:25;;24475:20;24493:1;24475:20;:::i;:::-;24470:25;;24629:1;24561:66;24557:74;24554:1;24551:81;24548:107;;;24635:18;;:::i;:::-;24548:107;24679:1;24676;24672:9;24665:16;;24382:305;;;;:::o;24693:185::-;24733:1;24750:20;24768:1;24750:20;:::i;:::-;24745:25;;24784:20;24802:1;24784:20;:::i;:::-;24779:25;;24823:1;24813:35;;24828:18;;:::i;:::-;24813:35;24870:1;24867;24863:9;24858:14;;24693:185;;;;:::o;24884:348::-;24924:7;24947:20;24965:1;24947:20;:::i;:::-;24942:25;;24981:20;24999:1;24981:20;:::i;:::-;24976:25;;25169:1;25101:66;25097:74;25094:1;25091:81;25086:1;25079:9;25072:17;25068:105;25065:131;;;25176:18;;:::i;:::-;25065:131;25224:1;25221;25217:9;25206:20;;24884:348;;;;:::o;25238:191::-;25278:4;25298:20;25316:1;25298:20;:::i;:::-;25293:25;;25332:20;25350:1;25332:20;:::i;:::-;25327:25;;25371:1;25368;25365:8;25362:34;;;25376:18;;:::i;:::-;25362:34;25421:1;25418;25414:9;25406:17;;25238:191;;;;:::o;25435:96::-;25472:7;25501:24;25519:5;25501:24;:::i;:::-;25490:35;;25435:96;;;:::o;25537:90::-;25571:7;25614:5;25607:13;25600:21;25589:32;;25537:90;;;:::o;25633:149::-;25669:7;25709:66;25702:5;25698:78;25687:89;;25633:149;;;:::o;25788:126::-;25825:7;25865:42;25858:5;25854:54;25843:65;;25788:126;;;:::o;25920:77::-;25957:7;25986:5;25975:16;;25920:77;;;:::o;26003:109::-;26039:7;26079:26;26072:5;26068:38;26057:49;;26003:109;;;:::o;26118:154::-;26202:6;26197:3;26192;26179:30;26264:1;26255:6;26250:3;26246:16;26239:27;26118:154;;;:::o;26278:307::-;26346:1;26356:113;26370:6;26367:1;26364:13;26356:113;;;26455:1;26450:3;26446:11;26440:18;26436:1;26431:3;26427:11;26420:39;26392:2;26389:1;26385:10;26380:15;;26356:113;;;26487:6;26484:1;26481:13;26478:101;;;26567:1;26558:6;26553:3;26549:16;26542:27;26478:101;26327:258;26278:307;;;:::o;26591:320::-;26635:6;26672:1;26666:4;26662:12;26652:22;;26719:1;26713:4;26709:12;26740:18;26730:81;;26796:4;26788:6;26784:17;26774:27;;26730:81;26858:2;26850:6;26847:14;26827:18;26824:38;26821:84;;;26877:18;;:::i;:::-;26821:84;26642:269;26591:320;;;:::o;26917:281::-;27000:27;27022:4;27000:27;:::i;:::-;26992:6;26988:40;27130:6;27118:10;27115:22;27094:18;27082:10;27079:34;27076:62;27073:88;;;27141:18;;:::i;:::-;27073:88;27181:10;27177:2;27170:22;26960:238;26917:281;;:::o;27204:233::-;27243:3;27266:24;27284:5;27266:24;:::i;:::-;27257:33;;27312:66;27305:5;27302:77;27299:103;;;27382:18;;:::i;:::-;27299:103;27429:1;27422:5;27418:13;27411:20;;27204:233;;;:::o;27443:176::-;27475:1;27492:20;27510:1;27492:20;:::i;:::-;27487:25;;27526:20;27544:1;27526:20;:::i;:::-;27521:25;;27565:1;27555:35;;27570:18;;:::i;:::-;27555:35;27611:1;27608;27604:9;27599:14;;27443:176;;;;:::o;27625:180::-;27673:77;27670:1;27663:88;27770:4;27767:1;27760:15;27794:4;27791:1;27784:15;27811:180;27859:77;27856:1;27849:88;27956:4;27953:1;27946:15;27980:4;27977:1;27970:15;27997:180;28045:77;28042:1;28035:88;28142:4;28139:1;28132:15;28166:4;28163:1;28156:15;28183:180;28231:77;28228:1;28221:88;28328:4;28325:1;28318:15;28352:4;28349:1;28342:15;28369:180;28417:77;28414:1;28407:88;28514:4;28511:1;28504:15;28538:4;28535:1;28528:15;28555:117;28664:1;28661;28654:12;28678:117;28787:1;28784;28777:12;28801:117;28910:1;28907;28900:12;28924:117;29033:1;29030;29023:12;29047:102;29088:6;29139:2;29135:7;29130:2;29123:5;29119:14;29115:28;29105:38;;29047:102;;;:::o;29155:168::-;29295:20;29291:1;29283:6;29279:14;29272:44;29155:168;:::o;29329:225::-;29469:34;29465:1;29457:6;29453:14;29446:58;29538:8;29533:2;29525:6;29521:15;29514:33;29329:225;:::o;29560:168::-;29700:20;29696:1;29688:6;29684:14;29677:44;29560:168;:::o;29734:182::-;29874:34;29870:1;29862:6;29858:14;29851:58;29734:182;:::o;29922:234::-;30062:34;30058:1;30050:6;30046:14;30039:58;30131:17;30126:2;30118:6;30114:15;30107:42;29922:234;:::o;30162:114::-;;:::o;30282:166::-;30422:18;30418:1;30410:6;30406:14;30399:42;30282:166;:::o;30454:229::-;30594:34;30590:1;30582:6;30578:14;30571:58;30663:12;30658:2;30650:6;30646:15;30639:37;30454:229;:::o;30689:181::-;30829:33;30825:1;30817:6;30813:14;30806:57;30689:181;:::o;30876:175::-;31016:27;31012:1;31004:6;31000:14;30993:51;30876:175;:::o;31057:122::-;31130:24;31148:5;31130:24;:::i;:::-;31123:5;31120:35;31110:63;;31169:1;31166;31159:12;31110:63;31057:122;:::o;31185:116::-;31255:21;31270:5;31255:21;:::i;:::-;31248:5;31245:32;31235:60;;31291:1;31288;31281:12;31235:60;31185:116;:::o;31307:120::-;31379:23;31396:5;31379:23;:::i;:::-;31372:5;31369:34;31359:62;;31417:1;31414;31407:12;31359:62;31307:120;:::o;31433:122::-;31506:24;31524:5;31506:24;:::i;:::-;31499:5;31496:35;31486:63;;31545:1;31542;31535:12;31486:63;31433:122;:::o;31561:120::-;31633:23;31650:5;31633:23;:::i;:::-;31626:5;31623:34;31613:62;;31671:1;31668;31661:12;31613:62;31561:120;:::o
Swarm Source
ipfs://9e46302eeb60a0b9cfcf9acee88a6797288b916c8ce407ab19e0b82cf91ca88a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.