Overview
ETH Balance
ETH Value
$33.29 (@ $2,219.25/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 58 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Buy Tickets | 44154706 | 10 days ago | IN | 0.0025 ETH | 0.00000089 | ||||
| Buy Tickets | 44154687 | 10 days ago | IN | 0.0025 ETH | 0.00000104 | ||||
| Create Raffle | 44154332 | 10 days ago | IN | 0 ETH | 0.00000266 | ||||
| Mint | 44154295 | 10 days ago | IN | 0.02 ETH | 0.00000176 | ||||
| Buy Tickets | 43582629 | 23 days ago | IN | 0.0025 ETH | 0.00000083 | ||||
| Buy Tickets | 43580478 | 23 days ago | IN | 0.0025 ETH | 0.0000011 | ||||
| Buy Tickets | 43579402 | 23 days ago | IN | 0.0025 ETH | 0.0000013 | ||||
| Create Raffle | 43579276 | 23 days ago | IN | 0 ETH | 0.00000336 | ||||
| Create Raffle | 43579199 | 23 days ago | IN | 0 ETH | 0.00000335 | ||||
| Buy Tickets | 43578701 | 23 days ago | IN | 0.0025 ETH | 0.000001 | ||||
| Create Raffle | 43578581 | 23 days ago | IN | 0 ETH | 0.00000266 | ||||
| Complete Raffle | 43578213 | 23 days ago | IN | 0 ETH | 0.00000059 | ||||
| Buy Tickets | 43578124 | 23 days ago | IN | 0.0025 ETH | 0.00000081 | ||||
| Buy Tickets | 43578090 | 23 days ago | IN | 0.0025 ETH | 0.00000105 | ||||
| Buy Tickets | 43578066 | 23 days ago | IN | 0.0025 ETH | 0.00000073 | ||||
| Buy Tickets | 43578043 | 23 days ago | IN | 0.0025 ETH | 0.00000093 | ||||
| Create Raffle | 43577873 | 23 days ago | IN | 0 ETH | 0.0000024 | ||||
| Mint | 43577827 | 23 days ago | IN | 0.02 ETH | 0.00000119 | ||||
| Set Approval For... | 42375297 | 51 days ago | IN | 0 ETH | 0.00000033 | ||||
| Set Approval For... | 42375274 | 51 days ago | IN | 0 ETH | 0.00000033 | ||||
| Set Approval For... | 42375246 | 51 days ago | IN | 0 ETH | 0.00000033 | ||||
| Set Approval For... | 42375217 | 51 days ago | IN | 0 ETH | 0.00000036 | ||||
| Set Approval For... | 42375185 | 51 days ago | IN | 0 ETH | 0.00000038 | ||||
| Set Approval For... | 42375153 | 51 days ago | IN | 0 ETH | 0.00000036 | ||||
| Set Approval For... | 42375103 | 51 days ago | IN | 0 ETH | 0.00000037 |
Latest 22 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 44154295 | 10 days ago | 0.02 ETH | ||||
| 43578213 | 23 days ago | 0.005 ETH | ||||
| 43578213 | 23 days ago | 0.005 ETH | ||||
| 43577827 | 23 days ago | 0.02 ETH | ||||
| 42148072 | 56 days ago | 0.0025 ETH | ||||
| 42148072 | 56 days ago | 0.0025 ETH | ||||
| 41760596 | 65 days ago | 0.02 ETH | ||||
| 41504559 | 71 days ago | 0.02 ETH | ||||
| 41416933 | 73 days ago | 0.00125 ETH | ||||
| 41416933 | 73 days ago | 0.00125 ETH | ||||
| 41416374 | 73 days ago | 0.02 ETH | ||||
| 41407938 | 73 days ago | 0.00375 ETH | ||||
| 41407938 | 73 days ago | 0.00375 ETH | ||||
| 41386030 | 74 days ago | 0.02 ETH | ||||
| 41384815 | 74 days ago | 0.02 ETH | ||||
| 41384544 | 74 days ago | 0.02 ETH | ||||
| 41377935 | 74 days ago | 0.02 ETH | ||||
| 41376562 | 74 days ago | 0.02 ETH | ||||
| 41373819 | 74 days ago | 0.02 ETH | ||||
| 41371573 | 74 days ago | 0.0025 ETH | ||||
| 41371573 | 74 days ago | 0.0025 ETH | ||||
| 41347419 | 75 days ago | 0.02 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity)
/** *Submitted for verification at basescan.org on 2026-01-27 */ // Sources flattened with hardhat v2.22.17 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // 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/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.8.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 have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // 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 @openzeppelin/contracts/token/ERC721/[email protected] // 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/[email protected] // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/NFT5050.sol pragma solidity ^0.8.19; /** * @title NFT5050 - NFT-Gated 50/50 Raffle Platform with Transfer Protection * @dev ERC721 NFT that grants holders the ability to create unlimited 50/50 raffles * @notice CRITICAL FEATURE: NFTs with active raffles CANNOT be transferred/sold * This prevents fraud where someone sells an NFT while a raffle is ongoing */ contract NFT5050 is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { using Strings for uint256; // ============ NFT COLLECTION SETTINGS ============ uint256 public constant MAX_SUPPLY = 5050; // 5,050 NFTs (NFT5050!) uint256 public constant MINT_PRICE = 0.02 ether; // 0.02 ETH per NFT // NO MAX PER WALLET - Users can mint unlimited NFTs // ============ RAFFLE PLATFORM SETTINGS ============ uint256 public constant TICKET_PRICE = 0.0025 ether; // 0.0025 ETH per raffle ticket address public constant PLATFORM_WALLET = 0xD6DA4f85f4e7a9A26e378A5dc67c2429fe887D82; // NFT mint revenue goes here uint256 public constant MIN_CREATION_DELAY = 2 minutes; // ============ STATE VARIABLES ============ uint256 private _tokenIdCounter; string private _baseTokenURI; bool public mintingActive = false; bool public revealed = false; string public notRevealedUri; // ============ RAFFLE TRACKING & LOCKING ============ mapping(uint256 => uint256[]) public tokenActiveRaffles; // tokenId => active raffle IDs mapping(uint256 => address) public raffleCreators; // raffleId => creator address mapping(uint256 => uint256) public raffleCreatorTokenId; // raffleId => tokenId used mapping(address => uint256[]) public userRaffles; // user => raffle IDs they created uint256 public totalRafflesCreated; /** * @dev Raffle structure */ struct Raffle { address creator; uint256 creatorTokenId; // NFT token ID used to create this raffle string title; string description; string image; uint256 ticketSupply; uint256 ticketsSold; uint256 startTime; uint256 endTime; address winner; bool completed; uint256 totalAmount; mapping(uint256 => address) tickets; mapping(address => uint256[]) userTickets; } Raffle[] public raffles; // ============ EVENTS ============ event NFTMinted(address indexed to, uint256 indexed tokenId); event RaffleCreated( uint256 indexed raffleId, address indexed creator, uint256 indexed tokenId, string title, uint256 ticketSupply, uint256 startTime, uint256 endTime ); event TicketPurchased( uint256 indexed raffleId, address indexed buyer, uint256 quantity, uint256[] ticketNumbers ); event RaffleCompleted( uint256 indexed raffleId, address indexed winner, uint256 winnerPrize, uint256 creatorPrize ); event NFTLocked(uint256 indexed tokenId, uint256 indexed raffleId); event NFTUnlocked(uint256 indexed tokenId, uint256 indexed raffleId); event TransferBlocked(uint256 indexed tokenId, uint256 activeRaffleCount); event RaffleCancelled(uint256 indexed raffleId, uint256 indexed tokenId, string reason); // ============ CONSTRUCTOR ============ constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721(_name, _symbol) { _baseTokenURI = _initBaseURI; notRevealedUri = _initNotRevealedUri; } // ============ NFT MINTING FUNCTIONS ============ /** * @dev Mint NFT5050 NFTs * @param _quantity Number of NFTs to mint * @notice No limit per wallet - mint as many as you want! * @notice Mint revenue automatically sent to Platform Wallet */ function mint(uint256 _quantity) external payable nonReentrant { require(mintingActive, "Minting is not active"); require(_quantity > 0, "Must mint at least 1 NFT"); require(_tokenIdCounter + _quantity <= MAX_SUPPLY, "Exceeds max supply"); require( msg.value == MINT_PRICE * _quantity, "Incorrect ETH amount" ); // Send mint revenue to Platform Wallet immediately (bool success, ) = PLATFORM_WALLET.call{value: msg.value}(""); require(success, "Failed to send mint payment to platform wallet"); // Mint NFTs to user for (uint256 i = 0; i < _quantity; i++) { uint256 tokenId = _tokenIdCounter; _tokenIdCounter++; _safeMint(msg.sender, tokenId); emit NFTMinted(msg.sender, tokenId); } } /** * @dev Owner mint for team/giveaways */ function ownerMint(address _to, uint256 _quantity) external onlyOwner { require(_tokenIdCounter + _quantity <= MAX_SUPPLY, "Exceeds max supply"); for (uint256 i = 0; i < _quantity; i++) { uint256 tokenId = _tokenIdCounter; _tokenIdCounter++; _safeMint(_to, tokenId); emit NFTMinted(_to, tokenId); } } // ============ RAFFLE CREATION (NFT HOLDER ONLY) ============ /** * @dev Create a 50/50 raffle (NFT holders only) * @notice This LOCKS the NFT - it cannot be transferred until raffle completes * @param _tokenId The NFT token ID to use for raffle creation * @param _title Raffle title * @param _description Raffle description * @param _image Raffle image URL or IPFS hash * @param _ticketSupply Maximum number of tickets * @param _startTime When the raffle starts * @param _endTime When the raffle ends */ function createRaffle( uint256 _tokenId, string memory _title, string memory _description, string memory _image, uint256 _ticketSupply, uint256 _startTime, uint256 _endTime ) external nonReentrant { // Verify NFT ownership require(ownerOf(_tokenId) == msg.sender, "Must own NFT5050 NFT to create raffles"); require(_ticketSupply > 0, "Ticket supply must be greater than 0"); require( _startTime >= block.timestamp + MIN_CREATION_DELAY, "Raffle must start at least 2 minutes in the future" ); require(_endTime > _startTime, "End time must be after start time"); require(bytes(_title).length > 0, "Title cannot be empty"); // Create new raffle Raffle storage newRaffle = raffles.push(); newRaffle.creator = msg.sender; newRaffle.creatorTokenId = _tokenId; newRaffle.title = _title; newRaffle.description = _description; newRaffle.image = _image; newRaffle.ticketSupply = _ticketSupply; newRaffle.startTime = _startTime; newRaffle.endTime = _endTime; newRaffle.completed = false; newRaffle.totalAmount = 0; uint256 raffleId = raffles.length - 1; raffleCreators[raffleId] = msg.sender; raffleCreatorTokenId[raffleId] = _tokenId; userRaffles[msg.sender].push(raffleId); totalRafflesCreated++; // LOCK THE NFT - Add to active raffles list tokenActiveRaffles[_tokenId].push(raffleId); emit RaffleCreated( raffleId, msg.sender, _tokenId, _title, _ticketSupply, _startTime, _endTime ); emit NFTLocked(_tokenId, raffleId); } // ============ RAFFLE PARTICIPATION ============ /** * @dev Buy tickets for a raffle */ function buyTickets( uint256 _raffleId, uint256 _quantity ) external payable nonReentrant { require(_raffleId < raffles.length, "Raffle does not exist"); require(_quantity > 0, "Quantity must be greater than 0"); Raffle storage raffle = raffles[_raffleId]; require(!raffle.completed, "Raffle has already been completed"); require(block.timestamp >= raffle.startTime, "Raffle has not started yet"); require(block.timestamp < raffle.endTime, "Raffle has ended"); require( msg.value == TICKET_PRICE * _quantity, "Must send correct ETH amount" ); require( raffle.ticketsSold + _quantity <= raffle.ticketSupply, "Not enough tickets available" ); uint256[] memory newTicketNumbers = new uint256[](_quantity); for (uint256 i = 0; i < _quantity; i++) { uint256 ticketNumber = raffle.ticketsSold + i; raffle.tickets[ticketNumber] = msg.sender; raffle.userTickets[msg.sender].push(ticketNumber); newTicketNumbers[i] = ticketNumber; } raffle.ticketsSold += _quantity; raffle.totalAmount += msg.value; emit TicketPurchased(_raffleId, msg.sender, _quantity, newTicketNumbers); } /** * @dev Complete a raffle and distribute prizes * @notice This UNLOCKS the NFT - it can now be transferred again */ function completeRaffle(uint256 _raffleId) external nonReentrant { require(_raffleId < raffles.length, "Raffle does not exist"); Raffle storage raffle = raffles[_raffleId]; require(!raffle.completed, "Raffle has already been completed"); require( block.timestamp >= raffle.endTime || raffle.ticketsSold == raffle.ticketSupply, "Raffle is not ready to be completed" ); require(raffle.ticketsSold > 0, "No tickets were sold"); // Generate random winner uint256 randomSeed = _generateRandomSeed(_raffleId, raffle); uint256 winningTicketNumber = randomSeed % raffle.ticketsSold; address winner = raffle.tickets[winningTicketNumber]; raffle.winner = winner; raffle.completed = true; // UNLOCK THE NFT - Remove from active raffles list uint256 tokenId = raffle.creatorTokenId; _removeActiveRaffle(tokenId, _raffleId); // 50/50 split uint256 totalPrize = raffle.totalAmount; uint256 winnerShare = totalPrize / 2; uint256 creatorShare = totalPrize - winnerShare; // Transfer prizes (bool winnerPaid, ) = winner.call{value: winnerShare}(""); require(winnerPaid, "Failed to transfer prize to winner"); (bool creatorPaid, ) = raffle.creator.call{value: creatorShare}(""); require(creatorPaid, "Failed to transfer prize to creator"); emit RaffleCompleted(_raffleId, winner, winnerShare, creatorShare); emit NFTUnlocked(tokenId, _raffleId); } /** * @dev Cancel a raffle that ended with no ticket sales and unlock the NFT * @notice This UNLOCKS the NFT - it can now be transferred again * @notice Can only be called if raffle has ended AND no tickets were sold */ function cancelRaffle(uint256 _raffleId) external nonReentrant { require(_raffleId < raffles.length, "Raffle does not exist"); Raffle storage raffle = raffles[_raffleId]; require(!raffle.completed, "Raffle has already been completed"); require(block.timestamp >= raffle.endTime, "Raffle has not ended yet"); require(raffle.ticketsSold == 0, "Cannot cancel raffle with ticket sales"); // Mark as completed (cancelled) raffle.completed = true; // UNLOCK THE NFT - Remove from active raffles list uint256 tokenId = raffle.creatorTokenId; _removeActiveRaffle(tokenId, _raffleId); emit RaffleCancelled(_raffleId, tokenId, "No tickets sold"); emit NFTUnlocked(tokenId, _raffleId); } // ============ TRANSFER PROTECTION (ANTI-FRAUD) ============ /** * @dev Check if an NFT has active raffles (is locked) * @param _tokenId The NFT token ID to check * @return bool True if NFT has active raffles and cannot be transferred */ function isNFTLocked(uint256 _tokenId) public view returns (bool) { return tokenActiveRaffles[_tokenId].length > 0; } /** * @dev Get all active raffle IDs for a specific NFT * @param _tokenId The NFT token ID * @return uint256[] Array of active raffle IDs */ function getActiveRafflesForToken(uint256 _tokenId) external view returns (uint256[] memory) { return tokenActiveRaffles[_tokenId]; } /** * @dev Internal function to remove a raffle from token's active list */ function _removeActiveRaffle(uint256 _tokenId, uint256 _raffleId) private { uint256[] storage activeRaffles = tokenActiveRaffles[_tokenId]; for (uint256 i = 0; i < activeRaffles.length; i++) { if (activeRaffles[i] == _raffleId) { // Move last element to this position and pop activeRaffles[i] = activeRaffles[activeRaffles.length - 1]; activeRaffles.pop(); break; } } } /** * @dev Override transfer functions to prevent transfers of locked NFTs * This is the CRITICAL SECURITY FEATURE that prevents marketplace fraud */ function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); // Allow minting (from == address(0)) if (from == address(0)) { return; } // Check if NFT has active raffles uint256 activeRaffleCount = tokenActiveRaffles[tokenId].length; if (activeRaffleCount > 0) { emit TransferBlocked(tokenId, activeRaffleCount); revert("NFT is locked: has active raffle(s). Complete raffle before transfer."); } } // ============ VIEW FUNCTIONS ============ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Token does not exist"); if (!revealed) { return notRevealedUri; } string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function getRaffleCount() external view returns (uint256) { return raffles.length; } function getUserRaffles(address _user) external view returns (uint256[] memory) { return userRaffles[_user]; } function getUserTickets(uint256 _raffleId, address _user) external view returns (uint256[] memory) { require(_raffleId < raffles.length, "Raffle does not exist"); return raffles[_raffleId].userTickets[_user]; } function getRaffle(uint256 _raffleId) external view returns ( address creator, uint256 creatorTokenId, string memory title, string memory description, string memory image, uint256 ticketSupply, uint256 ticketsSold, uint256 startTime, uint256 endTime, address winner, bool completed, uint256 totalAmount ) { require(_raffleId < raffles.length, "Raffle does not exist"); Raffle storage raffle = raffles[_raffleId]; return ( raffle.creator, raffle.creatorTokenId, raffle.title, raffle.description, raffle.image, raffle.ticketSupply, raffle.ticketsSold, raffle.startTime, raffle.endTime, raffle.winner, raffle.completed, raffle.totalAmount ); } function getActiveRaffles() external view returns (uint256[] memory) { uint256 activeCount = 0; // First pass: count active raffles for (uint256 i = 0; i < raffles.length; i++) { if ( !raffles[i].completed && block.timestamp >= raffles[i].startTime && block.timestamp < raffles[i].endTime ) { activeCount++; } } // Second pass: populate array uint256[] memory activeRaffleIds = new uint256[](activeCount); uint256 currentIndex = 0; for (uint256 i = 0; i < raffles.length; i++) { if ( !raffles[i].completed && block.timestamp >= raffles[i].startTime && block.timestamp < raffles[i].endTime ) { activeRaffleIds[currentIndex] = i; currentIndex++; } } return activeRaffleIds; } function totalSupply() public view override returns (uint256) { return _tokenIdCounter; } // ============ ADMIN FUNCTIONS ============ function setMintingActive(bool _active) external onlyOwner { mintingActive = _active; } function setRevealed(bool _revealed) external onlyOwner { revealed = _revealed; } function setBaseURI(string memory _newBaseURI) external onlyOwner { _baseTokenURI = _newBaseURI; } function setNotRevealedURI(string memory _notRevealedURI) external onlyOwner { notRevealedUri = _notRevealedURI; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "No balance to withdraw"); (bool success, ) = payable(owner()).call{value: balance}(""); require(success, "Withdrawal failed"); } /** * @dev Emergency function to unlock an NFT if it's stuck * @notice Only owner can call this - use with extreme caution * @param _tokenId The NFT token ID to unlock * @param _raffleId The raffle ID to remove from active raffles */ function emergencyUnlockNFT(uint256 _tokenId, uint256 _raffleId) external onlyOwner { require(_exists(_tokenId), "Token does not exist"); require(_raffleId < raffles.length, "Raffle does not exist"); // Remove the raffle from active raffles list _removeActiveRaffle(_tokenId, _raffleId); emit NFTUnlocked(_tokenId, _raffleId); } // ============ INTERNAL FUNCTIONS ============ function _generateRandomSeed(uint256 _raffleId, Raffle storage raffle) private view returns (uint256) { return uint256( keccak256( abi.encodePacked( block.prevrandao, blockhash(block.number - 1), block.timestamp, block.number, raffle.creator, raffle.startTime, raffle.endTime, raffle.ticketsSold, raffle.totalAmount, msg.sender, tx.gasprice, address(this), _getParticipantsHash(_raffleId) ) ) ); } function _getParticipantsHash(uint256 _raffleId) private view returns (bytes32) { Raffle storage raffle = raffles[_raffleId]; bytes memory participantsData; uint256 maxTickets = raffle.ticketsSold > 50 ? 50 : raffle.ticketsSold; for (uint256 i = 0; i < maxTickets; i++) { participantsData = abi.encodePacked(participantsData, raffle.tickets[i]); } return keccak256(participantsData); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"raffleId","type":"uint256"}],"name":"NFTLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"raffleId","type":"uint256"}],"name":"NFTUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"raffleId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"RaffleCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"raffleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"winnerPrize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorPrize","type":"uint256"}],"name":"RaffleCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"raffleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"uint256","name":"ticketSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"RaffleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"raffleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"ticketNumbers","type":"uint256[]"}],"name":"TicketPurchased","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"activeRaffleCount","type":"uint256"}],"name":"TransferBlocked","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_CREATION_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PLATFORM_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TICKET_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleId","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"buyTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleId","type":"uint256"}],"name":"cancelRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleId","type":"uint256"}],"name":"completeRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"string","name":"_image","type":"string"},{"internalType":"uint256","name":"_ticketSupply","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"createRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_raffleId","type":"uint256"}],"name":"emergencyUnlockNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveRaffles","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getActiveRafflesForToken","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleId","type":"uint256"}],"name":"getRaffle","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"creatorTokenId","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"uint256","name":"ticketSupply","type":"uint256"},{"internalType":"uint256","name":"ticketsSold","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserRaffles","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raffleId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTickets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isNFTLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"raffleCreatorTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"raffleCreators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"raffles","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"creatorTokenId","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"uint256","name":"ticketSupply","type":"uint256"},{"internalType":"uint256","name":"ticketsSold","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setMintingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenActiveRaffles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRafflesCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRaffles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052600e805461ffff191690553480156200001c57600080fd5b506040516200497f3803806200497f8339810160408190526200003f91620001c3565b838360006200004f83826200030b565b5060016200005e82826200030b565b5050506200007b62000075620000a860201b60201c565b620000ac565b6001600b55600d6200008e83826200030b565b50600f6200009d82826200030b565b5050505050620003d7565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200012657600080fd5b81516001600160401b0380821115620001435762000143620000fe565b604051601f8301601f19908116603f011681019082821181831017156200016e576200016e620000fe565b816040528381526020925086838588010111156200018b57600080fd5b600091505b83821015620001af578582018301518183018401529082019062000190565b600093810190920192909252949350505050565b60008060008060808587031215620001da57600080fd5b84516001600160401b0380821115620001f257600080fd5b620002008883890162000114565b955060208701519150808211156200021757600080fd5b620002258883890162000114565b945060408701519150808211156200023c57600080fd5b6200024a8883890162000114565b935060608701519150808211156200026157600080fd5b50620002708782880162000114565b91505092959194509250565b600181811c908216806200029157607f821691505b602082108103620002b257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200030657600081815260208120601f850160051c81016020861015620002e15750805b601f850160051c820191505b818110156200030257828155600101620002ed565b5050505b505050565b81516001600160401b03811115620003275762000327620000fe565b6200033f816200033884546200027c565b84620002b8565b602080601f8311600181146200037757600084156200035e5750858301515b600019600386901b1c1916600185901b17855562000302565b600085815260208120601f198616915b82811015620003a85788860151825594840194600190910190840162000387565b5085821015620003c75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61459880620003e76000396000f3fe6080604052600436106103035760003560e01c806365ed57c211610190578063c87b56dd116100dc578063e7a7f65c11610095578063f27d2b0c1161006f578063f27d2b0c14610937578063f2c4ce1e14610964578063f2fde38b14610984578063f89367e5146109a457600080fd5b8063e7a7f65c146108a6578063e985e9c5146108c6578063eb8b12d41461090f57600080fd5b8063c87b56dd146107e6578063cf99ac6f14610806578063d04ef28514610826578063d51075c114610846578063e0a8085314610866578063e4dafec91461088657600080fd5b80638da5cb5b11610149578063a0712d6811610123578063a0712d6814610778578063a22cb4651461078b578063b88d4fde146107ab578063c002d23d146107cb57600080fd5b80638da5cb5b1461072557806395d89b411461074357806398d711381461075857600080fd5b806365ed57c2146106715780636a0c5a71146106a757806370a08231146106bd578063715018a6146106dd5780638627df46146106f2578063889842ff1461070557600080fd5b806331f9c9191161024f578063484b973c1161020857806355f804b3116101e257806355f804b3146105d95780635d4bc0ce146105f95780635fba3171146106315780636352211e1461065157600080fd5b8063484b973c1461057a5780634f6ccce71461059a57806351830227146105ba57600080fd5b806331f9c919146104e057806332cb6b0c146104fa578063372df421146105105780633ccfd60b146105305780633dc70c161461054557806342842e0e1461055a57600080fd5b80631a5a3b86116102bc57806323b872dd1161029657806323b872dd1461045357806326febbb0146104735780632f745c59146104a05780633077a863146104c057600080fd5b80631a5a3b86146103f45780631a95f15f146104235780631d8c60861461043e57600080fd5b806301ffc9a71461030f57806306fdde0314610344578063081812fc14610366578063081c8c441461039e578063095ea7b3146103b357806318160ddd146103d557600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a366004613beb565b6109b9565b60405190151581526020015b60405180910390f35b34801561035057600080fd5b506103596109ca565b60405161033b9190613c58565b34801561037257600080fd5b50610386610381366004613c6b565b610a5c565b6040516001600160a01b03909116815260200161033b565b3480156103aa57600080fd5b50610359610a83565b3480156103bf57600080fd5b506103d36103ce366004613ca0565b610b11565b005b3480156103e157600080fd5b50600c545b60405190815260200161033b565b34801561040057600080fd5b5061032f61040f366004613c6b565b600090815260106020526040902054151590565b34801561042f57600080fd5b506103e66608e1bc9bf0400081565b34801561044a57600080fd5b506015546103e6565b34801561045f57600080fd5b506103d361046e366004613cca565b610c2b565b34801561047f57600080fd5b5061049361048e366004613c6b565b610c5c565b60405161033b9190613d41565b3480156104ac57600080fd5b506103e66104bb366004613ca0565b610cbe565b3480156104cc57600080fd5b506103d36104db366004613c6b565b610d54565b3480156104ec57600080fd5b50600e5461032f9060ff1681565b34801561050657600080fd5b506103e66113ba81565b34801561051c57600080fd5b506103d361052b366004613e00565b611100565b34801561053c57600080fd5b506103d36114e4565b34801561055157600080fd5b506104936115df565b34801561056657600080fd5b506103d3610575366004613cca565b6117da565b34801561058657600080fd5b506103d3610595366004613ca0565b6117f5565b3480156105a657600080fd5b506103e66105b5366004613c6b565b6118c6565b3480156105c657600080fd5b50600e5461032f90610100900460ff1681565b3480156105e557600080fd5b506103d36105f4366004613ead565b611959565b34801561060557600080fd5b50610619610614366004613c6b565b61196d565b60405161033b9c9b9a99989796959493929190613ee2565b34801561063d57600080fd5b506103d361064c366004613c6b565b611b8f565b34801561065d57600080fd5b5061038661066c366004613c6b565b611d79565b34801561067d57600080fd5b5061038661068c366004613c6b565b6011602052600090815260409020546001600160a01b031681565b3480156106b357600080fd5b506103e660145481565b3480156106c957600080fd5b506103e66106d8366004613f74565b611dd9565b3480156106e957600080fd5b506103d3611e5f565b6103d3610700366004613f8f565b611e73565b34801561071157600080fd5b506103d3610720366004613f8f565b6121f7565b34801561073157600080fd5b50600a546001600160a01b0316610386565b34801561074f57600080fd5b506103596122b6565b34801561076457600080fd5b50610493610773366004613f74565b6122c5565b6103d3610786366004613c6b565b61232f565b34801561079757600080fd5b506103d36107a6366004613fc1565b6125b6565b3480156107b757600080fd5b506103d36107c6366004613ff4565b6125c1565b3480156107d757600080fd5b506103e666470de4df82000081565b3480156107f257600080fd5b50610359610801366004613c6b565b6125f9565b34801561081257600080fd5b506103e6610821366004613f8f565b61274a565b34801561083257600080fd5b506103d3610841366004614070565b61277b565b34801561085257600080fd5b506103e6610861366004613ca0565b612796565b34801561087257600080fd5b506103d3610881366004614070565b6127b2565b34801561089257600080fd5b506106196108a1366004613c6b565b6127d4565b3480156108b257600080fd5b506104936108c136600461408b565b612a68565b3480156108d257600080fd5b5061032f6108e13660046140ae565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561091b57600080fd5b5061038673d6da4f85f4e7a9a26e378a5dc67c2429fe887d8281565b34801561094357600080fd5b506103e6610952366004613c6b565b60126020526000908152604090205481565b34801561097057600080fd5b506103d361097f366004613ead565b612b18565b34801561099057600080fd5b506103d361099f366004613f74565b612b2c565b3480156109b057600080fd5b506103e6607881565b60006109c482612ba2565b92915050565b6060600080546109d9906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a05906140d8565b8015610a525780601f10610a2757610100808354040283529160200191610a52565b820191906000526020600020905b815481529060010190602001808311610a3557829003601f168201915b5050505050905090565b6000610a6782612bc7565b506000908152600460205260409020546001600160a01b031690565b600f8054610a90906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610abc906140d8565b8015610b095780601f10610ade57610100808354040283529160200191610b09565b820191906000526020600020905b815481529060010190602001808311610aec57829003601f168201915b505050505081565b6000610b1c82611d79565b9050806001600160a01b0316836001600160a01b031603610b8e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610baa5750610baa81336108e1565b610c1c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610b85565b610c268383612c26565b505050565b610c353382612c94565b610c515760405162461bcd60e51b8152600401610b8590614112565b610c26838383612d13565b600081815260106020908152604091829020805483518184028101840190945280845260609392830182828015610cb257602002820191906000526020600020905b815481526020019060010190808311610c9e575b50505050509050919050565b6000610cc983611dd9565b8210610d2b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b85565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d5c612e84565b6015548110610d7d5760405162461bcd60e51b8152600401610b859061415f565b600060158281548110610d9257610d9261418e565b90600052602060002090600d020190508060090160149054906101000a900460ff1615610dd15760405162461bcd60e51b8152600401610b85906141a4565b806008015442101580610deb575080600501548160060154145b610e435760405162461bcd60e51b815260206004820152602360248201527f526166666c65206973206e6f7420726561647920746f20626520636f6d706c656044820152621d195960ea1b6064820152608401610b85565b6000816006015411610e8e5760405162461bcd60e51b8152602060048201526014602482015273139bc81d1a58dad95d1cc81dd95c99481cdbdb1960621b6044820152606401610b85565b6000610e9a8383612edd565b90506000826006015482610eae91906141fb565b6000818152600b850160205260409020546009850180546001600160a81b0319166001600160a01b03909216918217600160a01b179055600185015491925090610ef88187612fc1565b600a8501546000610f0a600283614225565b90506000610f188284614239565b90506000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114610f67576040519150601f19603f3d011682016040523d82523d6000602084013e610f6c565b606091505b5050905080610fc85760405162461bcd60e51b815260206004820152602260248201527f4661696c656420746f207472616e73666572207072697a6520746f2077696e6e60448201526132b960f11b6064820152608401610b85565b88546040516000916001600160a01b03169084908381818185875af1925050503d8060008114611014576040519150601f19603f3d011682016040523d82523d6000602084013e611019565b606091505b50509050806110765760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f207472616e73666572207072697a6520746f20637265616044820152623a37b960e91b6064820152608401610b85565b60408051858152602081018590526001600160a01b038916918d917f6d923903234942f55c3e2f800f13803f26c28fc270f3951572fe9b2b46bd3092910160405180910390a36040518b9087907fb1b49d4f77edac3329efc42f4d955b24e11eda7d0c6516e89f43651cadbd351190600090a3505050505050505050506110fd6001600b55565b50565b611108612e84565b3361111288611d79565b6001600160a01b0316146111775760405162461bcd60e51b815260206004820152602660248201527f4d757374206f776e204e465435303530204e465420746f2063726561746520726044820152656166666c657360d01b6064820152608401610b85565b600083116111d35760405162461bcd60e51b8152602060048201526024808201527f5469636b657420737570706c79206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608401610b85565b6111de60784261424c565b8210156112485760405162461bcd60e51b815260206004820152603260248201527f526166666c65206d757374207374617274206174206c656173742032206d696e6044820152717574657320696e207468652066757475726560701b6064820152608401610b85565b8181116112a15760405162461bcd60e51b815260206004820152602160248201527f456e642074696d65206d7573742062652061667465722073746172742074696d6044820152606560f81b6064820152608401610b85565b60008651116112ea5760405162461bcd60e51b81526020600482015260156024820152745469746c652063616e6e6f7420626520656d70747960581b6044820152606401610b85565b60158054600181018255600091909152600d027f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475810180546001600160a01b031916331781557f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4768201899055907f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4770161138388826142ad565b506003810161139287826142ad565b50600481016113a186826142ad565b5060058101849055600781018390556008810182905560098101805460ff60a01b191690556000600a82018190556015546113de90600190614239565b600081815260116020908152604080832080546001600160a01b03191633908117909155601283528184208e9055835260138252822080546001810182559083529082200182905560148054929350906114378361436d565b9091555050600089815260106020908152604080832080546001810182559084529190922001829055518990339083907f5f7cd4ff8b597a2bb4eeb9475667cf2b193e17a1496325650ee228c7f3887e369061149a908d908b908b908b90614386565b60405180910390a460405181908a907f44d0c74c9e9b44c077d56a3f750884f3e102f2c60e727a9d373c454ee325e2f490600090a350506114db6001600b55565b50505050505050565b6114ec613085565b47806115335760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b6044820152606401610b85565b6000611547600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611591576040519150601f19603f3d011682016040523d82523d6000602084013e611596565b606091505b50509050806115db5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b6044820152606401610b85565b5050565b60606000805b6015548110156116a657601581815481106116025761160261418e565b90600052602060002090600d020160090160149054906101000a900460ff1615801561165257506015818154811061163c5761163c61418e565b90600052602060002090600d0201600701544210155b801561168157506015818154811061166c5761166c61418e565b90600052602060002090600d02016008015442105b1561169457816116908161436d565b9250505b8061169e8161436d565b9150506115e5565b5060008167ffffffffffffffff8111156116c2576116c2613d54565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090506000805b6015548110156117d1576015818154811061170f5761170f61418e565b90600052602060002090600d020160090160149054906101000a900460ff1615801561175f5750601581815481106117495761174961418e565b90600052602060002090600d0201600701544210155b801561178e5750601581815481106117795761177961418e565b90600052602060002090600d02016008015442105b156117bf57808383815181106117a6576117a661418e565b6020908102919091010152816117bb8161436d565b9250505b806117c98161436d565b9150506116f2565b50909392505050565b610c26838383604051806020016040528060008152506125c1565b6117fd613085565b6113ba81600c5461180e919061424c565b11156118515760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610b85565b60005b81811015610c2657600c8054908190600061186e8361436d565b919050555061187d84826130df565b60405181906001600160a01b038616907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090600090a350806118be8161436d565b915050611854565b60006118d160085490565b82106119345760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b85565b600882815481106119475761194761418e565b90600052602060002001549050919050565b611961613085565b600d6115db82826142ad565b6015818154811061197d57600080fd5b60009182526020909120600d90910201805460018201546002830180546001600160a01b0390931694509092916119b3906140d8565b80601f01602080910402602001604051908101604052809291908181526020018280546119df906140d8565b8015611a2c5780601f10611a0157610100808354040283529160200191611a2c565b820191906000526020600020905b815481529060010190602001808311611a0f57829003601f168201915b505050505090806003018054611a41906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d906140d8565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b505050505090806004018054611acf906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054611afb906140d8565b8015611b485780601f10611b1d57610100808354040283529160200191611b48565b820191906000526020600020905b815481529060010190602001808311611b2b57829003601f168201915b5050505060058301546006840154600785015460088601546009870154600a9097015495969395929450909290916001600160a01b03821691600160a01b900460ff16908c565b611b97612e84565b6015548110611bb85760405162461bcd60e51b8152600401610b859061415f565b600060158281548110611bcd57611bcd61418e565b90600052602060002090600d020190508060090160149054906101000a900460ff1615611c0c5760405162461bcd60e51b8152600401610b85906141a4565b8060080154421015611c605760405162461bcd60e51b815260206004820152601860248201527f526166666c6520686173206e6f7420656e6465642079657400000000000000006044820152606401610b85565b600681015415611cc15760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742063616e63656c20726166666c652077697468207469636b65746044820152652073616c657360d01b6064820152608401610b85565b60098101805460ff60a01b1916600160a01b1790556001810154611ce58184612fc1565b80837fdae01c07455c315d7f45ed4e227b621a5e36c5f267e781e28984b7de82795903604051611d38906020808252600f908201526e139bc81d1a58dad95d1cc81cdbdb19608a1b604082015260600190565b60405180910390a3604051839082907fb1b49d4f77edac3329efc42f4d955b24e11eda7d0c6516e89f43651cadbd351190600090a350506110fd6001600b55565b6000818152600260205260408120546001600160a01b0316806109c45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b85565b60006001600160a01b038216611e435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610b85565b506001600160a01b031660009081526003602052604090205490565b611e67613085565b611e7160006130f9565b565b611e7b612e84565b6015548210611e9c5760405162461bcd60e51b8152600401610b859061415f565b60008111611eec5760405162461bcd60e51b815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e2030006044820152606401610b85565b600060158381548110611f0157611f0161418e565b90600052602060002090600d020190508060090160149054906101000a900460ff1615611f405760405162461bcd60e51b8152600401610b85906141a4565b8060070154421015611f945760405162461bcd60e51b815260206004820152601a60248201527f526166666c6520686173206e6f742073746172746564207965740000000000006044820152606401610b85565b80600801544210611fda5760405162461bcd60e51b815260206004820152601060248201526f149859999b19481a185cc8195b99195960821b6044820152606401610b85565b611feb826608e1bc9bf040006143b5565b34146120395760405162461bcd60e51b815260206004820152601c60248201527f4d7573742073656e6420636f72726563742045544820616d6f756e74000000006044820152606401610b85565b806005015482826006015461204e919061424c565b111561209c5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768207469636b65747320617661696c61626c65000000006044820152606401610b85565b60008267ffffffffffffffff8111156120b7576120b7613d54565b6040519080825280602002602001820160405280156120e0578160200160208202803683370190505b50905060005b83811015612178576000818460060154612100919061424c565b6000818152600b86016020908152604080832080546001600160a01b031916339081179091558352600c88018252822080546001810182559083529120018190558351909150819084908490811061215a5761215a61418e565b602090810291909101015250806121708161436d565b9150506120e6565b508282600601600082825461218d919061424c565b925050819055503482600a0160008282546121a8919061424c565b9091555050604051339085907fdd1335d8700f40d827a1ef5cd3c318f03e9b5ad405f80611223021a60056f4d1906121e390879086906143cc565b60405180910390a350506115db6001600b55565b6121ff613085565b6000828152600260205260409020546001600160a01b031661225a5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610b85565b601554811061227b5760405162461bcd60e51b8152600401610b859061415f565b6122858282612fc1565b604051819083907fb1b49d4f77edac3329efc42f4d955b24e11eda7d0c6516e89f43651cadbd351190600090a35050565b6060600180546109d9906140d8565b6001600160a01b038116600090815260136020908152604091829020805483518184028101840190945280845260609392830182828015610cb25760200282019190600052602060002090815481526020019060010190808311610c9e5750505050509050919050565b612337612e84565b600e5460ff166123815760405162461bcd60e51b81526020600482015260156024820152744d696e74696e67206973206e6f742061637469766560581b6044820152606401610b85565b600081116123d15760405162461bcd60e51b815260206004820152601860248201527f4d757374206d696e74206174206c656173742031204e465400000000000000006044820152606401610b85565b6113ba81600c546123e2919061424c565b11156124255760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610b85565b6124368166470de4df8200006143b5565b341461247b5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606401610b85565b60405160009073d6da4f85f4e7a9a26e378a5dc67c2429fe887d829034908381818185875af1925050503d80600081146124d1576040519150601f19603f3d011682016040523d82523d6000602084013e6124d6565b606091505b505090508061253e5760405162461bcd60e51b815260206004820152602e60248201527f4661696c656420746f2073656e64206d696e74207061796d656e7420746f207060448201526d1b185d199bdc9b481dd85b1b195d60921b6064820152608401610b85565b60005b828110156125aa57600c8054908190600061255b8361436d565b919050555061256a33826130df565b604051819033907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090600090a350806125a28161436d565b915050612541565b50506110fd6001600b55565b6115db33838361314b565b6125cb3383612c94565b6125e75760405162461bcd60e51b8152600401610b8590614112565b6125f384848484613219565b50505050565b6000818152600260205260409020546060906001600160a01b03166126575760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610b85565b600e54610100900460ff166126ee57600f8054612673906140d8565b80601f016020809104026020016040519081016040528092919081815260200182805461269f906140d8565b8015610cb25780601f106126c157610100808354040283529160200191610cb2565b820191906000526020600020905b8154815290600101906020018083116126cf5750939695505050505050565b60006126f861324c565b905060008151116127185760405180602001604052806000815250612743565b806127228461325b565b6040516020016127339291906143e5565b6040516020818303038152906040525b9392505050565b6010602052816000526040600020818154811061276657600080fd5b90600052602060002001600091509150505481565b612783613085565b600e805460ff1916911515919091179055565b6013602052816000526040600020818154811061276657600080fd5b6127ba613085565b600e80549115156101000261ff0019909216919091179055565b600080606080606060008060008060008060006015805490508d1061280b5760405162461bcd60e51b8152600401610b859061415f565b600060158e815481106128205761282061418e565b90600052602060002090600d020190508060000160009054906101000a90046001600160a01b0316816001015482600201836003018460040185600501548660060154876007015488600801548960090160009054906101000a90046001600160a01b03168a60090160149054906101000a900460ff168b600a01548980546128a8906140d8565b80601f01602080910402602001604051908101604052809291908181526020018280546128d4906140d8565b80156129215780601f106128f657610100808354040283529160200191612921565b820191906000526020600020905b81548152906001019060200180831161290457829003601f168201915b50505050509950888054612934906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054612960906140d8565b80156129ad5780601f10612982576101008083540402835291602001916129ad565b820191906000526020600020905b81548152906001019060200180831161299057829003601f168201915b505050505098508780546129c0906140d8565b80601f01602080910402602001604051908101604052809291908181526020018280546129ec906140d8565b8015612a395780601f10612a0e57610100808354040283529160200191612a39565b820191906000526020600020905b815481529060010190602001808311612a1c57829003601f168201915b505050505097509c509c509c509c509c509c509c509c509c509c509c509c505091939597999b5091939597999b565b6015546060908310612a8c5760405162461bcd60e51b8152600401610b859061415f565b60158381548110612a9f57612a9f61418e565b600091825260208083206001600160a01b0386168452600c600d9093020191909101815260409182902080548351818402810184019094528084529091830182828015612b0b57602002820191906000526020600020905b815481526020019060010190808311612af7575b5050505050905092915050565b612b20613085565b600f6115db82826142ad565b612b34613085565b6001600160a01b038116612b995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b85565b6110fd816130f9565b60006001600160e01b0319821663780e9d6360e01b14806109c457506109c4826132ee565b6000818152600260205260409020546001600160a01b03166110fd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b85565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c5b82611d79565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612ca083611d79565b9050806001600160a01b0316846001600160a01b03161480612ce757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612d0b5750836001600160a01b0316612d0084610a5c565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d2682611d79565b6001600160a01b031614612d4c5760405162461bcd60e51b8152600401610b8590614424565b6001600160a01b038216612dae5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b85565b612dbb838383600161333e565b826001600160a01b0316612dce82611d79565b6001600160a01b031614612df45760405162461bcd60e51b8152600401610b8590614424565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6002600b5403612ed65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600b55565b600044612eeb600143614239565b4042438560000160009054906101000a90046001600160a01b031686600701548760080154886006015489600a0154333a30612f268f61342b565b60408051602081019e909e528d019b909b526060808d019a909a5260808c01989098526bffffffffffffffffffffffff1996891b871660a08c015260b48b019590955260d48a019390935260f4890191909152610114880152841b8216610134870152610148860152911b1661016883015261017c82015261019c0160408051601f1981840301815291905280516020909101209392505050565b6000828152601060205260408120905b81548110156125f35782828281548110612fed57612fed61418e565b906000526020600020015403613073578154829061300d90600190614239565b8154811061301d5761301d61418e565b906000526020600020015482828154811061303a5761303a61418e565b90600052602060002001819055508180548061305857613058614469565b600190038181906000526020600020016000905590556125f3565b8061307d8161436d565b915050612fd1565b600a546001600160a01b03163314611e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b6115db8282604051806020016040528060008152506134df565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036131ac5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b85565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613224848484612d13565b61323084848484613512565b6125f35760405162461bcd60e51b8152600401610b859061447f565b6060600d80546109d9906140d8565b6060600061326883613613565b600101905060008167ffffffffffffffff81111561328857613288613d54565b6040519080825280601f01601f1916602001820160405280156132b2576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846132bc57509392505050565b60006001600160e01b031982166380ac58cd60e01b148061331f57506001600160e01b03198216635b5e139f60e01b145b806109c457506301ffc9a760e01b6001600160e01b03198316146109c4565b61334a848484846136eb565b6001600160a01b038416156125f357600082815260106020526040902054801561342457827ff20ceac9dd9e1c60702af4ad889b2b04c5d4dfb49a6d2b94ee45a99dab435751826040516133a091815260200190565b60405180910390a260405162461bcd60e51b815260206004820152604560248201527f4e4654206973206c6f636b65643a206861732061637469766520726166666c6560448201527f2873292e20436f6d706c65746520726166666c65206265666f7265207472616e60648201526439b332b91760d91b608482015260a401610b85565b5050505050565b600080601583815481106134415761344161418e565b90600052602060002090600d0201905060606000603283600601541161346b57826006015461346e565b60325b905060005b818110156134ce576000818152600b850160209081526040918290205491516134aa9286926001600160a01b0390911691016144d1565b604051602081830303815290604052925080806134c69061436d565b915050613473565b505080516020909101209392505050565b6134e98383613824565b6134f66000848484613512565b610c265760405162461bcd60e51b8152600401610b859061447f565b60006001600160a01b0384163b1561360857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613556903390899088908890600401614508565b6020604051808303816000875af1925050508015613591575060408051601f3d908101601f1916820190925261358e91810190614545565b60015b6135ee573d8080156135bf576040519150601f19603f3d011682016040523d82523d6000602084013e6135c4565b606091505b5080516000036135e65760405162461bcd60e51b8152600401610b859061447f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d0b565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106136525772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061367e576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061369c57662386f26fc10000830492506010015b6305f5e10083106136b4576305f5e100830492506008015b61271083106136c857612710830492506004015b606483106136da576064830492506002015b600a83106109c45760010192915050565b6136f7848484846139bd565b60018111156137665760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610b85565b816001600160a01b0385166137c2576137bd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6137e5565b836001600160a01b0316856001600160a01b0316146137e5576137e58582613a45565b6001600160a01b038416613801576137fc81613ae2565b613424565b846001600160a01b0316846001600160a01b031614613424576134248482613b91565b6001600160a01b03821661387a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b85565b6000818152600260205260409020546001600160a01b0316156138df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b85565b6138ed60008383600161333e565b6000818152600260205260409020546001600160a01b0316156139525760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b85565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60018111156125f3576001600160a01b03841615613a03576001600160a01b038416600090815260036020526040812080548392906139fd908490614239565b90915550505b6001600160a01b038316156125f3576001600160a01b03831660009081526003602052604081208054839290613a3a90849061424c565b909155505050505050565b60006001613a5284611dd9565b613a5c9190614239565b600083815260076020526040902054909150808214613aaf576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613af490600190614239565b60008381526009602052604081205460088054939450909284908110613b1c57613b1c61418e565b906000526020600020015490508060088381548110613b3d57613b3d61418e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613b7557613b75614469565b6001900381819060005260206000200160009055905550505050565b6000613b9c83611dd9565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b0319811681146110fd57600080fd5b600060208284031215613bfd57600080fd5b813561274381613bd5565b60005b83811015613c23578181015183820152602001613c0b565b50506000910152565b60008151808452613c44816020860160208601613c08565b601f01601f19169290920160200192915050565b6020815260006127436020830184613c2c565b600060208284031215613c7d57600080fd5b5035919050565b80356001600160a01b0381168114613c9b57600080fd5b919050565b60008060408385031215613cb357600080fd5b613cbc83613c84565b946020939093013593505050565b600080600060608486031215613cdf57600080fd5b613ce884613c84565b9250613cf660208501613c84565b9150604084013590509250925092565b600081518084526020808501945080840160005b83811015613d3657815187529582019590820190600101613d1a565b509495945050505050565b6020815260006127436020830184613d06565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d8557613d85613d54565b604051601f8501601f19908116603f01168101908282118183101715613dad57613dad613d54565b81604052809350858152868686011115613dc657600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112613df157600080fd5b61274383833560208501613d6a565b600080600080600080600060e0888a031215613e1b57600080fd5b87359650602088013567ffffffffffffffff80821115613e3a57600080fd5b613e468b838c01613de0565b975060408a0135915080821115613e5c57600080fd5b613e688b838c01613de0565b965060608a0135915080821115613e7e57600080fd5b50613e8b8a828b01613de0565b979a969950949760808101359660a0820135965060c090910135945092505050565b600060208284031215613ebf57600080fd5b813567ffffffffffffffff811115613ed657600080fd5b612d0b84828501613de0565b600060018060a01b03808f1683528d60208401526101806040840152613f0c61018084018e613c2c565b8381036060850152613f1e818e613c2c565b90508381036080850152613f32818d613c2c565b60a085019b909b525060c08301989098525060e08101959095526101008501939093529316610120830152911515610140820152610160015295945050505050565b600060208284031215613f8657600080fd5b61274382613c84565b60008060408385031215613fa257600080fd5b50508035926020909101359150565b80358015158114613c9b57600080fd5b60008060408385031215613fd457600080fd5b613fdd83613c84565b9150613feb60208401613fb1565b90509250929050565b6000806000806080858703121561400a57600080fd5b61401385613c84565b935061402160208601613c84565b925060408501359150606085013567ffffffffffffffff81111561404457600080fd5b8501601f8101871361405557600080fd5b61406487823560208401613d6a565b91505092959194509250565b60006020828403121561408257600080fd5b61274382613fb1565b6000806040838503121561409e57600080fd5b82359150613feb60208401613c84565b600080604083850312156140c157600080fd5b6140ca83613c84565b9150613feb60208401613c84565b600181811c908216806140ec57607f821691505b60208210810361410c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b602080825260159082015274149859999b1948191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f526166666c652068617320616c7265616479206265656e20636f6d706c6574656040820152601960fa1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261420a5761420a6141e5565b500690565b634e487b7160e01b600052601160045260246000fd5b600082614234576142346141e5565b500490565b818103818111156109c4576109c461420f565b808201808211156109c4576109c461420f565b601f821115610c2657600081815260208120601f850160051c810160208610156142865750805b601f850160051c820191505b818110156142a557828155600101614292565b505050505050565b815167ffffffffffffffff8111156142c7576142c7613d54565b6142db816142d584546140d8565b8461425f565b602080601f83116001811461431057600084156142f85750858301515b600019600386901b1c1916600185901b1785556142a5565b600085815260208120601f198616915b8281101561433f57888601518255948401946001909101908401614320565b508582101561435d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161437f5761437f61420f565b5060010190565b6080815260006143996080830187613c2c565b6020830195909552506040810192909252606090910152919050565b80820281158282048414176109c4576109c461420f565b828152604060208201526000612d0b6040830184613d06565b600083516143f7818460208801613c08565b83519083019061440b818360208801613c08565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516144e3818460208801613c08565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061453b90830184613c2c565b9695505050505050565b60006020828403121561455757600080fd5b815161274381613bd556fea2646970667358221220eb34526af5f09e0f3c47e075cb20e10f01563266af6c5953c94aa16977f42cb564736f6c63430008130033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000074e4654353035300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074e46543530353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f626166796265696233346d37367068756d367262726e64713674336c61676d7074726a6d676279326e376a7576747979617a6f35636663626e6a692f0000000000000000000000000000000000000000000000000000000000000000006e68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f626166796265696233346d37367068756d367262726e64713674336c61676d7074726a6d676279326e376a7576747979617a6f35636663626e6a692f706c616365686f6c6465722e6a736f6e000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103035760003560e01c806365ed57c211610190578063c87b56dd116100dc578063e7a7f65c11610095578063f27d2b0c1161006f578063f27d2b0c14610937578063f2c4ce1e14610964578063f2fde38b14610984578063f89367e5146109a457600080fd5b8063e7a7f65c146108a6578063e985e9c5146108c6578063eb8b12d41461090f57600080fd5b8063c87b56dd146107e6578063cf99ac6f14610806578063d04ef28514610826578063d51075c114610846578063e0a8085314610866578063e4dafec91461088657600080fd5b80638da5cb5b11610149578063a0712d6811610123578063a0712d6814610778578063a22cb4651461078b578063b88d4fde146107ab578063c002d23d146107cb57600080fd5b80638da5cb5b1461072557806395d89b411461074357806398d711381461075857600080fd5b806365ed57c2146106715780636a0c5a71146106a757806370a08231146106bd578063715018a6146106dd5780638627df46146106f2578063889842ff1461070557600080fd5b806331f9c9191161024f578063484b973c1161020857806355f804b3116101e257806355f804b3146105d95780635d4bc0ce146105f95780635fba3171146106315780636352211e1461065157600080fd5b8063484b973c1461057a5780634f6ccce71461059a57806351830227146105ba57600080fd5b806331f9c919146104e057806332cb6b0c146104fa578063372df421146105105780633ccfd60b146105305780633dc70c161461054557806342842e0e1461055a57600080fd5b80631a5a3b86116102bc57806323b872dd1161029657806323b872dd1461045357806326febbb0146104735780632f745c59146104a05780633077a863146104c057600080fd5b80631a5a3b86146103f45780631a95f15f146104235780631d8c60861461043e57600080fd5b806301ffc9a71461030f57806306fdde0314610344578063081812fc14610366578063081c8c441461039e578063095ea7b3146103b357806318160ddd146103d557600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a366004613beb565b6109b9565b60405190151581526020015b60405180910390f35b34801561035057600080fd5b506103596109ca565b60405161033b9190613c58565b34801561037257600080fd5b50610386610381366004613c6b565b610a5c565b6040516001600160a01b03909116815260200161033b565b3480156103aa57600080fd5b50610359610a83565b3480156103bf57600080fd5b506103d36103ce366004613ca0565b610b11565b005b3480156103e157600080fd5b50600c545b60405190815260200161033b565b34801561040057600080fd5b5061032f61040f366004613c6b565b600090815260106020526040902054151590565b34801561042f57600080fd5b506103e66608e1bc9bf0400081565b34801561044a57600080fd5b506015546103e6565b34801561045f57600080fd5b506103d361046e366004613cca565b610c2b565b34801561047f57600080fd5b5061049361048e366004613c6b565b610c5c565b60405161033b9190613d41565b3480156104ac57600080fd5b506103e66104bb366004613ca0565b610cbe565b3480156104cc57600080fd5b506103d36104db366004613c6b565b610d54565b3480156104ec57600080fd5b50600e5461032f9060ff1681565b34801561050657600080fd5b506103e66113ba81565b34801561051c57600080fd5b506103d361052b366004613e00565b611100565b34801561053c57600080fd5b506103d36114e4565b34801561055157600080fd5b506104936115df565b34801561056657600080fd5b506103d3610575366004613cca565b6117da565b34801561058657600080fd5b506103d3610595366004613ca0565b6117f5565b3480156105a657600080fd5b506103e66105b5366004613c6b565b6118c6565b3480156105c657600080fd5b50600e5461032f90610100900460ff1681565b3480156105e557600080fd5b506103d36105f4366004613ead565b611959565b34801561060557600080fd5b50610619610614366004613c6b565b61196d565b60405161033b9c9b9a99989796959493929190613ee2565b34801561063d57600080fd5b506103d361064c366004613c6b565b611b8f565b34801561065d57600080fd5b5061038661066c366004613c6b565b611d79565b34801561067d57600080fd5b5061038661068c366004613c6b565b6011602052600090815260409020546001600160a01b031681565b3480156106b357600080fd5b506103e660145481565b3480156106c957600080fd5b506103e66106d8366004613f74565b611dd9565b3480156106e957600080fd5b506103d3611e5f565b6103d3610700366004613f8f565b611e73565b34801561071157600080fd5b506103d3610720366004613f8f565b6121f7565b34801561073157600080fd5b50600a546001600160a01b0316610386565b34801561074f57600080fd5b506103596122b6565b34801561076457600080fd5b50610493610773366004613f74565b6122c5565b6103d3610786366004613c6b565b61232f565b34801561079757600080fd5b506103d36107a6366004613fc1565b6125b6565b3480156107b757600080fd5b506103d36107c6366004613ff4565b6125c1565b3480156107d757600080fd5b506103e666470de4df82000081565b3480156107f257600080fd5b50610359610801366004613c6b565b6125f9565b34801561081257600080fd5b506103e6610821366004613f8f565b61274a565b34801561083257600080fd5b506103d3610841366004614070565b61277b565b34801561085257600080fd5b506103e6610861366004613ca0565b612796565b34801561087257600080fd5b506103d3610881366004614070565b6127b2565b34801561089257600080fd5b506106196108a1366004613c6b565b6127d4565b3480156108b257600080fd5b506104936108c136600461408b565b612a68565b3480156108d257600080fd5b5061032f6108e13660046140ae565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561091b57600080fd5b5061038673d6da4f85f4e7a9a26e378a5dc67c2429fe887d8281565b34801561094357600080fd5b506103e6610952366004613c6b565b60126020526000908152604090205481565b34801561097057600080fd5b506103d361097f366004613ead565b612b18565b34801561099057600080fd5b506103d361099f366004613f74565b612b2c565b3480156109b057600080fd5b506103e6607881565b60006109c482612ba2565b92915050565b6060600080546109d9906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a05906140d8565b8015610a525780601f10610a2757610100808354040283529160200191610a52565b820191906000526020600020905b815481529060010190602001808311610a3557829003601f168201915b5050505050905090565b6000610a6782612bc7565b506000908152600460205260409020546001600160a01b031690565b600f8054610a90906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610abc906140d8565b8015610b095780601f10610ade57610100808354040283529160200191610b09565b820191906000526020600020905b815481529060010190602001808311610aec57829003601f168201915b505050505081565b6000610b1c82611d79565b9050806001600160a01b0316836001600160a01b031603610b8e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610baa5750610baa81336108e1565b610c1c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610b85565b610c268383612c26565b505050565b610c353382612c94565b610c515760405162461bcd60e51b8152600401610b8590614112565b610c26838383612d13565b600081815260106020908152604091829020805483518184028101840190945280845260609392830182828015610cb257602002820191906000526020600020905b815481526020019060010190808311610c9e575b50505050509050919050565b6000610cc983611dd9565b8210610d2b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b85565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d5c612e84565b6015548110610d7d5760405162461bcd60e51b8152600401610b859061415f565b600060158281548110610d9257610d9261418e565b90600052602060002090600d020190508060090160149054906101000a900460ff1615610dd15760405162461bcd60e51b8152600401610b85906141a4565b806008015442101580610deb575080600501548160060154145b610e435760405162461bcd60e51b815260206004820152602360248201527f526166666c65206973206e6f7420726561647920746f20626520636f6d706c656044820152621d195960ea1b6064820152608401610b85565b6000816006015411610e8e5760405162461bcd60e51b8152602060048201526014602482015273139bc81d1a58dad95d1cc81dd95c99481cdbdb1960621b6044820152606401610b85565b6000610e9a8383612edd565b90506000826006015482610eae91906141fb565b6000818152600b850160205260409020546009850180546001600160a81b0319166001600160a01b03909216918217600160a01b179055600185015491925090610ef88187612fc1565b600a8501546000610f0a600283614225565b90506000610f188284614239565b90506000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114610f67576040519150601f19603f3d011682016040523d82523d6000602084013e610f6c565b606091505b5050905080610fc85760405162461bcd60e51b815260206004820152602260248201527f4661696c656420746f207472616e73666572207072697a6520746f2077696e6e60448201526132b960f11b6064820152608401610b85565b88546040516000916001600160a01b03169084908381818185875af1925050503d8060008114611014576040519150601f19603f3d011682016040523d82523d6000602084013e611019565b606091505b50509050806110765760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f207472616e73666572207072697a6520746f20637265616044820152623a37b960e91b6064820152608401610b85565b60408051858152602081018590526001600160a01b038916918d917f6d923903234942f55c3e2f800f13803f26c28fc270f3951572fe9b2b46bd3092910160405180910390a36040518b9087907fb1b49d4f77edac3329efc42f4d955b24e11eda7d0c6516e89f43651cadbd351190600090a3505050505050505050506110fd6001600b55565b50565b611108612e84565b3361111288611d79565b6001600160a01b0316146111775760405162461bcd60e51b815260206004820152602660248201527f4d757374206f776e204e465435303530204e465420746f2063726561746520726044820152656166666c657360d01b6064820152608401610b85565b600083116111d35760405162461bcd60e51b8152602060048201526024808201527f5469636b657420737570706c79206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608401610b85565b6111de60784261424c565b8210156112485760405162461bcd60e51b815260206004820152603260248201527f526166666c65206d757374207374617274206174206c656173742032206d696e6044820152717574657320696e207468652066757475726560701b6064820152608401610b85565b8181116112a15760405162461bcd60e51b815260206004820152602160248201527f456e642074696d65206d7573742062652061667465722073746172742074696d6044820152606560f81b6064820152608401610b85565b60008651116112ea5760405162461bcd60e51b81526020600482015260156024820152745469746c652063616e6e6f7420626520656d70747960581b6044820152606401610b85565b60158054600181018255600091909152600d027f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475810180546001600160a01b031916331781557f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4768201899055907f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4770161138388826142ad565b506003810161139287826142ad565b50600481016113a186826142ad565b5060058101849055600781018390556008810182905560098101805460ff60a01b191690556000600a82018190556015546113de90600190614239565b600081815260116020908152604080832080546001600160a01b03191633908117909155601283528184208e9055835260138252822080546001810182559083529082200182905560148054929350906114378361436d565b9091555050600089815260106020908152604080832080546001810182559084529190922001829055518990339083907f5f7cd4ff8b597a2bb4eeb9475667cf2b193e17a1496325650ee228c7f3887e369061149a908d908b908b908b90614386565b60405180910390a460405181908a907f44d0c74c9e9b44c077d56a3f750884f3e102f2c60e727a9d373c454ee325e2f490600090a350506114db6001600b55565b50505050505050565b6114ec613085565b47806115335760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b6044820152606401610b85565b6000611547600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611591576040519150601f19603f3d011682016040523d82523d6000602084013e611596565b606091505b50509050806115db5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b6044820152606401610b85565b5050565b60606000805b6015548110156116a657601581815481106116025761160261418e565b90600052602060002090600d020160090160149054906101000a900460ff1615801561165257506015818154811061163c5761163c61418e565b90600052602060002090600d0201600701544210155b801561168157506015818154811061166c5761166c61418e565b90600052602060002090600d02016008015442105b1561169457816116908161436d565b9250505b8061169e8161436d565b9150506115e5565b5060008167ffffffffffffffff8111156116c2576116c2613d54565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090506000805b6015548110156117d1576015818154811061170f5761170f61418e565b90600052602060002090600d020160090160149054906101000a900460ff1615801561175f5750601581815481106117495761174961418e565b90600052602060002090600d0201600701544210155b801561178e5750601581815481106117795761177961418e565b90600052602060002090600d02016008015442105b156117bf57808383815181106117a6576117a661418e565b6020908102919091010152816117bb8161436d565b9250505b806117c98161436d565b9150506116f2565b50909392505050565b610c26838383604051806020016040528060008152506125c1565b6117fd613085565b6113ba81600c5461180e919061424c565b11156118515760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610b85565b60005b81811015610c2657600c8054908190600061186e8361436d565b919050555061187d84826130df565b60405181906001600160a01b038616907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090600090a350806118be8161436d565b915050611854565b60006118d160085490565b82106119345760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b85565b600882815481106119475761194761418e565b90600052602060002001549050919050565b611961613085565b600d6115db82826142ad565b6015818154811061197d57600080fd5b60009182526020909120600d90910201805460018201546002830180546001600160a01b0390931694509092916119b3906140d8565b80601f01602080910402602001604051908101604052809291908181526020018280546119df906140d8565b8015611a2c5780601f10611a0157610100808354040283529160200191611a2c565b820191906000526020600020905b815481529060010190602001808311611a0f57829003601f168201915b505050505090806003018054611a41906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d906140d8565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b505050505090806004018054611acf906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054611afb906140d8565b8015611b485780601f10611b1d57610100808354040283529160200191611b48565b820191906000526020600020905b815481529060010190602001808311611b2b57829003601f168201915b5050505060058301546006840154600785015460088601546009870154600a9097015495969395929450909290916001600160a01b03821691600160a01b900460ff16908c565b611b97612e84565b6015548110611bb85760405162461bcd60e51b8152600401610b859061415f565b600060158281548110611bcd57611bcd61418e565b90600052602060002090600d020190508060090160149054906101000a900460ff1615611c0c5760405162461bcd60e51b8152600401610b85906141a4565b8060080154421015611c605760405162461bcd60e51b815260206004820152601860248201527f526166666c6520686173206e6f7420656e6465642079657400000000000000006044820152606401610b85565b600681015415611cc15760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742063616e63656c20726166666c652077697468207469636b65746044820152652073616c657360d01b6064820152608401610b85565b60098101805460ff60a01b1916600160a01b1790556001810154611ce58184612fc1565b80837fdae01c07455c315d7f45ed4e227b621a5e36c5f267e781e28984b7de82795903604051611d38906020808252600f908201526e139bc81d1a58dad95d1cc81cdbdb19608a1b604082015260600190565b60405180910390a3604051839082907fb1b49d4f77edac3329efc42f4d955b24e11eda7d0c6516e89f43651cadbd351190600090a350506110fd6001600b55565b6000818152600260205260408120546001600160a01b0316806109c45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b85565b60006001600160a01b038216611e435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610b85565b506001600160a01b031660009081526003602052604090205490565b611e67613085565b611e7160006130f9565b565b611e7b612e84565b6015548210611e9c5760405162461bcd60e51b8152600401610b859061415f565b60008111611eec5760405162461bcd60e51b815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e2030006044820152606401610b85565b600060158381548110611f0157611f0161418e565b90600052602060002090600d020190508060090160149054906101000a900460ff1615611f405760405162461bcd60e51b8152600401610b85906141a4565b8060070154421015611f945760405162461bcd60e51b815260206004820152601a60248201527f526166666c6520686173206e6f742073746172746564207965740000000000006044820152606401610b85565b80600801544210611fda5760405162461bcd60e51b815260206004820152601060248201526f149859999b19481a185cc8195b99195960821b6044820152606401610b85565b611feb826608e1bc9bf040006143b5565b34146120395760405162461bcd60e51b815260206004820152601c60248201527f4d7573742073656e6420636f72726563742045544820616d6f756e74000000006044820152606401610b85565b806005015482826006015461204e919061424c565b111561209c5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768207469636b65747320617661696c61626c65000000006044820152606401610b85565b60008267ffffffffffffffff8111156120b7576120b7613d54565b6040519080825280602002602001820160405280156120e0578160200160208202803683370190505b50905060005b83811015612178576000818460060154612100919061424c565b6000818152600b86016020908152604080832080546001600160a01b031916339081179091558352600c88018252822080546001810182559083529120018190558351909150819084908490811061215a5761215a61418e565b602090810291909101015250806121708161436d565b9150506120e6565b508282600601600082825461218d919061424c565b925050819055503482600a0160008282546121a8919061424c565b9091555050604051339085907fdd1335d8700f40d827a1ef5cd3c318f03e9b5ad405f80611223021a60056f4d1906121e390879086906143cc565b60405180910390a350506115db6001600b55565b6121ff613085565b6000828152600260205260409020546001600160a01b031661225a5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610b85565b601554811061227b5760405162461bcd60e51b8152600401610b859061415f565b6122858282612fc1565b604051819083907fb1b49d4f77edac3329efc42f4d955b24e11eda7d0c6516e89f43651cadbd351190600090a35050565b6060600180546109d9906140d8565b6001600160a01b038116600090815260136020908152604091829020805483518184028101840190945280845260609392830182828015610cb25760200282019190600052602060002090815481526020019060010190808311610c9e5750505050509050919050565b612337612e84565b600e5460ff166123815760405162461bcd60e51b81526020600482015260156024820152744d696e74696e67206973206e6f742061637469766560581b6044820152606401610b85565b600081116123d15760405162461bcd60e51b815260206004820152601860248201527f4d757374206d696e74206174206c656173742031204e465400000000000000006044820152606401610b85565b6113ba81600c546123e2919061424c565b11156124255760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610b85565b6124368166470de4df8200006143b5565b341461247b5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606401610b85565b60405160009073d6da4f85f4e7a9a26e378a5dc67c2429fe887d829034908381818185875af1925050503d80600081146124d1576040519150601f19603f3d011682016040523d82523d6000602084013e6124d6565b606091505b505090508061253e5760405162461bcd60e51b815260206004820152602e60248201527f4661696c656420746f2073656e64206d696e74207061796d656e7420746f207060448201526d1b185d199bdc9b481dd85b1b195d60921b6064820152608401610b85565b60005b828110156125aa57600c8054908190600061255b8361436d565b919050555061256a33826130df565b604051819033907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090600090a350806125a28161436d565b915050612541565b50506110fd6001600b55565b6115db33838361314b565b6125cb3383612c94565b6125e75760405162461bcd60e51b8152600401610b8590614112565b6125f384848484613219565b50505050565b6000818152600260205260409020546060906001600160a01b03166126575760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610b85565b600e54610100900460ff166126ee57600f8054612673906140d8565b80601f016020809104026020016040519081016040528092919081815260200182805461269f906140d8565b8015610cb25780601f106126c157610100808354040283529160200191610cb2565b820191906000526020600020905b8154815290600101906020018083116126cf5750939695505050505050565b60006126f861324c565b905060008151116127185760405180602001604052806000815250612743565b806127228461325b565b6040516020016127339291906143e5565b6040516020818303038152906040525b9392505050565b6010602052816000526040600020818154811061276657600080fd5b90600052602060002001600091509150505481565b612783613085565b600e805460ff1916911515919091179055565b6013602052816000526040600020818154811061276657600080fd5b6127ba613085565b600e80549115156101000261ff0019909216919091179055565b600080606080606060008060008060008060006015805490508d1061280b5760405162461bcd60e51b8152600401610b859061415f565b600060158e815481106128205761282061418e565b90600052602060002090600d020190508060000160009054906101000a90046001600160a01b0316816001015482600201836003018460040185600501548660060154876007015488600801548960090160009054906101000a90046001600160a01b03168a60090160149054906101000a900460ff168b600a01548980546128a8906140d8565b80601f01602080910402602001604051908101604052809291908181526020018280546128d4906140d8565b80156129215780601f106128f657610100808354040283529160200191612921565b820191906000526020600020905b81548152906001019060200180831161290457829003601f168201915b50505050509950888054612934906140d8565b80601f0160208091040260200160405190810160405280929190818152602001828054612960906140d8565b80156129ad5780601f10612982576101008083540402835291602001916129ad565b820191906000526020600020905b81548152906001019060200180831161299057829003601f168201915b505050505098508780546129c0906140d8565b80601f01602080910402602001604051908101604052809291908181526020018280546129ec906140d8565b8015612a395780601f10612a0e57610100808354040283529160200191612a39565b820191906000526020600020905b815481529060010190602001808311612a1c57829003601f168201915b505050505097509c509c509c509c509c509c509c509c509c509c509c509c505091939597999b5091939597999b565b6015546060908310612a8c5760405162461bcd60e51b8152600401610b859061415f565b60158381548110612a9f57612a9f61418e565b600091825260208083206001600160a01b0386168452600c600d9093020191909101815260409182902080548351818402810184019094528084529091830182828015612b0b57602002820191906000526020600020905b815481526020019060010190808311612af7575b5050505050905092915050565b612b20613085565b600f6115db82826142ad565b612b34613085565b6001600160a01b038116612b995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b85565b6110fd816130f9565b60006001600160e01b0319821663780e9d6360e01b14806109c457506109c4826132ee565b6000818152600260205260409020546001600160a01b03166110fd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b85565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c5b82611d79565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612ca083611d79565b9050806001600160a01b0316846001600160a01b03161480612ce757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612d0b5750836001600160a01b0316612d0084610a5c565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d2682611d79565b6001600160a01b031614612d4c5760405162461bcd60e51b8152600401610b8590614424565b6001600160a01b038216612dae5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b85565b612dbb838383600161333e565b826001600160a01b0316612dce82611d79565b6001600160a01b031614612df45760405162461bcd60e51b8152600401610b8590614424565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6002600b5403612ed65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b85565b6002600b55565b600044612eeb600143614239565b4042438560000160009054906101000a90046001600160a01b031686600701548760080154886006015489600a0154333a30612f268f61342b565b60408051602081019e909e528d019b909b526060808d019a909a5260808c01989098526bffffffffffffffffffffffff1996891b871660a08c015260b48b019590955260d48a019390935260f4890191909152610114880152841b8216610134870152610148860152911b1661016883015261017c82015261019c0160408051601f1981840301815291905280516020909101209392505050565b6000828152601060205260408120905b81548110156125f35782828281548110612fed57612fed61418e565b906000526020600020015403613073578154829061300d90600190614239565b8154811061301d5761301d61418e565b906000526020600020015482828154811061303a5761303a61418e565b90600052602060002001819055508180548061305857613058614469565b600190038181906000526020600020016000905590556125f3565b8061307d8161436d565b915050612fd1565b600a546001600160a01b03163314611e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b6115db8282604051806020016040528060008152506134df565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036131ac5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b85565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613224848484612d13565b61323084848484613512565b6125f35760405162461bcd60e51b8152600401610b859061447f565b6060600d80546109d9906140d8565b6060600061326883613613565b600101905060008167ffffffffffffffff81111561328857613288613d54565b6040519080825280601f01601f1916602001820160405280156132b2576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846132bc57509392505050565b60006001600160e01b031982166380ac58cd60e01b148061331f57506001600160e01b03198216635b5e139f60e01b145b806109c457506301ffc9a760e01b6001600160e01b03198316146109c4565b61334a848484846136eb565b6001600160a01b038416156125f357600082815260106020526040902054801561342457827ff20ceac9dd9e1c60702af4ad889b2b04c5d4dfb49a6d2b94ee45a99dab435751826040516133a091815260200190565b60405180910390a260405162461bcd60e51b815260206004820152604560248201527f4e4654206973206c6f636b65643a206861732061637469766520726166666c6560448201527f2873292e20436f6d706c65746520726166666c65206265666f7265207472616e60648201526439b332b91760d91b608482015260a401610b85565b5050505050565b600080601583815481106134415761344161418e565b90600052602060002090600d0201905060606000603283600601541161346b57826006015461346e565b60325b905060005b818110156134ce576000818152600b850160209081526040918290205491516134aa9286926001600160a01b0390911691016144d1565b604051602081830303815290604052925080806134c69061436d565b915050613473565b505080516020909101209392505050565b6134e98383613824565b6134f66000848484613512565b610c265760405162461bcd60e51b8152600401610b859061447f565b60006001600160a01b0384163b1561360857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613556903390899088908890600401614508565b6020604051808303816000875af1925050508015613591575060408051601f3d908101601f1916820190925261358e91810190614545565b60015b6135ee573d8080156135bf576040519150601f19603f3d011682016040523d82523d6000602084013e6135c4565b606091505b5080516000036135e65760405162461bcd60e51b8152600401610b859061447f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d0b565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106136525772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061367e576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061369c57662386f26fc10000830492506010015b6305f5e10083106136b4576305f5e100830492506008015b61271083106136c857612710830492506004015b606483106136da576064830492506002015b600a83106109c45760010192915050565b6136f7848484846139bd565b60018111156137665760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610b85565b816001600160a01b0385166137c2576137bd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6137e5565b836001600160a01b0316856001600160a01b0316146137e5576137e58582613a45565b6001600160a01b038416613801576137fc81613ae2565b613424565b846001600160a01b0316846001600160a01b031614613424576134248482613b91565b6001600160a01b03821661387a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b85565b6000818152600260205260409020546001600160a01b0316156138df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b85565b6138ed60008383600161333e565b6000818152600260205260409020546001600160a01b0316156139525760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b85565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60018111156125f3576001600160a01b03841615613a03576001600160a01b038416600090815260036020526040812080548392906139fd908490614239565b90915550505b6001600160a01b038316156125f3576001600160a01b03831660009081526003602052604081208054839290613a3a90849061424c565b909155505050505050565b60006001613a5284611dd9565b613a5c9190614239565b600083815260076020526040902054909150808214613aaf576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613af490600190614239565b60008381526009602052604081205460088054939450909284908110613b1c57613b1c61418e565b906000526020600020015490508060088381548110613b3d57613b3d61418e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613b7557613b75614469565b6001900381819060005260206000200160009055905550505050565b6000613b9c83611dd9565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b0319811681146110fd57600080fd5b600060208284031215613bfd57600080fd5b813561274381613bd5565b60005b83811015613c23578181015183820152602001613c0b565b50506000910152565b60008151808452613c44816020860160208601613c08565b601f01601f19169290920160200192915050565b6020815260006127436020830184613c2c565b600060208284031215613c7d57600080fd5b5035919050565b80356001600160a01b0381168114613c9b57600080fd5b919050565b60008060408385031215613cb357600080fd5b613cbc83613c84565b946020939093013593505050565b600080600060608486031215613cdf57600080fd5b613ce884613c84565b9250613cf660208501613c84565b9150604084013590509250925092565b600081518084526020808501945080840160005b83811015613d3657815187529582019590820190600101613d1a565b509495945050505050565b6020815260006127436020830184613d06565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d8557613d85613d54565b604051601f8501601f19908116603f01168101908282118183101715613dad57613dad613d54565b81604052809350858152868686011115613dc657600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112613df157600080fd5b61274383833560208501613d6a565b600080600080600080600060e0888a031215613e1b57600080fd5b87359650602088013567ffffffffffffffff80821115613e3a57600080fd5b613e468b838c01613de0565b975060408a0135915080821115613e5c57600080fd5b613e688b838c01613de0565b965060608a0135915080821115613e7e57600080fd5b50613e8b8a828b01613de0565b979a969950949760808101359660a0820135965060c090910135945092505050565b600060208284031215613ebf57600080fd5b813567ffffffffffffffff811115613ed657600080fd5b612d0b84828501613de0565b600060018060a01b03808f1683528d60208401526101806040840152613f0c61018084018e613c2c565b8381036060850152613f1e818e613c2c565b90508381036080850152613f32818d613c2c565b60a085019b909b525060c08301989098525060e08101959095526101008501939093529316610120830152911515610140820152610160015295945050505050565b600060208284031215613f8657600080fd5b61274382613c84565b60008060408385031215613fa257600080fd5b50508035926020909101359150565b80358015158114613c9b57600080fd5b60008060408385031215613fd457600080fd5b613fdd83613c84565b9150613feb60208401613fb1565b90509250929050565b6000806000806080858703121561400a57600080fd5b61401385613c84565b935061402160208601613c84565b925060408501359150606085013567ffffffffffffffff81111561404457600080fd5b8501601f8101871361405557600080fd5b61406487823560208401613d6a565b91505092959194509250565b60006020828403121561408257600080fd5b61274382613fb1565b6000806040838503121561409e57600080fd5b82359150613feb60208401613c84565b600080604083850312156140c157600080fd5b6140ca83613c84565b9150613feb60208401613c84565b600181811c908216806140ec57607f821691505b60208210810361410c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b602080825260159082015274149859999b1948191bd95cc81b9bdd08195e1a5cdd605a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f526166666c652068617320616c7265616479206265656e20636f6d706c6574656040820152601960fa1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261420a5761420a6141e5565b500690565b634e487b7160e01b600052601160045260246000fd5b600082614234576142346141e5565b500490565b818103818111156109c4576109c461420f565b808201808211156109c4576109c461420f565b601f821115610c2657600081815260208120601f850160051c810160208610156142865750805b601f850160051c820191505b818110156142a557828155600101614292565b505050505050565b815167ffffffffffffffff8111156142c7576142c7613d54565b6142db816142d584546140d8565b8461425f565b602080601f83116001811461431057600084156142f85750858301515b600019600386901b1c1916600185901b1785556142a5565b600085815260208120601f198616915b8281101561433f57888601518255948401946001909101908401614320565b508582101561435d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161437f5761437f61420f565b5060010190565b6080815260006143996080830187613c2c565b6020830195909552506040810192909252606090910152919050565b80820281158282048414176109c4576109c461420f565b828152604060208201526000612d0b6040830184613d06565b600083516143f7818460208801613c08565b83519083019061440b818360208801613c08565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516144e3818460208801613c08565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061453b90830184613c2c565b9695505050505050565b60006020828403121561455757600080fd5b815161274381613bd556fea2646970667358221220eb34526af5f09e0f3c47e075cb20e10f01563266af6c5953c94aa16977f42cb564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000074e4654353035300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074e46543530353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f626166796265696233346d37367068756d367262726e64713674336c61676d7074726a6d676279326e376a7576747979617a6f35636663626e6a692f0000000000000000000000000000000000000000000000000000000000000000006e68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f626166796265696233346d37367068756d367262726e64713674336c61676d7074726a6d676279326e376a7576747979617a6f35636663626e6a692f706c616365686f6c6465722e6a736f6e000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): NFT5050
Arg [1] : _symbol (string): NFT5050
Arg [2] : _initBaseURI (string): https://gateway.pinata.cloud/ipfs/bafybeib34m76phum6rbrndq6t3lagmptrjmgby2n7juvtyyazo5cfcbnji/
Arg [3] : _initNotRevealedUri (string): https://gateway.pinata.cloud/ipfs/bafybeib34m76phum6rbrndq6t3lagmptrjmgby2n7juvtyyazo5cfcbnji/placeholder.json
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 4e46543530353000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 4e46543530353000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000005e
Arg [9] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [10] : 732f626166796265696233346d37367068756d367262726e64713674336c6167
Arg [11] : 6d7074726a6d676279326e376a7576747979617a6f35636663626e6a692f0000
Arg [12] : 000000000000000000000000000000000000000000000000000000000000006e
Arg [13] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [14] : 732f626166796265696233346d37367068756d367262726e64713674336c6167
Arg [15] : 6d7074726a6d676279326e376a7576747979617a6f35636663626e6a692f706c
Arg [16] : 616365686f6c6465722e6a736f6e000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65942:20710:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86396:212;;;;;;;;;;-1:-1:-1;86396:212:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;86396:212:0;;;;;;;;39625:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41137:171::-;;;;;;;;;;-1:-1:-1;41137:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;41137:171:0;1533:203:1;66858:28:0;;;;;;;;;;;;;:::i;40655:416::-;;;;;;;;;;-1:-1:-1;40655:416:0;;;;;:::i;:::-;;:::i;:::-;;83418:103;;;;;;;;;;-1:-1:-1;83498:15:0;;83418:103;;;2324:25:1;;;2312:2;2297:18;83418:103:0;2178:177:1;78180:131:0;;;;;;;;;;-1:-1:-1;78180:131:0;;;;;:::i;:::-;78240:4;78264:28;;;:18;:28;;;;;:35;:39;;;78180:131;66382:51;;;;;;;;;;;;66421:12;66382:51;;80784:98;;;;;;;;;;-1:-1:-1;80860:7:0;:14;80784:98;;41837:335;;;;;;;;;;-1:-1:-1;41837:335:0;;;;;:::i;:::-;;:::i;78493:147::-;;;;;;;;;;-1:-1:-1;78493:147:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56959:256::-;;;;;;;;;;-1:-1:-1;56959:256:0;;;;;:::i;:::-;;:::i;75125:1674::-;;;;;;;;;;-1:-1:-1;75125:1674:0;;;;;:::i;:::-;;:::i;66783:33::-;;;;;;;;;;-1:-1:-1;66783:33:0;;;;;;;;66112:41;;;;;;;;;;;;66149:4;66112:41;;71536:1905;;;;;;;;;;-1:-1:-1;71536:1905:0;;;;;:::i;:::-;;:::i;84073:273::-;;;;;;;;;;;;;:::i;82367:1039::-;;;;;;;;;;;;;:::i;42243:185::-;;;;;;;;;;-1:-1:-1;42243:185:0;;;;;:::i;:::-;;:::i;70548:394::-;;;;;;;;;;-1:-1:-1;70548:394:0;;;;;:::i;:::-;;:::i;57481:233::-;;;;;;;;;;-1:-1:-1;57481:233:0;;;;;:::i;:::-;;:::i;66823:28::-;;;;;;;;;;-1:-1:-1;66823:28:0;;;;;;;;;;;83809:112;;;;;;;;;;-1:-1:-1;83809:112:0;;;;;:::i;:::-;;:::i;67919:23::-;;;;;;;;;;-1:-1:-1;67919:23:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;77060:829::-;;;;;;;;;;-1:-1:-1;77060:829:0;;;;;:::i;:::-;;:::i;39335:223::-;;;;;;;;;;-1:-1:-1;39335:223:0;;;;;:::i;:::-;;:::i;67053:49::-;;;;;;;;;;-1:-1:-1;67053:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;67053:49:0;;;67320:34;;;;;;;;;;;;;;;;39066:207;;;;;;;;;;-1:-1:-1;39066:207:0;;;;;:::i;:::-;;:::i;2885:103::-;;;;;;;;;;;;;:::i;73570:1401::-;;;;;;:::i;:::-;;:::i;84627:398::-;;;;;;;;;;-1:-1:-1;84627:398:0;;;;;:::i;:::-;;:::i;2237:87::-;;;;;;;;;;-1:-1:-1;2310:6:0;;-1:-1:-1;;;;;2310:6:0;2237:87;;39794:104;;;;;;;;;;;;;:::i;80894:124::-;;;;;;;;;;-1:-1:-1;80894:124:0;;;;;:::i;:::-;;:::i;69589:886::-;;;;;;:::i;:::-;;:::i;41380:155::-;;;;;;;;;;-1:-1:-1;41380:155:0;;;;;:::i;:::-;;:::i;42499:322::-;;;;;;;;;;-1:-1:-1;42499:322:0;;;;;:::i;:::-;;:::i;66185:47::-;;;;;;;;;;;;66222:10;66185:47;;80213:433;;;;;;;;;;-1:-1:-1;80213:433:0;;;;;:::i;:::-;;:::i;66959:55::-;;;;;;;;;;-1:-1:-1;66959:55:0;;;;;:::i;:::-;;:::i;83589:101::-;;;;;;;;;;-1:-1:-1;83589:101:0;;;;;:::i;:::-;;:::i;67230:48::-;;;;;;;;;;-1:-1:-1;67230:48:0;;;;;:::i;:::-;;:::i;83702:95::-;;;;;;;;;;-1:-1:-1;83702:95:0;;;;;:::i;:::-;;:::i;81311:1044::-;;;;;;;;;;-1:-1:-1;81311:1044:0;;;;;:::i;:::-;;:::i;81030:269::-;;;;;;;;;;-1:-1:-1;81030:269:0;;;;;:::i;:::-;;:::i;41606:164::-;;;;;;;;;;-1:-1:-1;41606:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;41727:25:0;;;41703:4;41727:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;41606:164;66472:84;;;;;;;;;;;;66514:42;66472:84;;67140:55;;;;;;;;;;-1:-1:-1;67140:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;83933:128;;;;;;;;;;-1:-1:-1;83933:128:0;;;;;:::i;:::-;;:::i;3143:201::-;;;;;;;;;;-1:-1:-1;3143:201:0;;;;;:::i;:::-;;:::i;66593:54::-;;;;;;;;;;;;66638:9;66593:54;;86396:212;86535:4;86564:36;86588:11;86564:23;:36::i;:::-;86557:43;86396:212;-1:-1:-1;;86396:212:0:o;39625:100::-;39679:13;39712:5;39705:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39625:100;:::o;41137:171::-;41213:7;41233:23;41248:7;41233:14;:23::i;:::-;-1:-1:-1;41276:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41276:24:0;;41137:171::o;66858:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40655:416::-;40736:13;40752:23;40767:7;40752:14;:23::i;:::-;40736:39;;40800:5;-1:-1:-1;;;;;40794:11:0;:2;-1:-1:-1;;;;;40794:11:0;;40786:57;;;;-1:-1:-1;;;40786:57:0;;9852:2:1;40786:57:0;;;9834:21:1;9891:2;9871:18;;;9864:30;9930:34;9910:18;;;9903:62;-1:-1:-1;;;9981:18:1;;;9974:31;10022:19;;40786:57:0;;;;;;;;;864:10;-1:-1:-1;;;;;40878:21:0;;;;:62;;-1:-1:-1;40903:37:0;40920:5;864:10;41606:164;:::i;40903:37::-;40856:173;;;;-1:-1:-1;;;40856:173:0;;10254:2:1;40856:173:0;;;10236:21:1;10293:2;10273:18;;;10266:30;10332:34;10312:18;;;10305:62;10403:31;10383:18;;;10376:59;10452:19;;40856:173:0;10052:425:1;40856:173:0;41042:21;41051:2;41055:7;41042:8;:21::i;:::-;40725:346;40655:416;;:::o;41837:335::-;42032:41;864:10;42065:7;42032:18;:41::i;:::-;42024:99;;;;-1:-1:-1;;;42024:99:0;;;;;;;:::i;:::-;42136:28;42146:4;42152:2;42156:7;42136:9;:28::i;78493:147::-;78604:28;;;;:18;:28;;;;;;;;;78597:35;;;;;;;;;;;;;;;;;78568:16;;78597:35;;;78604:28;78597:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78493:147;;;:::o;56959:256::-;57056:7;57092:23;57109:5;57092:16;:23::i;:::-;57084:5;:31;57076:87;;;;-1:-1:-1;;;57076:87:0;;11098:2:1;57076:87:0;;;11080:21:1;11137:2;11117:18;;;11110:30;11176:34;11156:18;;;11149:62;-1:-1:-1;;;11227:18:1;;;11220:41;11278:19;;57076:87:0;10896:407:1;57076:87:0;-1:-1:-1;;;;;;57181:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;56959:256::o;75125:1674::-;64937:21;:19;:21::i;:::-;75221:7:::1;:14:::0;75209:26;::::1;75201:60;;;;-1:-1:-1::0;;;75201:60:0::1;;;;;;;:::i;:::-;75282:21;75306:7;75314:9;75306:18;;;;;;;;:::i;:::-;;;;;;;;;;;75282:42;;75344:6;:16;;;;;;;;;;;;75343:17;75335:63;;;;-1:-1:-1::0;;;75335:63:0::1;;;;;;;:::i;:::-;75450:6;:14;;;75431:15;:33;;:78;;;;75490:6;:19;;;75468:6;:18;;;:41;75431:78;75409:163;;;::::0;-1:-1:-1;;;75409:163:0;;12394:2:1;75409:163:0::1;::::0;::::1;12376:21:1::0;12433:2;12413:18;;;12406:30;12472:34;12452:18;;;12445:62;-1:-1:-1;;;12523:18:1;;;12516:33;12566:19;;75409:163:0::1;12192:399:1::0;75409:163:0::1;75612:1;75591:6;:18;;;:22;75583:55;;;::::0;-1:-1:-1;;;75583:55:0;;12798:2:1;75583:55:0::1;::::0;::::1;12780:21:1::0;12837:2;12817:18;;;12810:30;-1:-1:-1;;;12856:18:1;;;12849:50;12916:18;;75583:55:0::1;12596:344:1::0;75583:55:0::1;75694:18;75715:38;75735:9;75746:6;75715:19;:38::i;:::-;75694:59;;75764:27;75807:6;:18;;;75794:10;:31;;;;:::i;:::-;75836:14;75853:35:::0;;;:14:::1;::::0;::::1;:35;::::0;;;;;75909:13:::1;::::0;::::1;:22:::0;;-1:-1:-1;;;;;;75942:23:0;-1:-1:-1;;;;;75853:35:0;;::::1;75942:23:::0;;;-1:-1:-1;;;75942:23:0::1;::::0;;75853:35;76065:21;::::1;::::0;75764:61;;-1:-1:-1;75853:35:0;76097:39:::1;76065:21:::0;76126:9;76097:19:::1;:39::i;:::-;76202:18;::::0;::::1;::::0;76181::::1;76253:14;76266:1;76202:18:::0;76253:14:::1;:::i;:::-;76231:36:::0;-1:-1:-1;76278:20:0::1;76301:24;76231:36:::0;76301:10;:24:::1;:::i;:::-;76278:47;;76375:15;76396:6;-1:-1:-1::0;;;;;76396:11:0::1;76415;76396:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76374:57;;;76450:10;76442:57;;;::::0;-1:-1:-1;;;76442:57:0;;13996:2:1;76442:57:0::1;::::0;::::1;13978:21:1::0;14035:2;14015:18;;;14008:30;14074:34;14054:18;;;14047:62;-1:-1:-1;;;14125:18:1;;;14118:32;14167:19;;76442:57:0::1;13794:398:1::0;76442:57:0::1;76543:14:::0;;:44:::1;::::0;76521:16:::1;::::0;-1:-1:-1;;;;;76543:14:0::1;::::0;76570:12;;76521:16;76543:44;76521:16;76543:44;76570:12;76543:14;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76520:67;;;76606:11;76598:59;;;::::0;-1:-1:-1;;;76598:59:0;;14399:2:1;76598:59:0::1;::::0;::::1;14381:21:1::0;14438:2;14418:18;;;14411:30;14477:34;14457:18;;;14450:62;-1:-1:-1;;;14528:18:1;;;14521:33;14571:19;;76598:59:0::1;14197:399:1::0;76598:59:0::1;76683:61;::::0;;14775:25:1;;;14831:2;14816:18;;14809:34;;;-1:-1:-1;;;;;76683:61:0;::::1;::::0;76699:9;;76683:61:::1;::::0;14748:18:1;76683:61:0::1;;;;;;;76760:31;::::0;76781:9;;76772:7;;76760:31:::1;::::0;;;::::1;75190:1609;;;;;;;;;;64981:20:::0;64375:1;65501:7;:22;65318:213;64981:20;75125:1674;:::o;71536:1905::-;64937:21;:19;:21::i;:::-;71874:10:::1;71853:17;71861:8:::0;71853:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;71853:31:0::1;;71845:82;;;::::0;-1:-1:-1;;;71845:82:0;;15056:2:1;71845:82:0::1;::::0;::::1;15038:21:1::0;15095:2;15075:18;;;15068:30;15134:34;15114:18;;;15107:62;-1:-1:-1;;;15185:18:1;;;15178:36;15231:19;;71845:82:0::1;14854:402:1::0;71845:82:0::1;71962:1;71946:13;:17;71938:66;;;::::0;-1:-1:-1;;;71938:66:0;;15463:2:1;71938:66:0::1;::::0;::::1;15445:21:1::0;15502:2;15482:18;;;15475:30;15541:34;15521:18;;;15514:62;-1:-1:-1;;;15592:18:1;;;15585:34;15636:19;;71938:66:0::1;15261:400:1::0;71938:66:0::1;72051:36;66638:9;72051:15;:36;:::i;:::-;72037:10;:50;;72015:150;;;::::0;-1:-1:-1;;;72015:150:0;;15998:2:1;72015:150:0::1;::::0;::::1;15980:21:1::0;16037:2;16017:18;;;16010:30;16076:34;16056:18;;;16049:62;-1:-1:-1;;;16127:18:1;;;16120:48;16185:19;;72015:150:0::1;15796:414:1::0;72015:150:0::1;72195:10;72184:8;:21;72176:67;;;::::0;-1:-1:-1;;;72176:67:0;;16417:2:1;72176:67:0::1;::::0;::::1;16399:21:1::0;16456:2;16436:18;;;16429:30;16495:34;16475:18;;;16468:62;-1:-1:-1;;;16546:18:1;;;16539:31;16587:19;;72176:67:0::1;16215:397:1::0;72176:67:0::1;72285:1;72268:6;72262:20;:24;72254:58;;;::::0;-1:-1:-1;;;72254:58:0;;16819:2:1;72254:58:0::1;::::0;::::1;16801:21:1::0;16858:2;16838:18;;;16831:30;-1:-1:-1;;;16877:18:1;;;16870:51;16938:18;;72254:58:0::1;16617:345:1::0;72254:58:0::1;72390:7;:14:::0;;::::1;::::0;::::1;::::0;;72363:24:::1;72390:14:::0;;;;::::1;;::::0;;::::1;72415:30:::0;;-1:-1:-1;;;;;;72415:30:0::1;72435:10;72415:30;::::0;;72456:24;;;:35;;;72390:14;72502:15;;:24:::1;72520:6:::0;72502:15;:24:::1;:::i;:::-;-1:-1:-1::0;72537:21:0::1;::::0;::::1;:36;72561:12:::0;72537:21;:36:::1;:::i;:::-;-1:-1:-1::0;72584:15:0::1;::::0;::::1;:24;72602:6:::0;72584:15;:24:::1;:::i;:::-;-1:-1:-1::0;72619:22:0::1;::::0;::::1;:38:::0;;;72668:19:::1;::::0;::::1;:32:::0;;;72711:17:::1;::::0;::::1;:28:::0;;;72750:19:::1;::::0;::::1;:27:::0;;-1:-1:-1;;;;72750:27:0::1;::::0;;-1:-1:-1;72788:21:0::1;::::0;::::1;:25:::0;;;72853:7:::1;:14:::0;:18:::1;::::0;72750:27;;72853:18:::1;:::i;:::-;72882:24;::::0;;;:14:::1;:24;::::0;;;;;;;:37;;-1:-1:-1;;;;;;72882:37:0::1;72909:10;72882:37:::0;;::::1;::::0;;;72930:20:::1;:30:::0;;;;;:41;;;72982:23;;:11:::1;:23:::0;;;;:38;;72882:37;72982:38;::::1;::::0;;;;;;;;::::1;::::0;;;73031:19:::1;:21:::0;;72834:37;;-1:-1:-1;73031:19:0;:21:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;73127:28:0::1;::::0;;;:18:::1;:28;::::0;;;;;;;:43;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;73196:192;73146:8;;73247:10:::1;::::0;73161:8;;73196:192:::1;::::0;::::1;::::0;73295:6;;73316:13;;73344:10;;73369:8;;73196:192:::1;:::i;:::-;;;;;;;;73404:29;::::0;73424:8;;73414;;73404:29:::1;::::0;;;::::1;71801:1640;;64981:20:::0;64375:1;65501:7;:22;65318:213;64981:20;71536:1905;;;;;;;:::o;84073:273::-;2123:13;:11;:13::i;:::-;84141:21:::1;84181:11:::0;84173:46:::1;;;::::0;-1:-1:-1;;;84173:46:0;;19953:2:1;84173:46:0::1;::::0;::::1;19935:21:1::0;19992:2;19972:18;;;19965:30;-1:-1:-1;;;20011:18:1;;;20004:52;20073:18;;84173:46:0::1;19751:346:1::0;84173:46:0::1;84231:12;84257:7;2310:6:::0;;-1:-1:-1;;;;;2310:6:0;;2237:87;84257:7:::1;-1:-1:-1::0;;;;;84249:21:0::1;84278:7;84249:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84230:60;;;84309:7;84301:37;;;::::0;-1:-1:-1;;;84301:37:0;;20304:2:1;84301:37:0::1;::::0;::::1;20286:21:1::0;20343:2;20323:18;;;20316:30;-1:-1:-1;;;20362:18:1;;;20355:47;20419:18;;84301:37:0::1;20102:341:1::0;84301:37:0::1;84112:234;;84073:273::o:0;82367:1039::-;82418:16;82447:19;82541:9;82536:295;82560:7;:14;82556:18;;82536:295;;;82619:7;82627:1;82619:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;;;;;;;;;;82618:21;:81;;;;;82679:7;82687:1;82679:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;82660:15;:39;;82618:81;:138;;;;;82738:7;82746:1;82738:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;82720:15;:36;82618:138;82596:224;;;82791:13;;;;:::i;:::-;;;;82596:224;82576:3;;;;:::i;:::-;;;;82536:295;;;;82891:32;82940:11;82926:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82926:26:0;;82891:61;;82963:20;83013:9;83008:348;83032:7;:14;83028:18;;83008:348;;;83091:7;83099:1;83091:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;;;;;;;;;;83090:21;:81;;;;;83151:7;83159:1;83151:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;83132:15;:39;;83090:81;:138;;;;;83210:7;83218:1;83210:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;83192:15;:36;83090:138;83068:277;;;83295:1;83263:15;83279:12;83263:29;;;;;;;;:::i;:::-;;;;;;;;;;:33;83315:14;;;;:::i;:::-;;;;83068:277;83048:3;;;;:::i;:::-;;;;83008:348;;;-1:-1:-1;83383:15:0;;82367:1039;-1:-1:-1;;;82367:1039:0:o;42243:185::-;42381:39;42398:4;42404:2;42408:7;42381:39;;;;;;;;;;;;:16;:39::i;70548:394::-;2123:13;:11;:13::i;:::-;66149:4:::1;70655:9;70637:15;;:27;;;;:::i;:::-;:41;;70629:72;;;::::0;-1:-1:-1;;;70629:72:0;;20650:2:1;70629:72:0::1;::::0;::::1;20632:21:1::0;20689:2;20669:18;;;20662:30;-1:-1:-1;;;20708:18:1;;;20701:48;20766:18;;70629:72:0::1;20448:342:1::0;70629:72:0::1;70727:9;70722:213;70746:9;70742:1;:13;70722:213;;;70795:15;::::0;;;;;70777::::1;70825:17;70795:15:::0;70825:17:::1;:::i;:::-;;;;;;70857:23;70867:3;70872:7;70857:9;:23::i;:::-;70900;::::0;70915:7;;-1:-1:-1;;;;;70900:23:0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;70757:3:0;::::1;::::0;::::1;:::i;:::-;;;;70722:213;;57481:233:::0;57556:7;57592:30;57379:10;:17;;57291:113;57592:30;57584:5;:38;57576:95;;;;-1:-1:-1;;;57576:95:0;;20997:2:1;57576:95:0;;;20979:21:1;21036:2;21016:18;;;21009:30;21075:34;21055:18;;;21048:62;-1:-1:-1;;;21126:18:1;;;21119:42;21178:19;;57576:95:0;20795:408:1;57576:95:0;57689:10;57700:5;57689:17;;;;;;;;:::i;:::-;;;;;;;;;57682:24;;57481:233;;;:::o;83809:112::-;2123:13;:11;:13::i;:::-;83886::::1;:27;83902:11:::0;83886:13;:27:::1;:::i;67919:23::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67919:23:0;;;;-1:-1:-1;67919:23:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;67919:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67919:23:0;;;;-1:-1:-1;;;;;67919:23:0;;;-1:-1:-1;;;67919:23:0;;;;;;:::o;77060:829::-;64937:21;:19;:21::i;:::-;77154:7:::1;:14:::0;77142:26;::::1;77134:60;;;;-1:-1:-1::0;;;77134:60:0::1;;;;;;;:::i;:::-;77215:21;77239:7;77247:9;77239:18;;;;;;;;:::i;:::-;;;;;;;;;;;77215:42;;77277:6;:16;;;;;;;;;;;;77276:17;77268:63;;;;-1:-1:-1::0;;;77268:63:0::1;;;;;;;:::i;:::-;77369:6;:14;;;77350:15;:33;;77342:70;;;::::0;-1:-1:-1;;;77342:70:0;;21410:2:1;77342:70:0::1;::::0;::::1;21392:21:1::0;21449:2;21429:18;;;21422:30;21488:26;21468:18;;;21461:54;21532:18;;77342:70:0::1;21208:348:1::0;77342:70:0::1;77431:18;::::0;::::1;::::0;:23;77423:74:::1;;;::::0;-1:-1:-1;;;77423:74:0;;21763:2:1;77423:74:0::1;::::0;::::1;21745:21:1::0;21802:2;21782:18;;;21775:30;21841:34;21821:18;;;21814:62;-1:-1:-1;;;21892:18:1;;;21885:36;21938:19;;77423:74:0::1;21561:402:1::0;77423:74:0::1;77560:16;::::0;::::1;:23:::0;;-1:-1:-1;;;;77560:23:0::1;-1:-1:-1::0;;;77560:23:0::1;::::0;;77579:4:::1;77683:21:::0;::::1;::::0;77715:39:::1;77683:21:::0;77744:9;77715:19:::1;:39::i;:::-;77807:7;77796:9;77780:54;;;;;22170:2:1::0;22152:21;;;22209:2;22189:18;;;22182:30;-1:-1:-1;;;22243:2:1;22228:18;;22221:45;22298:2;22283:18;;21968:339;77780:54:0::1;;;;;;;;77850:31;::::0;77871:9;;77862:7;;77850:31:::1;::::0;;;::::1;77123:766;;64981:20:::0;64375:1;65501:7;:22;65318:213;39335:223;39407:7;44222:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44222:16:0;;39471:56;;;;-1:-1:-1;;;39471:56:0;;22514:2:1;39471:56:0;;;22496:21:1;22553:2;22533:18;;;22526:30;-1:-1:-1;;;22572:18:1;;;22565:54;22636:18;;39471:56:0;22312:348:1;39066:207:0;39138:7;-1:-1:-1;;;;;39166:19:0;;39158:73;;;;-1:-1:-1;;;39158:73:0;;22867:2:1;39158:73:0;;;22849:21:1;22906:2;22886:18;;;22879:30;22945:34;22925:18;;;22918:62;-1:-1:-1;;;22996:18:1;;;22989:39;23045:19;;39158:73:0;22665:405:1;39158:73:0;-1:-1:-1;;;;;;39249:16:0;;;;;:9;:16;;;;;;;39066:207::o;2885:103::-;2123:13;:11;:13::i;:::-;2950:30:::1;2977:1;2950:18;:30::i;:::-;2885:103::o:0;73570:1401::-;64937:21;:19;:21::i;:::-;73714:7:::1;:14:::0;73702:26;::::1;73694:60;;;;-1:-1:-1::0;;;73694:60:0::1;;;;;;;:::i;:::-;73785:1;73773:9;:13;73765:57;;;::::0;-1:-1:-1;;;73765:57:0;;23277:2:1;73765:57:0::1;::::0;::::1;23259:21:1::0;23316:2;23296:18;;;23289:30;23355:33;23335:18;;;23328:61;23406:18;;73765:57:0::1;23075:355:1::0;73765:57:0::1;73843:21;73867:7;73875:9;73867:18;;;;;;;;:::i;:::-;;;;;;;;;;;73843:42;;73915:6;:16;;;;;;;;;;;;73914:17;73906:63;;;;-1:-1:-1::0;;;73906:63:0::1;;;;;;;:::i;:::-;74007:6;:16;;;73988:15;:35;;73980:74;;;::::0;-1:-1:-1;;;73980:74:0;;23637:2:1;73980:74:0::1;::::0;::::1;23619:21:1::0;23676:2;23656:18;;;23649:30;23715:28;23695:18;;;23688:56;23761:18;;73980:74:0::1;23435:350:1::0;73980:74:0::1;74091:6;:14;;;74073:15;:32;74065:61;;;::::0;-1:-1:-1;;;74065:61:0;;23992:2:1;74065:61:0::1;::::0;::::1;23974:21:1::0;24031:2;24011:18;;;24004:30;-1:-1:-1;;;24050:18:1;;;24043:46;24106:18;;74065:61:0::1;23790:340:1::0;74065:61:0::1;74172:24;74187:9:::0;66421:12:::1;74172:24;:::i;:::-;74159:9;:37;74137:115;;;::::0;-1:-1:-1;;;74137:115:0;;24510:2:1;74137:115:0::1;::::0;::::1;24492:21:1::0;24549:2;24529:18;;;24522:30;24588;24568:18;;;24561:58;24636:18;;74137:115:0::1;24308:352:1::0;74137:115:0::1;74319:6;:19;;;74306:9;74285:6;:18;;;:30;;;;:::i;:::-;:53;;74263:131;;;::::0;-1:-1:-1;;;74263:131:0;;24867:2:1;74263:131:0::1;::::0;::::1;24849:21:1::0;24906:2;24886:18;;;24879:30;24945;24925:18;;;24918:58;24993:18;;74263:131:0::1;24665:352:1::0;74263:131:0::1;74415:33;74465:9;74451:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;74451:24:0::1;;74415:60;;74501:9;74496:281;74520:9;74516:1;:13;74496:281;;;74551:20;74595:1;74574:6;:18;;;:22;;;;:::i;:::-;74611:28;::::0;;;:14:::1;::::0;::::1;:28;::::0;;;;;;;:41;;-1:-1:-1;;;;;;74611:41:0::1;74642:10;74611:41:::0;;::::1;::::0;;;74667:30;;:18:::1;::::0;::::1;:30:::0;;;;:49;;74611:41;74667:49;::::1;::::0;;;;;;;::::1;::::0;;;74731:19;;74551:45;;-1:-1:-1;74551:45:0;;74731:16;;74748:1;;74731:19;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:34;-1:-1:-1;74531:3:0;::::1;::::0;::::1;:::i;:::-;;;;74496:281;;;;74819:9;74797:6;:18;;;:31;;;;;;;:::i;:::-;;;;;;;;74861:9;74839:6;:18;;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;74896:67:0::1;::::0;74923:10:::1;::::0;74912:9;;74896:67:::1;::::0;::::1;::::0;74935:9;;74946:16;;74896:67:::1;:::i;:::-;;;;;;;;73683:1288;;64981:20:::0;64375:1;65501:7;:22;65318:213;84627:398;2123:13;:11;:13::i;:::-;44624:4;44222:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44222:16:0;84722:50:::1;;;::::0;-1:-1:-1;;;84722:50:0;;25561:2:1;84722:50:0::1;::::0;::::1;25543:21:1::0;25600:2;25580:18;;;25573:30;-1:-1:-1;;;25619:18:1;;;25612:50;25679:18;;84722:50:0::1;25359:344:1::0;84722:50:0::1;84803:7;:14:::0;84791:26;::::1;84783:60;;;;-1:-1:-1::0;;;84783:60:0::1;;;;;;;:::i;:::-;84919:40;84939:8;84949:9;84919:19;:40::i;:::-;84985:32;::::0;85007:9;;84997:8;;84985:32:::1;::::0;;;::::1;84627:398:::0;;:::o;39794:104::-;39850:13;39883:7;39876:14;;;;;:::i;80894:124::-;-1:-1:-1;;;;;80992:18:0;;;;;;:11;:18;;;;;;;;;80985:25;;;;;;;;;;;;;;;;;80956:16;;80985:25;;;80992:18;80985:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80894:124;;;:::o;69589:886::-;64937:21;:19;:21::i;:::-;69671:13:::1;::::0;::::1;;69663:47;;;::::0;-1:-1:-1;;;69663:47:0;;25910:2:1;69663:47:0::1;::::0;::::1;25892:21:1::0;25949:2;25929:18;;;25922:30;-1:-1:-1;;;25968:18:1;;;25961:51;26029:18;;69663:47:0::1;25708:345:1::0;69663:47:0::1;69741:1;69729:9;:13;69721:50;;;::::0;-1:-1:-1;;;69721:50:0;;26260:2:1;69721:50:0::1;::::0;::::1;26242:21:1::0;26299:2;26279:18;;;26272:30;26338:26;26318:18;;;26311:54;26382:18;;69721:50:0::1;26058:348:1::0;69721:50:0::1;66149:4;69808:9;69790:15;;:27;;;;:::i;:::-;:41;;69782:72;;;::::0;-1:-1:-1;;;69782:72:0;;20650:2:1;69782:72:0::1;::::0;::::1;20632:21:1::0;20689:2;20669:18;;;20662:30;-1:-1:-1;;;20708:18:1;;;20701:48;20766:18;;69782:72:0::1;20448:342:1::0;69782:72:0::1;69900:22;69913:9:::0;66222:10:::1;69900:22;:::i;:::-;69887:9;:35;69865:105;;;::::0;-1:-1:-1;;;69865:105:0;;26613:2:1;69865:105:0::1;::::0;::::1;26595:21:1::0;26652:2;26632:18;;;26625:30;-1:-1:-1;;;26671:18:1;;;26664:50;26731:18;;69865:105:0::1;26411:344:1::0;69865:105:0::1;70071:42;::::0;70053:12:::1;::::0;66514:42:::1;::::0;70099:9:::1;::::0;70053:12;70071:42;70053:12;70071:42;70099:9;66514:42;70071::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70052:61;;;70132:7;70124:66;;;::::0;-1:-1:-1;;;70124:66:0;;26962:2:1;70124:66:0::1;::::0;::::1;26944:21:1::0;27001:2;26981:18;;;26974:30;27040:34;27020:18;;;27013:62;-1:-1:-1;;;27091:18:1;;;27084:44;27145:19;;70124:66:0::1;26760:410:1::0;70124:66:0::1;70246:9;70241:227;70265:9;70261:1;:13;70241:227;;;70314:15;::::0;;;;;70296::::1;70344:17;70314:15:::0;70344:17:::1;:::i;:::-;;;;;;70376:30;70386:10;70398:7;70376:9;:30::i;:::-;70426;::::0;70448:7;;70436:10:::1;::::0;70426:30:::1;::::0;;;::::1;-1:-1:-1::0;70276:3:0;::::1;::::0;::::1;:::i;:::-;;;;70241:227;;;;69652:823;64981:20:::0;64375:1;65501:7;:22;65318:213;41380:155;41475:52;864:10;41508:8;41518;41475:18;:52::i;42499:322::-;42673:41;864:10;42706:7;42673:18;:41::i;:::-;42665:99;;;;-1:-1:-1;;;42665:99:0;;;;;;;:::i;:::-;42775:38;42789:4;42795:2;42799:7;42808:4;42775:13;:38::i;:::-;42499:322;;;;:::o;80213:433::-;44624:4;44222:16;;;:7;:16;;;;;;80286:13;;-1:-1:-1;;;;;44222:16:0;80312:49;;;;-1:-1:-1;;;80312:49:0;;25561:2:1;80312:49:0;;;25543:21:1;25600:2;25580:18;;;25573:30;-1:-1:-1;;;25619:18:1;;;25612:50;25679:18;;80312:49:0;25359:344:1;80312:49:0;80387:8;;;;;;;80382:63;;80419:14;80412:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80412:21:0;;80213:433;-1:-1:-1;;;;;;80213:433:0:o;80382:63::-;80465:21;80489:10;:8;:10::i;:::-;80465:34;;80541:1;80523:7;80517:21;:25;:121;;;;;;;;;;;;;;;;;80582:7;80591:18;:7;:16;:18::i;:::-;80565:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80517:121;80510:128;80213:433;-1:-1:-1;;;80213:433:0:o;66959:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;83589:101::-;2123:13;:11;:13::i;:::-;83659::::1;:23:::0;;-1:-1:-1;;83659:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;83589:101::o;67230:48::-;;;;;;;;;;;;;;;;;;;;83702:95;2123:13;:11;:13::i;:::-;83769:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;83769:20:0;;::::1;::::0;;;::::1;::::0;;83702:95::o;81311:1044::-;81413:15;81443:22;81480:19;81514:25;81554:19;81588:20;81623:19;81657:17;81689:15;81719:14;81748;81777:19;81844:7;:14;;;;81832:9;:26;81824:60;;;;-1:-1:-1;;;81824:60:0;;;;;;;:::i;:::-;81895:21;81919:7;81927:9;81919:18;;;;;;;;:::i;:::-;;;;;;;;;;;81895:42;;81980:6;:14;;;;;;;;;;-1:-1:-1;;;;;81980:14:0;82009:6;:21;;;82045:6;:12;;82072:6;:18;;82105:6;:12;;82132:6;:19;;;82166:6;:18;;;82199:6;:16;;;82230:6;:14;;;82259:6;:13;;;;;;;;;;-1:-1:-1;;;;;82259:13:0;82287:6;:16;;;;;;;;;;;;82318:6;:18;;;81958:389;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81311:1044;;;;;;;;;;;;;:::o;81030:269::-;81196:7;:14;81141:16;;81184:26;;81176:60;;;;-1:-1:-1;;;81176:60:0;;;;;;;:::i;:::-;81254:7;81262:9;81254:18;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;81254:37:0;;;;:30;:18;;;;;:30;;;;:37;;;;;;;81247:44;;;;;;;;;;;;;;;;;81254:37;;81247:44;;81254:37;81247:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81030:269;;;;:::o;83933:128::-;2123:13;:11;:13::i;:::-;84021:14:::1;:32;84038:15:::0;84021:14;:32:::1;:::i;3143:201::-:0;2123:13;:11;:13::i;:::-;-1:-1:-1;;;;;3232:22:0;::::1;3224:73;;;::::0;-1:-1:-1;;;3224:73:0;;28045:2:1;3224:73:0::1;::::0;::::1;28027:21:1::0;28084:2;28064:18;;;28057:30;28123:34;28103:18;;;28096:62;-1:-1:-1;;;28174:18:1;;;28167:36;28220:19;;3224:73:0::1;27843:402:1::0;3224:73:0::1;3308:28;3327:8;3308:18;:28::i;56651:224::-:0;56753:4;-1:-1:-1;;;;;;56777:50:0;;-1:-1:-1;;;56777:50:0;;:90;;;56831:36;56855:11;56831:23;:36::i;50956:135::-;44624:4;44222:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44222:16:0;51030:53;;;;-1:-1:-1;;;51030:53:0;;22514:2:1;51030:53:0;;;22496:21:1;22553:2;22533:18;;;22526:30;-1:-1:-1;;;22572:18:1;;;22565:54;22636:18;;51030:53:0;22312:348:1;50235:174:0;50310:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;50310:29:0;-1:-1:-1;;;;;50310:29:0;;;;;;;;:24;;50364:23;50310:24;50364:14;:23::i;:::-;-1:-1:-1;;;;;50355:46:0;;;;;;;;;;;50235:174;;:::o;44854:264::-;44947:4;44964:13;44980:23;44995:7;44980:14;:23::i;:::-;44964:39;;45033:5;-1:-1:-1;;;;;45022:16:0;:7;-1:-1:-1;;;;;45022:16:0;;:52;;;-1:-1:-1;;;;;;41727:25:0;;;41703:4;41727:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;45042:32;45022:87;;;;45102:7;-1:-1:-1;;;;;45078:31:0;:20;45090:7;45078:11;:20::i;:::-;-1:-1:-1;;;;;45078:31:0;;45022:87;45014:96;44854:264;-1:-1:-1;;;;44854:264:0:o;48853:1263::-;49012:4;-1:-1:-1;;;;;48985:31:0;:23;49000:7;48985:14;:23::i;:::-;-1:-1:-1;;;;;48985:31:0;;48977:81;;;;-1:-1:-1;;;48977:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49077:16:0;;49069:65;;;;-1:-1:-1;;;49069:65:0;;28858:2:1;49069:65:0;;;28840:21:1;28897:2;28877:18;;;28870:30;28936:34;28916:18;;;28909:62;-1:-1:-1;;;28987:18:1;;;28980:34;29031:19;;49069:65:0;28656:400:1;49069:65:0;49147:42;49168:4;49174:2;49178:7;49187:1;49147:20;:42::i;:::-;49319:4;-1:-1:-1;;;;;49292:31:0;:23;49307:7;49292:14;:23::i;:::-;-1:-1:-1;;;;;49292:31:0;;49284:81;;;;-1:-1:-1;;;49284:81:0;;;;;;;:::i;:::-;49437:24;;;;:15;:24;;;;;;;;49430:31;;-1:-1:-1;;;;;;49430:31:0;;;;;;-1:-1:-1;;;;;49913:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;49913:20:0;;;49948:13;;;;;;;;;:18;;49430:31;49948:18;;;49988:16;;;:7;:16;;;;;;:21;;;;;;;;;;50027:27;;49453:7;;50027:27;;;40725:346;40655:416;;:::o;65017:293::-;64419:1;65151:7;;:19;65143:63;;;;-1:-1:-1;;;65143:63:0;;29263:2:1;65143:63:0;;;29245:21:1;29302:2;29282:18;;;29275:30;29341:33;29321:18;;;29314:61;29392:18;;65143:63:0;29061:355:1;65143:63:0;64419:1;65284:7;:18;65017:293::o;85096:789::-;85219:7;85341:16;85390;85405:1;85390:12;:16;:::i;:::-;85380:27;85430:15;85468:12;85503:6;:14;;;;;;;;;;-1:-1:-1;;;;;85503:14:0;85540:6;:16;;;85579:6;:14;;;85616:6;:18;;;85657:6;:18;;;85698:10;85731:11;85773:4;85801:31;85822:9;85801:20;:31::i;:::-;85302:549;;;;;;29889:19:1;;;;29924:12;;29917:28;;;;29961:12;;;;29954:28;;;;29998:12;;;29991:28;;;;-1:-1:-1;;30104:15:1;;;30100:24;;30085:13;;;30078:47;30141:13;;;30134:29;;;;30179:13;;;30172:29;;;;30217:13;;;30210:29;;;;30255:13;;;30248:29;30312:15;;30308:24;;30293:13;;;30286:47;30349:13;;;30342:30;30407:16;;30403:25;30388:13;;;30381:48;30445:13;;;30438:30;30484:13;;85302:549:0;;;-1:-1:-1;;85302:549:0;;;;;;;;;85274:592;;85302:549;85274:592;;;;;85096:789;-1:-1:-1;;;85096:789:0:o;78745:505::-;78830:31;78864:28;;;:18;:28;;;;;;78913:330;78937:20;;78933:24;;78913:330;;;79003:9;78983:13;78997:1;78983:16;;;;;;;;:::i;:::-;;;;;;;;;:29;78979:253;;79129:20;;79115:13;;79129:24;;79152:1;;79129:24;:::i;:::-;79115:39;;;;;;;;:::i;:::-;;;;;;;;;79096:13;79110:1;79096:16;;;;;;;;:::i;:::-;;;;;;;;:58;;;;79173:13;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;79211:5;;78979:253;78959:3;;;;:::i;:::-;;;;78913:330;;2402:132;2310:6;;-1:-1:-1;;;;;2310:6:0;864:10;2466:23;2458:68;;;;-1:-1:-1;;;2458:68:0;;30842:2:1;2458:68:0;;;30824:21:1;;;30861:18;;;30854:30;30920:34;30900:18;;;30893:62;30972:18;;2458:68:0;30640:356:1;45460:110:0;45536:26;45546:2;45550:7;45536:26;;;;;;;;;;;;:9;:26::i;3504:191::-;3597:6;;;-1:-1:-1;;;;;3614:17:0;;;-1:-1:-1;;;;;;3614:17:0;;;;;;;3647:40;;3597:6;;;3614:17;3597:6;;3647:40;;3578:16;;3647:40;3567:128;3504:191;:::o;50552:315::-;50707:8;-1:-1:-1;;;;;50698:17:0;:5;-1:-1:-1;;;;;50698:17:0;;50690:55;;;;-1:-1:-1;;;50690:55:0;;31203:2:1;50690:55:0;;;31185:21:1;31242:2;31222:18;;;31215:30;31281:27;31261:18;;;31254:55;31326:18;;50690:55:0;31001:349:1;50690:55:0;-1:-1:-1;;;;;50756:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;50756:46:0;;;;;;;;;;50818:41;;540::1;;;50818::0;;513:18:1;50818:41:0;;;;;;;50552:315;;;:::o;43702:313::-;43858:28;43868:4;43874:2;43878:7;43858:9;:28::i;:::-;43905:47;43928:4;43934:2;43938:7;43947:4;43905:22;:47::i;:::-;43897:110;;;;-1:-1:-1;;;43897:110:0;;;;;;;:::i;80658:114::-;80718:13;80751;80744:20;;;;;:::i;35392:716::-;35448:13;35499:14;35516:17;35527:5;35516:10;:17::i;:::-;35536:1;35516:21;35499:38;;35552:20;35586:6;35575:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35575:18:0;-1:-1:-1;35552:41:0;-1:-1:-1;35717:28:0;;;35733:2;35717:28;35774:288;-1:-1:-1;;35806:5:0;-1:-1:-1;;;35943:2:0;35932:14;;35927:30;35806:5;35914:44;36004:2;35995:11;;;-1:-1:-1;36025:21:0;35774:288;36025:21;-1:-1:-1;36083:6:0;35392:716;-1:-1:-1;;;35392:716:0:o;38697:305::-;38799:4;-1:-1:-1;;;;;;38836:40:0;;-1:-1:-1;;;38836:40:0;;:105;;-1:-1:-1;;;;;;;38893:48:0;;-1:-1:-1;;;38893:48:0;38836:105;:158;;;-1:-1:-1;;;;;;;;;;22022:40:0;;;38958:36;21913:157;79435:711;79625:56;79652:4;79658:2;79662:7;79671:9;79625:26;:56::i;:::-;-1:-1:-1;;;;;79753:18:0;;79749:57;79788:7;79749:57;79870:25;79898:27;;;:18;:27;;;;;:34;79947:21;;79943:196;;80006:7;79990:43;80015:17;79990:43;;;;2324:25:1;;2312:2;2297:18;;2178:177;79990:43:0;;;;;;;;80048:79;;-1:-1:-1;;;80048:79:0;;31976:2:1;80048:79:0;;;31958:21:1;32015:2;31995:18;;;31988:30;32054:34;32034:18;;;32027:62;32125:34;32105:18;;;32098:62;-1:-1:-1;;;32176:19:1;;;32169:36;32222:19;;80048:79:0;31774:473:1;79943:196:0;79614:532;79435:711;;;;:::o;85897:487::-;85968:7;85988:21;86012:7;86020:9;86012:18;;;;;;;;:::i;:::-;;;;;;;;;;;85988:42;;86041:29;86091:18;86133:2;86112:6;:18;;;:23;:49;;86143:6;:18;;;86112:49;;;86138:2;86112:49;86091:70;;86187:9;86182:140;86206:10;86202:1;:14;86182:140;;;86292:17;;;;:14;;;:17;;;;;;;;;;86257:53;;;;86274:16;;-1:-1:-1;;;;;86292:17:0;;;;86257:53;;:::i;:::-;;;;;;;;;;;;;86238:72;;86218:3;;;;;:::i;:::-;;;;86182:140;;;-1:-1:-1;;86349:27:0;;;;;;;;85897:487;-1:-1:-1;;;85897:487:0:o;45797:319::-;45926:18;45932:2;45936:7;45926:5;:18::i;:::-;45977:53;46008:1;46012:2;46016:7;46025:4;45977:22;:53::i;:::-;45955:153;;;;-1:-1:-1;;;45955:153:0;;;;;;;:::i;51655:853::-;51809:4;-1:-1:-1;;;;;51830:13:0;;13144:19;:23;51826:675;;51866:71;;-1:-1:-1;;;51866:71:0;;-1:-1:-1;;;;;51866:36:0;;;;;:71;;864:10;;51917:4;;51923:7;;51932:4;;51866:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51866:71:0;;;;;;;;-1:-1:-1;;51866:71:0;;;;;;;;;;;;:::i;:::-;;;51862:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52107:6;:13;52124:1;52107:18;52103:328;;52150:60;;-1:-1:-1;;;52150:60:0;;;;;;;:::i;52103:328::-;52381:6;52375:13;52366:6;52362:2;52358:15;52351:38;51862:584;-1:-1:-1;;;;;;51988:51:0;-1:-1:-1;;;51988:51:0;;-1:-1:-1;51981:58:0;;51826:675;-1:-1:-1;52485:4:0;51655:853;;;;;;:::o;32254:922::-;32307:7;;-1:-1:-1;;;32385:15:0;;32381:102;;-1:-1:-1;;;32421:15:0;;;-1:-1:-1;32465:2:0;32455:12;32381:102;32510:6;32501:5;:15;32497:102;;32546:6;32537:15;;;-1:-1:-1;32581:2:0;32571:12;32497:102;32626:6;32617:5;:15;32613:102;;32662:6;32653:15;;;-1:-1:-1;32697:2:0;32687:12;32613:102;32742:5;32733;:14;32729:99;;32777:5;32768:14;;;-1:-1:-1;32811:1:0;32801:11;32729:99;32855:5;32846;:14;32842:99;;32890:5;32881:14;;;-1:-1:-1;32924:1:0;32914:11;32842:99;32968:5;32959;:14;32955:99;;33003:5;32994:14;;;-1:-1:-1;33037:1:0;33027:11;32955:99;33081:5;33072;:14;33068:66;;33117:1;33107:11;33162:6;32254:922;-1:-1:-1;;32254:922:0:o;57788:915::-;57965:61;57992:4;57998:2;58002:12;58016:9;57965:26;:61::i;:::-;58055:1;58043:9;:13;58039:222;;;58186:63;;-1:-1:-1;;;58186:63:0;;33635:2:1;58186:63:0;;;33617:21:1;33674:2;33654:18;;;33647:30;33713:34;33693:18;;;33686:62;-1:-1:-1;;;33764:18:1;;;33757:51;33825:19;;58186:63:0;33433:417:1;58039:222:0;58291:12;-1:-1:-1;;;;;58320:18:0;;58316:187;;58355:40;58387:7;59530:10;:17;;59503:24;;;;:15;:24;;;;;:44;;;59558:24;;;;;;;;;;;;59426:164;58355:40;58316:187;;;58425:2;-1:-1:-1;;;;;58417:10:0;:4;-1:-1:-1;;;;;58417:10:0;;58413:90;;58444:47;58477:4;58483:7;58444:32;:47::i;:::-;-1:-1:-1;;;;;58517:16:0;;58513:183;;58550:45;58587:7;58550:36;:45::i;:::-;58513:183;;;58623:4;-1:-1:-1;;;;;58617:10:0;:2;-1:-1:-1;;;;;58617:10:0;;58613:83;;58644:40;58672:2;58676:7;58644:27;:40::i;46452:942::-;-1:-1:-1;;;;;46532:16:0;;46524:61;;;;-1:-1:-1;;;46524:61:0;;34057:2:1;46524:61:0;;;34039:21:1;;;34076:18;;;34069:30;34135:34;34115:18;;;34108:62;34187:18;;46524:61:0;33855:356:1;46524:61:0;44624:4;44222:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44222:16:0;44648:31;46596:58;;;;-1:-1:-1;;;46596:58:0;;34418:2:1;46596:58:0;;;34400:21:1;34457:2;34437:18;;;34430:30;34496;34476:18;;;34469:58;34544:18;;46596:58:0;34216:352:1;46596:58:0;46667:48;46696:1;46700:2;46704:7;46713:1;46667:20;:48::i;:::-;44624:4;44222:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44222:16:0;44648:31;46805:58;;;;-1:-1:-1;;;46805:58:0;;34418:2:1;46805:58:0;;;34400:21:1;34457:2;34437:18;;;34430:30;34496;34476:18;;;34469:58;34544:18;;46805:58:0;34216:352:1;46805:58:0;-1:-1:-1;;;;;47212:13:0;;;;;;:9;:13;;;;;;;;:18;;47229:1;47212:18;;;47254:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47254:21:0;;;;;47293:33;47262:7;;47212:13;;47293:33;;47212:13;;47293:33;84112:234:::1;;84073:273::o:0;53240:410::-;53430:1;53418:9;:13;53414:229;;;-1:-1:-1;;;;;53452:18:0;;;53448:87;;-1:-1:-1;;;;;53491:15:0;;;;;;:9;:15;;;;;:28;;53510:9;;53491:15;:28;;53510:9;;53491:28;:::i;:::-;;;;-1:-1:-1;;53448:87:0;-1:-1:-1;;;;;53553:16:0;;;53549:83;;-1:-1:-1;;;;;53590:13:0;;;;;;:9;:13;;;;;:26;;53607:9;;53590:13;:26;;53607:9;;53590:26;:::i;:::-;;;;-1:-1:-1;;53240:410:0;;;;:::o;60217:988::-;60483:22;60533:1;60508:22;60525:4;60508:16;:22::i;:::-;:26;;;;:::i;:::-;60545:18;60566:26;;;:17;:26;;;;;;60483:51;;-1:-1:-1;60699:28:0;;;60695:328;;-1:-1:-1;;;;;60766:18:0;;60744:19;60766:18;;;:12;:18;;;;;;;;:34;;;;;;;;;60817:30;;;;;;:44;;;60934:30;;:17;:30;;;;;:43;;;60695:328;-1:-1:-1;61119:26:0;;;;:17;:26;;;;;;;;61112:33;;;-1:-1:-1;;;;;61163:18:0;;;;;:12;:18;;;;;:34;;;;;;;61156:41;60217:988::o;61500:1079::-;61778:10;:17;61753:22;;61778:21;;61798:1;;61778:21;:::i;:::-;61810:18;61831:24;;;:15;:24;;;;;;62204:10;:26;;61753:46;;-1:-1:-1;61831:24:0;;61753:46;;62204:26;;;;;;:::i;:::-;;;;;;;;;62182:48;;62268:11;62243:10;62254;62243:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;62348:28;;;:15;:28;;;;;;;:41;;;62520:24;;;;;62513:31;62555:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;61571:1008;;;61500:1079;:::o;59004:221::-;59089:14;59106:20;59123:2;59106:16;:20::i;:::-;-1:-1:-1;;;;;59137:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;59182:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;59004:221:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:435::-;2746:3;2784:5;2778:12;2811:6;2806:3;2799:19;2837:4;2866:2;2861:3;2857:12;2850:19;;2903:2;2896:5;2892:14;2924:1;2934:169;2948:6;2945:1;2942:13;2934:169;;;3009:13;;2997:26;;3043:12;;;;3078:15;;;;2970:1;2963:9;2934:169;;;-1:-1:-1;3119:3:1;;2693:435;-1:-1:-1;;;;;2693:435:1:o;3133:261::-;3312:2;3301:9;3294:21;3275:4;3332:56;3384:2;3373:9;3369:18;3361:6;3332:56;:::i;3399:127::-;3460:10;3455:3;3451:20;3448:1;3441:31;3491:4;3488:1;3481:15;3515:4;3512:1;3505:15;3531:632;3596:5;3626:18;3667:2;3659:6;3656:14;3653:40;;;3673:18;;:::i;:::-;3748:2;3742:9;3716:2;3802:15;;-1:-1:-1;;3798:24:1;;;3824:2;3794:33;3790:42;3778:55;;;3848:18;;;3868:22;;;3845:46;3842:72;;;3894:18;;:::i;:::-;3934:10;3930:2;3923:22;3963:6;3954:15;;3993:6;3985;3978:22;4033:3;4024:6;4019:3;4015:16;4012:25;4009:45;;;4050:1;4047;4040:12;4009:45;4100:6;4095:3;4088:4;4080:6;4076:17;4063:44;4155:1;4148:4;4139:6;4131;4127:19;4123:30;4116:41;;;;3531:632;;;;;:::o;4168:222::-;4211:5;4264:3;4257:4;4249:6;4245:17;4241:27;4231:55;;4282:1;4279;4272:12;4231:55;4304:80;4380:3;4371:6;4358:20;4351:4;4343:6;4339:17;4304:80;:::i;4395:1019::-;4538:6;4546;4554;4562;4570;4578;4586;4639:3;4627:9;4618:7;4614:23;4610:33;4607:53;;;4656:1;4653;4646:12;4607:53;4692:9;4679:23;4669:33;;4753:2;4742:9;4738:18;4725:32;4776:18;4817:2;4809:6;4806:14;4803:34;;;4833:1;4830;4823:12;4803:34;4856:50;4898:7;4889:6;4878:9;4874:22;4856:50;:::i;:::-;4846:60;;4959:2;4948:9;4944:18;4931:32;4915:48;;4988:2;4978:8;4975:16;4972:36;;;5004:1;5001;4994:12;4972:36;5027:52;5071:7;5060:8;5049:9;5045:24;5027:52;:::i;:::-;5017:62;;5132:2;5121:9;5117:18;5104:32;5088:48;;5161:2;5151:8;5148:16;5145:36;;;5177:1;5174;5167:12;5145:36;;5200:52;5244:7;5233:8;5222:9;5218:24;5200:52;:::i;:::-;4395:1019;;;;-1:-1:-1;4395:1019:1;;5299:3;5284:19;;5271:33;;5351:3;5336:19;;5323:33;;-1:-1:-1;5403:3:1;5388:19;;;5375:33;;-1:-1:-1;4395:1019:1;-1:-1:-1;;;4395:1019:1:o;5419:322::-;5488:6;5541:2;5529:9;5520:7;5516:23;5512:32;5509:52;;;5557:1;5554;5547:12;5509:52;5597:9;5584:23;5630:18;5622:6;5619:30;5616:50;;;5662:1;5659;5652:12;5616:50;5685;5727:7;5718:6;5707:9;5703:22;5685:50;:::i;5746:1265::-;6202:4;6248:1;6244;6239:3;6235:11;6231:19;6289:2;6281:6;6277:15;6266:9;6259:34;6329:6;6324:2;6313:9;6309:18;6302:34;6372:3;6367:2;6356:9;6352:18;6345:31;6399:46;6440:3;6429:9;6425:19;6417:6;6399:46;:::i;:::-;6493:9;6485:6;6481:22;6476:2;6465:9;6461:18;6454:50;6527:33;6553:6;6545;6527:33;:::i;:::-;6513:47;;6609:9;6601:6;6597:22;6591:3;6580:9;6576:19;6569:51;6637:33;6663:6;6655;6637:33;:::i;:::-;6701:3;6686:19;;6679:35;;;;-1:-1:-1;6745:3:1;6730:19;;6723:35;;;;-1:-1:-1;6789:3:1;6774:19;;6767:35;;;;6833:3;6818:19;;6811:35;;;;6883:15;;6877:3;6862:19;;6855:44;6943:15;;6936:23;6930:3;6915:19;;6908:52;6991:3;6976:19;6969:36;6629:41;5746:1265;-1:-1:-1;;;;;5746:1265:1:o;7016:186::-;7075:6;7128:2;7116:9;7107:7;7103:23;7099:32;7096:52;;;7144:1;7141;7134:12;7096:52;7167:29;7186:9;7167:29;:::i;7207:248::-;7275:6;7283;7336:2;7324:9;7315:7;7311:23;7307:32;7304:52;;;7352:1;7349;7342:12;7304:52;-1:-1:-1;;7375:23:1;;;7445:2;7430:18;;;7417:32;;-1:-1:-1;7207:248:1:o;7460:160::-;7525:20;;7581:13;;7574:21;7564:32;;7554:60;;7610:1;7607;7600:12;7625:254;7690:6;7698;7751:2;7739:9;7730:7;7726:23;7722:32;7719:52;;;7767:1;7764;7757:12;7719:52;7790:29;7809:9;7790:29;:::i;:::-;7780:39;;7838:35;7869:2;7858:9;7854:18;7838:35;:::i;:::-;7828:45;;7625:254;;;;;:::o;7884:667::-;7979:6;7987;7995;8003;8056:3;8044:9;8035:7;8031:23;8027:33;8024:53;;;8073:1;8070;8063:12;8024:53;8096:29;8115:9;8096:29;:::i;:::-;8086:39;;8144:38;8178:2;8167:9;8163:18;8144:38;:::i;:::-;8134:48;;8229:2;8218:9;8214:18;8201:32;8191:42;;8284:2;8273:9;8269:18;8256:32;8311:18;8303:6;8300:30;8297:50;;;8343:1;8340;8333:12;8297:50;8366:22;;8419:4;8411:13;;8407:27;-1:-1:-1;8397:55:1;;8448:1;8445;8438:12;8397:55;8471:74;8537:7;8532:2;8519:16;8514:2;8510;8506:11;8471:74;:::i;:::-;8461:84;;;7884:667;;;;;;;:::o;8556:180::-;8612:6;8665:2;8653:9;8644:7;8640:23;8636:32;8633:52;;;8681:1;8678;8671:12;8633:52;8704:26;8720:9;8704:26;:::i;8741:254::-;8809:6;8817;8870:2;8858:9;8849:7;8845:23;8841:32;8838:52;;;8886:1;8883;8876:12;8838:52;8922:9;8909:23;8899:33;;8951:38;8985:2;8974:9;8970:18;8951:38;:::i;9000:260::-;9068:6;9076;9129:2;9117:9;9108:7;9104:23;9100:32;9097:52;;;9145:1;9142;9135:12;9097:52;9168:29;9187:9;9168:29;:::i;:::-;9158:39;;9216:38;9250:2;9239:9;9235:18;9216:38;:::i;9265:380::-;9344:1;9340:12;;;;9387;;;9408:61;;9462:4;9454:6;9450:17;9440:27;;9408:61;9515:2;9507:6;9504:14;9484:18;9481:38;9478:161;;9561:10;9556:3;9552:20;9549:1;9542:31;9596:4;9593:1;9586:15;9624:4;9621:1;9614:15;9478:161;;9265:380;;;:::o;10482:409::-;10684:2;10666:21;;;10723:2;10703:18;;;10696:30;10762:34;10757:2;10742:18;;10735:62;-1:-1:-1;;;10828:2:1;10813:18;;10806:43;10881:3;10866:19;;10482:409::o;11308:345::-;11510:2;11492:21;;;11549:2;11529:18;;;11522:30;-1:-1:-1;;;11583:2:1;11568:18;;11561:51;11644:2;11629:18;;11308:345::o;11658:127::-;11719:10;11714:3;11710:20;11707:1;11700:31;11750:4;11747:1;11740:15;11774:4;11771:1;11764:15;11790:397;11992:2;11974:21;;;12031:2;12011:18;;;12004:30;12070:34;12065:2;12050:18;;12043:62;-1:-1:-1;;;12136:2:1;12121:18;;12114:31;12177:3;12162:19;;11790:397::o;12945:127::-;13006:10;13001:3;12997:20;12994:1;12987:31;13037:4;13034:1;13027:15;13061:4;13058:1;13051:15;13077:112;13109:1;13135;13125:35;;13140:18;;:::i;:::-;-1:-1:-1;13174:9:1;;13077:112::o;13194:127::-;13255:10;13250:3;13246:20;13243:1;13236:31;13286:4;13283:1;13276:15;13310:4;13307:1;13300:15;13326:120;13366:1;13392;13382:35;;13397:18;;:::i;:::-;-1:-1:-1;13431:9:1;;13326:120::o;13451:128::-;13518:9;;;13539:11;;;13536:37;;;13553:18;;:::i;15666:125::-;15731:9;;;15752:10;;;15749:36;;;15765:18;;:::i;17093:545::-;17195:2;17190:3;17187:11;17184:448;;;17231:1;17256:5;17252:2;17245:17;17301:4;17297:2;17287:19;17371:2;17359:10;17355:19;17352:1;17348:27;17342:4;17338:38;17407:4;17395:10;17392:20;17389:47;;;-1:-1:-1;17430:4:1;17389:47;17485:2;17480:3;17476:12;17473:1;17469:20;17463:4;17459:31;17449:41;;17540:82;17558:2;17551:5;17548:13;17540:82;;;17603:17;;;17584:1;17573:13;17540:82;;;17544:3;;;17093:545;;;:::o;17814:1352::-;17940:3;17934:10;17967:18;17959:6;17956:30;17953:56;;;17989:18;;:::i;:::-;18018:97;18108:6;18068:38;18100:4;18094:11;18068:38;:::i;:::-;18062:4;18018:97;:::i;:::-;18170:4;;18234:2;18223:14;;18251:1;18246:663;;;;18953:1;18970:6;18967:89;;;-1:-1:-1;19022:19:1;;;19016:26;18967:89;-1:-1:-1;;17771:1:1;17767:11;;;17763:24;17759:29;17749:40;17795:1;17791:11;;;17746:57;19069:81;;18216:944;;18246:663;17040:1;17033:14;;;17077:4;17064:18;;-1:-1:-1;;18282:20:1;;;18400:236;18414:7;18411:1;18408:14;18400:236;;;18503:19;;;18497:26;18482:42;;18595:27;;;;18563:1;18551:14;;;;18430:19;;18400:236;;;18404:3;18664:6;18655:7;18652:19;18649:201;;;18725:19;;;18719:26;-1:-1:-1;;18808:1:1;18804:14;;;18820:3;18800:24;18796:37;18792:42;18777:58;18762:74;;18649:201;-1:-1:-1;;;;;18896:1:1;18880:14;;;18876:22;18863:36;;-1:-1:-1;17814:1352:1:o;19171:135::-;19210:3;19231:17;;;19228:43;;19251:18;;:::i;:::-;-1:-1:-1;19298:1:1;19287:13;;19171:135::o;19311:435::-;19544:3;19533:9;19526:22;19507:4;19565:46;19606:3;19595:9;19591:19;19583:6;19565:46;:::i;:::-;19642:2;19627:18;;19620:34;;;;-1:-1:-1;19685:2:1;19670:18;;19663:34;;;;19728:2;19713:18;;;19706:34;19557:54;19311:435;-1:-1:-1;19311:435:1:o;24135:168::-;24208:9;;;24239;;24256:15;;;24250:22;;24236:37;24226:71;;24277:18;;:::i;25022:332::-;25229:6;25218:9;25211:25;25272:2;25267;25256:9;25252:18;25245:30;25192:4;25292:56;25344:2;25333:9;25329:18;25321:6;25292:56;:::i;27175:663::-;27455:3;27493:6;27487:13;27509:66;27568:6;27563:3;27556:4;27548:6;27544:17;27509:66;:::i;:::-;27638:13;;27597:16;;;;27660:70;27638:13;27597:16;27707:4;27695:17;;27660:70;:::i;:::-;-1:-1:-1;;;27752:20:1;;27781:22;;;27830:1;27819:13;;27175:663;-1:-1:-1;;;;27175:663:1:o;28250:401::-;28452:2;28434:21;;;28491:2;28471:18;;;28464:30;28530:34;28525:2;28510:18;;28503:62;-1:-1:-1;;;28596:2:1;28581:18;;28574:35;28641:3;28626:19;;28250:401::o;30508:127::-;30569:10;30564:3;30560:20;30557:1;30550:31;30600:4;30597:1;30590:15;30624:4;30621:1;30614:15;31355:414;31557:2;31539:21;;;31596:2;31576:18;;;31569:30;31635:34;31630:2;31615:18;;31608:62;-1:-1:-1;;;31701:2:1;31686:18;;31679:48;31759:3;31744:19;;31355:414::o;32252:428::-;32409:3;32447:6;32441:13;32463:66;32522:6;32517:3;32510:4;32502:6;32498:17;32463:66;:::i;:::-;32598:2;32594:15;;;;-1:-1:-1;;32590:53:1;32551:16;;;;32576:68;;;32671:2;32660:14;;32252:428;-1:-1:-1;;32252:428:1:o;32685:489::-;-1:-1:-1;;;;;32954:15:1;;;32936:34;;33006:15;;33001:2;32986:18;;32979:43;33053:2;33038:18;;33031:34;;;33101:3;33096:2;33081:18;;33074:31;;;32879:4;;33122:46;;33148:19;;33140:6;33122:46;:::i;:::-;33114:54;32685:489;-1:-1:-1;;;;;;32685:489:1:o;33179:249::-;33248:6;33301:2;33289:9;33280:7;33276:23;33272:32;33269:52;;;33317:1;33314;33307:12;33269:52;33349:9;33343:16;33368:30;33392:5;33368:30;:::i
Swarm Source
ipfs://eb34526af5f09e0f3c47e075cb20e10f01563266af6c5953c94aa16977f42cb5
Net Worth in USD
Net Worth in ETH
Token Allocations
Multichain Portfolio | 32 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BASE | 100.00% | $2,219.68 | 0.015 | $33.3 |
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.