Token
Overview ERC1155
Total Supply:
0 N/A
Holders:
65 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ElementalStone
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-29 */ // Sources flattened with hardhat v2.12.2 https://hardhat.org // File contracts/interfaces/IAttunement.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IAttunement { function stake( address user, uint256 id, uint256 girlId, bool isMatched ) external; function attune( address _account, uint256 _id, uint256 _girlId ) external; function girlTransferred(uint256 girlID) external; } // File contracts/interfaces/IGirl.sol pragma solidity ^0.8.4; interface IGirl { function getCosmicLevel(uint256 _id) external view returns (uint256); function getGamerScore(uint256 _id) external view returns (uint256); function isPaired(uint256 girlId) external view returns (bool); function setPaired(uint256 _id, bool _paired) external; function checkStake(uint256 girlId) external view returns ( address, bool, uint256 ); function getCosmicLevelUpgradeCost(uint256 id, uint256 toTier) external view returns (uint256[] memory); function handleUpgradeCosmicLevel(uint256 id, uint256 toTier) external; function getGamerScoreUpgradeCost(uint256 id, uint256 toTier) external view returns (uint256 cost); function handleUpgradeGamerScore(uint256 id, uint256 toTier) external; function ownerOf(uint256 id) external view returns (address); function walletOfOwner(address _owner) external view returns (uint256[] memory); } // 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/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/utils/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/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/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll( address indexed account, address indexed operator, bool approved ); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // 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/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: address zero is not a valid owner" ); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck( operator, address(0), to, id, amount, data ); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: burn amount exceeds balance" ); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver.onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require( supply >= amount, "ERC1155: burn amount exceeds totalSupply" ); unchecked { _totalSupply[id] = supply - amount; } } } } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burnBatch(account, ids, values); } } // File contracts/Gacha/ElementalStone.sol pragma solidity ^0.8.4; contract ElementalStone is ERC1155Supply, Ownable, ERC1155Burnable, IERC2981 { bytes4 public constant INTERFACE_ID_ERC2981 = 0x2a55205a; // 1 = flame; 2 = terra; 3 = aqua IAttunement public attunement; IGirl public girl; uint256 public tokenCount = 6; uint256[] public upgradeIDs = [4, 5, 6]; string public baseURI; string[] public elementString = ["", "Flame", "Terra", "Aqua"]; mapping(address => bool) public isGachaMachine; // testing // uint256[] testids = [1, 2, 3, 4, 5, 6]; // uint256[] testamounts = [100, 100, 100, 100, 100, 100]; // royalty address private _recipient; event CosmicLevelUpgraded(uint256 id, uint256 toTier); constructor( address _gachaMachine, address _girl, string memory _baseURI, address _royalty ) ERC1155("TGG Elemental Stone") { isGachaMachine[_gachaMachine] = true; setGirlContract(_girl); setBaseURI(_baseURI); setRoyalties(_royalty); _recipient = msg.sender; } // function mintDev(address _to) external onlyOwner { // _mintBatch(_to, testids, testamounts, ""); // } function setBaseURI(string memory newBaseURI) public onlyOwner { baseURI = newBaseURI; } function setTokenCount(uint256 newCount) external onlyOwner { tokenCount = newCount; } function uri(uint256 _tokenID) public view override returns (string memory) { string memory tokenID = Strings.toString(_tokenID); return string(abi.encodePacked(baseURI, tokenID)); } function mint( address account, uint256 id, uint256 amount ) external onlyGachaMachine { _mint(account, id, amount, ""); } function setGirlContract(address _girl) public onlyOwner { girl = IGirl(_girl); } function stake(uint256 id, uint256 girlId) external { require(id >= 1 && id <= 3, "ES: only dormant stones can be staked"); address _user; bool _isPaired; uint256 _el; (_user, _isPaired, _el) = girl.checkStake(girlId); require(msg.sender == _user, "ES: cant pair with girl.. not owner"); require(!_isPaired, "ES: girl is already staking"); safeTransferFrom(msg.sender, address(attunement), id, 1, ""); attunement.stake(msg.sender, id, girlId, (id == _el)); girl.setPaired(girlId, true); } function attune( address account, uint256 id, uint256 girlId ) external onlyAttunement { // burn old id _mint(account, id + 3, 1, ""); girl.setPaired(girlId, false); } function getWalletBalance(address _user) external view returns (uint256[] memory) { uint256[] memory all = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; ++i) { all[i] = balanceOf(_user, i + 1); } return all; } function setAttunementContract(address _contract) external onlyOwner { attunement = IAttunement(_contract); } function setGachaMachineContract(address _contract) external onlyOwner { isGachaMachine[_contract] = true; } modifier onlyGachaMachine() { require(isGachaMachine[msg.sender], "Only gacha machine can mint"); _; } modifier onlyAttunement() { require( msg.sender == address(attunement), "Only attunement can attune" ); _; } function upgradeCosmicLevel(uint256 id, uint256 toTier) external { // get cost uint256[] memory amounts = girl.getCosmicLevelUpgradeCost(id, toTier); // check user balance require( balanceOf(msg.sender, 4) >= amounts[0] && balanceOf(msg.sender, 5) >= amounts[1] && balanceOf(msg.sender, 6) >= amounts[2], "Upgrade: not enough stones" ); // check owner of girl require( girl.ownerOf(id) == msg.sender, "Elemental: upgrade caller not owner" ); // burn amount burnBatch(msg.sender, upgradeIDs, amounts); // upgrade stats girl.handleUpgradeCosmicLevel(id, toTier); emit CosmicLevelUpgraded(id, toTier); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } /** @dev EIP2981 royalties */ function _setRoyalties(address newRecipient) internal { require( newRecipient != address(0), "Royalties: new recipient is the zero address" ); _recipient = newRecipient; } function setRoyalties(address newRecipient) public onlyOwner { _setRoyalties(newRecipient); } /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) { receiver = _recipient; royaltyAmount = (_salePrice * 6) / 100; } function supportsInterface(bytes4 interfaceId) public view override(IERC165, ERC1155) returns (bool) { return interfaceId == INTERFACE_ID_ERC2981 || super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_gachaMachine","type":"address"},{"internalType":"address","name":"_girl","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_royalty","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTier","type":"uint256"}],"name":"CosmicLevelUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"INTERFACE_ID_ERC2981","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"girlId","type":"uint256"}],"name":"attune","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"attunement","outputs":[{"internalType":"contract IAttunement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"elementString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getWalletBalance","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"girl","outputs":[{"internalType":"contract IGirl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGachaMachine","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setAttunementContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setGachaMachineContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_girl","type":"address"}],"name":"setGirlContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setTokenCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"girlId","type":"uint256"}],"name":"stake","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":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"toTier","type":"uint256"}],"name":"upgradeCosmicLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"upgradeIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6006600781905560e060405260046080908152600560a05260c0919091526200002d90600890600362000362565b50604051806080016040528060405180602001604052806000815250815260200160405180604001604052806005815260200164466c616d6560d81b815250815260200160405180604001604052806005815260200164546572726160d81b8152508152602001604051806040016040528060048152602001634171756160e01b815250815250600a906004620000c6929190620003b7565b50348015620000d457600080fd5b506040516200360538038062003605833981016040819052620000f79162000528565b60408051808201909152601381527f54474720456c656d656e74616c2053746f6e650000000000000000000000000060208201526200013681620001a3565b506200014233620001bc565b6001600160a01b0384166000908152600b60205260409020805460ff1916600117905562000170836200020e565b6200017b826200023a565b620001868162000259565b5050600c80546001600160a01b03191633179055506200068c9050565b8051620001b890600290602084019062000417565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200021862000271565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6200024462000271565b8051620001b890600990602084019062000417565b6200026362000271565b6200026e81620002d3565b50565b6004546001600160a01b03163314620002d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6001600160a01b038116620003405760405162461bcd60e51b815260206004820152602c60248201527f526f79616c746965733a206e657720726563697069656e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620002c8565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b828054828255906000526020600020908101928215620003a5579160200282015b82811115620003a5578251829060ff1690559160200191906001019062000383565b50620003b392915062000494565b5090565b82805482825590600052602060002090810192821562000409579160200282015b82811115620004095782518051620003f891849160209091019062000417565b5091602001919060010190620003d8565b50620003b3929150620004ab565b828054620004259062000639565b90600052602060002090601f016020900481019282620004495760008555620003a5565b82601f106200046457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a557825182559160200191906001019062000477565b5b80821115620003b3576000815560010162000495565b80821115620003b3576000620004c28282620004cc565b50600101620004ab565b508054620004da9062000639565b6000825580601f10620004eb575050565b601f0160209004906000526020600020908101906200026e919062000494565b80516001600160a01b03811681146200052357600080fd5b919050565b600080600080608085870312156200053e578384fd5b62000549856200050b565b935060206200055a8187016200050b565b60408701519094506001600160401b038082111562000577578485fd5b818801915088601f8301126200058b578485fd5b815181811115620005a057620005a062000676565b604051601f8201601f19908116603f01168101908382118183101715620005cb57620005cb62000676565b816040528281528b86848701011115620005e3578788fd5b8793505b82841015620006065784840186015181850187015292850192620005e7565b828411156200061757878684830101525b8097505050505050506200062e606086016200050b565b905092959194509250565b600181811c908216806200064e57607f821691505b602082108114156200067057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612f69806200069c6000396000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c806355f804b311610125578063a22cb465116100ad578063e985e9c51161007c578063e985e9c5146104e3578063ed8ec1941461051f578063f242432a14610532578063f2fde38b14610545578063f5298aca1461055857600080fd5b8063a22cb46514610476578063a388237d14610489578063b060dd861461049c578063bd85b039146104c357600080fd5b80637b0472f0116100f45780637b0472f0146104235780637b435a651461043657806384eda544146104495780638da5cb5b1461045c5780639f181b5e1461046d57600080fd5b806355f804b3146103ed5780636b20c454146104005780636c0360eb14610413578063715018a61461041b57600080fd5b80632a9e63c6116101a85780633c22ae5a116101775780633c22ae5a146103625780634c7b7c6f146103855780634d683d08146103985780634e1273f4146103ab5780634f558e79146103cb57600080fd5b80632a9e63c6146103165780632eb2c2d6146103295780633318f1a51461033c578063348a2c3c1461034f57600080fd5b8063156e29f6116101e4578063156e29f6146102a95780631c253155146102be5780631ce57c00146102d15780632a55205a146102e457600080fd5b8062fdd58e1461021557806301ffc9a71461023b5780630e89341c1461025e5780630f3b899b1461027e575b600080fd5b610228610223366004612676565b61056b565b6040519081526020015b60405180910390f35b61024e61024936600461283d565b610601565b6040519015158152602001610232565b61027161026c3660046128c2565b61062c565b6040516102329190612afe565b600554610291906001600160a01b031681565b6040516001600160a01b039091168152602001610232565b6102bc6102b73660046126a1565b610666565b005b6102bc6102cc366004612416565b6106e5565b6102bc6102df3660046126a1565b610711565b6102f76102f23660046128da565b6107fb565b604080516001600160a01b039093168352602083019190915201610232565b6102bc610324366004612416565b610829565b6102bc610337366004612486565b61083d565b600654610291906001600160a01b031681565b61022861035d3660046128c2565b610889565b61024e610370366004612416565b600b6020526000908152604090205460ff1681565b6102bc6103933660046128da565b6108aa565b6102716103a63660046128c2565b610c0f565b6103be6103b93660046126d5565b610cbb565b6040516102329190612ac6565b61024e6103d93660046128c2565b600090815260036020526040902054151590565b6102bc6103fb366004612875565b610e1c565b6102bc61040e366004612595565b610e3b565b610271610e7e565b6102bc610e8b565b6102bc6104313660046128da565b610e9f565b6102bc6104443660046128c2565b611156565b6102bc610457366004612416565b611163565b6004546001600160a01b0316610291565b61022860075481565b6102bc610484366004612607565b61118d565b6102bc610497366004612416565b611198565b6104aa63152a902d60e11b81565b6040516001600160e01b03199091168152602001610232565b6102286104d13660046128c2565b60009081526003602052604090205490565b61024e6104f136600461244e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6103be61052d366004612416565b6111c2565b6102bc61054036600461252f565b611278565b6102bc610553366004612416565b6112bd565b6102bc6105663660046126a1565b611333565b60006001600160a01b0383166105db5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b1480610626575061062682611376565b92915050565b60606000610639836113c6565b905060098160405160200161064f92919061297d565b604051602081830303815290604052915050919050565b336000908152600b602052604090205460ff166106c55760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206761636861206d616368696e652063616e206d696e74000000000060448201526064016105d2565b6106e083838360405180602001604052806000815250611468565b505050565b6106ed611582565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b0316331461076b5760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c7920617474756e656d656e742063616e20617474756e6500000000000060448201526064016105d2565b6107918361077a846003612d28565b600160405180602001604052806000815250611468565b600654604051633f1ed70960e01b815260048101839052600060248201526001600160a01b0390911690633f1ed70990604401600060405180830381600087803b1580156107de57600080fd5b505af11580156107f2573d6000803e3d6000fd5b50505050505050565b600c546001600160a01b031660006064610816846006612d60565b6108209190612d40565b90509250929050565b610831611582565b61083a816115dc565b50565b6001600160a01b038516331480610859575061085985336104f1565b6108755760405162461bcd60e51b81526004016105d290612b9d565b6108828585858585611669565b5050505050565b6008818154811061089957600080fd5b600091825260209091200154905081565b600654604051631fba62cb60e11b815260048101849052602481018390526000916001600160a01b031690633f74c5969060440160006040518083038186803b1580156108f657600080fd5b505afa15801561090a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261093291908101906127a1565b90508060008151811061095557634e487b7160e01b600052603260045260246000fd5b602002602001015161096833600461056b565b101580156109a857508060018151811061099257634e487b7160e01b600052603260045260246000fd5b60200260200101516109a533600561056b565b10155b80156109e65750806002815181106109d057634e487b7160e01b600052603260045260246000fd5b60200260200101516109e333600661056b565b10155b610a325760405162461bcd60e51b815260206004820152601a60248201527f557067726164653a206e6f7420656e6f7567682073746f6e657300000000000060448201526064016105d2565b6006546040516331a9108f60e11b81526004810185905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a7657600080fd5b505afa158015610a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aae9190612432565b6001600160a01b031614610b105760405162461bcd60e51b815260206004820152602360248201527f456c656d656e74616c3a20757067726164652063616c6c6572206e6f74206f776044820152623732b960e91b60648201526084016105d2565b610b6b336008805480602002602001604051908101604052809291908181526020018280548015610b6057602002820191906000526020600020905b815481526020019060010190808311610b4c575b505050505083610e3b565b600654604051636aa5dd7160e01b815260048101859052602481018490526001600160a01b0390911690636aa5dd7190604401600060405180830381600087803b158015610bb857600080fd5b505af1158015610bcc573d6000803e3d6000fd5b505060408051868152602081018690527f549cdf5da15129b72a0feab3af971de93f43bae8c4c308abca039291e66e1afe935001905060405180910390a1505050565b600a8181548110610c1f57600080fd5b906000526020600020016000915090508054610c3a90612dab565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6690612dab565b8015610cb35780601f10610c8857610100808354040283529160200191610cb3565b820191906000526020600020905b815481529060010190602001808311610c9657829003601f168201915b505050505081565b60608151835114610d205760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105d2565b600083516001600160401b03811115610d4957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d72578160200160208202803683370190505b50905060005b8451811015610e1457610dd9858281518110610da457634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610dcc57634e487b7160e01b600052603260045260246000fd5b602002602001015161056b565b828281518110610df957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610e0d81612e12565b9050610d78565b509392505050565b610e24611582565b8051610e37906009906020840190612286565b5050565b6001600160a01b038316331480610e575750610e5783336104f1565b610e735760405162461bcd60e51b81526004016105d290612b9d565b6106e083838361182f565b60098054610c3a90612dab565b610e93611582565b610e9d60006119e9565b565b60018210158015610eb1575060038211155b610f0b5760405162461bcd60e51b815260206004820152602560248201527f45533a206f6e6c7920646f726d616e742073746f6e65732063616e20626520736044820152641d185ad95960da1b60648201526084016105d2565b600654604051630814786760e31b815260048101839052600091829182916001600160a01b0316906340a3c3389060240160606040518083038186803b158015610f5457600080fd5b505afa158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c9190612634565b91945092509050336001600160a01b03841614610ff75760405162461bcd60e51b815260206004820152602360248201527f45533a2063616e7420706169722077697468206769726c2e2e206e6f74206f776044820152623732b960e91b60648201526084016105d2565b81156110455760405162461bcd60e51b815260206004820152601b60248201527f45533a206769726c20697320616c7265616479207374616b696e67000000000060448201526064016105d2565b61107733600560009054906101000a90046001600160a01b031687600160405180602001604052806000815250611278565b600554604051636ea3404b60e11b8152336004820152602481018790526044810186905282871460648201526001600160a01b039091169063dd46809690608401600060405180830381600087803b1580156110d257600080fd5b505af11580156110e6573d6000803e3d6000fd5b5050600654604051633f1ed70960e01b815260048101889052600160248201526001600160a01b039091169250633f1ed7099150604401600060405180830381600087803b15801561113757600080fd5b505af115801561114b573d6000803e3d6000fd5b505050505050505050565b61115e611582565b600755565b61116b611582565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b610e37338383611a3b565b6111a0611582565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060006007546001600160401b038111156111ee57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611217578160200160208202803683370190505b50905060005b6007548110156112715761123684610223836001612d28565b82828151811061125657634e487b7160e01b600052603260045260246000fd5b602090810291909101015261126a81612e12565b905061121d565b5092915050565b6001600160a01b038516331480611294575061129485336104f1565b6112b05760405162461bcd60e51b81526004016105d290612b9d565b6108828585858585611b1c565b6112c5611582565b6001600160a01b03811661132a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105d2565b61083a816119e9565b6001600160a01b03831633148061134f575061134f83336104f1565b61136b5760405162461bcd60e51b81526004016105d290612b9d565b6106e0838383611c49565b60006001600160e01b03198216636cdb3d1360e11b14806113a757506001600160e01b031982166303a24d0760e21b145b8061062657506301ffc9a760e01b6001600160e01b0319831614610626565b606060006113d383611d61565b60010190506000816001600160401b0381111561140057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561142a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461146357610e14565b611434565b6001600160a01b0384166114c85760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105d2565b3360006114d485611e39565b905060006114e185611e39565b90506114f283600089858589611e92565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611522908490612d28565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107f283600089898989611ea0565b6004546001600160a01b03163314610e9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105d2565b6001600160a01b0381166116475760405162461bcd60e51b815260206004820152602c60248201527f526f79616c746965733a206e657720726563697069656e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016105d2565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b815183511461168a5760405162461bcd60e51b81526004016105d290612cbd565b6001600160a01b0384166116b05760405162461bcd60e51b81526004016105d290612beb565b336116bf818787878787611e92565b60005b84518110156117c15760008582815181106116ed57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061171957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156117695760405162461bcd60e51b81526004016105d290612c73565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906117a6908490612d28565b92505081905550505050806117ba90612e12565b90506116c2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611811929190612ad9565b60405180910390a461182781878787878761200b565b505050505050565b6001600160a01b0383166118555760405162461bcd60e51b81526004016105d290612c30565b80518251146118765760405162461bcd60e51b81526004016105d290612cbd565b600033905061189981856000868660405180602001604052806000815250611e92565b60005b835181101561197a5760008482815181106118c757634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008483815181106118f357634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156119435760405162461bcd60e51b81526004016105d290612b59565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061197281612e12565b91505061189c565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119cb929190612ad9565b60405180910390a46040805160208101909152600090525b50505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611aaf5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105d2565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611b425760405162461bcd60e51b81526004016105d290612beb565b336000611b4e85611e39565b90506000611b5b85611e39565b9050611b6b838989858589611e92565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611bac5760405162461bcd60e51b81526004016105d290612c73565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611be9908490612d28565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461114b848a8a8a8a8a611ea0565b6001600160a01b038316611c6f5760405162461bcd60e51b81526004016105d290612c30565b336000611c7b84611e39565b90506000611c8884611e39565b9050611ca883876000858560405180602001604052806000815250611e92565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015611ce95760405162461bcd60e51b81526004016105d290612b59565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526107f2565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611da05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611dcc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611dea57662386f26fc10000830492506010015b6305f5e1008310611e02576305f5e100830492506008015b6127108310611e1657612710830492506004015b60648310611e28576064830492506002015b600a83106106265760010192915050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611e8157634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6118278686868686866120d5565b6001600160a01b0384163b156118275760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611ee49089908990889088908890600401612a81565b602060405180830381600087803b158015611efe57600080fd5b505af1925050508015611f2e575060408051601f3d908101601f19168201909252611f2b91810190612859565b60015b611fdb57611f3a612e59565b806308c379a01415611f745750611f4f612e71565b80611f5a5750611f76565b8060405162461bcd60e51b81526004016105d29190612afe565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105d2565b6001600160e01b0319811663f23a6e6160e01b146107f25760405162461bcd60e51b81526004016105d290612b11565b6001600160a01b0384163b156118275760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061204f9089908990889088908890600401612a23565b602060405180830381600087803b15801561206957600080fd5b505af1925050508015612099575060408051601f3d908101601f1916820190925261209691810190612859565b60015b6120a557611f3a612e59565b6001600160e01b0319811663bc197c8160e01b146107f25760405162461bcd60e51b81526004016105d290612b11565b6001600160a01b0385166121785760005b83518110156121765782818151811061210f57634e487b7160e01b600052603260045260246000fd5b60200260200101516003600086848151811061213b57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546121609190612d28565b9091555061216f905081612e12565b90506120e6565b505b6001600160a01b0384166118275760005b83518110156107f25760008482815181106121b457634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008483815181106121e057634e487b7160e01b600052603260045260246000fd5b60200260200101519050600060036000848152602001908152602001600020549050818110156122635760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016105d2565b6000928352600360205260409092209103905561227f81612e12565b9050612189565b82805461229290612dab565b90600052602060002090601f0160209004810192826122b457600085556122fa565b82601f106122cd57805160ff19168380011785556122fa565b828001600101855582156122fa579182015b828111156122fa5782518255916020019190600101906122df565b5061230692915061230a565b5090565b5b80821115612306576000815560010161230b565b60006001600160401b0383111561233857612338612e43565b60405161234f601f8501601f191660200182612de6565b80915083815284848401111561236457600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261238c578081fd5b8135602061239982612d05565b6040516123a68282612de6565b8381528281019150858301600585901b870184018810156123c5578586fd5b855b858110156123e3578135845292840192908401906001016123c7565b5090979650505050505050565b600082601f830112612400578081fd5b61240f8383356020850161231f565b9392505050565b600060208284031215612427578081fd5b813561240f81612efa565b600060208284031215612443578081fd5b815161240f81612efa565b60008060408385031215612460578081fd5b823561246b81612efa565b9150602083013561247b81612efa565b809150509250929050565b600080600080600060a0868803121561249d578081fd5b85356124a881612efa565b945060208601356124b881612efa565b935060408601356001600160401b03808211156124d3578283fd5b6124df89838a0161237c565b945060608801359150808211156124f4578283fd5b61250089838a0161237c565b93506080880135915080821115612515578283fd5b50612522888289016123f0565b9150509295509295909350565b600080600080600060a08688031215612546578081fd5b853561255181612efa565b9450602086013561256181612efa565b9350604086013592506060860135915060808601356001600160401b03811115612589578182fd5b612522888289016123f0565b6000806000606084860312156125a9578081fd5b83356125b481612efa565b925060208401356001600160401b03808211156125cf578283fd5b6125db8783880161237c565b935060408601359150808211156125f0578283fd5b506125fd8682870161237c565b9150509250925092565b60008060408385031215612619578182fd5b823561262481612efa565b9150602083013561247b81612f0f565b600080600060608486031215612648578081fd5b835161265381612efa565b602085015190935061266481612f0f565b80925050604084015190509250925092565b60008060408385031215612688578182fd5b823561269381612efa565b946020939093013593505050565b6000806000606084860312156126b5578081fd5b83356126c081612efa565b95602085013595506040909401359392505050565b600080604083850312156126e7578182fd5b82356001600160401b03808211156126fd578384fd5b818501915085601f830112612710578384fd5b8135602061271d82612d05565b60405161272a8282612de6565b8381528281019150858301600585901b870184018b1015612749578889fd5b8896505b8487101561277457803561276081612efa565b83526001969096019591830191830161274d565b509650508601359250508082111561278a578283fd5b506127978582860161237c565b9150509250929050565b600060208083850312156127b3578182fd5b82516001600160401b038111156127c8578283fd5b8301601f810185136127d8578283fd5b80516127e381612d05565b6040516127f08282612de6565b8281528481019150838501600584901b8501860189101561280f578687fd5b8694505b83851015612831578051835260019490940193918501918501612813565b50979650505050505050565b60006020828403121561284e578081fd5b813561240f81612f1d565b60006020828403121561286a578081fd5b815161240f81612f1d565b600060208284031215612886578081fd5b81356001600160401b0381111561289b578182fd5b8201601f810184136128ab578182fd5b6128ba8482356020840161231f565b949350505050565b6000602082840312156128d3578081fd5b5035919050565b600080604083850312156128ec578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561292a5781518752958201959082019060010161290e565b509495945050505050565b6000815180845261294d816020860160208601612d7f565b601f01601f19169290920160200192915050565b60008151612973818560208601612d7f565b9290920192915050565b600080845482600182811c91508083168061299957607f831692505b60208084108214156129b957634e487b7160e01b87526022600452602487fd5b8180156129cd57600181146129de57612a0a565b60ff19861689528489019650612a0a565b60008b815260209020885b86811015612a025781548b8201529085019083016129e9565b505084890196505b505050505050612a1a8185612961565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612a4f908301866128fb565b8281036060840152612a6181866128fb565b90508281036080840152612a758185612935565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612abb90830184612935565b979650505050505050565b60208152600061240f60208301846128fb565b604081526000612aec60408301856128fb565b8281036020840152612a1a81856128fb565b60208152600061240f6020830184612935565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60006001600160401b03821115612d1e57612d1e612e43565b5060051b60200190565b60008219821115612d3b57612d3b612e2d565b500190565b600082612d5b57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612d7a57612d7a612e2d565b500290565b60005b83811015612d9a578181015183820152602001612d82565b838111156119e35750506000910152565b600181811c90821680612dbf57607f821691505b60208210811415612de057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612e0b57612e0b612e43565b6040525050565b6000600019821415612e2657612e26612e2d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612e6e57600481823e5160e01c5b90565b600060443d1015612e7f5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612eae57505050505090565b8285019150815181811115612ec65750505050505090565b843d8701016020828501011115612ee05750505050505090565b612eef60208286010187612de6565b509095945050505050565b6001600160a01b038116811461083a57600080fd5b801515811461083a57600080fd5b6001600160e01b03198116811461083a57600080fdfea2646970667358221220fbee47e057b879ac46c417aff383390dbbbde930473b0afa8658d3a9ea03fa7964736f6c6343000804003300000000000000000000000012252fa55396deeca4ea54204e8fb33ff91ccbea000000000000000000000000ce802a866249215efdf881383fc8eb386352394f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000fb7758a1c62959d55512bb484ba5792cce58abd7000000000000000000000000000000000000000000000000000000000000003768747470733a2f2f7467672d6170692e6865726f6b756170702e636f6d2f656c656d656e74616c2d73746f6e652f6d657461646174612f000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000012252fa55396deeca4ea54204e8fb33ff91ccbea000000000000000000000000ce802a866249215efdf881383fc8eb386352394f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000fb7758a1c62959d55512bb484ba5792cce58abd7000000000000000000000000000000000000000000000000000000000000003768747470733a2f2f7467672d6170692e6865726f6b756170702e636f6d2f656c656d656e74616c2d73746f6e652f6d657461646174612f000000000000000000
-----Decoded View---------------
Arg [0] : _gachaMachine (address): 0x12252fa55396deeca4ea54204e8fb33ff91ccbea
Arg [1] : _girl (address): 0xce802a866249215efdf881383fc8eb386352394f
Arg [2] : _baseURI (string): https://tgg-api.herokuapp.com/elemental-stone/metadata/
Arg [3] : _royalty (address): 0xfb7758a1c62959d55512bb484ba5792cce58abd7
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000012252fa55396deeca4ea54204e8fb33ff91ccbea
Arg [1] : 000000000000000000000000ce802a866249215efdf881383fc8eb386352394f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 000000000000000000000000fb7758a1c62959d55512bb484ba5792cce58abd7
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [5] : 68747470733a2f2f7467672d6170692e6865726f6b756170702e636f6d2f656c
Arg [6] : 656d656e74616c2d73746f6e652f6d657461646174612f000000000000000000
Deployed ByteCode Sourcemap
63718:6093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43757:317;;;;;;:::i;:::-;;:::i;:::-;;;25933:25:1;;;25921:2;25906:18;43757:317:0;;;;;;;;69539:269;;;;;;:::i;:::-;;:::i;:::-;;;15743:14:1;;15736:22;15718:41;;15706:2;15691:18;69539:269:0;15673:92:1;65153:246:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63904:29::-;;;;;-1:-1:-1;;;;;63904:29:0;;;;;;-1:-1:-1;;;;;12691:32:1;;;12673:51;;12661:2;12646:18;63904:29:0;12628:102:1;65407:168:0;;;;;;:::i;:::-;;:::i;:::-;;66967:122;;;;;;:::i;:::-;;:::i;66277:231::-;;;;;;:::i;:::-;;:::i;69269:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;14323:32:1;;;14305:51;;14387:2;14372:18;;14365:34;;;;14278:18;69269:262:0;14260:145:1;68911:107:0;;;;;;:::i;:::-;;:::i;45906:438::-;;;;;;:::i;:::-;;:::i;63940:17::-;;;;;-1:-1:-1;;;;;63940:17:0;;;64002:39;;;;;;:::i;:::-;;:::i;64151:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;67404:818;;;;;;:::i;:::-;;:::i;64080:62::-;;;;;;:::i;:::-;;:::i;44240:561::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61302:122::-;;;;;;:::i;:::-;61359:4;61180:16;;;:12;:16;;;;;;-1:-1:-1;;;61302:122:0;64935:102;;;;;;:::i;:::-;;:::i;63280:358::-;;;;;;:::i;:::-;;:::i;64050:21::-;;;:::i;4474:103::-;;;:::i;65686:583::-;;;;;;:::i;:::-;;:::i;65045:100::-;;;;;;:::i;:::-;;:::i;65583:95::-;;;;;;:::i;:::-;;:::i;3826:87::-;3899:6;;-1:-1:-1;;;;;3899:6:0;3826:87;;63966:29;;;;;;44874:187;;;;;;:::i;:::-;;:::i;66836:123::-;;;;;;:::i;:::-;;:::i;63802:56::-;;-1:-1:-1;;;63802:56:0;;;;;-1:-1:-1;;;;;;15932:33:1;;;15914:52;;15902:2;15887:18;63802:56:0;15869:103:1;61091:113:0;;;;;;:::i;:::-;61153:7;61180:16;;;:12;:16;;;;;;;61091:113;45133:218;;;;;;:::i;:::-;-1:-1:-1;;;;;45306:27:0;;;45277:4;45306:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;45133:218;66516:312;;;;;;:::i;:::-;;:::i;45423:406::-;;;;;;:::i;:::-;;:::i;4732:238::-;;;;;;:::i;:::-;;:::i;62946:326::-;;;;;;:::i;:::-;;:::i;43757:317::-;43888:7;-1:-1:-1;;;;;43935:21:0;;43913:113;;;;-1:-1:-1;;;43913:113:0;;18477:2:1;43913:113:0;;;18459:21:1;18516:2;18496:18;;;18489:30;18555:34;18535:18;;;18528:62;-1:-1:-1;;;18606:18:1;;;18599:40;18656:19;;43913:113:0;;;;;;;;;-1:-1:-1;44044:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;44044:22:0;;;;;;;;;;;;43757:317::o;69539:269::-;69670:4;-1:-1:-1;;;;;;69712:35:0;;-1:-1:-1;;;69712:35:0;;:88;;;69764:36;69788:11;69764:23;:36::i;:::-;69692:108;69539:269;-1:-1:-1;;69539:269:0:o;65153:246::-;65250:13;65281:21;65305:26;65322:8;65305:16;:26::i;:::-;65281:50;;65373:7;65382;65356:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65342:49;;;65153:246;;;:::o;65407:168::-;67159:10;67144:26;;;;:14;:26;;;;;;;;67136:66;;;;-1:-1:-1;;;67136:66:0;;20113:2:1;67136:66:0;;;20095:21:1;20152:2;20132:18;;;20125:30;20191:29;20171:18;;;20164:57;20238:18;;67136:66:0;20085:177:1;67136:66:0;65537:30:::1;65543:7;65552:2;65556:6;65537:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;65407:168:::0;;;:::o;66967:122::-;3712:13;:11;:13::i;:::-;-1:-1:-1;;;;;67049:25:0::1;;::::0;;;:14:::1;:25;::::0;;;;:32;;-1:-1:-1;;67049:32:0::1;67077:4;67049:32;::::0;;66967:122::o;66277:231::-;67311:10;;-1:-1:-1;;;;;67311:10:0;67289;:33;67267:109;;;;-1:-1:-1;;;67267:109:0;;25230:2:1;67267:109:0;;;25212:21:1;25269:2;25249:18;;;25242:30;25308:28;25288:18;;;25281:56;25354:18;;67267:109:0;25202:176:1;67267:109:0;66431:29:::1;66437:7:::0;66446:6:::1;:2:::0;66451:1:::1;66446:6;:::i;:::-;66454:1;66431:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;66471:4;::::0;:29:::1;::::0;-1:-1:-1;;;66471:29:0;;::::1;::::0;::::1;26137:25:1::0;;;66471:4:0::1;26178:18:1::0;;;26171:50;-1:-1:-1;;;;;66471:4:0;;::::1;::::0;:14:::1;::::0;26110:18:1;;66471:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66277:231:::0;;;:::o;69269:262::-;69464:10;;-1:-1:-1;;;;;69464:10:0;69396:16;69520:3;69502:14;:10;69515:1;69502:14;:::i;:::-;69501:22;;;;:::i;:::-;69485:38;;69269:262;;;;;:::o;68911:107::-;3712:13;:11;:13::i;:::-;68983:27:::1;68997:12;68983:13;:27::i;:::-;68911:107:::0;:::o;45906:438::-;-1:-1:-1;;;;;46139:20:0;;2430:10;46139:20;;:60;;-1:-1:-1;46163:36:0;46180:4;2430:10;45133:218;:::i;46163:36::-;46117:156;;;;-1:-1:-1;;;46117:156:0;;;;;;;:::i;:::-;46284:52;46307:4;46313:2;46317:3;46322:7;46331:4;46284:22;:52::i;:::-;45906:438;;;;;:::o;64002:39::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64002:39:0;:::o;67404:818::-;67528:4;;:42;;-1:-1:-1;;;67528:42:0;;;;;26406:25:1;;;26447:18;;;26440:34;;;67501:24:0;;-1:-1:-1;;;;;67528:4:0;;:30;;26379:18:1;;67528:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67528:42:0;;;;;;;;;;;;:::i;:::-;67501:69;;67664:7;67672:1;67664:10;;;;;;-1:-1:-1;;;67664:10:0;;;;;;;;;;;;;;;67636:24;67646:10;67658:1;67636:9;:24::i;:::-;:38;;:97;;;;;67723:7;67731:1;67723:10;;;;;;-1:-1:-1;;;67723:10:0;;;;;;;;;;;;;;;67695:24;67705:10;67717:1;67695:9;:24::i;:::-;:38;;67636:97;:156;;;;;67782:7;67790:1;67782:10;;;;;;-1:-1:-1;;;67782:10:0;;;;;;;;;;;;;;;67754:24;67764:10;67776:1;67754:9;:24::i;:::-;:38;;67636:156;67614:232;;;;-1:-1:-1;;;67614:232:0;;22410:2:1;67614:232:0;;;22392:21:1;22449:2;22429:18;;;22422:30;22488:28;22468:18;;;22461:56;22534:18;;67614:232:0;22382:176:1;67614:232:0;67913:4;;:16;;-1:-1:-1;;;67913:16:0;;;;;25933:25:1;;;67933:10:0;;-1:-1:-1;;;;;67913:4:0;;:12;;25906:18:1;;67913:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67913:30:0;;67891:115;;;;-1:-1:-1;;;67891:115:0;;19709:2:1;67891:115:0;;;19691:21:1;19748:2;19728:18;;;19721:30;19787:34;19767:18;;;19760:62;-1:-1:-1;;;19838:18:1;;;19831:33;19881:19;;67891:115:0;19681:225:1;67891:115:0;68043:42;68053:10;68065;68043:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68077:7;68043:9;:42::i;:::-;68124:4;;:41;;-1:-1:-1;;;68124:41:0;;;;;26406:25:1;;;26447:18;;;26440:34;;;-1:-1:-1;;;;;68124:4:0;;;;:29;;26379:18:1;;68124:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68183:31:0;;;26406:25:1;;;26462:2;26447:18;;26440:34;;;68183:31:0;;-1:-1:-1;26379:18:1;;-1:-1:-1;68183:31:0;;;;;;;67404:818;;;:::o;64080:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44240:561::-;44396:16;44471:3;:10;44452:8;:15;:29;44430:120;;;;-1:-1:-1;;;44430:120:0;;23588:2:1;44430:120:0;;;23570:21:1;23627:2;23607:18;;;23600:30;23666:34;23646:18;;;23639:62;-1:-1:-1;;;23717:18:1;;;23710:39;23766:19;;44430:120:0;23560:231:1;44430:120:0;44563:30;44610:8;:15;-1:-1:-1;;;;;44596:30:0;;;;;-1:-1:-1;;;44596:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44596:30:0;;44563:63;;44644:9;44639:122;44663:8;:15;44659:1;:19;44639:122;;;44719:30;44729:8;44738:1;44729:11;;;;;;-1:-1:-1;;;44729:11:0;;;;;;;;;;;;;;;44742:3;44746:1;44742:6;;;;;;-1:-1:-1;;;44742:6:0;;;;;;;;;;;;;;;44719:9;:30::i;:::-;44700:13;44714:1;44700:16;;;;;;-1:-1:-1;;;44700:16:0;;;;;;;;;;;;;;;;;;:49;44680:3;;;:::i;:::-;;;44639:122;;;-1:-1:-1;44780:13:0;44240:561;-1:-1:-1;;;44240:561:0:o;64935:102::-;3712:13;:11;:13::i;:::-;65009:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;64935:102:::0;:::o;63280:358::-;-1:-1:-1;;;;;63445:23:0;;2430:10;63445:23;;:66;;-1:-1:-1;63472:39:0;63489:7;2430:10;45133:218;:::i;63472:39::-;63423:162;;;;-1:-1:-1;;;63423:162:0;;;;;;;:::i;:::-;63598:32;63609:7;63618:3;63623:6;63598:10;:32::i;64050:21::-;;;;;;;:::i;4474:103::-;3712:13;:11;:13::i;:::-;4539:30:::1;4566:1;4539:18;:30::i;:::-;4474:103::o:0;65686:583::-;65763:1;65757:2;:7;;:18;;;;;65774:1;65768:2;:7;;65757:18;65749:68;;;;-1:-1:-1;;;65749:68:0;;17259:2:1;65749:68:0;;;17241:21:1;17298:2;17278:18;;;17271:30;17337:34;17317:18;;;17310:62;-1:-1:-1;;;17388:18:1;;;17381:35;17433:19;;65749:68:0;17231:227:1;65749:68:0;65925:4;;:23;;-1:-1:-1;;;65925:23:0;;;;;25933:25:1;;;65828:13:0;;;;;;-1:-1:-1;;;;;65925:4:0;;:15;;25906:18:1;;65925:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65899:49;;-1:-1:-1;65899:49:0;-1:-1:-1;65899:49:0;-1:-1:-1;65967:10:0;-1:-1:-1;;;;;65967:19:0;;;65959:67;;;;-1:-1:-1;;;65959:67:0;;25585:2:1;65959:67:0;;;25567:21:1;25624:2;25604:18;;;25597:30;25663:34;25643:18;;;25636:62;-1:-1:-1;;;25714:18:1;;;25707:33;25757:19;;65959:67:0;25557:225:1;65959:67:0;66046:9;66045:10;66037:50;;;;-1:-1:-1;;;66037:50:0;;20469:2:1;66037:50:0;;;20451:21:1;20508:2;20488:18;;;20481:30;20547:29;20527:18;;;20520:57;20594:18;;66037:50:0;20441:177:1;66037:50:0;66098:60;66115:10;66135;;;;;;;;;-1:-1:-1;;;;;66135:10:0;66148:2;66152:1;66098:60;;;;;;;;;;;;:16;:60::i;:::-;66169:10;;:53;;-1:-1:-1;;;66169:53:0;;66186:10;66169:53;;;14635:51:1;14702:18;;;14695:34;;;14745:18;;;14738:34;;;66211:9:0;;;14788:18:1;;;14781:50;-1:-1:-1;;;;;66169:10:0;;;;:16;;14607:19:1;;66169:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66233:4:0;;:28;;-1:-1:-1;;;66233:28:0;;;;;26137:25:1;;;66233:4:0;26178:18:1;;;26171:50;-1:-1:-1;;;;;66233:4:0;;;;-1:-1:-1;66233:14:0;;-1:-1:-1;26110:18:1;;66233:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65686:583;;;;;:::o;65045:100::-;3712:13;:11;:13::i;:::-;65116:10:::1;:21:::0;65045:100::o;65583:95::-;3712:13;:11;:13::i;:::-;65651:4:::1;:19:::0;;-1:-1:-1;;;;;;65651:19:0::1;-1:-1:-1::0;;;;;65651:19:0;;;::::1;::::0;;;::::1;::::0;;65583:95::o;44874:187::-;45001:52;2430:10;45034:8;45044;45001:18;:52::i;66836:123::-;3712:13;:11;:13::i;:::-;66916:10:::1;:35:::0;;-1:-1:-1;;;;;;66916:35:0::1;-1:-1:-1::0;;;;;66916:35:0;;;::::1;::::0;;;::::1;::::0;;66836:123::o;66516:312::-;66607:16;66641:20;66678:10;;-1:-1:-1;;;;;66664:25:0;;;;;-1:-1:-1;;;66664:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66664:25:0;;66641:48;;66705:9;66700:100;66724:10;;66720:1;:14;66700:100;;;66765:23;66775:5;66782;:1;66786;66782:5;:::i;66765:23::-;66756:3;66760:1;66756:6;;;;;;-1:-1:-1;;;66756:6:0;;;;;;;;;;;;;;;;;;:32;66736:3;;;:::i;:::-;;;66700:100;;;-1:-1:-1;66817:3:0;66516:312;-1:-1:-1;;66516:312:0:o;45423:406::-;-1:-1:-1;;;;;45631:20:0;;2430:10;45631:20;;:60;;-1:-1:-1;45655:36:0;45672:4;2430:10;45133:218;:::i;45655:36::-;45609:156;;;;-1:-1:-1;;;45609:156:0;;;;;;;:::i;:::-;45776:45;45794:4;45800:2;45804;45808:6;45816:4;45776:17;:45::i;4732:238::-;3712:13;:11;:13::i;:::-;-1:-1:-1;;;;;4835:22:0;::::1;4813:110;;;::::0;-1:-1:-1;;;4813:110:0;;17665:2:1;4813:110:0::1;::::0;::::1;17647:21:1::0;17704:2;17684:18;;;17677:30;17743:34;17723:18;;;17716:62;-1:-1:-1;;;17794:18:1;;;17787:36;17840:19;;4813:110:0::1;17637:228:1::0;4813:110:0::1;4934:28;4953:8;4934:18;:28::i;62946:326::-:0;-1:-1:-1;;;;;63086:23:0;;2430:10;63086:23;;:66;;-1:-1:-1;63113:39:0;63130:7;2430:10;45133:218;:::i;63113:39::-;63064:162;;;;-1:-1:-1;;;63064:162:0;;;;;;;:::i;:::-;63239:25;63245:7;63254:2;63258:5;63239;:25::i;42730:360::-;42877:4;-1:-1:-1;;;;;;42919:41:0;;-1:-1:-1;;;42919:41:0;;:110;;-1:-1:-1;;;;;;;42977:52:0;;-1:-1:-1;;;42977:52:0;42919:110;:163;;;-1:-1:-1;;;;;;;;;;40863:40:0;;;43046:36;40704:207;20724:716;20780:13;20831:14;20848:17;20859:5;20848:10;:17::i;:::-;20868:1;20848:21;20831:38;;20884:20;20918:6;-1:-1:-1;;;;;20907:18:0;;;;;-1:-1:-1;;;20907:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20907:18:0;-1:-1:-1;20884:41:0;-1:-1:-1;21049:28:0;;;21065:2;21049:28;21106:288;-1:-1:-1;;21138:5:0;-1:-1:-1;;;21275:2:0;21264:14;;21259:30;21138:5;21246:44;21336:2;21327:11;;;-1:-1:-1;21361:10:0;21357:21;;21373:5;;21357:21;21106:288;;50816:818;-1:-1:-1;;;;;50969:16:0;;50961:62;;;;-1:-1:-1;;;50961:62:0;;24407:2:1;50961:62:0;;;24389:21:1;24446:2;24426:18;;;24419:30;24485:34;24465:18;;;24458:62;-1:-1:-1;;;24536:18:1;;;24529:31;24577:19;;50961:62:0;24379:223:1;50961:62:0;2430:10;51036:16;51101:21;51119:2;51101:17;:21::i;:::-;51078:44;;51133:24;51160:25;51178:6;51160:17;:25::i;:::-;51133:52;;51198:66;51219:8;51237:1;51241:2;51245:3;51250:7;51259:4;51198:20;:66::i;:::-;51277:9;:13;;;;;;;;;;;-1:-1:-1;;;;;51277:17:0;;;;;;;;;:27;;51298:6;;51277:9;:27;;51298:6;;51277:27;:::i;:::-;;;;-1:-1:-1;;51320:52:0;;;26406:25:1;;;26462:2;26447:18;;26440:34;;;-1:-1:-1;;;;;51320:52:0;;;;51353:1;;51320:52;;;;;;26379:18:1;51320:52:0;;;;;;;51463:163;51508:8;51539:1;51556:2;51573;51590:6;51611:4;51463:30;:163::i;3991:132::-;3899:6;;-1:-1:-1;;;;;3899:6:0;2430:10;4055:23;4047:68;;;;-1:-1:-1;;;4047:68:0;;21640:2:1;4047:68:0;;;21622:21:1;;;21659:18;;;21652:30;21718:34;21698:18;;;21691:62;21770:18;;4047:68:0;21612:182:1;68674:229:0;-1:-1:-1;;;;;68761:26:0;;68739:120;;;;-1:-1:-1;;;68739:120:0;;22765:2:1;68739:120:0;;;22747:21:1;22804:2;22784:18;;;22777:30;22843:34;22823:18;;;22816:62;-1:-1:-1;;;22894:18:1;;;22887:42;22946:19;;68739:120:0;22737:234:1;68739:120:0;68870:10;:25;;-1:-1:-1;;;;;;68870:25:0;-1:-1:-1;;;;;68870:25:0;;;;;;;;;;68674:229::o;48177:1321::-;48418:7;:14;48404:3;:10;:28;48382:118;;;;-1:-1:-1;;;48382:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48519:16:0;;48511:66;;;;-1:-1:-1;;;48511:66:0;;;;;;;:::i;:::-;2430:10;48634:60;2430:10;48665:4;48671:2;48675:3;48680:7;48689:4;48634:20;:60::i;:::-;48712:9;48707:470;48731:3;:10;48727:1;:14;48707:470;;;48763:10;48776:3;48780:1;48776:6;;;;;;-1:-1:-1;;;48776:6:0;;;;;;;;;;;;;;;48763:19;;48797:14;48814:7;48822:1;48814:10;;;;;;-1:-1:-1;;;48814:10:0;;;;;;;;;;;;;;;;;;;;48841:19;48863:13;;;;;;;;;;-1:-1:-1;;;;;48863:19:0;;;;;;;;;;;;48814:10;;-1:-1:-1;48923:21:0;;;;48897:125;;;;-1:-1:-1;;;48897:125:0;;;;;;;:::i;:::-;49066:9;:13;;;;;;;;;;;-1:-1:-1;;;;;49066:19:0;;;;;;;;;;49088:20;;;49066:42;;49138:17;;;;;;;:27;;49088:20;;49066:9;49138:27;;49088:20;;49138:27;:::i;:::-;;;;;;;;48707:470;;;48743:3;;;;:::i;:::-;;;48707:470;;;;49224:2;-1:-1:-1;;;;;49194:47:0;49218:4;-1:-1:-1;;;;;49194:47:0;49208:8;-1:-1:-1;;;;;49194:47:0;;49228:3;49233:7;49194:47;;;;;;;:::i;:::-;;;;;;;;49326:164;49376:8;49399:4;49418:2;49435:3;49453:7;49475:4;49326:35;:164::i;:::-;48177:1321;;;;;;:::o;54332:1055::-;-1:-1:-1;;;;;54484:18:0;;54476:66;;;;-1:-1:-1;;;54476:66:0;;;;;;;:::i;:::-;54589:7;:14;54575:3;:10;:28;54553:118;;;;-1:-1:-1;;;54553:118:0;;;;;;;:::i;:::-;54684:16;2430:10;54684:31;;54728:66;54749:8;54759:4;54773:1;54777:3;54782:7;54728:66;;;;;;;;;;;;:20;:66::i;:::-;54812:9;54807:422;54831:3;:10;54827:1;:14;54807:422;;;54863:10;54876:3;54880:1;54876:6;;;;;;-1:-1:-1;;;54876:6:0;;;;;;;;;;;;;;;54863:19;;54897:14;54914:7;54922:1;54914:10;;;;;;-1:-1:-1;;;54914:10:0;;;;;;;;;;;;;;;;;;;;54941:19;54963:13;;;;;;;;;;-1:-1:-1;;;;;54963:19:0;;;;;;;;;;;;54914:10;;-1:-1:-1;55023:21:0;;;;54997:119;;;;-1:-1:-1;;;54997:119:0;;;;;;;:::i;:::-;55160:9;:13;;;;;;;;;;;-1:-1:-1;;;;;55160:19:0;;;;;;;;;;55182:20;;55160:42;;54843:3;;;;:::i;:::-;;;;54807:422;;;;55284:1;-1:-1:-1;;;;;55246:55:0;55270:4;-1:-1:-1;;;;;55246:55:0;55260:8;-1:-1:-1;;;;;55246:55:0;;55288:3;55293:7;55246:55;;;;;;;:::i;:::-;;;;;;;;55314:65;;;;;;;;;55358:1;55314:65;;;54332:1055;;;;:::o;5130:191::-;5223:6;;;-1:-1:-1;;;;;5240:17:0;;;-1:-1:-1;;;;;;5240:17:0;;;;;;;5273:40;;5223:6;;;5240:17;5223:6;;5273:40;;5204:16;;5273:40;5130:191;;:::o;55530:331::-;55685:8;-1:-1:-1;;;;;55676:17:0;:5;-1:-1:-1;;;;;55676:17:0;;;55668:71;;;;-1:-1:-1;;;55668:71:0;;23178:2:1;55668:71:0;;;23160:21:1;23217:2;23197:18;;;23190:30;23256:34;23236:18;;;23229:62;-1:-1:-1;;;23307:18:1;;;23300:39;23356:19;;55668:71:0;23150:231:1;55668:71:0;-1:-1:-1;;;;;55750:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;55750:46:0;;;;;;;;;;55812:41;;15718::1;;;55812::0;;15691:18:1;55812:41:0;;;;;;;55530:331;;;:::o;46808:1011::-;-1:-1:-1;;;;;46996:16:0;;46988:66;;;;-1:-1:-1;;;46988:66:0;;;;;;;:::i;:::-;2430:10;47067:16;47132:21;47150:2;47132:17;:21::i;:::-;47109:44;;47164:24;47191:25;47209:6;47191:17;:25::i;:::-;47164:52;;47229:60;47250:8;47260:4;47266:2;47270:3;47275:7;47284:4;47229:20;:60::i;:::-;47302:19;47324:13;;;;;;;;;;;-1:-1:-1;;;;;47324:19:0;;;;;;;;;;47376:21;;;;47354:113;;;;-1:-1:-1;;;47354:113:0;;;;;;;:::i;:::-;47503:9;:13;;;;;;;;;;;-1:-1:-1;;;;;47503:19:0;;;;;;;;;;47525:20;;;47503:42;;47567:17;;;;;;;:27;;47525:20;;47503:9;47567:27;;47525:20;;47567:27;:::i;:::-;;;;-1:-1:-1;;47612:46:0;;;26406:25:1;;;26462:2;26447:18;;26440:34;;;-1:-1:-1;;;;;47612:46:0;;;;;;;;;;;;;;26379:18:1;47612:46:0;;;;;;;47743:68;47774:8;47784:4;47790:2;47794;47798:6;47806:4;47743:30;:68::i;53274:808::-;-1:-1:-1;;;;;53401:18:0;;53393:66;;;;-1:-1:-1;;;53393:66:0;;;;;;;:::i;:::-;2430:10;53472:16;53537:21;53555:2;53537:17;:21::i;:::-;53514:44;;53569:24;53596:25;53614:6;53596:17;:25::i;:::-;53569:52;;53634:66;53655:8;53665:4;53679:1;53683:3;53688:7;53634:66;;;;;;;;;;;;:20;:66::i;:::-;53713:19;53735:13;;;;;;;;;;;-1:-1:-1;;;;;53735:19:0;;;;;;;;;;53773:21;;;;53765:70;;;;-1:-1:-1;;;53765:70:0;;;;;;;:::i;:::-;53871:9;:13;;;;;;;;;;;-1:-1:-1;;;;;53871:19:0;;;;;;;;;;;;53893:20;;;53871:42;;53942:54;;26406:25:1;;;26447:18;;;26440:34;;;53871:19:0;;53942:54;;;;;;26379:18:1;53942:54:0;;;;;;;54009:65;;;;;;;;;54053:1;54009:65;;;48177:1321;17456:922;17509:7;;-1:-1:-1;;;17587:15:0;;17583:102;;-1:-1:-1;;;17623:15:0;;;-1:-1:-1;17667:2:0;17657:12;17583:102;17712:6;17703:5;:15;17699:102;;17748:6;17739:15;;;-1:-1:-1;17783:2:0;17773:12;17699:102;17828:6;17819:5;:15;17815:102;;17864:6;17855:15;;;-1:-1:-1;17899:2:0;17889:12;17815:102;17944:5;17935;:14;17931:99;;17979:5;17970:14;;;-1:-1:-1;18013:1:0;18003:11;17931:99;18057:5;18048;:14;18044:99;;18092:5;18083:14;;;-1:-1:-1;18126:1:0;18116:11;18044:99;18170:5;18161;:14;18157:99;;18205:5;18196:14;;;-1:-1:-1;18239:1:0;18229:11;18157:99;18283:5;18274;:14;18270:66;;18319:1;18309:11;18364:6;17456:922;-1:-1:-1;;17456:922:0:o;60112:230::-;60264:16;;;60278:1;60264:16;;;;;;;;;60205;;60239:22;;60264:16;;;;;;;;;;;;-1:-1:-1;60264:16:0;60239:41;;60302:7;60291:5;60297:1;60291:8;;;;;;-1:-1:-1;;;60291:8:0;;;;;;;;;;;;;;;;;;:18;60329:5;60112:230;-1:-1:-1;;60112:230:0:o;68300:329::-;68555:66;68582:8;68592:4;68598:2;68602:3;68607:7;68616:4;68555:26;:66::i;58223:898::-;-1:-1:-1;;;;;58438:13:0;;24182:19;:23;58434:680;;58491:196;;-1:-1:-1;;;58491:196:0;;-1:-1:-1;;;;;58491:38:0;;;;;:196;;58552:8;;58583:4;;58610:2;;58635:6;;58664:4;;58491:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58491:196:0;;;;;;;;-1:-1:-1;;58491:196:0;;;;;;;;;;;;:::i;:::-;;;58470:633;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;58976:6;58969:14;;-1:-1:-1;;;58969:14:0;;;;;;;;:::i;58470:633::-;;;59025:62;;-1:-1:-1;;;59025:62:0;;24809:2:1;59025:62:0;;;24791:21:1;24848:2;24828:18;;;24821:30;24887:34;24867:18;;;24860:62;-1:-1:-1;;;24938:18:1;;;24931:50;24998:19;;59025:62:0;24781:242:1;58470:633:0;-1:-1:-1;;;;;;58750:55:0;;-1:-1:-1;;;58750:55:0;58746:154;;58830:50;;-1:-1:-1;;;58830:50:0;;;;;;;:::i;59129:975::-;-1:-1:-1;;;;;59369:13:0;;24182:19;:23;59365:732;;59422:203;;-1:-1:-1;;;59422:203:0;;-1:-1:-1;;;;;59422:43:0;;;;;:203;;59488:8;;59519:4;;59546:3;;59572:7;;59602:4;;59422:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59422:203:0;;;;;;;;-1:-1:-1;;59422:203:0;;;;;;;;;;;;:::i;:::-;;;59401:685;;;;:::i;:::-;-1:-1:-1;;;;;;59710:60:0;;-1:-1:-1;;;59710:60:0;59684:199;;59813:50;;-1:-1:-1;;;59813:50:0;;;;;;;:::i;61499:992::-;-1:-1:-1;;;;;61821:18:0;;61817:160;;61861:9;61856:110;61880:3;:10;61876:1;:14;61856:110;;;61940:7;61948:1;61940:10;;;;;;-1:-1:-1;;;61940:10:0;;;;;;;;;;;;;;;61916:12;:20;61929:3;61933:1;61929:6;;;;;;-1:-1:-1;;;61929:6:0;;;;;;;;;;;;;;;61916:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;61892:3:0;;-1:-1:-1;61892:3:0;;:::i;:::-;;;61856:110;;;;61817:160;-1:-1:-1;;;;;61993:16:0;;61989:495;;62031:9;62026:447;62050:3;:10;62046:1;:14;62026:447;;;62086:10;62099:3;62103:1;62099:6;;;;;;-1:-1:-1;;;62099:6:0;;;;;;;;;;;;;;;62086:19;;62124:14;62141:7;62149:1;62141:10;;;;;;-1:-1:-1;;;62141:10:0;;;;;;;;;;;;;;;62124:27;;62170:14;62187:12;:16;62200:2;62187:16;;;;;;;;;;;;62170:33;;62262:6;62252;:16;;62222:130;;;;-1:-1:-1;;;62222:130:0;;22001:2:1;62222:130:0;;;21983:21:1;22040:2;22020:18;;;22013:30;22079:34;22059:18;;;22052:62;-1:-1:-1;;;22130:18:1;;;22123:38;22178:19;;62222:130:0;21973:230:1;62222:130:0;62404:16;;;;:12;:16;;;;;;62423:15;;62404:34;;62062:3;;;:::i;:::-;;;62026:447;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:2;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:2;;;369:1;366;359:12;328:2;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;88:394;;;;;:::o;487:755::-;541:5;594:3;587:4;579:6;575:17;571:27;561:2;;616:5;609;602:20;561:2;656:6;643:20;682:4;705:43;745:2;705:43;:::i;:::-;777:2;771:9;789:31;817:2;809:6;789:31;:::i;:::-;855:18;;;889:15;;;;-1:-1:-1;924:15:1;;;974:1;970:10;;;958:23;;954:32;;951:41;-1:-1:-1;948:2:1;;;1009:5;1002;995:20;948:2;1035:5;1049:163;1063:2;1060:1;1057:9;1049:163;;;1120:17;;1108:30;;1158:12;;;;1190;;;;1081:1;1074:9;1049:163;;;-1:-1:-1;1230:6:1;;551:691;-1:-1:-1;;;;;;;551:691:1:o;1247:228::-;1289:5;1342:3;1335:4;1327:6;1323:17;1319:27;1309:2;;1364:5;1357;1350:20;1309:2;1390:79;1465:3;1456:6;1443:20;1436:4;1428:6;1424:17;1390:79;:::i;:::-;1381:88;1299:176;-1:-1:-1;;;1299:176:1:o;1480:257::-;1539:6;1592:2;1580:9;1571:7;1567:23;1563:32;1560:2;;;1613:6;1605;1598:22;1560:2;1657:9;1644:23;1676:31;1701:5;1676:31;:::i;1742:261::-;1812:6;1865:2;1853:9;1844:7;1840:23;1836:32;1833:2;;;1886:6;1878;1871:22;1833:2;1923:9;1917:16;1942:31;1967:5;1942:31;:::i;2008:398::-;2076:6;2084;2137:2;2125:9;2116:7;2112:23;2108:32;2105:2;;;2158:6;2150;2143:22;2105:2;2202:9;2189:23;2221:31;2246:5;2221:31;:::i;:::-;2271:5;-1:-1:-1;2328:2:1;2313:18;;2300:32;2341:33;2300:32;2341:33;:::i;:::-;2393:7;2383:17;;;2095:311;;;;;:::o;2411:1111::-;2565:6;2573;2581;2589;2597;2650:3;2638:9;2629:7;2625:23;2621:33;2618:2;;;2672:6;2664;2657:22;2618:2;2716:9;2703:23;2735:31;2760:5;2735:31;:::i;:::-;2785:5;-1:-1:-1;2842:2:1;2827:18;;2814:32;2855:33;2814:32;2855:33;:::i;:::-;2907:7;-1:-1:-1;2965:2:1;2950:18;;2937:32;-1:-1:-1;;;;;3018:14:1;;;3015:2;;;3050:6;3042;3035:22;3015:2;3078:61;3131:7;3122:6;3111:9;3107:22;3078:61;:::i;:::-;3068:71;;3192:2;3181:9;3177:18;3164:32;3148:48;;3221:2;3211:8;3208:16;3205:2;;;3242:6;3234;3227:22;3205:2;3270:63;3325:7;3314:8;3303:9;3299:24;3270:63;:::i;:::-;3260:73;;3386:3;3375:9;3371:19;3358:33;3342:49;;3416:2;3406:8;3403:16;3400:2;;;3437:6;3429;3422:22;3400:2;;3465:51;3508:7;3497:8;3486:9;3482:24;3465:51;:::i;:::-;3455:61;;;2608:914;;;;;;;;:::o;3527:754::-;3631:6;3639;3647;3655;3663;3716:3;3704:9;3695:7;3691:23;3687:33;3684:2;;;3738:6;3730;3723:22;3684:2;3782:9;3769:23;3801:31;3826:5;3801:31;:::i;:::-;3851:5;-1:-1:-1;3908:2:1;3893:18;;3880:32;3921:33;3880:32;3921:33;:::i;:::-;3973:7;-1:-1:-1;4027:2:1;4012:18;;3999:32;;-1:-1:-1;4078:2:1;4063:18;;4050:32;;-1:-1:-1;4133:3:1;4118:19;;4105:33;-1:-1:-1;;;;;4150:30:1;;4147:2;;;4198:6;4190;4183:22;4147:2;4226:49;4267:7;4258:6;4247:9;4243:22;4226:49;:::i;4286:760::-;4413:6;4421;4429;4482:2;4470:9;4461:7;4457:23;4453:32;4450:2;;;4503:6;4495;4488:22;4450:2;4547:9;4534:23;4566:31;4591:5;4566:31;:::i;:::-;4616:5;-1:-1:-1;4672:2:1;4657:18;;4644:32;-1:-1:-1;;;;;4725:14:1;;;4722:2;;;4757:6;4749;4742:22;4722:2;4785:61;4838:7;4829:6;4818:9;4814:22;4785:61;:::i;:::-;4775:71;;4899:2;4888:9;4884:18;4871:32;4855:48;;4928:2;4918:8;4915:16;4912:2;;;4949:6;4941;4934:22;4912:2;;4977:63;5032:7;5021:8;5010:9;5006:24;4977:63;:::i;:::-;4967:73;;;4440:606;;;;;:::o;5051:392::-;5116:6;5124;5177:2;5165:9;5156:7;5152:23;5148:32;5145:2;;;5198:6;5190;5183:22;5145:2;5242:9;5229:23;5261:31;5286:5;5261:31;:::i;:::-;5311:5;-1:-1:-1;5368:2:1;5353:18;;5340:32;5381:30;5340:32;5381:30;:::i;5448:450::-;5533:6;5541;5549;5602:2;5590:9;5581:7;5577:23;5573:32;5570:2;;;5623:6;5615;5608:22;5570:2;5660:9;5654:16;5679:31;5704:5;5679:31;:::i;:::-;5779:2;5764:18;;5758:25;5729:5;;-1:-1:-1;5792:30:1;5758:25;5792:30;:::i;:::-;5841:7;5831:17;;;5888:2;5877:9;5873:18;5867:25;5857:35;;5560:338;;;;;:::o;5903:325::-;5971:6;5979;6032:2;6020:9;6011:7;6007:23;6003:32;6000:2;;;6053:6;6045;6038:22;6000:2;6097:9;6084:23;6116:31;6141:5;6116:31;:::i;:::-;6166:5;6218:2;6203:18;;;;6190:32;;-1:-1:-1;;;5990:238:1:o;6233:393::-;6310:6;6318;6326;6379:2;6367:9;6358:7;6354:23;6350:32;6347:2;;;6400:6;6392;6385:22;6347:2;6444:9;6431:23;6463:31;6488:5;6463:31;:::i;:::-;6513:5;6565:2;6550:18;;6537:32;;-1:-1:-1;6616:2:1;6601:18;;;6588:32;;6337:289;-1:-1:-1;;;6337:289:1:o;6631:1343::-;6749:6;6757;6810:2;6798:9;6789:7;6785:23;6781:32;6778:2;;;6831:6;6823;6816:22;6778:2;6876:9;6863:23;-1:-1:-1;;;;;6946:2:1;6938:6;6935:14;6932:2;;;6967:6;6959;6952:22;6932:2;7010:6;6999:9;6995:22;6985:32;;7055:7;7048:4;7044:2;7040:13;7036:27;7026:2;;7082:6;7074;7067:22;7026:2;7123;7110:16;7145:4;7168:43;7208:2;7168:43;:::i;:::-;7240:2;7234:9;7252:31;7280:2;7272:6;7252:31;:::i;:::-;7318:18;;;7352:15;;;;-1:-1:-1;7387:11:1;;;7429:1;7425:10;;;7417:19;;7413:28;;7410:41;-1:-1:-1;7407:2:1;;;7469:6;7461;7454:22;7407:2;7496:6;7487:15;;7511:238;7525:2;7522:1;7519:9;7511:238;;;7596:3;7583:17;7613:31;7638:5;7613:31;:::i;:::-;7657:18;;7543:1;7536:9;;;;;7695:12;;;;7727;;7511:238;;;-1:-1:-1;7768:6:1;-1:-1:-1;;7812:18:1;;7799:32;;-1:-1:-1;;7843:16:1;;;7840:2;;;7877:6;7869;7862:22;7840:2;;7905:63;7960:7;7949:8;7938:9;7934:24;7905:63;:::i;:::-;7895:73;;;6768:1206;;;;;:::o;7979:999::-;8074:6;8105:2;8148;8136:9;8127:7;8123:23;8119:32;8116:2;;;8169:6;8161;8154:22;8116:2;8207:9;8201:16;-1:-1:-1;;;;;8232:6:1;8229:30;8226:2;;;8277:6;8269;8262:22;8226:2;8305:22;;8358:4;8350:13;;8346:27;-1:-1:-1;8336:2:1;;8392:6;8384;8377:22;8336:2;8426;8420:9;8448:43;8488:2;8448:43;:::i;:::-;8520:2;8514:9;8532:31;8560:2;8552:6;8532:31;:::i;:::-;8598:18;;;8632:15;;;;-1:-1:-1;8667:11:1;;;8709:1;8705:10;;;8697:19;;8693:28;;8690:41;-1:-1:-1;8687:2:1;;;8749:6;8741;8734:22;8687:2;8776:6;8767:15;;8791:156;8805:2;8802:1;8799:9;8791:156;;;8862:10;;8850:23;;8823:1;8816:9;;;;;8893:12;;;;8925;;8791:156;;;-1:-1:-1;8966:6:1;8085:893;-1:-1:-1;;;;;;;8085:893:1:o;8983:255::-;9041:6;9094:2;9082:9;9073:7;9069:23;9065:32;9062:2;;;9115:6;9107;9100:22;9062:2;9159:9;9146:23;9178:30;9202:5;9178:30;:::i;9243:259::-;9312:6;9365:2;9353:9;9344:7;9340:23;9336:32;9333:2;;;9386:6;9378;9371:22;9333:2;9423:9;9417:16;9442:30;9466:5;9442:30;:::i;9507:480::-;9576:6;9629:2;9617:9;9608:7;9604:23;9600:32;9597:2;;;9650:6;9642;9635:22;9597:2;9695:9;9682:23;-1:-1:-1;;;;;9720:6:1;9717:30;9714:2;;;9765:6;9757;9750:22;9714:2;9793:22;;9846:4;9838:13;;9834:27;-1:-1:-1;9824:2:1;;9880:6;9872;9865:22;9824:2;9908:73;9973:7;9968:2;9955:16;9950:2;9946;9942:11;9908:73;:::i;:::-;9898:83;9587:400;-1:-1:-1;;;;9587:400:1:o;9992:190::-;10051:6;10104:2;10092:9;10083:7;10079:23;10075:32;10072:2;;;10125:6;10117;10110:22;10072:2;-1:-1:-1;10153:23:1;;10062:120;-1:-1:-1;10062:120:1:o;10187:258::-;10255:6;10263;10316:2;10304:9;10295:7;10291:23;10287:32;10284:2;;;10337:6;10329;10322:22;10284:2;-1:-1:-1;;10365:23:1;;;10435:2;10420:18;;;10407:32;;-1:-1:-1;10274:171:1:o;10450:437::-;10503:3;10541:5;10535:12;10568:6;10563:3;10556:19;10594:4;10623:2;10618:3;10614:12;10607:19;;10660:2;10653:5;10649:14;10681:3;10693:169;10707:6;10704:1;10701:13;10693:169;;;10768:13;;10756:26;;10802:12;;;;10837:15;;;;10729:1;10722:9;10693:169;;;-1:-1:-1;10878:3:1;;10511:376;-1:-1:-1;;;;;10511:376:1:o;10892:257::-;10933:3;10971:5;10965:12;10998:6;10993:3;10986:19;11014:63;11070:6;11063:4;11058:3;11054:14;11047:4;11040:5;11036:16;11014:63;:::i;:::-;11131:2;11110:15;-1:-1:-1;;11106:29:1;11097:39;;;;11138:4;11093:50;;10941:208;-1:-1:-1;;10941:208:1:o;11154:185::-;11196:3;11234:5;11228:12;11249:52;11294:6;11289:3;11282:4;11275:5;11271:16;11249:52;:::i;:::-;11317:16;;;;;11204:135;-1:-1:-1;;11204:135:1:o;11344:1178::-;11520:3;11549;11584:6;11578:13;11614:3;11636:1;11664:9;11660:2;11656:18;11646:28;;11724:2;11713:9;11709:18;11746;11736:2;;11790:4;11782:6;11778:17;11768:27;;11736:2;11816;11864;11856:6;11853:14;11833:18;11830:38;11827:2;;;-1:-1:-1;;;11891:33:1;;11947:4;11944:1;11937:15;11977:4;11898:3;11965:17;11827:2;12008:18;12035:104;;;;12153:1;12148:322;;;;12001:469;;12035:104;-1:-1:-1;;12068:24:1;;12056:37;;12113:16;;;;-1:-1:-1;12035:104:1;;12148:322;26720:4;26739:17;;;26789:4;26773:21;;12243:3;12259:165;12273:6;12270:1;12267:13;12259:165;;;12351:14;;12338:11;;;12331:35;12394:16;;;;12288:10;;12259:165;;;12263:3;;12453:6;12448:3;12444:16;12437:23;;12001:469;;;;;;;12486:30;12512:3;12504:6;12486:30;:::i;:::-;12479:37;11528:994;-1:-1:-1;;;;;11528:994:1:o;12735:826::-;-1:-1:-1;;;;;13132:15:1;;;13114:34;;13184:15;;13179:2;13164:18;;13157:43;13094:3;13231:2;13216:18;;13209:31;;;13057:4;;13263:57;;13300:19;;13292:6;13263:57;:::i;:::-;13368:9;13360:6;13356:22;13351:2;13340:9;13336:18;13329:50;13402:44;13439:6;13431;13402:44;:::i;:::-;13388:58;;13495:9;13487:6;13483:22;13477:3;13466:9;13462:19;13455:51;13523:32;13548:6;13540;13523:32;:::i;:::-;13515:40;13066:495;-1:-1:-1;;;;;;;;13066:495:1:o;13566:560::-;-1:-1:-1;;;;;13863:15:1;;;13845:34;;13915:15;;13910:2;13895:18;;13888:43;13962:2;13947:18;;13940:34;;;14005:2;13990:18;;13983:34;;;13825:3;14048;14033:19;;14026:32;;;13788:4;;14075:45;;14100:19;;14092:6;14075:45;:::i;:::-;14067:53;13797:329;-1:-1:-1;;;;;;;13797:329:1:o;14842:261::-;15021:2;15010:9;15003:21;14984:4;15041:56;15093:2;15082:9;15078:18;15070:6;15041:56;:::i;15108:465::-;15365:2;15354:9;15347:21;15328:4;15391:56;15443:2;15432:9;15428:18;15420:6;15391:56;:::i;:::-;15495:9;15487:6;15483:22;15478:2;15467:9;15463:18;15456:50;15523:44;15560:6;15552;15523:44;:::i;16424:219::-;16573:2;16562:9;16555:21;16536:4;16593:44;16633:2;16622:9;16618:18;16610:6;16593:44;:::i;16648:404::-;16850:2;16832:21;;;16889:2;16869:18;;;16862:30;16928:34;16923:2;16908:18;;16901:62;-1:-1:-1;;;16994:2:1;16979:18;;16972:38;17042:3;17027:19;;16822:230::o;17870:400::-;18072:2;18054:21;;;18111:2;18091:18;;;18084:30;18150:34;18145:2;18130:18;;18123:62;-1:-1:-1;;;18216:2:1;18201:18;;18194:34;18260:3;18245:19;;18044:226::o;18686:410::-;18888:2;18870:21;;;18927:2;18907:18;;;18900:30;18966:34;18961:2;18946:18;;18939:62;-1:-1:-1;;;19032:2:1;19017:18;;19010:44;19086:3;19071:19;;18860:236::o;19101:401::-;19303:2;19285:21;;;19342:2;19322:18;;;19315:30;19381:34;19376:2;19361:18;;19354:62;-1:-1:-1;;;19447:2:1;19432:18;;19425:35;19492:3;19477:19;;19275:227::o;20623:399::-;20825:2;20807:21;;;20864:2;20844:18;;;20837:30;20903:34;20898:2;20883:18;;20876:62;-1:-1:-1;;;20969:2:1;20954:18;;20947:33;21012:3;20997:19;;20797:225::o;21027:406::-;21229:2;21211:21;;;21268:2;21248:18;;;21241:30;21307:34;21302:2;21287:18;;21280:62;-1:-1:-1;;;21373:2:1;21358:18;;21351:40;21423:3;21408:19;;21201:232::o;23796:404::-;23998:2;23980:21;;;24037:2;24017:18;;;24010:30;24076:34;24071:2;24056:18;;24049:62;-1:-1:-1;;;24142:2:1;24127:18;;24120:38;24190:3;24175:19;;23970:230::o;26485:183::-;26545:4;-1:-1:-1;;;;;26570:6:1;26567:30;26564:2;;;26600:18;;:::i;:::-;-1:-1:-1;26645:1:1;26641:14;26657:4;26637:25;;26554:114::o;26805:128::-;26845:3;26876:1;26872:6;26869:1;26866:13;26863:2;;;26882:18;;:::i;:::-;-1:-1:-1;26918:9:1;;26853:80::o;26938:217::-;26978:1;27004;26994:2;;-1:-1:-1;;;27029:31:1;;27083:4;27080:1;27073:15;27111:4;27036:1;27101:15;26994:2;-1:-1:-1;27140:9:1;;26984:171::o;27160:168::-;27200:7;27266:1;27262;27258:6;27254:14;27251:1;27248:21;27243:1;27236:9;27229:17;27225:45;27222:2;;;27273:18;;:::i;:::-;-1:-1:-1;27313:9:1;;27212:116::o;27333:258::-;27405:1;27415:113;27429:6;27426:1;27423:13;27415:113;;;27505:11;;;27499:18;27486:11;;;27479:39;27451:2;27444:10;27415:113;;;27546:6;27543:1;27540:13;27537:2;;;-1:-1:-1;;27581:1:1;27563:16;;27556:27;27386:205::o;27596:380::-;27675:1;27671:12;;;;27718;;;27739:2;;27793:4;27785:6;27781:17;27771:27;;27739:2;27846;27838:6;27835:14;27815:18;27812:38;27809:2;;;27892:10;27887:3;27883:20;27880:1;27873:31;27927:4;27924:1;27917:15;27955:4;27952:1;27945:15;27809:2;;27651:325;;;:::o;27981:249::-;28091:2;28072:13;;-1:-1:-1;;28068:27:1;28056:40;;-1:-1:-1;;;;;28111:34:1;;28147:22;;;28108:62;28105:2;;;28173:18;;:::i;:::-;28209:2;28202:22;-1:-1:-1;;28028:202:1:o;28235:135::-;28274:3;-1:-1:-1;;28295:17:1;;28292:2;;;28315:18;;:::i;:::-;-1:-1:-1;28362:1:1;28351:13;;28282:88::o;28375:127::-;28436:10;28431:3;28427:20;28424:1;28417:31;28467:4;28464:1;28457:15;28491:4;28488:1;28481:15;28507:127;28568:10;28563:3;28559:20;28556:1;28549:31;28599:4;28596:1;28589:15;28623:4;28620:1;28613:15;28639:185;28674:3;28716:1;28698:16;28695:23;28692:2;;;28766:1;28761:3;28756;28741:27;28797:10;28792:3;28788:20;28692:2;28682:142;:::o;28829:671::-;28868:3;28910:4;28892:16;28889:26;28886:2;;;28876:624;:::o;28886:2::-;28952;28946:9;-1:-1:-1;;29017:16:1;29013:25;;29010:1;28946:9;28989:50;29068:4;29062:11;29092:16;-1:-1:-1;;;;;29198:2:1;29191:4;29183:6;29179:17;29176:25;29171:2;29163:6;29160:14;29157:45;29154:2;;;29205:5;;;;;28876:624;:::o;29154:2::-;29242:6;29236:4;29232:17;29221:28;;29278:3;29272:10;29305:2;29297:6;29294:14;29291:2;;;29311:5;;;;;;28876:624;:::o;29291:2::-;29395;29376:16;29370:4;29366:27;29362:36;29355:4;29346:6;29341:3;29337:16;29333:27;29330:69;29327:2;;;29402:5;;;;;;28876:624;:::o;29327:2::-;29418:57;29469:4;29460:6;29452;29448:19;29444:30;29438:4;29418:57;:::i;:::-;-1:-1:-1;29491:3:1;;28876:624;-1:-1:-1;;;;;28876:624:1:o;29505:131::-;-1:-1:-1;;;;;29580:31:1;;29570:42;;29560:2;;29626:1;29623;29616:12;29641:118;29727:5;29720:13;29713:21;29706:5;29703:32;29693:2;;29749:1;29746;29739:12;29764:131;-1:-1:-1;;;;;;29838:32:1;;29828:43;;29818:2;;29885:1;29882;29875:12
Swarm Source
ipfs://fbee47e057b879ac46c417aff383390dbbbde930473b0afa8658d3a9ea03fa79