Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 16942156 | 518 days ago | IN | 0 ETH | 0.09766673 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RenovaItem
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-30 */ interface IWormholeStructs { struct Provider { uint16 chainId; uint16 governanceChainId; bytes32 governanceContract; } struct GuardianSet { address[] keys; uint32 expirationTime; } struct Signature { bytes32 r; bytes32 s; uint8 v; uint8 guardianIndex; } struct VM { uint8 version; uint32 timestamp; uint32 nonce; uint16 emitterChainId; bytes32 emitterAddress; uint64 sequence; uint8 consistencyLevel; bytes payload; uint32 guardianSetIndex; Signature[] signatures; bytes32 hash; } } interface IWormhole is IWormholeStructs { event LogMessagePublished( address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel ); function publishMessage( uint32 nonce, bytes memory payload, uint8 consistencyLevel ) external payable returns (uint64 sequence); function parseAndVerifyVM( bytes calldata encodedVM ) external view returns ( IWormholeStructs.VM memory vm, bool valid, string memory reason ); function verifyVM( IWormholeStructs.VM memory vm ) external view returns (bool valid, string memory reason); function verifySignatures( bytes32 hash, IWormholeStructs.Signature[] memory signatures, IWormholeStructs.GuardianSet memory guardianSet ) external pure returns (bool valid, string memory reason); function parseVM( bytes memory encodedVM ) external pure returns (IWormholeStructs.VM memory vm); function getGuardianSet( uint32 index ) external view returns (IWormholeStructs.GuardianSet memory); function getCurrentGuardianSetIndex() external view returns (uint32); function getGuardianSetExpiry() external view returns (uint32); function governanceActionIsConsumed( bytes32 hash ) external view returns (bool); function isInitialized(address impl) external view returns (bool); function chainId() external view returns (uint16); function governanceChainId() external view returns (uint16); function governanceContract() external view returns (bytes32); function messageFee() external view returns (uint256); } interface IWormholeBaseUpgradeable { /// @notice Emitted when the Wormhole Endpoin is updated. /// @param newWormhole The new Wormhole Endpoin address. /// @param oldWormhole The previous Wormhole Endpoin address. event UpdateWormhole(address newWormhole, address oldWormhole); /// @notice Emitted when the Wormhole Chain ID is updated. /// @param newWormholeChainId The new Wormhole Chain ID. /// @param oldWormholeChainId The previous Wormhole Chain ID. event UpdateWormholeChainId( uint16 newWormholeChainId, uint16 oldWormholeChainId ); /// @notice Emitted when the Wormhle Consistency Level is updated. /// @param newConsistencyLevel The new Consistency Level. /// @param oldConsistencyLevel The previous consistency Level. event UpdateWormholeConsistencyLevel( uint8 newConsistencyLevel, uint8 oldConsistencyLevel ); /// @notice Emitted when a trusted Wormhole x-chain remote is updated. /// @param wormholeChainId The Wormhole Chain ID for which the remote is updated. /// @param remote The remote address, 0-padded to 32 bytes. event UpdateWormholeRemote(uint16 wormholeChainId, bytes32 remote); /// @notice Emitted when a Wormhole message has been sent (published). /// @param sequence The Sequence Number of the message. event WormholeSend(uint64 sequence); /// @notice Emitted when a Wormhole message has been received (relayed). /// @param emitterChainId The source Wormhole Chain ID. /// @param emitterAddress The address of the emitting contract, 0-padded to 32 bytes. /// @param sequence The Sequence Number of the message. event WormholeReceive( uint16 emitterChainId, bytes32 emitterAddress, uint64 sequence ); /// @notice Updates the Wormhole Endpoint address. /// @param wormhole The address of the new Wormhole endpoint. /// @dev This also sets a new Wormhole Chain ID. function updateWormhole(address wormhole) external; /// @notice Updates the Wormhole Consistency Level. /// @param wormholeConsistencyLevel The new Wormhole Consistency Level. function updateWormholeConsistencyLevel( uint8 wormholeConsistencyLevel ) external; /// @notice Updates the trusted Wormhole x-chain remote for a particular Wormhole Chain ID. /// @param wormholeChainId The Wormhole Chain ID to update the trusted remote for. /// @param authorizedRemote The trusted remote address, 0-padded to 32 bytes. function updateWormholeRemote( uint16 wormholeChainId, bytes32 authorizedRemote ) external; /// @notice Allows the owner to withdraw fees collected for the Relayer. function withdrawRelayerFees() external; } library MathUpgradeable { 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); } } } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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 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); } } } interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } library StringsUpgradeable { 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 = MathUpgradeable.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, MathUpgradeable.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); } } abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721Upgradeable.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; } interface IERC2981Upgradeable is IERC165Upgradeable { /** * @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); } abstract contract ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { function __ERC2981_init() internal onlyInitializing { } function __ERC2981_init_unchained() internal onlyInitializing { } struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981Upgradeable */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } abstract contract ERC721RoyaltyUpgradeable is Initializable, ERC2981Upgradeable, ERC721Upgradeable { function __ERC721Royalty_init() internal onlyInitializing { } function __ERC721Royalty_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable, ERC2981Upgradeable) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } interface IERC4906Upgradeable is IERC165Upgradeable, IERC721Upgradeable { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } abstract contract WormholeBaseUpgradeable is IWormholeBaseUpgradeable, OwnableUpgradeable { using AddressUpgradeable for address payable; address private _wormhole; uint8 private _wormholeConsistencyLevel; mapping(bytes32 => bool) private _processedMessageHashes; mapping(uint16 => bytes32) internal _wormholeRemotes; uint16 internal _wormholeChainId; /// @dev Reserved for future upgrades. uint256[16] private __gap; /// @notice Base initializer. /// @param wormhole The address of the Wormhole endpoint. /// @param wormholeConsistencyLevel The Wormhole consistency level. function __WormholeBaseUpgradeable_init( address wormhole, uint8 wormholeConsistencyLevel ) internal { __Ownable_init(); _updateWormhole(wormhole); _updateWormholeConsistencyLevel(wormholeConsistencyLevel); } /// @inheritdoc IWormholeBaseUpgradeable function updateWormhole(address wormhole) external override onlyOwner { _updateWormhole(wormhole); } /// @inheritdoc IWormholeBaseUpgradeable function updateWormholeConsistencyLevel( uint8 wormholeConsistencyLevel ) external override onlyOwner { _updateWormholeConsistencyLevel(wormholeConsistencyLevel); } /// @inheritdoc IWormholeBaseUpgradeable function updateWormholeRemote( uint16 wormholeChainId, bytes32 authorizedRemote ) external override onlyOwner { require( wormholeChainId != 0, 'WormholeBaseUpgradeable::updateWormholeRemote wormholeChainId cannot be 0.' ); require( authorizedRemote != bytes32(0), 'WormholeBaseUpgradeable::updateWormholeRemote Remote cannot be 0.' ); _wormholeRemotes[wormholeChainId] = authorizedRemote; emit UpdateWormholeRemote(wormholeChainId, authorizedRemote); } /// @inheritdoc IWormholeBaseUpgradeable function withdrawRelayerFees() external override onlyOwner { require( address(this).balance > 0, 'WormholeBaseUpgradeable::withdrawRelayerFees No fees collected.' ); payable(msg.sender).sendValue(address(this).balance); } /// @notice Sends a Wormhole message. /// @param nonce The nonce of the message. /// @param payload The payload to send. function _wormholeSend( uint32 nonce, bytes memory payload, uint256 wormholeMessageFee ) internal virtual returns (uint64 sequence) { require( _wormhole != address(0), 'WormholeBaseUpgradeable::_wormholeSend Wormhole is not defined.' ); require( _wormholeConsistencyLevel > 0, 'WormholeBaseUpgradeable:: _wormholeSend Wormhole consistency level is not defined.' ); sequence = IWormhole(_wormhole).publishMessage{ value: wormholeMessageFee }(nonce, payload, _wormholeConsistencyLevel); emit WormholeSend(sequence); } /// @notice Called when a Wormhole message is received. /// @param encodedVM The Wormhole VAA. function _wormholeReceive( bytes memory encodedVM ) internal virtual returns (uint16 emitterChainId, bytes memory payload) { require( _wormhole != address(0), 'WormholeBaseUpgradeable::_wormholeReceive Wormhole is not defined.' ); require( _wormholeChainId > 0, 'WormholeBaseUpgradeable::_wormholeReceive Wormhole Chain ID is not defined.' ); ( IWormholeStructs.VM memory vm, bool valid, string memory reason ) = IWormhole(_wormhole).parseAndVerifyVM(encodedVM); require(valid, reason); require( !_processedMessageHashes[vm.hash], 'WormholeBaseUpgradeable::_wormholeReceive Message already processed.' ); _processedMessageHashes[vm.hash] = true; emitterChainId = vm.emitterChainId; require( _wormholeRemotes[emitterChainId] != bytes32(0), 'WormholeBaseUpgradeable::_wormholeReceive Wormhole remote not defined on emitted chain.' ); require( _wormholeRemotes[emitterChainId] == vm.emitterAddress, 'WormholeBaseUpgradeable::_wormholeReceive Emitter not authorized.' ); emit WormholeReceive(vm.emitterChainId, vm.emitterAddress, vm.sequence); payload = vm.payload; } /// @notice Updates The wormhole endpoint. /// @param wormhole The new Wormhole endpoint. function _updateWormhole(address wormhole) internal { require( wormhole != address(0), 'WormholeBaseUpgradeable::_updateWormhole Address cannot be 0.' ); emit UpdateWormhole(wormhole, _wormhole); _wormhole = wormhole; uint16 wormholeChainId = IWormhole(_wormhole).chainId(); emit UpdateWormholeChainId(wormholeChainId, _wormholeChainId); _wormholeChainId = wormholeChainId; } /// @notice Updates the Wormhole consistency level. /// @param wormholeConsistencyLevel The new consistency level. function _updateWormholeConsistencyLevel( uint8 wormholeConsistencyLevel ) internal { require( wormholeConsistencyLevel > 0, 'WormholeBaseUpgradeable::updateWormholeConsistencyLevel Consistency level cannot be set to 0.' ); emit UpdateWormholeConsistencyLevel( wormholeConsistencyLevel, _wormholeConsistencyLevel ); _wormholeConsistencyLevel = wormholeConsistencyLevel; } } interface IRenovaItemBase is IERC4906Upgradeable { /// @notice Emitted when an item is minted. /// @param player The player who owns the item. /// @param tokenId The token ID. /// @param hashverseItemId The Hashverse Item ID. event Mint( address indexed player, uint256 tokenId, uint256 hashverseItemId ); /// @notice Emitted when the Custom Metadata URI is updated. /// @param uri The new URI. event UpdateCustomURI(string uri); /// @notice Emitted when an item is bridged out of the current chain. /// @param player The player. /// @param tokenId The Token ID. /// @param hashverseItemId The Hashverse Item ID. /// @param dstWormholeChainId The Wormhole Chain ID of the chain the item is being bridged to. /// @param sequence The Wormhole sequence number. event XChainBridgeOut( address indexed player, uint256 tokenId, uint256 hashverseItemId, uint16 dstWormholeChainId, uint256 sequence, uint256 relayerFee ); /// @notice Emitted when an item was bridged into the current chain. /// @param player The player. /// @param tokenId The Token ID. /// @param hashverseItemId The Hashverse Item ID. /// @param srcWormholeChainId The Wormhole Chain ID of the chain the item is being bridged from. event XChainBridgeIn( address indexed player, uint256 tokenId, uint256 hashverseItemId, uint16 srcWormholeChainId ); /// @notice Bridges an item into the chain via Wormhole. /// @param vaa The Wormhole VAA. function wormholeBridgeIn(bytes memory vaa) external; /// @notice Bridges an item out of the chain via Wormhole. /// @param tokenId The Token ID. /// @param dstWormholeChainId The Wormhole Chain ID of the chain the item is being bridged to. function wormholeBridgeOut( uint256 tokenId, uint16 dstWormholeChainId, uint256 wormholeMessageFee ) external payable; /// @notice Sets the default royalty for the Item collection. /// @param receiver The receiver of royalties. /// @param feeNumerator The numerator of the fraction denoting the royalty percentage. function setDefaultRoyalty(address receiver, uint96 feeNumerator) external; /// @notice Sets a custom base URI for the token metadata. /// @param customBaseURI The new Custom URI. function setCustomBaseURI(string memory customBaseURI) external; /// @notice Emits a refresh metadata event for a token. /// @param tokenId The ID of the token. function refreshMetadata(uint256 tokenId) external; /// @notice Emits a refresh metadata event for all tokens. function refreshAllMetadata() external; } abstract contract RenovaItemBase is IRenovaItemBase, WormholeBaseUpgradeable, ERC721RoyaltyUpgradeable { string private _customBaseURI; mapping(uint256 => uint256) private _bridgeNonces; mapping(uint256 => uint256) internal _hashverseItemIds; /// @dev Reserved for future upgrades. uint256[16] private __gap; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } /// @notice Initializer function. /// @param wormhole The Wormhole endpoint address. /// @param wormholeConsistencyLevel The Wormhole consistency level. function __RenovaItemBase_init( address wormhole, uint8 wormholeConsistencyLevel ) internal onlyInitializing { __WormholeBaseUpgradeable_init(wormhole, wormholeConsistencyLevel); __ERC721_init('Renova Item', 'RNVI'); } /// @inheritdoc IERC165Upgradeable function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721RoyaltyUpgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId); } /// @inheritdoc IRenovaItemBase function wormholeBridgeIn(bytes memory wormholeVAA) external override { ( uint16 emitterWormholeChainId, bytes memory payload ) = _wormholeReceive(wormholeVAA); ( uint256 tokenId, address itemOwner, uint256 hashverseItemId, uint16 dstWormholeChainId, uint256 bridgeNonce ) = abi.decode(payload, (uint256, address, uint256, uint16, uint256)); require( _wormholeChainId == dstWormholeChainId, 'RenovaItemBase::wormholeBridgeIn Item sent to different chain.' ); require( bridgeNonce > _bridgeNonces[tokenId], 'RenovaItemBase::wormholeBridgeIn Invalid nonce.' ); emit XChainBridgeIn( itemOwner, tokenId, hashverseItemId, emitterWormholeChainId ); _bridgeNonces[tokenId] = bridgeNonce; _mintItem(itemOwner, tokenId, hashverseItemId); } /// @inheritdoc IRenovaItemBase function wormholeBridgeOut( uint256 tokenId, uint16 dstWormholeChainId, uint256 wormholeMessageFee ) external payable override { address itemOwner = _ownerOf(tokenId); require( _msgSender() == itemOwner, 'RenovaItemBase::wormholeBridgeOut Only owner can bridge.' ); require( msg.value >= wormholeMessageFee, 'RenovaItemBase::wormholeBridgeOut msg.value does not cover fees.' ); require( _wormholeRemotes[dstWormholeChainId] != bytes32(0), 'RenovaItemBase::wormholeBridgeOut Unsupported dst chain.' ); _burn(tokenId); _bridgeNonces[tokenId] += 1; uint256 bridgedHashverseItemId = _hashverseItemIds[tokenId]; bytes memory payload = abi.encode( tokenId, itemOwner, bridgedHashverseItemId, dstWormholeChainId, _bridgeNonces[tokenId] ); delete _hashverseItemIds[tokenId]; uint64 sequence = _wormholeSend(0, payload, wormholeMessageFee); emit XChainBridgeOut( _msgSender(), tokenId, bridgedHashverseItemId, dstWormholeChainId, sequence, msg.value - wormholeMessageFee ); } /// @inheritdoc IERC721MetadataUpgradeable function tokenURI( uint256 tokenId ) public view override returns (string memory) { string memory tokenURIPrefix = ERC721Upgradeable.tokenURI(tokenId); return bytes(tokenURIPrefix).length > 0 ? string(abi.encodePacked(tokenURIPrefix, '.json')) : ''; } // Admin. /// @inheritdoc IRenovaItemBase function setDefaultRoyalty( address receiver, uint96 feeNumerator ) external override onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } /// @inheritdoc IRenovaItemBase function setCustomBaseURI( string memory customBaseURI ) external override onlyOwner { _customBaseURI = customBaseURI; emit UpdateCustomURI(_customBaseURI); emit BatchMetadataUpdate(1, type(uint256).max); } /// @inheritdoc IRenovaItemBase function refreshMetadata(uint256 tokenId) external override onlyOwner { emit MetadataUpdate(tokenId); } /// @inheritdoc IRenovaItemBase function refreshAllMetadata() external override onlyOwner { emit BatchMetadataUpdate(1, type(uint256).max); } /// @inheritdoc OwnableUpgradeable function renounceOwnership() public view override onlyOwner { revert('RenovaItemBase::renounceOwnership Cannot renounce ownership.'); } /// @notice Mints an item. /// @param tokenOwner The owner of the item. /// @param tokenId The token ID. /// @param hashverseItemId The Hashverse Item ID. function _mintItem( address tokenOwner, uint256 tokenId, uint256 hashverseItemId ) internal virtual { _safeMint(tokenOwner, tokenId); _hashverseItemIds[tokenId] = hashverseItemId; emit Mint(tokenOwner, tokenId, hashverseItemId); } /// @notice Returns the custom base URI. /// @return The base URI. function _baseURI() internal view override returns (string memory) { return _customBaseURI; } } interface IRenovaItem is IRenovaItemBase { /// @notice Emitted when the authorization status of a minter changes. /// @param minter The minter for which the status was updated. /// @param status The new status. event UpdateMinterAuthorization(address minter, bool status); /// @notice Initializer function. /// @param minter The initial authorized minter. /// @param wormhole The Wormhole Endpoint address. See {IWormholeBaseUpgradeable}. /// @param wormholeConsistencyLevel The Wormhole Consistency Level. See {IWormholeBaseUpgradeable}. function initialize( address minter, address wormhole, uint8 wormholeConsistencyLevel ) external; /// @notice Mints an item. /// @param tokenOwner The owner of the item. /// @param hashverseItemId The Hashverse Item ID. function mint(address tokenOwner, uint256 hashverseItemId) external; /// @notice Updates the authorization status of a minter. /// @param minter The minter to update the authorization status for. /// @param status The new status. function updateMinterAuthorization(address minter, bool status) external; } contract RenovaItem is IRenovaItem, RenovaItemBase { mapping(address => bool) internal _authorizedMinter; uint256 private _numMintedItems; /// @dev Reserved for future upgrades. uint256[16] private __gap; /// @inheritdoc IRenovaItem function initialize( address minter, address wormhole, uint8 wormholeConsistencyLevel ) external override initializer { __RenovaItemBase_init(wormhole, wormholeConsistencyLevel); _authorizedMinter[minter] = true; _numMintedItems = 0; emit UpdateMinterAuthorization(minter, true); } /// @inheritdoc IRenovaItem function mint(address tokenOwner, uint256 hashverseItemId) external { require( _authorizedMinter[_msgSender()], 'RenovaItem::mint Unauthorized minter.' ); _numMintedItems++; _mintItem(tokenOwner, _numMintedItems, hashverseItemId); } /// @inheritdoc IRenovaItem function updateMinterAuthorization( address minter, bool status ) external override onlyOwner { _authorizedMinter[minter] = status; emit UpdateMinterAuthorization(minter, status); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hashverseItemId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"UpdateCustomURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateMinterAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWormhole","type":"address"},{"indexed":false,"internalType":"address","name":"oldWormhole","type":"address"}],"name":"UpdateWormhole","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newWormholeChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldWormholeChainId","type":"uint16"}],"name":"UpdateWormholeChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"newConsistencyLevel","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"oldConsistencyLevel","type":"uint8"}],"name":"UpdateWormholeConsistencyLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"wormholeChainId","type":"uint16"},{"indexed":false,"internalType":"bytes32","name":"remote","type":"bytes32"}],"name":"UpdateWormholeRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"emitterChainId","type":"uint16"},{"indexed":false,"internalType":"bytes32","name":"emitterAddress","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"sequence","type":"uint64"}],"name":"WormholeReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequence","type":"uint64"}],"name":"WormholeSend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hashverseItemId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"srcWormholeChainId","type":"uint16"}],"name":"XChainBridgeIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hashverseItemId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"dstWormholeChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"sequence","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"relayerFee","type":"uint256"}],"name":"XChainBridgeOut","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"address","name":"wormhole","type":"address"},{"internalType":"uint8","name":"wormholeConsistencyLevel","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"hashverseItemId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refreshAllMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"refreshMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseURI","type":"string"}],"name":"setCustomBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateMinterAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wormhole","type":"address"}],"name":"updateWormhole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"wormholeConsistencyLevel","type":"uint8"}],"name":"updateWormholeConsistencyLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"wormholeChainId","type":"uint16"},{"internalType":"bytes32","name":"authorizedRemote","type":"bytes32"}],"name":"updateWormholeRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRelayerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"wormholeVAA","type":"bytes"}],"name":"wormholeBridgeIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint16","name":"dstWormholeChainId","type":"uint16"},{"internalType":"uint256","name":"wormholeMessageFee","type":"uint256"}],"name":"wormholeBridgeOut","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b613f7180620000f46000396000f3fe6080604052600436106101cd5760003560e01c80637b0cad31116100f7578063b5630e5f11610095578063cdf0ae7611610064578063cdf0ae7614610535578063d95ba42f14610555578063e985e9c514610575578063f2fde38b146105be57600080fd5b8063b5630e5f146104c0578063b88d4fde146104e0578063bed20a8714610500578063c87b56dd1461051557600080fd5b806395d89b41116100d157806395d89b411461044b578063a22cb46514610460578063ad47f57d14610480578063aebb4ce9146104a057600080fd5b80637b0cad31146103ed57806389232a001461040d5780638da5cb5b1461042d57600080fd5b80632a55205a1161016f5780636352211e1161013e5780636352211e1461036a5780636cc247e01461038a57806370a08231146103aa578063715018a6146103d857600080fd5b80632a55205a146102d65780632b0e29741461031557806340c10f191461032a57806342842e0e1461034a57600080fd5b8063081812fc116101ab578063081812fc1461024b578063095ea7b31461028357806323b872dd146102a3578063258ad6ee146102c357600080fd5b806301ffc9a7146101d257806304634d8d1461020757806306fdde0314610229575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046133b8565b6105de565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506102276102223660046133ea565b610622565b005b34801561023557600080fd5b5061023e610638565b6040516101fe9190613484565b34801561025757600080fd5b5061026b610266366004613497565b6106ca565b6040516001600160a01b0390911681526020016101fe565b34801561028f57600080fd5b5061022761029e3660046134b0565b6106f1565b3480156102af57600080fd5b506102276102be3660046134dc565b610845565b6102276102d136600461352d565b6108cc565b3480156102e257600080fd5b506102f66102f1366004613554565b610b6d565b604080516001600160a01b0390931683526020830191909152016101fe565b34801561032157600080fd5b50610227610c28565b34801561033657600080fd5b506102276103453660046134b0565b610cb2565b34801561035657600080fd5b506102276103653660046134dc565b610d5c565b34801561037657600080fd5b5061026b610385366004613497565b610d77565b34801561039657600080fd5b506102276103a5366004613670565b610ddc565b3480156103b657600080fd5b506103ca6103c53660046136b9565b610e6a565b6040519081526020016101fe565b3480156103e457600080fd5b50610227610f04565b3480156103f957600080fd5b506102276104083660046136f6565b610f7a565b34801561041957600080fd5b5061022761042836600461373a565b61112b565b34801561043957600080fd5b506097546001600160a01b031661026b565b34801561045757600080fd5b5061023e6112b8565b34801561046c57600080fd5b5061022761047b366004613793565b6112c7565b34801561048c57600080fd5b5061022761049b3660046137c1565b6112d2565b3480156104ac57600080fd5b506102276104bb3660046137de565b6112e6565b3480156104cc57600080fd5b506102276104db366004613793565b61147b565b3480156104ec57600080fd5b506102276104fb3660046137fc565b6114e0565b34801561050c57600080fd5b50610227611568565b34801561052157600080fd5b5061023e610530366004613497565b6115ad565b34801561054157600080fd5b506102276105503660046136b9565b611602565b34801561056157600080fd5b50610227610570366004613497565b611613565b34801561058157600080fd5b506101f2610590366004613868565b6001600160a01b03918216600090815260e26020908152604080832093909416825291909152205460ff1690565b3480156105ca57600080fd5b506102276105d93660046136b9565b61164b565b60006001600160e01b031982167f4906490600000000000000000000000000000000000000000000000000000000148061061c575061061c826116d8565b92915050565b61062a6116e3565b610634828261173d565b5050565b606060dd805461064790613896565b80601f016020809104026020016040519081016040528092919081815260200182805461067390613896565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b5050505050905090565b60006106d582611857565b50600090815260e160205260409020546001600160a01b031690565b60006106fc82610d77565b9050806001600160a01b0316836001600160a01b03160361078a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806107c457506001600160a01b038116600090815260e26020908152604080832033845290915290205460ff165b6108365760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610781565b61084083836118bb565b505050565b61084f3382611936565b6108c15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610781565b6108408383836119b5565b600083815260df60205260409020546001600160a01b03163381146109595760405162461bcd60e51b815260206004820152603860248201527f52656e6f76614974656d426173653a3a776f726d686f6c654272696467654f7560448201527f74204f6e6c79206f776e65722063616e206272696467652e00000000000000006064820152608401610781565b813410156109d1576040805162461bcd60e51b81526020600482015260248101919091527f52656e6f76614974656d426173653a3a776f726d686f6c654272696467654f7560448201527f74206d73672e76616c756520646f6573206e6f7420636f76657220666565732e6064820152608401610781565b61ffff8316600090815260cb6020526040902054610a575760405162461bcd60e51b815260206004820152603860248201527f52656e6f76614974656d426173653a3a776f726d686f6c654272696467654f7560448201527f7420556e737570706f727465642064737420636861696e2e00000000000000006064820152608401610781565b610a6084611bf8565b600084815261014260205260408120805460019290610a809084906138e6565b9091555050600084815261014360208181526040808420805461014284528286205483518086018c90526001600160a01b038916818601526060810183905261ffff8b16608082015260a0808201929092528451808203909201825260c00190935289865293909252908390559091610afa818387611c12565b9050337f021c8ccac0fa7e8ce208583dca897c5ad2d675f2b36b6b00b73bbb8d11c0d99188858985610b2c8b346138f9565b60408051958652602086019490945261ffff929092168484015267ffffffffffffffff1660608401526080830152519081900360a00190a250505050505050565b60008281526066602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610bec5750604080518082019091526065546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610c10906bffffffffffffffffffffffff168761390c565b610c1a9190613923565b915196919550909350505050565b610c306116e3565b60004711610ca65760405162461bcd60e51b815260206004820152603f60248201527f576f726d686f6c65426173655570677261646561626c653a3a7769746864726160448201527f7752656c6179657246656573204e6f206665657320636f6c6c65637465642e006064820152608401610781565b610cb03347611e1a565b565b336000908152610154602052604090205460ff16610d385760405162461bcd60e51b815260206004820152602560248201527f52656e6f76614974656d3a3a6d696e7420556e617574686f72697a6564206d6960448201527f6e7465722e0000000000000000000000000000000000000000000000000000006064820152608401610781565b6101558054906000610d4983613945565b9190505550610634826101555483611f33565b610840838383604051806020016040528060008152506114e0565b600081815260df60205260408120546001600160a01b03168061061c5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610781565b610de46116e3565b610141610df182826139ad565b507fa6079050ba457cec0a5a38490491927a6c30ecc1c27e7a9b060080b5278e3f3a610141604051610e239190613a6d565b60405180910390a1604080516001815260001960208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91015b60405180910390a150565b60006001600160a01b038216610ee85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610781565b506001600160a01b0316600090815260e0602052604090205490565b610f0c6116e3565b60405162461bcd60e51b815260206004820152603c60248201527f52656e6f76614974656d426173653a3a72656e6f756e63654f776e657273686960448201527f702043616e6e6f742072656e6f756e6365206f776e6572736869702e000000006064820152608401610781565b600080610f8683611f99565b91509150600080600080600085806020019051810190610fa69190613b08565b60cc549499509297509095509350915061ffff8084169116146110315760405162461bcd60e51b815260206004820152603e60248201527f52656e6f76614974656d426173653a3a776f726d686f6c65427269646765496e60448201527f204974656d2073656e7420746f20646966666572656e7420636861696e2e00006064820152608401610781565b6000858152610142602052604090205481116110b55760405162461bcd60e51b815260206004820152602f60248201527f52656e6f76614974656d426173653a3a776f726d686f6c65427269646765496e60448201527f20496e76616c6964206e6f6e63652e00000000000000000000000000000000006064820152608401610781565b604080518681526020810185905261ffff89168183015290516001600160a01b038616917f7386380ff18b577cd9fd393ad6de5172b6682ad656d9d6cce4c380740efa8f99919081900360600190a2600085815261014260205260409020819055611121848685611f33565b5050505050505050565b600054610100900460ff161580801561114b5750600054600160ff909116105b806111655750303b158015611165575060005460ff166001145b6111d75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610781565b6000805460ff1916600117905580156111fa576000805461ff0019166101001790555b611204838361243d565b6001600160a01b038416600081815261015460209081526040808320805460ff19166001908117909155610155939093558051938452908301919091527f55a29e82c3e4f8fd2a824a98f3cd64b0d667b068ce9a876d284af8fef2ee661c910160405180910390a180156112b2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606060de805461064790613896565b610634338383612526565b6112da6116e3565b6112e3816125f4565b50565b6112ee6116e3565b8161ffff1660000361138e5760405162461bcd60e51b815260206004820152604a60248201527f576f726d686f6c65426173655570677261646561626c653a3a7570646174655760448201527f6f726d686f6c6552656d6f746520776f726d686f6c65436861696e496420636160648201527f6e6e6f7420626520302e00000000000000000000000000000000000000000000608482015260a401610781565b806114275760405162461bcd60e51b815260206004820152604160248201527f576f726d686f6c65426173655570677261646561626c653a3a7570646174655760448201527f6f726d686f6c6552656d6f74652052656d6f74652063616e6e6f74206265203060648201527f2e00000000000000000000000000000000000000000000000000000000000000608482015260a401610781565b61ffff8216600081815260cb6020908152604091829020849055815192835282018390527f35e23d9dc327a48e399315447f33b792cbdbee431b0f83f5c78ed734eb709fac91015b60405180910390a15050565b6114836116e3565b6001600160a01b03821660008181526101546020908152604091829020805460ff19168515159081179091558251938452908301527f55a29e82c3e4f8fd2a824a98f3cd64b0d667b068ce9a876d284af8fef2ee661c910161146f565b6114ea3383611936565b61155c5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610781565b6112b284848484612717565b6115706116e3565b604080516001815260001960208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a1565b606060006115ba836127a0565b905060008151116115da57604051806020016040528060008152506115fb565b806040516020016115eb9190613b5f565b6040516020818303038152906040525b9392505050565b61160a6116e3565b6112e3816127f0565b61161b6116e3565b6040518181527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790602001610e5f565b6116536116e3565b6001600160a01b0381166116cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610781565b6112e3816129d4565b600061061c82612a33565b6097546001600160a01b03163314610cb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610781565b6127106bffffffffffffffffffffffff821611156117c35760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610781565b6001600160a01b0382166118195760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610781565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217606555565b600081815260df60205260409020546001600160a01b03166112e35760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610781565b600081815260e160205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906118fd82610d77565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061194283610d77565b9050806001600160a01b0316846001600160a01b0316148061198957506001600160a01b03808216600090815260e2602090815260408083209388168352929052205460ff165b806119ad5750836001600160a01b03166119a2846106ca565b6001600160a01b0316145b949350505050565b826001600160a01b03166119c882610d77565b6001600160a01b031614611a445760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610781565b6001600160a01b038216611abf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610781565b611acc8383836001612aa5565b826001600160a01b0316611adf82610d77565b6001600160a01b031614611b5b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610781565b600081815260e160209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260e0855283862080546000190190559087168086528386208054600101905586865260df90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611c0181612b2d565b600090815260666020526040812055565b60c9546000906001600160a01b0316611c935760405162461bcd60e51b815260206004820152603f60248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c6553656e6420576f726d686f6c65206973206e6f7420646566696e65642e006064820152608401610781565b60c954600160a01b900460ff16611d385760405162461bcd60e51b815260206004820152605260248201527f576f726d686f6c65426173655570677261646561626c653a3a205f776f726d6860448201527f6f6c6553656e6420576f726d686f6c6520636f6e73697374656e6379206c657660648201527f656c206973206e6f7420646566696e65642e0000000000000000000000000000608482015260a401610781565b60c9546040517fb19a437e0000000000000000000000000000000000000000000000000000000081526001600160a01b0382169163b19a437e918591611d909189918991600160a01b90910460ff1690600401613ba0565b60206040518083038185885af1158015611dae573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611dd39190613bea565b60405167ffffffffffffffff821681529091507f2c0ada6fb76253b7077fa555f15478fe8f40ec488c2c43daae2481a1b5dc40099060200160405180910390a19392505050565b80471015611e6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610781565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b50509050806108405760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610781565b611f3d8383612bdd565b6000828152610143602090815260409182902083905581518481529081018390526001600160a01b038516917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2505050565b60c9546000906060906001600160a01b03166120435760405162461bcd60e51b815260206004820152604260248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520576f726d686f6c65206973206e6f7420646566696e6560648201527f642e000000000000000000000000000000000000000000000000000000000000608482015260a401610781565b60cc5461ffff166120e25760405162461bcd60e51b815260206004820152604b60248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520576f726d686f6c6520436861696e204944206973206e60648201527f6f7420646566696e65642e000000000000000000000000000000000000000000608482015260a401610781565b60c9546040517fc0fd8bde000000000000000000000000000000000000000000000000000000008152600091829182916001600160a01b03169063c0fd8bde90612130908990600401613484565b600060405180830381865afa15801561214d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121759190810190613d3e565b92509250925081819061219b5760405162461bcd60e51b81526004016107819190613484565b50610140830151600090815260ca602052604090205460ff161561224e5760405162461bcd60e51b8152602060048201526044602482018190527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f908201527f6c6552656365697665204d65737361676520616c72656164792070726f63657360648201527f7365642e00000000000000000000000000000000000000000000000000000000608482015260a401610781565b610140830151600090815260ca60209081526040808320805460ff19166001179055606086015161ffff8116845260cb909252909120549095506123205760405162461bcd60e51b815260206004820152605760248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520576f726d686f6c652072656d6f7465206e6f7420646560648201527f66696e6564206f6e20656d697474656420636861696e2e000000000000000000608482015260a401610781565b608083015161ffff8616600090815260cb6020526040902054146123d25760405162461bcd60e51b815260206004820152604160248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520456d6974746572206e6f7420617574686f72697a656460648201527f2e00000000000000000000000000000000000000000000000000000000000000608482015260a401610781565b606080840151608085015160a08601516040805161ffff9094168452602084019290925267ffffffffffffffff16908201527fd013688f55d49dbb965d100e42f874e733aa2db9ced00ce62e643b6f47ecc22e910160405180910390a1505060e00151919391925050565b600054610100900460ff166124a85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b6124b28282612bf7565b6106346040518060400160405280600b81526020017f52656e6f7661204974656d0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f524e564900000000000000000000000000000000000000000000000000000000815250612c11565b816001600160a01b0316836001600160a01b0316036125875760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610781565b6001600160a01b03838116600081815260e26020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008160ff16116126935760405162461bcd60e51b815260206004820152605d60248201527f576f726d686f6c65426173655570677261646561626c653a3a7570646174655760448201527f6f726d686f6c65436f6e73697374656e63794c6576656c20436f6e736973746560648201527f6e6379206c6576656c2063616e6e6f742062652073657420746f20302e000000608482015260a401610781565b60c9546040805160ff8085168252600160a01b90930490921660208301527f4776078413e31938cb5212df6c9a4ceb607c6f05445e7384623373bc2ac632c4910160405180910390a160c9805460ff909216600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6127228484846119b5565b61272e84848484612c86565b6112b25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610781565b60606127ab82611857565b60006127b5612e0f565b905060008151116127d557604051806020016040528060008152506115fb565b806127df84612e1f565b6040516020016115eb929190613e96565b6001600160a01b03811661286c5760405162461bcd60e51b815260206004820152603d60248201527f576f726d686f6c65426173655570677261646561626c653a3a5f75706461746560448201527f576f726d686f6c6520416464726573732063616e6e6f7420626520302e0000006064820152608401610781565b60c954604080516001600160a01b03808516825290921660208301527f24341e031c7687e9eeb2b18d176371aaf18c9cb7cc6574be31aa512b84a17ebc910160405180910390a160c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117909155604080517f9a8a0592000000000000000000000000000000000000000000000000000000008152905160009291639a8a05929160048083019260209291908290030181865afa158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129599190613ec5565b60cc546040805161ffff808516825290921660208301529192507ff08a2a85a4e60e268b72b8ae59558a699797e81a58fa0767f74579aa0415d9a5910160405180910390a160cc80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff9290921691909117905550565b609780546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612a9657506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061061c575061061c82612ebf565b60018111156112b2576001600160a01b03841615612aeb576001600160a01b038416600090815260e0602052604081208054839290612ae59084906138f9565b90915550505b6001600160a01b038316156112b2576001600160a01b038316600090815260e0602052604081208054839290612b229084906138e6565b909155505050505050565b6000612b3882610d77565b9050612b48816000846001612aa5565b612b5182610d77565b600083815260e160209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b03851680855260e08452828520805460001901905587855260df909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610634828260405180602001604052806000815250612f26565b612bff612faf565b612c08826127f0565b610634816125f4565b600054610100900460ff16612c7c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b6106348282613022565b60006001600160a01b0384163b15612e04576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612ce3903390899088908890600401613ee2565b6020604051808303816000875af1925050508015612d1e575060408051601f3d908101601f19168201909252612d1b91810190613f1e565b60015b612dd1573d808015612d4c576040519150601f19603f3d011682016040523d82523d6000602084013e612d51565b606091505b508051600003612dc95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610781565b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490506119ad565b506001949350505050565b6060610141805461064790613896565b60606000612e2c836130a6565b600101905060008167ffffffffffffffff811115612e4c57612e4c613576565b6040519080825280601f01601f191660200182016040528015612e76576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084612e8057509392505050565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061061c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461061c565b612f308383613188565b612f3d6000848484612c86565b6108405760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610781565b600054610100900460ff1661301a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b610cb061332e565b600054610100900460ff1661308d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b60dd61309983826139ad565b5060de61084082826139ad565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106130ef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061311b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061313957662386f26fc10000830492506010015b6305f5e1008310613151576305f5e100830492506008015b612710831061316557612710830492506004015b60648310613177576064830492506002015b600a831061061c5760010192915050565b6001600160a01b0382166131de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610781565b600081815260df60205260409020546001600160a01b0316156132435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610781565b613251600083836001612aa5565b600081815260df60205260409020546001600160a01b0316156132b65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610781565b6001600160a01b038216600081815260e0602090815260408083208054600101905584835260df909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600054610100900460ff166133995760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b610cb0336129d4565b6001600160e01b0319811681146112e357600080fd5b6000602082840312156133ca57600080fd5b81356115fb816133a2565b6001600160a01b03811681146112e357600080fd5b600080604083850312156133fd57600080fd5b8235613408816133d5565b915060208301356bffffffffffffffffffffffff8116811461342957600080fd5b809150509250929050565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b6020815260006115fb6020830184613458565b6000602082840312156134a957600080fd5b5035919050565b600080604083850312156134c357600080fd5b82356134ce816133d5565b946020939093013593505050565b6000806000606084860312156134f157600080fd5b83356134fc816133d5565b9250602084013561350c816133d5565b929592945050506040919091013590565b61ffff811681146112e357600080fd5b60008060006060848603121561354257600080fd5b83359250602084013561350c8161351d565b6000806040838503121561356757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156135af576135af613576565b60405290565b604051610160810167ffffffffffffffff811182821017156135af576135af613576565b604051601f8201601f1916810167ffffffffffffffff8111828210171561360257613602613576565b604052919050565b600067ffffffffffffffff82111561362457613624613576565b50601f01601f191660200190565b60006136456136408461360a565b6135d9565b905082815283838301111561365957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561368257600080fd5b813567ffffffffffffffff81111561369957600080fd5b8201601f810184136136aa57600080fd5b6119ad84823560208401613632565b6000602082840312156136cb57600080fd5b81356115fb816133d5565b600082601f8301126136e757600080fd5b6115fb83833560208501613632565b60006020828403121561370857600080fd5b813567ffffffffffffffff81111561371f57600080fd5b6119ad848285016136d6565b60ff811681146112e357600080fd5b60008060006060848603121561374f57600080fd5b833561375a816133d5565b9250602084013561376a816133d5565b9150604084013561377a8161372b565b809150509250925092565b80151581146112e357600080fd5b600080604083850312156137a657600080fd5b82356137b1816133d5565b9150602083013561342981613785565b6000602082840312156137d357600080fd5b81356115fb8161372b565b600080604083850312156137f157600080fd5b82356134ce8161351d565b6000806000806080858703121561381257600080fd5b843561381d816133d5565b9350602085013561382d816133d5565b925060408501359150606085013567ffffffffffffffff81111561385057600080fd5b61385c878288016136d6565b91505092959194509250565b6000806040838503121561387b57600080fd5b8235613886816133d5565b91506020830135613429816133d5565b600181811c908216806138aa57607f821691505b6020821081036138ca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561061c5761061c6138d0565b8181038181111561061c5761061c6138d0565b808202811582820484141761061c5761061c6138d0565b60008261394057634e487b7160e01b600052601260045260246000fd5b500490565b60006000198203613958576139586138d0565b5060010190565b601f82111561084057600081815260208120601f850160051c810160208610156139865750805b601f850160051c820191505b818110156139a557828155600101613992565b505050505050565b815167ffffffffffffffff8111156139c7576139c7613576565b6139db816139d58454613896565b8461395f565b602080601f831160018114613a1057600084156139f85750858301515b600019600386901b1c1916600185901b1785556139a5565b600085815260208120601f198616915b82811015613a3f57888601518255948401946001909101908401613a20565b5085821015613a5d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835260008454613a8181613896565b80848701526040600180841660008114613aa25760018114613abc57613aea565b60ff198516838a01528284151560051b8a01019550613aea565b896000528660002060005b85811015613ae25781548b8201860152908301908801613ac7565b8a0184019650505b509398975050505050505050565b8051613b038161351d565b919050565b600080600080600060a08688031215613b2057600080fd5b855194506020860151613b32816133d5565b604087015160608801519195509350613b4a8161351d565b80925050608086015190509295509295909350565b60008251613b71818460208701613434565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b63ffffffff84168152606060208201526000613bbf6060830185613458565b905060ff83166040830152949350505050565b805167ffffffffffffffff81168114613b0357600080fd5b600060208284031215613bfc57600080fd5b6115fb82613bd2565b8051613b038161372b565b805163ffffffff81168114613b0357600080fd5b600082601f830112613c3557600080fd5b8151613c436136408261360a565b818152846020838601011115613c5857600080fd5b6119ad826020830160208701613434565b600082601f830112613c7a57600080fd5b8151602067ffffffffffffffff821115613c9657613c96613576565b613ca4818360051b016135d9565b82815260079290921b84018101918181019086841115613cc357600080fd5b8286015b84811015613d285760808189031215613ce05760008081fd5b613ce861358c565b815181528482015185820152604080830151613d038161372b565b90820152606082810151613d168161372b565b90820152835291830191608001613cc7565b509695505050505050565b8051613b0381613785565b600080600060608486031215613d5357600080fd5b835167ffffffffffffffff80821115613d6b57600080fd5b908501906101608288031215613d8057600080fd5b613d886135b5565b613d9183613c05565b8152613d9f60208401613c10565b6020820152613db060408401613c10565b6040820152613dc160608401613af8565b606082015260808301516080820152613ddc60a08401613bd2565b60a0820152613ded60c08401613c05565b60c082015260e083015182811115613e0457600080fd5b613e1089828601613c24565b60e083015250610100613e24818501613c10565b908201526101208381015183811115613e3c57600080fd5b613e488a828701613c69565b918301919091525061014083810151908201529450613e6960208701613d33565b93506040860151915080821115613e7f57600080fd5b50613e8c86828701613c24565b9150509250925092565b60008351613ea8818460208801613434565b835190830190613ebc818360208801613434565b01949350505050565b600060208284031215613ed757600080fd5b81516115fb8161351d565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613f146080830184613458565b9695505050505050565b600060208284031215613f3057600080fd5b81516115fb816133a256fea2646970667358221220368e395c76b602d2e4605784ca717f09e47f0aa3405b1945e2ca01fa2d3a6cdc64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80637b0cad31116100f7578063b5630e5f11610095578063cdf0ae7611610064578063cdf0ae7614610535578063d95ba42f14610555578063e985e9c514610575578063f2fde38b146105be57600080fd5b8063b5630e5f146104c0578063b88d4fde146104e0578063bed20a8714610500578063c87b56dd1461051557600080fd5b806395d89b41116100d157806395d89b411461044b578063a22cb46514610460578063ad47f57d14610480578063aebb4ce9146104a057600080fd5b80637b0cad31146103ed57806389232a001461040d5780638da5cb5b1461042d57600080fd5b80632a55205a1161016f5780636352211e1161013e5780636352211e1461036a5780636cc247e01461038a57806370a08231146103aa578063715018a6146103d857600080fd5b80632a55205a146102d65780632b0e29741461031557806340c10f191461032a57806342842e0e1461034a57600080fd5b8063081812fc116101ab578063081812fc1461024b578063095ea7b31461028357806323b872dd146102a3578063258ad6ee146102c357600080fd5b806301ffc9a7146101d257806304634d8d1461020757806306fdde0314610229575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046133b8565b6105de565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b506102276102223660046133ea565b610622565b005b34801561023557600080fd5b5061023e610638565b6040516101fe9190613484565b34801561025757600080fd5b5061026b610266366004613497565b6106ca565b6040516001600160a01b0390911681526020016101fe565b34801561028f57600080fd5b5061022761029e3660046134b0565b6106f1565b3480156102af57600080fd5b506102276102be3660046134dc565b610845565b6102276102d136600461352d565b6108cc565b3480156102e257600080fd5b506102f66102f1366004613554565b610b6d565b604080516001600160a01b0390931683526020830191909152016101fe565b34801561032157600080fd5b50610227610c28565b34801561033657600080fd5b506102276103453660046134b0565b610cb2565b34801561035657600080fd5b506102276103653660046134dc565b610d5c565b34801561037657600080fd5b5061026b610385366004613497565b610d77565b34801561039657600080fd5b506102276103a5366004613670565b610ddc565b3480156103b657600080fd5b506103ca6103c53660046136b9565b610e6a565b6040519081526020016101fe565b3480156103e457600080fd5b50610227610f04565b3480156103f957600080fd5b506102276104083660046136f6565b610f7a565b34801561041957600080fd5b5061022761042836600461373a565b61112b565b34801561043957600080fd5b506097546001600160a01b031661026b565b34801561045757600080fd5b5061023e6112b8565b34801561046c57600080fd5b5061022761047b366004613793565b6112c7565b34801561048c57600080fd5b5061022761049b3660046137c1565b6112d2565b3480156104ac57600080fd5b506102276104bb3660046137de565b6112e6565b3480156104cc57600080fd5b506102276104db366004613793565b61147b565b3480156104ec57600080fd5b506102276104fb3660046137fc565b6114e0565b34801561050c57600080fd5b50610227611568565b34801561052157600080fd5b5061023e610530366004613497565b6115ad565b34801561054157600080fd5b506102276105503660046136b9565b611602565b34801561056157600080fd5b50610227610570366004613497565b611613565b34801561058157600080fd5b506101f2610590366004613868565b6001600160a01b03918216600090815260e26020908152604080832093909416825291909152205460ff1690565b3480156105ca57600080fd5b506102276105d93660046136b9565b61164b565b60006001600160e01b031982167f4906490600000000000000000000000000000000000000000000000000000000148061061c575061061c826116d8565b92915050565b61062a6116e3565b610634828261173d565b5050565b606060dd805461064790613896565b80601f016020809104026020016040519081016040528092919081815260200182805461067390613896565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b5050505050905090565b60006106d582611857565b50600090815260e160205260409020546001600160a01b031690565b60006106fc82610d77565b9050806001600160a01b0316836001600160a01b03160361078a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806107c457506001600160a01b038116600090815260e26020908152604080832033845290915290205460ff165b6108365760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610781565b61084083836118bb565b505050565b61084f3382611936565b6108c15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610781565b6108408383836119b5565b600083815260df60205260409020546001600160a01b03163381146109595760405162461bcd60e51b815260206004820152603860248201527f52656e6f76614974656d426173653a3a776f726d686f6c654272696467654f7560448201527f74204f6e6c79206f776e65722063616e206272696467652e00000000000000006064820152608401610781565b813410156109d1576040805162461bcd60e51b81526020600482015260248101919091527f52656e6f76614974656d426173653a3a776f726d686f6c654272696467654f7560448201527f74206d73672e76616c756520646f6573206e6f7420636f76657220666565732e6064820152608401610781565b61ffff8316600090815260cb6020526040902054610a575760405162461bcd60e51b815260206004820152603860248201527f52656e6f76614974656d426173653a3a776f726d686f6c654272696467654f7560448201527f7420556e737570706f727465642064737420636861696e2e00000000000000006064820152608401610781565b610a6084611bf8565b600084815261014260205260408120805460019290610a809084906138e6565b9091555050600084815261014360208181526040808420805461014284528286205483518086018c90526001600160a01b038916818601526060810183905261ffff8b16608082015260a0808201929092528451808203909201825260c00190935289865293909252908390559091610afa818387611c12565b9050337f021c8ccac0fa7e8ce208583dca897c5ad2d675f2b36b6b00b73bbb8d11c0d99188858985610b2c8b346138f9565b60408051958652602086019490945261ffff929092168484015267ffffffffffffffff1660608401526080830152519081900360a00190a250505050505050565b60008281526066602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610bec5750604080518082019091526065546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610c10906bffffffffffffffffffffffff168761390c565b610c1a9190613923565b915196919550909350505050565b610c306116e3565b60004711610ca65760405162461bcd60e51b815260206004820152603f60248201527f576f726d686f6c65426173655570677261646561626c653a3a7769746864726160448201527f7752656c6179657246656573204e6f206665657320636f6c6c65637465642e006064820152608401610781565b610cb03347611e1a565b565b336000908152610154602052604090205460ff16610d385760405162461bcd60e51b815260206004820152602560248201527f52656e6f76614974656d3a3a6d696e7420556e617574686f72697a6564206d6960448201527f6e7465722e0000000000000000000000000000000000000000000000000000006064820152608401610781565b6101558054906000610d4983613945565b9190505550610634826101555483611f33565b610840838383604051806020016040528060008152506114e0565b600081815260df60205260408120546001600160a01b03168061061c5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610781565b610de46116e3565b610141610df182826139ad565b507fa6079050ba457cec0a5a38490491927a6c30ecc1c27e7a9b060080b5278e3f3a610141604051610e239190613a6d565b60405180910390a1604080516001815260001960208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91015b60405180910390a150565b60006001600160a01b038216610ee85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610781565b506001600160a01b0316600090815260e0602052604090205490565b610f0c6116e3565b60405162461bcd60e51b815260206004820152603c60248201527f52656e6f76614974656d426173653a3a72656e6f756e63654f776e657273686960448201527f702043616e6e6f742072656e6f756e6365206f776e6572736869702e000000006064820152608401610781565b600080610f8683611f99565b91509150600080600080600085806020019051810190610fa69190613b08565b60cc549499509297509095509350915061ffff8084169116146110315760405162461bcd60e51b815260206004820152603e60248201527f52656e6f76614974656d426173653a3a776f726d686f6c65427269646765496e60448201527f204974656d2073656e7420746f20646966666572656e7420636861696e2e00006064820152608401610781565b6000858152610142602052604090205481116110b55760405162461bcd60e51b815260206004820152602f60248201527f52656e6f76614974656d426173653a3a776f726d686f6c65427269646765496e60448201527f20496e76616c6964206e6f6e63652e00000000000000000000000000000000006064820152608401610781565b604080518681526020810185905261ffff89168183015290516001600160a01b038616917f7386380ff18b577cd9fd393ad6de5172b6682ad656d9d6cce4c380740efa8f99919081900360600190a2600085815261014260205260409020819055611121848685611f33565b5050505050505050565b600054610100900460ff161580801561114b5750600054600160ff909116105b806111655750303b158015611165575060005460ff166001145b6111d75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610781565b6000805460ff1916600117905580156111fa576000805461ff0019166101001790555b611204838361243d565b6001600160a01b038416600081815261015460209081526040808320805460ff19166001908117909155610155939093558051938452908301919091527f55a29e82c3e4f8fd2a824a98f3cd64b0d667b068ce9a876d284af8fef2ee661c910160405180910390a180156112b2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606060de805461064790613896565b610634338383612526565b6112da6116e3565b6112e3816125f4565b50565b6112ee6116e3565b8161ffff1660000361138e5760405162461bcd60e51b815260206004820152604a60248201527f576f726d686f6c65426173655570677261646561626c653a3a7570646174655760448201527f6f726d686f6c6552656d6f746520776f726d686f6c65436861696e496420636160648201527f6e6e6f7420626520302e00000000000000000000000000000000000000000000608482015260a401610781565b806114275760405162461bcd60e51b815260206004820152604160248201527f576f726d686f6c65426173655570677261646561626c653a3a7570646174655760448201527f6f726d686f6c6552656d6f74652052656d6f74652063616e6e6f74206265203060648201527f2e00000000000000000000000000000000000000000000000000000000000000608482015260a401610781565b61ffff8216600081815260cb6020908152604091829020849055815192835282018390527f35e23d9dc327a48e399315447f33b792cbdbee431b0f83f5c78ed734eb709fac91015b60405180910390a15050565b6114836116e3565b6001600160a01b03821660008181526101546020908152604091829020805460ff19168515159081179091558251938452908301527f55a29e82c3e4f8fd2a824a98f3cd64b0d667b068ce9a876d284af8fef2ee661c910161146f565b6114ea3383611936565b61155c5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610781565b6112b284848484612717565b6115706116e3565b604080516001815260001960208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a1565b606060006115ba836127a0565b905060008151116115da57604051806020016040528060008152506115fb565b806040516020016115eb9190613b5f565b6040516020818303038152906040525b9392505050565b61160a6116e3565b6112e3816127f0565b61161b6116e3565b6040518181527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790602001610e5f565b6116536116e3565b6001600160a01b0381166116cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610781565b6112e3816129d4565b600061061c82612a33565b6097546001600160a01b03163314610cb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610781565b6127106bffffffffffffffffffffffff821611156117c35760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610781565b6001600160a01b0382166118195760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610781565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217606555565b600081815260df60205260409020546001600160a01b03166112e35760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610781565b600081815260e160205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906118fd82610d77565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061194283610d77565b9050806001600160a01b0316846001600160a01b0316148061198957506001600160a01b03808216600090815260e2602090815260408083209388168352929052205460ff165b806119ad5750836001600160a01b03166119a2846106ca565b6001600160a01b0316145b949350505050565b826001600160a01b03166119c882610d77565b6001600160a01b031614611a445760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610781565b6001600160a01b038216611abf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610781565b611acc8383836001612aa5565b826001600160a01b0316611adf82610d77565b6001600160a01b031614611b5b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610781565b600081815260e160209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260e0855283862080546000190190559087168086528386208054600101905586865260df90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611c0181612b2d565b600090815260666020526040812055565b60c9546000906001600160a01b0316611c935760405162461bcd60e51b815260206004820152603f60248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c6553656e6420576f726d686f6c65206973206e6f7420646566696e65642e006064820152608401610781565b60c954600160a01b900460ff16611d385760405162461bcd60e51b815260206004820152605260248201527f576f726d686f6c65426173655570677261646561626c653a3a205f776f726d6860448201527f6f6c6553656e6420576f726d686f6c6520636f6e73697374656e6379206c657660648201527f656c206973206e6f7420646566696e65642e0000000000000000000000000000608482015260a401610781565b60c9546040517fb19a437e0000000000000000000000000000000000000000000000000000000081526001600160a01b0382169163b19a437e918591611d909189918991600160a01b90910460ff1690600401613ba0565b60206040518083038185885af1158015611dae573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611dd39190613bea565b60405167ffffffffffffffff821681529091507f2c0ada6fb76253b7077fa555f15478fe8f40ec488c2c43daae2481a1b5dc40099060200160405180910390a19392505050565b80471015611e6a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610781565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b50509050806108405760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610781565b611f3d8383612bdd565b6000828152610143602090815260409182902083905581518481529081018390526001600160a01b038516917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2505050565b60c9546000906060906001600160a01b03166120435760405162461bcd60e51b815260206004820152604260248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520576f726d686f6c65206973206e6f7420646566696e6560648201527f642e000000000000000000000000000000000000000000000000000000000000608482015260a401610781565b60cc5461ffff166120e25760405162461bcd60e51b815260206004820152604b60248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520576f726d686f6c6520436861696e204944206973206e60648201527f6f7420646566696e65642e000000000000000000000000000000000000000000608482015260a401610781565b60c9546040517fc0fd8bde000000000000000000000000000000000000000000000000000000008152600091829182916001600160a01b03169063c0fd8bde90612130908990600401613484565b600060405180830381865afa15801561214d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121759190810190613d3e565b92509250925081819061219b5760405162461bcd60e51b81526004016107819190613484565b50610140830151600090815260ca602052604090205460ff161561224e5760405162461bcd60e51b8152602060048201526044602482018190527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f908201527f6c6552656365697665204d65737361676520616c72656164792070726f63657360648201527f7365642e00000000000000000000000000000000000000000000000000000000608482015260a401610781565b610140830151600090815260ca60209081526040808320805460ff19166001179055606086015161ffff8116845260cb909252909120549095506123205760405162461bcd60e51b815260206004820152605760248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520576f726d686f6c652072656d6f7465206e6f7420646560648201527f66696e6564206f6e20656d697474656420636861696e2e000000000000000000608482015260a401610781565b608083015161ffff8616600090815260cb6020526040902054146123d25760405162461bcd60e51b815260206004820152604160248201527f576f726d686f6c65426173655570677261646561626c653a3a5f776f726d686f60448201527f6c655265636569766520456d6974746572206e6f7420617574686f72697a656460648201527f2e00000000000000000000000000000000000000000000000000000000000000608482015260a401610781565b606080840151608085015160a08601516040805161ffff9094168452602084019290925267ffffffffffffffff16908201527fd013688f55d49dbb965d100e42f874e733aa2db9ced00ce62e643b6f47ecc22e910160405180910390a1505060e00151919391925050565b600054610100900460ff166124a85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b6124b28282612bf7565b6106346040518060400160405280600b81526020017f52656e6f7661204974656d0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f524e564900000000000000000000000000000000000000000000000000000000815250612c11565b816001600160a01b0316836001600160a01b0316036125875760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610781565b6001600160a01b03838116600081815260e26020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008160ff16116126935760405162461bcd60e51b815260206004820152605d60248201527f576f726d686f6c65426173655570677261646561626c653a3a7570646174655760448201527f6f726d686f6c65436f6e73697374656e63794c6576656c20436f6e736973746560648201527f6e6379206c6576656c2063616e6e6f742062652073657420746f20302e000000608482015260a401610781565b60c9546040805160ff8085168252600160a01b90930490921660208301527f4776078413e31938cb5212df6c9a4ceb607c6f05445e7384623373bc2ac632c4910160405180910390a160c9805460ff909216600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6127228484846119b5565b61272e84848484612c86565b6112b25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610781565b60606127ab82611857565b60006127b5612e0f565b905060008151116127d557604051806020016040528060008152506115fb565b806127df84612e1f565b6040516020016115eb929190613e96565b6001600160a01b03811661286c5760405162461bcd60e51b815260206004820152603d60248201527f576f726d686f6c65426173655570677261646561626c653a3a5f75706461746560448201527f576f726d686f6c6520416464726573732063616e6e6f7420626520302e0000006064820152608401610781565b60c954604080516001600160a01b03808516825290921660208301527f24341e031c7687e9eeb2b18d176371aaf18c9cb7cc6574be31aa512b84a17ebc910160405180910390a160c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117909155604080517f9a8a0592000000000000000000000000000000000000000000000000000000008152905160009291639a8a05929160048083019260209291908290030181865afa158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129599190613ec5565b60cc546040805161ffff808516825290921660208301529192507ff08a2a85a4e60e268b72b8ae59558a699797e81a58fa0767f74579aa0415d9a5910160405180910390a160cc80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff9290921691909117905550565b609780546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612a9657506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061061c575061061c82612ebf565b60018111156112b2576001600160a01b03841615612aeb576001600160a01b038416600090815260e0602052604081208054839290612ae59084906138f9565b90915550505b6001600160a01b038316156112b2576001600160a01b038316600090815260e0602052604081208054839290612b229084906138e6565b909155505050505050565b6000612b3882610d77565b9050612b48816000846001612aa5565b612b5182610d77565b600083815260e160209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b03851680855260e08452828520805460001901905587855260df909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610634828260405180602001604052806000815250612f26565b612bff612faf565b612c08826127f0565b610634816125f4565b600054610100900460ff16612c7c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b6106348282613022565b60006001600160a01b0384163b15612e04576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612ce3903390899088908890600401613ee2565b6020604051808303816000875af1925050508015612d1e575060408051601f3d908101601f19168201909252612d1b91810190613f1e565b60015b612dd1573d808015612d4c576040519150601f19603f3d011682016040523d82523d6000602084013e612d51565b606091505b508051600003612dc95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610781565b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490506119ad565b506001949350505050565b6060610141805461064790613896565b60606000612e2c836130a6565b600101905060008167ffffffffffffffff811115612e4c57612e4c613576565b6040519080825280601f01601f191660200182016040528015612e76576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084612e8057509392505050565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061061c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461061c565b612f308383613188565b612f3d6000848484612c86565b6108405760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610781565b600054610100900460ff1661301a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b610cb061332e565b600054610100900460ff1661308d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b60dd61309983826139ad565b5060de61084082826139ad565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106130ef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061311b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061313957662386f26fc10000830492506010015b6305f5e1008310613151576305f5e100830492506008015b612710831061316557612710830492506004015b60648310613177576064830492506002015b600a831061061c5760010192915050565b6001600160a01b0382166131de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610781565b600081815260df60205260409020546001600160a01b0316156132435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610781565b613251600083836001612aa5565b600081815260df60205260409020546001600160a01b0316156132b65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610781565b6001600160a01b038216600081815260e0602090815260408083208054600101905584835260df909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600054610100900460ff166133995760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610781565b610cb0336129d4565b6001600160e01b0319811681146112e357600080fd5b6000602082840312156133ca57600080fd5b81356115fb816133a2565b6001600160a01b03811681146112e357600080fd5b600080604083850312156133fd57600080fd5b8235613408816133d5565b915060208301356bffffffffffffffffffffffff8116811461342957600080fd5b809150509250929050565b60005b8381101561344f578181015183820152602001613437565b50506000910152565b60008151808452613470816020860160208601613434565b601f01601f19169290920160200192915050565b6020815260006115fb6020830184613458565b6000602082840312156134a957600080fd5b5035919050565b600080604083850312156134c357600080fd5b82356134ce816133d5565b946020939093013593505050565b6000806000606084860312156134f157600080fd5b83356134fc816133d5565b9250602084013561350c816133d5565b929592945050506040919091013590565b61ffff811681146112e357600080fd5b60008060006060848603121561354257600080fd5b83359250602084013561350c8161351d565b6000806040838503121561356757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156135af576135af613576565b60405290565b604051610160810167ffffffffffffffff811182821017156135af576135af613576565b604051601f8201601f1916810167ffffffffffffffff8111828210171561360257613602613576565b604052919050565b600067ffffffffffffffff82111561362457613624613576565b50601f01601f191660200190565b60006136456136408461360a565b6135d9565b905082815283838301111561365957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561368257600080fd5b813567ffffffffffffffff81111561369957600080fd5b8201601f810184136136aa57600080fd5b6119ad84823560208401613632565b6000602082840312156136cb57600080fd5b81356115fb816133d5565b600082601f8301126136e757600080fd5b6115fb83833560208501613632565b60006020828403121561370857600080fd5b813567ffffffffffffffff81111561371f57600080fd5b6119ad848285016136d6565b60ff811681146112e357600080fd5b60008060006060848603121561374f57600080fd5b833561375a816133d5565b9250602084013561376a816133d5565b9150604084013561377a8161372b565b809150509250925092565b80151581146112e357600080fd5b600080604083850312156137a657600080fd5b82356137b1816133d5565b9150602083013561342981613785565b6000602082840312156137d357600080fd5b81356115fb8161372b565b600080604083850312156137f157600080fd5b82356134ce8161351d565b6000806000806080858703121561381257600080fd5b843561381d816133d5565b9350602085013561382d816133d5565b925060408501359150606085013567ffffffffffffffff81111561385057600080fd5b61385c878288016136d6565b91505092959194509250565b6000806040838503121561387b57600080fd5b8235613886816133d5565b91506020830135613429816133d5565b600181811c908216806138aa57607f821691505b6020821081036138ca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561061c5761061c6138d0565b8181038181111561061c5761061c6138d0565b808202811582820484141761061c5761061c6138d0565b60008261394057634e487b7160e01b600052601260045260246000fd5b500490565b60006000198203613958576139586138d0565b5060010190565b601f82111561084057600081815260208120601f850160051c810160208610156139865750805b601f850160051c820191505b818110156139a557828155600101613992565b505050505050565b815167ffffffffffffffff8111156139c7576139c7613576565b6139db816139d58454613896565b8461395f565b602080601f831160018114613a1057600084156139f85750858301515b600019600386901b1c1916600185901b1785556139a5565b600085815260208120601f198616915b82811015613a3f57888601518255948401946001909101908401613a20565b5085821015613a5d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835260008454613a8181613896565b80848701526040600180841660008114613aa25760018114613abc57613aea565b60ff198516838a01528284151560051b8a01019550613aea565b896000528660002060005b85811015613ae25781548b8201860152908301908801613ac7565b8a0184019650505b509398975050505050505050565b8051613b038161351d565b919050565b600080600080600060a08688031215613b2057600080fd5b855194506020860151613b32816133d5565b604087015160608801519195509350613b4a8161351d565b80925050608086015190509295509295909350565b60008251613b71818460208701613434565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b63ffffffff84168152606060208201526000613bbf6060830185613458565b905060ff83166040830152949350505050565b805167ffffffffffffffff81168114613b0357600080fd5b600060208284031215613bfc57600080fd5b6115fb82613bd2565b8051613b038161372b565b805163ffffffff81168114613b0357600080fd5b600082601f830112613c3557600080fd5b8151613c436136408261360a565b818152846020838601011115613c5857600080fd5b6119ad826020830160208701613434565b600082601f830112613c7a57600080fd5b8151602067ffffffffffffffff821115613c9657613c96613576565b613ca4818360051b016135d9565b82815260079290921b84018101918181019086841115613cc357600080fd5b8286015b84811015613d285760808189031215613ce05760008081fd5b613ce861358c565b815181528482015185820152604080830151613d038161372b565b90820152606082810151613d168161372b565b90820152835291830191608001613cc7565b509695505050505050565b8051613b0381613785565b600080600060608486031215613d5357600080fd5b835167ffffffffffffffff80821115613d6b57600080fd5b908501906101608288031215613d8057600080fd5b613d886135b5565b613d9183613c05565b8152613d9f60208401613c10565b6020820152613db060408401613c10565b6040820152613dc160608401613af8565b606082015260808301516080820152613ddc60a08401613bd2565b60a0820152613ded60c08401613c05565b60c082015260e083015182811115613e0457600080fd5b613e1089828601613c24565b60e083015250610100613e24818501613c10565b908201526101208381015183811115613e3c57600080fd5b613e488a828701613c69565b918301919091525061014083810151908201529450613e6960208701613d33565b93506040860151915080821115613e7f57600080fd5b50613e8c86828701613c24565b9150509250925092565b60008351613ea8818460208801613434565b835190830190613ebc818360208801613434565b01949350505050565b600060208284031215613ed757600080fd5b81516115fb8161351d565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613f146080830184613458565b9695505050505050565b600060208284031215613f3057600080fd5b81516115fb816133a256fea2646970667358221220368e395c76b602d2e4605784ca717f09e47f0aa3405b1945e2ca01fa2d3a6cdc64736f6c63430008130033
Deployed Bytecode Sourcemap
82701:1244:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76508:328;;;;;;;;;;-1:-1:-1;76508:328:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;76508:328:0;;;;;;;;79817:180;;;;;;;;;;-1:-1:-1;79817:180:0;;;;;:::i;:::-;;:::i;:::-;;45694:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47217:171::-;;;;;;;;;;-1:-1:-1;47217:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2401:55:1;;;2383:74;;2371:2;2356:18;47217:171:0;2237:226:1;46724:427:0;;;;;;;;;;-1:-1:-1;46724:427:0;;;;;:::i;:::-;;:::i;47917:335::-;;;;;;;;;;-1:-1:-1;47917:335:0;;;;;:::i;:::-;;:::i;77976:1386::-;;;;;;:::i;:::-;;:::i;62289:442::-;;;;;;;;;;-1:-1:-1;62289:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4202:55:1;;;4184:74;;4289:2;4274:18;;4267:34;;;;4157:18;62289:442:0;4010:297:1;68850:281:0;;;;;;;;;;;;;:::i;83369:303::-;;;;;;;;;;-1:-1:-1;83369:303:0;;;;;:::i;:::-;;:::i;48323:185::-;;;;;;;;;;-1:-1:-1;48323:185:0;;;;;:::i;:::-;;:::i;45404:223::-;;;;;;;;;;-1:-1:-1;45404:223:0;;;;;:::i;:::-;;:::i;80042:256::-;;;;;;;;;;-1:-1:-1;80042:256:0;;;;;:::i;:::-;;:::i;45135:207::-;;;;;;;;;;-1:-1:-1;45135:207:0;;;;;:::i;:::-;;:::i;:::-;;;6806:25:1;;;6794:2;6779:18;45135:207:0;6660:177:1;80676:149:0;;;;;;;;;;;;;:::i;76881:1050::-;;;;;;;;;;-1:-1:-1;76881:1050:0;;;;;:::i;:::-;;:::i;82970:358::-;;;;;;;;;;-1:-1:-1;82970:358:0;;;;;:::i;:::-;;:::i;23867:87::-;;;;;;;;;;-1:-1:-1;23940:6:0;;-1:-1:-1;;;;;23940:6:0;23867:87;;45863:104;;;;;;;;;;;;;:::i;47460:155::-;;;;;;;;;;-1:-1:-1;47460:155:0;;;;;:::i;:::-;;:::i;67962:192::-;;;;;;;;;;-1:-1:-1;67962:192:0;;;;;:::i;:::-;;:::i;68208:588::-;;;;;;;;;;-1:-1:-1;68208:588:0;;;;;:::i;:::-;;:::i;83713:229::-;;;;;;;;;;-1:-1:-1;83713:229:0;;;;;:::i;:::-;;:::i;48579:322::-;;;;;;;;;;-1:-1:-1;48579:322:0;;;;;:::i;:::-;;:::i;80505:123::-;;;;;;;;;;;;;:::i;79418:337::-;;;;;;;;;;-1:-1:-1;79418:337:0;;;;;:::i;:::-;;:::i;67794:114::-;;;;;;;;;;-1:-1:-1;67794:114:0;;;;;:::i;:::-;;:::i;80343:117::-;;;;;;;;;;-1:-1:-1;80343:117:0;;;;;:::i;:::-;;:::i;47686:164::-;;;;;;;;;;-1:-1:-1;47686:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;47807:25:0;;;47783:4;47807:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;47686:164;24773:201;;;;;;;;;;-1:-1:-1;24773:201:0;;;;;:::i;:::-;;:::i;76508:328::-;76700:4;-1:-1:-1;;;;;;76742:33:0;;76757:18;76742:33;;:86;;;76792:36;76816:11;76792:23;:36::i;:::-;76722:106;76508:328;-1:-1:-1;;76508:328:0:o;79817:180::-;23753:13;:11;:13::i;:::-;79947:42:::1;79966:8;79976:12;79947:18;:42::i;:::-;79817:180:::0;;:::o;45694:100::-;45748:13;45781:5;45774:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45694:100;:::o;47217:171::-;47293:7;47313:23;47328:7;47313:14;:23::i;:::-;-1:-1:-1;47356:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;47356:24:0;;47217:171::o;46724:427::-;46805:13;46821:34;46847:7;46821:25;:34::i;:::-;46805:50;;46880:5;-1:-1:-1;;;;;46874:11:0;:2;-1:-1:-1;;;;;46874:11:0;;46866:57;;;;-1:-1:-1;;;46866:57:0;;10825:2:1;46866:57:0;;;10807:21:1;10864:2;10844:18;;;10837:30;10903:34;10883:18;;;10876:62;10974:3;10954:18;;;10947:31;10995:19;;46866:57:0;;;;;;;;;22675:10;-1:-1:-1;;;;;46958:21:0;;;;:62;;-1:-1:-1;;;;;;47807:25:0;;47783:4;47807:25;;;:18;:25;;;;;;;;22675:10;47807:35;;;;;;;;;;46983:37;46936:173;;;;-1:-1:-1;;;46936:173:0;;11227:2:1;46936:173:0;;;11209:21:1;11266:2;11246:18;;;11239:30;11305:34;11285:18;;;11278:62;11376:31;11356:18;;;11349:59;11425:19;;46936:173:0;11025:425:1;46936:173:0;47122:21;47131:2;47135:7;47122:8;:21::i;:::-;46794:357;46724:427;;:::o;47917:335::-;48112:41;22675:10;48145:7;48112:18;:41::i;:::-;48104:99;;;;-1:-1:-1;;;48104:99:0;;11657:2:1;48104:99:0;;;11639:21:1;11696:2;11676:18;;;11669:30;11735:34;11715:18;;;11708:62;11806:15;11786:18;;;11779:43;11839:19;;48104:99:0;11455:409:1;48104:99:0;48216:28;48226:4;48232:2;48236:7;48216:9;:28::i;77976:1386::-;78146:17;50302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50302:16:0;22675:10;78216:25;;78194:131;;;;-1:-1:-1;;;78194:131:0;;12071:2:1;78194:131:0;;;12053:21:1;12110:2;12090:18;;;12083:30;12149:34;12129:18;;;12122:62;12220:26;12200:18;;;12193:54;12264:19;;78194:131:0;11869:420:1;78194:131:0;78373:18;78360:9;:31;;78338:145;;;;;-1:-1:-1;;;78338:145:0;;12496:2:1;78338:145:0;;;12478:21:1;12515:18;;;12508:30;;;;12574:34;12554:18;;;12547:62;12645:34;12625:18;;;12618:62;12697:19;;78338:145:0;12294:428:1;78338:145:0;78518:36;;;78566:1;78518:36;;;:16;:36;;;;;;78496:156;;;;-1:-1:-1;;;78496:156:0;;12929:2:1;78496:156:0;;;12911:21:1;12968:2;12948:18;;;12941:30;13007:34;12987:18;;;12980:62;13078:26;13058:18;;;13051:54;13122:19;;78496:156:0;12727:420:1;78496:156:0;78665:14;78671:7;78665:5;:14::i;:::-;78692:22;;;;:13;:22;;;;;:27;;78718:1;;78692:22;:27;;78718:1;;78692:27;:::i;:::-;;;;-1:-1:-1;;78732:30:0;78765:26;;;:17;:26;;;;;;;;;;78968:13;:22;;;;;;78827:174;;;;;13728:25:1;;;-1:-1:-1;;;;;13789:55:1;;13769:18;;;13762:83;13861:18;;;13854:34;;;13936:6;13924:19;;13904:18;;;13897:47;13960:19;;;;13953:35;;;;78827:174:0;;;;;;;;;;13700:19:1;;78827:174:0;;;79021:26;;;;;;;79014:33;;;;78765:26;;79078:45;78732:30;78827:174;79104:18;79078:13;:45::i;:::-;79060:63;-1:-1:-1;22675:10:0;79141:213;79198:7;79220:22;79257:18;79060:63;79313:30;79325:18;79313:9;:30;:::i;:::-;79141:213;;;14388:25:1;;;14444:2;14429:18;;14422:34;;;;14504:6;14492:19;;;;14472:18;;;14465:47;14560:18;14548:31;14543:2;14528:18;;14521:59;14611:3;14596:19;;14589:35;79141:213:0;;;;;14375:3:1;79141:213:0;;;78135:1227;;;;77976:1386;;;:::o;62289:442::-;62386:7;62444:27;;;:17;:27;;;;;;;;62415:56;;;;;;;;;-1:-1:-1;;;;;62415:56:0;;;;;-1:-1:-1;;;62415:56:0;;;;;;;;;;;;62386:7;;62484:92;;-1:-1:-1;62535:29:0;;;;;;;;;62545:19;62535:29;-1:-1:-1;;;;;62535:29:0;;;;-1:-1:-1;;;62535:29:0;;;;;;;;62484:92;62626:23;;;;62588:21;;63097:5;;62613:36;;62612:58;62613:36;:10;:36;:::i;:::-;62612:58;;;;:::i;:::-;62691:16;;;;;-1:-1:-1;62289:442:0;;-1:-1:-1;;;;62289:442:0:o;68850:281::-;23753:13;:11;:13::i;:::-;68966:1:::1;68942:21;:25;68920:138;;;::::0;-1:-1:-1;;;68920:138:0;;15478:2:1;68920:138:0::1;::::0;::::1;15460:21:1::0;15517:2;15497:18;;;15490:30;15556:34;15536:18;;;15529:62;15627:33;15607:18;;;15600:61;15678:19;;68920:138:0::1;15276:427:1::0;68920:138:0::1;69071:52;69079:10;69101:21;69071:29;:52::i;:::-;68850:281::o:0;83369:303::-;22675:10;83470:31;;;;:17;:31;;;;;;;;83448:118;;;;-1:-1:-1;;;83448:118:0;;15910:2:1;83448:118:0;;;15892:21:1;15949:2;15929:18;;;15922:30;15988:34;15968:18;;;15961:62;16059:7;16039:18;;;16032:35;16084:19;;83448:118:0;15708:401:1;83448:118:0;83579:15;:17;;;:15;:17;;;:::i;:::-;;;;;;83609:55;83619:10;83631:15;;83648;83609:9;:55::i;48323:185::-;48461:39;48478:4;48484:2;48488:7;48461:39;;;;;;;;;;;;:16;:39::i;45404:223::-;45476:7;50302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50302:16:0;;45540:56;;;;-1:-1:-1;;;45540:56:0;;16516:2:1;45540:56:0;;;16498:21:1;16555:2;16535:18;;;16528:30;16594:26;16574:18;;;16567:54;16638:18;;45540:56:0;16314:348:1;80042:256:0;23753:13;:11;:13::i;:::-;80152:14:::1;:30;80169:13:::0;80152:14;:30:::1;:::i;:::-;;80200:31;80216:14;80200:31;;;;;;:::i;:::-;;;;;;;;80249:41;::::0;;80269:1:::1;20258:25:1::0;;-1:-1:-1;;20314:2:1;20299:18;;20292:34;80249:41:0::1;::::0;20231:18:1;80249:41:0::1;;;;;;;;80042:256:::0;:::o;45135:207::-;45207:7;-1:-1:-1;;;;;45235:19:0;;45227:73;;;;-1:-1:-1;;;45227:73:0;;20539:2:1;45227:73:0;;;20521:21:1;20578:2;20558:18;;;20551:30;20617:34;20597:18;;;20590:62;20688:11;20668:18;;;20661:39;20717:19;;45227:73:0;20337:405:1;45227:73:0;-1:-1:-1;;;;;;45318:16:0;;;;;:9;:16;;;;;;;45135:207::o;80676:149::-;23753:13;:11;:13::i;:::-;80747:70:::1;::::0;-1:-1:-1;;;80747:70:0;;20949:2:1;80747:70:0::1;::::0;::::1;20931:21:1::0;20988:2;20968:18;;;20961:30;21027:34;21007:18;;;21000:62;21098:30;21078:18;;;21071:58;21146:19;;80747:70:0::1;20747:424:1::0;76881:1050:0;76977:29;77021:20;77055:29;77072:11;77055:16;:29::i;:::-;76962:122;;;;77112:15;77142:17;77174:23;77212:25;77252:19;77296:7;77285:65;;;;;;;;;;;;:::i;:::-;77385:16;;77097:253;;-1:-1:-1;77097:253:0;;-1:-1:-1;77097:253:0;;-1:-1:-1;77097:253:0;-1:-1:-1;77097:253:0;-1:-1:-1;77385:38:0;;;;:16;;:38;77363:150;;;;-1:-1:-1;;;77363:150:0;;22100:2:1;77363:150:0;;;22082:21:1;22139:2;22119:18;;;22112:30;22178:34;22158:18;;;22151:62;22249:32;22229:18;;;22222:60;22299:19;;77363:150:0;21898:426:1;77363:150:0;77562:22;;;;:13;:22;;;;;;77548:36;;77526:133;;;;-1:-1:-1;;;77526:133:0;;22531:2:1;77526:133:0;;;22513:21:1;22570:2;22550:18;;;22543:30;22609:34;22589:18;;;22582:62;22680:17;22660:18;;;22653:45;22715:19;;77526:133:0;22329:411:1;77526:133:0;77677:138;;;22945:25:1;;;23001:2;22986:18;;22979:34;;;23061:6;23049:19;;23029:18;;;23022:47;77677:138:0;;-1:-1:-1;;;;;77677:138:0;;;;;;;;;22933:2:1;77677:138:0;;;77828:22;;;;:13;:22;;;;;:36;;;77877:46;77887:9;77842:7;77907:15;77877:9;:46::i;:::-;76951:980;;;;;;;76881:1050;:::o;82970:358::-;18943:19;18966:13;;;;;;18965:14;;19013:34;;;;-1:-1:-1;19031:12:0;;19046:1;19031:12;;;;:16;19013:34;19012:108;;;-1:-1:-1;19092:4:0;26948:19;:23;;;19053:66;;-1:-1:-1;19102:12:0;;;;;:17;19053:66;18990:204;;;;-1:-1:-1;;;18990:204:0;;23282:2:1;18990:204:0;;;23264:21:1;23321:2;23301:18;;;23294:30;23360:34;23340:18;;;23333:62;23431:16;23411:18;;;23404:44;23465:19;;18990:204:0;23080:410:1;18990:204:0;19205:12;:16;;-1:-1:-1;;19205:16:0;19220:1;19205:16;;;19232:67;;;;19267:13;:20;;-1:-1:-1;;19267:20:0;;;;;19232:67;83131:57:::1;83153:8;83163:24;83131:21;:57::i;:::-;-1:-1:-1::0;;;;;83201:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:32;;-1:-1:-1;;83201:32:0::1;83229:4;83201:32:::0;;::::1;::::0;;;83244:15:::1;:19:::0;;;;83281:39;;23663:74:1;;;23753:18;;;23746:50;;;;83281:39:0::1;::::0;23636:18:1;83281:39:0::1;;;;;;;19325:14:::0;19321:102;;;19372:5;19356:21;;-1:-1:-1;;19356:21:0;;;19397:14;;-1:-1:-1;23959:36:1;;19397:14:0;;23947:2:1;23932:18;19397:14:0;;;;;;;19321:102;18932:498;82970:358;;;:::o;45863:104::-;45919:13;45952:7;45945:14;;;;;:::i;47460:155::-;47555:52;22675:10;47588:8;47598;47555:18;:52::i;67962:192::-;23753:13;:11;:13::i;:::-;68089:57:::1;68121:24;68089:31;:57::i;:::-;67962:192:::0;:::o;68208:588::-;23753:13;:11;:13::i;:::-;68374:15:::1;:20;;68393:1;68374:20:::0;68352:144:::1;;;::::0;-1:-1:-1;;;68352:144:0;;24208:2:1;68352:144:0::1;::::0;::::1;24190:21:1::0;24247:2;24227:18;;;24220:30;24286:34;24266:18;;;24259:62;24357:34;24337:18;;;24330:62;24429:12;24408:19;;;24401:41;24459:19;;68352:144:0::1;24006:478:1::0;68352:144:0::1;68529:16:::0;68507:145:::1;;;::::0;-1:-1:-1;;;68507:145:0;;24691:2:1;68507:145:0::1;::::0;::::1;24673:21:1::0;24730:2;24710:18;;;24703:30;24769:34;24749:18;;;24742:62;24840:34;24820:18;;;24813:62;24912:3;24891:19;;;24884:32;24933:19;;68507:145:0::1;24489:469:1::0;68507:145:0::1;68663:33;::::0;::::1;;::::0;;;:16:::1;:33;::::0;;;;;;;;:52;;;68733:55;;25135:38:1;;;25189:18;;25182:34;;;68733:55:0::1;::::0;25108:18:1;68733:55:0::1;;;;;;;;68208:588:::0;;:::o;83713:229::-;23753:13;:11;:13::i;:::-;-1:-1:-1;;;;;83841:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;;:34;;-1:-1:-1;;83841:34:0::1;::::0;::::1;;::::0;;::::1;::::0;;;83893:41;;23663:74:1;;;23753:18;;;23746:50;83893:41:0::1;::::0;23636:18:1;83893:41:0::1;23495:307:1::0;48579:322:0;48753:41;22675:10;48786:7;48753:18;:41::i;:::-;48745:99;;;;-1:-1:-1;;;48745:99:0;;11657:2:1;48745:99:0;;;11639:21:1;11696:2;11676:18;;;11669:30;11735:34;11715:18;;;11708:62;11806:15;11786:18;;;11779:43;11839:19;;48745:99:0;11455:409:1;48745:99:0;48855:38;48869:4;48875:2;48879:7;48888:4;48855:13;:38::i;80505:123::-;23753:13;:11;:13::i;:::-;80579:41:::1;::::0;;80599:1:::1;20258:25:1::0;;-1:-1:-1;;20314:2:1;20299:18;;20292:34;80579:41:0::1;::::0;20231:18:1;80579:41:0::1;;;;;;;80505:123::o:0;79418:337::-;79499:13;79525:28;79556:35;79583:7;79556:26;:35::i;:::-;79525:66;;79655:1;79630:14;79624:28;:32;:123;;;;;;;;;;;;;;;;;79700:14;79683:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;79624:123;79604:143;79418:337;-1:-1:-1;;;79418:337:0:o;67794:114::-;23753:13;:11;:13::i;:::-;67875:25:::1;67891:8;67875:15;:25::i;80343:117::-:0;23753:13;:11;:13::i;:::-;80429:23:::1;::::0;6806:25:1;;;80429:23:0::1;::::0;6794:2:1;6779:18;80429:23:0::1;6660:177:1::0;24773:201:0;23753:13;:11;:13::i;:::-;-1:-1:-1;;;;;24862:22:0;::::1;24854:73;;;::::0;-1:-1:-1;;;24854:73:0;;25890:2:1;24854:73:0::1;::::0;::::1;25872:21:1::0;25929:2;25909:18;;;25902:30;25968:34;25948:18;;;25941:62;26039:8;26019:18;;;26012:36;26065:19;;24854:73:0::1;25688:402:1::0;24854:73:0::1;24938:28;24957:8;24938:18;:28::i;65410:192::-:0;65534:4;65558:36;65582:11;65558:23;:36::i;24032:132::-;23940:6;;-1:-1:-1;;;;;23940:6:0;22675:10;24096:23;24088:68;;;;-1:-1:-1;;;24088:68:0;;26297:2:1;24088:68:0;;;26279:21:1;;;26316:18;;;26309:30;26375:34;26355:18;;;26348:62;26427:18;;24088:68:0;26095:356:1;63381:332:0;63097:5;63484:33;;;;;63476:88;;;;-1:-1:-1;;;63476:88:0;;26658:2:1;63476:88:0;;;26640:21:1;26697:2;26677:18;;;26670:30;26736:34;26716:18;;;26709:62;26807:12;26787:18;;;26780:40;26837:19;;63476:88:0;26456:406:1;63476:88:0;-1:-1:-1;;;;;63583:22:0;;63575:60;;;;-1:-1:-1;;;63575:60:0;;27069:2:1;63575:60:0;;;27051:21:1;27108:2;27088:18;;;27081:30;27147:27;27127:18;;;27120:55;27192:18;;63575:60:0;26867:349:1;63575:60:0;63670:35;;;;;;;;;-1:-1:-1;;;;;63670:35:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;63648:57:0;;;;:19;:57;63381:332::o;57102:135::-;50704:4;50302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50302:16:0;57176:53;;;;-1:-1:-1;;;57176:53:0;;16516:2:1;57176:53:0;;;16498:21:1;16555:2;16535:18;;;16528:30;16594:26;16574:18;;;16567:54;16638:18;;57176:53:0;16314:348:1;56370:185:0;56445:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;56445:29:0;-1:-1:-1;;;;;56445:29:0;;;;;;;;:24;;56499:34;56445:24;56499:25;:34::i;:::-;-1:-1:-1;;;;;56490:57:0;;;;;;;;;;;56370:185;;:::o;50934:275::-;51027:4;51044:13;51060:34;51086:7;51060:25;:34::i;:::-;51044:50;;51124:5;-1:-1:-1;;;;;51113:16:0;:7;-1:-1:-1;;;;;51113:16:0;;:52;;;-1:-1:-1;;;;;;47807:25:0;;;47783:4;47807:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;51133:32;51113:87;;;;51193:7;-1:-1:-1;;;;;51169:31:0;:20;51181:7;51169:11;:20::i;:::-;-1:-1:-1;;;;;51169:31:0;;51113:87;51105:96;50934:275;-1:-1:-1;;;;50934:275:0:o;54966:1285::-;55136:4;-1:-1:-1;;;;;55098:42:0;:34;55124:7;55098:25;:34::i;:::-;-1:-1:-1;;;;;55098:42:0;;55090:92;;;;-1:-1:-1;;;55090:92:0;;27423:2:1;55090:92:0;;;27405:21:1;27462:2;27442:18;;;27435:30;27501:34;27481:18;;;27474:62;27572:7;27552:18;;;27545:35;27597:19;;55090:92:0;27221:401:1;55090:92:0;-1:-1:-1;;;;;55201:16:0;;55193:65;;;;-1:-1:-1;;;55193:65:0;;27829:2:1;55193:65:0;;;27811:21:1;27868:2;27848:18;;;27841:30;27907:34;27887:18;;;27880:62;27978:6;27958:18;;;27951:34;28002:19;;55193:65:0;27627:400:1;55193:65:0;55271:42;55292:4;55298:2;55302:7;55311:1;55271:20;:42::i;:::-;55454:4;-1:-1:-1;;;;;55416:42:0;:34;55442:7;55416:25;:34::i;:::-;-1:-1:-1;;;;;55416:42:0;;55408:92;;;;-1:-1:-1;;;55408:92:0;;27423:2:1;55408:92:0;;;27405:21:1;27462:2;27442:18;;;27435:30;27501:34;27481:18;;;27474:62;27572:7;27552:18;;;27545:35;27597:19;;55408:92:0;27221:401:1;55408:92:0;55572:24;;;;:15;:24;;;;;;;;55565:31;;-1:-1:-1;;55565:31:0;;;;;;-1:-1:-1;;;;;56048:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;56048:20:0;;;56083:13;;;;;;;;;:18;;55565:31;56083:18;;;56123:16;;;:7;:16;;;;;;:21;;;;;;;;;;56162:27;;55588:7;;56162:27;;;46794:357;46724:427;;:::o;65734:135::-;65803:20;65815:7;65803:11;:20::i;:::-;64745:26;;;;:17;:26;;;;;64738:33;67962:192::o;69275:684::-;69472:9;;69422:15;;-1:-1:-1;;;;;69472:9:0;69450:136;;;;-1:-1:-1;;;69450:136:0;;28234:2:1;69450:136:0;;;28216:21:1;28273:2;28253:18;;;28246:30;28312:34;28292:18;;;28285:62;28383:33;28363:18;;;28356:61;28434:19;;69450:136:0;28032:427:1;69450:136:0;69619:25;;-1:-1:-1;;;69619:25:0;;;;69597:161;;;;-1:-1:-1;;;69597:161:0;;28666:2:1;69597:161:0;;;28648:21:1;28705:2;28685:18;;;28678:30;28744:34;28724:18;;;28717:62;28815:34;28795:18;;;28788:62;28887:20;28866:19;;;28859:49;28925:19;;69597:161:0;28464:486:1;69597:161:0;69792:9;;69782:129;;;;;-1:-1:-1;;;;;69792:9:0;;;69782:35;;69839:18;;69782:129;;69869:5;;69876:7;;-1:-1:-1;;;69885:25:0;;;;;;69782:129;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69929:22;;29907:18:1;29895:31;;29877:50;;69771:140:0;;-1:-1:-1;69929:22:0;;29865:2:1;29850:18;69929:22:0;;;;;;;69275:684;;;;;:::o;27914:317::-;28029:6;28004:21;:31;;27996:73;;;;-1:-1:-1;;;27996:73:0;;30140:2:1;27996:73:0;;;30122:21:1;30179:2;30159:18;;;30152:30;30218:31;30198:18;;;30191:59;30267:18;;27996:73:0;29938:353:1;27996:73:0;28083:12;28101:9;-1:-1:-1;;;;;28101:14:0;28123:6;28101:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28082:52;;;28153:7;28145:78;;;;-1:-1:-1;;;28145:78:0;;30708:2:1;28145:78:0;;;30690:21:1;30747:2;30727:18;;;30720:30;30786:34;30766:18;;;30759:62;30857:28;30837:18;;;30830:56;30903:19;;28145:78:0;30506:422:1;81008:298:0;81151:30;81161:10;81173:7;81151:9;:30::i;:::-;81194:26;;;;:17;:26;;;;;;;;;:44;;;81256:42;;20258:25:1;;;20299:18;;;20292:34;;;-1:-1:-1;;;;;81256:42:0;;;;;20231:18:1;81256:42:0;;;;;;;81008:298;;;:::o;70072:1418::-;70242:9;;70164:21;;70187:20;;-1:-1:-1;;;;;70242:9:0;70220:139;;;;-1:-1:-1;;;70220:139:0;;31388:2:1;70220:139:0;;;31370:21:1;31427:2;31407:18;;;31400:30;31466:34;31446:18;;;31439:62;31537:34;31517:18;;;31510:62;31609:4;31588:19;;;31581:33;31631:19;;70220:139:0;31186:470:1;70220:139:0;70392:16;;;;70370:145;;;;-1:-1:-1;;;70370:145:0;;31863:2:1;70370:145:0;;;31845:21:1;31902:2;31882:18;;;31875:30;31941:34;31921:18;;;31914:62;32012:34;31992:18;;;31985:62;32084:13;32063:19;;;32056:42;32115:19;;70370:145:0;31661:479:1;70370:145:0;70656:9;;70646:48;;;;;70543:29;;;;;;-1:-1:-1;;;;;70656:9:0;;70646:37;;:48;;70684:9;;70646:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70646:48:0;;;;;;;;;;;;:::i;:::-;70528:166;;;;;;70715:5;70722:6;70707:22;;;;;-1:-1:-1;;;70707:22:0;;;;;;;;:::i;:::-;-1:-1:-1;70787:7:0;;;;70763:32;;;;:23;:32;;;;;;;;70762:33;70740:151;;;;-1:-1:-1;;;70740:151:0;;36548:2:1;70740:151:0;;;36530:21:1;36587:2;36567:18;;;36560:30;;;36626:34;36606:18;;;36599:62;36697:34;36677:18;;;36670:62;36769:6;36748:19;;;36741:35;36793:19;;70740:151:0;36346:472:1;70740:151:0;70928:7;;;;70904:32;;;;:23;:32;;;;;;;;:39;;-1:-1:-1;;70904:39:0;70939:4;70904:39;;;70973:17;;;;71025:32;;;;;:16;:32;;;;;;;70973:17;;-1:-1:-1;71003:183:0;;;;-1:-1:-1;;;71003:183:0;;37025:2:1;71003:183:0;;;37007:21:1;37064:2;37044:18;;;37037:30;37103:34;37083:18;;;37076:62;37174:34;37154:18;;;37147:62;37246:25;37225:19;;;37218:54;37289:19;;71003:183:0;36823:491:1;71003:183:0;71255:17;;;;71219:32;;;;;;;:16;:32;;;;;;:53;71197:168;;;;-1:-1:-1;;;71197:168:0;;37521:2:1;71197:168:0;;;37503:21:1;37560:2;37540:18;;;37533:30;37599:34;37579:18;;;37572:62;37670:34;37650:18;;;37643:62;37742:3;37721:19;;;37714:32;37763:19;;71197:168:0;37319:469:1;71197:168:0;71399:17;;;;;71418;;;;71437:11;;;;71383:66;;;38021:6:1;38009:19;;;37991:38;;38060:2;38045:18;;38038:34;;;;38120:18;38108:31;38088:18;;;38081:59;71383:66:0;;37964:18:1;71383:66:0;;;;;;;-1:-1:-1;;71472:10:0;;;70072:1418;;71472:10;;-1:-1:-1;;70072:1418:0:o;76196:264::-;21086:13;;;;;;;21078:69;;;;-1:-1:-1;;;21078:69:0;;38353:2:1;21078:69:0;;;38335:21:1;38392:2;38372:18;;;38365:30;38431:34;38411:18;;;38404:62;-1:-1:-1;;;38482:18:1;;;38475:41;38533:19;;21078:69:0;38151:407:1;21078:69:0;76339:66:::1;76370:8;76380:24;76339:30;:66::i;:::-;76416:36;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:13:::1;:36::i;56698:315::-:0;56853:8;-1:-1:-1;;;;;56844:17:0;:5;-1:-1:-1;;;;;56844:17:0;;56836:55;;;;-1:-1:-1;;;56836:55:0;;38765:2:1;56836:55:0;;;38747:21:1;38804:2;38784:18;;;38777:30;38843:27;38823:18;;;38816:55;38888:18;;56836:55:0;38563:349:1;56836:55:0;-1:-1:-1;;;;;56902:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;56902:46:0;;;;;;;;;;56964:41;;586::1;;;56964::0;;559:18:1;56964:41:0;;;;;;;56698:315;;;:::o;72210:491::-;72368:1;72341:24;:28;;;72319:171;;;;-1:-1:-1;;;72319:171:0;;39119:2:1;72319:171:0;;;39101:21:1;39158:2;39138:18;;;39131:30;39197:34;39177:18;;;39170:62;39268:34;39248:18;;;39241:62;39340:31;39319:19;;;39312:60;39389:19;;72319:171:0;38917:497:1;72319:171:0;72592:25;;72508:120;;;72592:25;39603:17:1;;;39585:36;;-1:-1:-1;;;72592:25:0;;;;;;39652:2:1;39637:18;;39630:45;72508:120:0;;39558:18:1;72508:120:0;;;;;;;72641:25;:52;;;;;;-1:-1:-1;;;72641:52:0;;;;;;;;;;;72210:491::o;49782:313::-;49938:28;49948:4;49954:2;49958:7;49938:9;:28::i;:::-;49985:47;50008:4;50014:2;50018:7;50027:4;49985:22;:47::i;:::-;49977:110;;;;-1:-1:-1;;;49977:110:0;;39888:2:1;49977:110:0;;;39870:21:1;39927:2;39907:18;;;39900:30;39966:34;39946:18;;;39939:62;40037:20;40017:18;;;40010:48;40075:19;;49977:110:0;39686:414:1;46038:281:0;46111:13;46137:23;46152:7;46137:14;:23::i;:::-;46173:21;46197:10;:8;:10::i;:::-;46173:34;;46249:1;46231:7;46225:21;:25;:86;;;;;;;;;;;;;;;;;46277:7;46286:18;:7;:16;:18::i;:::-;46260:45;;;;;;;;;:::i;71598:479::-;-1:-1:-1;;;;;71683:22:0;;71661:133;;;;-1:-1:-1;;;71661:133:0;;40808:2:1;71661:133:0;;;40790:21:1;40847:2;40827:18;;;40820:30;40886:34;40866:18;;;40859:62;40957:31;40937:18;;;40930:59;41006:19;;71661:133:0;40606:425:1;71661:133:0;71837:9;;71812:35;;;-1:-1:-1;;;;;41289:15:1;;;41271:34;;71837:9:0;;;41336:2:1;41321:18;;41314:43;71812:35:0;;41183:18:1;71812:35:0;;;;;;;71860:9;:20;;-1:-1:-1;;71860:20:0;-1:-1:-1;;;;;71860:20:0;;;;;;;;71918:30;;;;;;;;-1:-1:-1;;71860:20:0;71918:28;;:30;;;;;;;;;;;;;;71860:20;71918:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72005:16;;71966:56;;;72005:16;41835:15:1;;;41817:34;;72005:16:0;;;41882:2:1;41867:18;;41860:43;71893:55:0;;-1:-1:-1;71966:56:0;;41765:18:1;71966:56:0;;;;;;;72035:16;:34;;;;;;;;;;;;;;;-1:-1:-1;71598:479:0:o;25134:191::-;25227:6;;;-1:-1:-1;;;;;25244:17:0;;;-1:-1:-1;;25244:17:0;;;;;;;25277:40;;25227:6;;;25244:17;25227:6;;25277:40;;25208:16;;25277:40;25197:128;25134:191;:::o;44722:349::-;44846:4;-1:-1:-1;;;;;;44883:51:0;;44898:36;44883:51;;:127;;-1:-1:-1;;;;;;;44951:59:0;;44966:44;44951:59;44883:127;:180;;;;45027:36;45051:11;45027:23;:36::i;59408:410::-;59598:1;59586:9;:13;59582:229;;;-1:-1:-1;;;;;59620:18:0;;;59616:87;;-1:-1:-1;;;;;59659:15:0;;;;;;:9;:15;;;;;:28;;59678:9;;59659:15;:28;;59678:9;;59659:28;:::i;:::-;;;;-1:-1:-1;;59616:87:0;-1:-1:-1;;;;;59721:16:0;;;59717:83;;-1:-1:-1;;;;;59758:13:0;;;;;;:9;:13;;;;;:26;;59775:9;;59758:13;:26;;59775:9;;59758:26;:::i;:::-;;;;-1:-1:-1;;59408:410:0;;;;:::o;53824:805::-;53884:13;53900:34;53926:7;53900:25;:34::i;:::-;53884:50;;53947:51;53968:5;53983:1;53987:7;53996:1;53947:20;:51::i;:::-;54111:34;54137:7;54111:25;:34::i;:::-;54193:24;;;;:15;:24;;;;;;;;54186:31;;-1:-1:-1;;54186:31:0;;;;;;-1:-1:-1;;;;;54438:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;54438:21:0;;;54488:16;;;:7;:16;;;;;;54481:23;;;;;;;54522:36;54103:42;;-1:-1:-1;54209:7:0;;54522:36;;54193:24;;54522:36;79817:180;;:::o;51551:110::-;51627:26;51637:2;51641:7;51627:26;;;;;;;;;;;;:9;:26::i;67475:265::-;67610:16;:14;:16::i;:::-;67639:25;67655:8;67639:15;:25::i;:::-;67675:57;67707:24;67675:31;:57::i;44328:151::-;21086:13;;;;;;;21078:69;;;;-1:-1:-1;;;21078:69:0;;38353:2:1;21078:69:0;;;38335:21:1;38392:2;38372:18;;;38365:30;38431:34;38411:18;;;38404:62;-1:-1:-1;;;38482:18:1;;;38475:41;38533:19;;21078:69:0;38151:407:1;21078:69:0;44432:39:::1;44456:5;44463:7;44432:23;:39::i;57801:875::-:0;57955:4;-1:-1:-1;;;;;57976:13:0;;26948:19;:23;57972:697;;58012:82;;;;;-1:-1:-1;;;;;58012:47:0;;;;;:82;;22675:10;;58074:4;;58080:7;;58089:4;;58012:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58012:82:0;;;;;;;;-1:-1:-1;;58012:82:0;;;;;;;;;;;;:::i;:::-;;;58008:606;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58275:6;:13;58292:1;58275:18;58271:328;;58318:60;;-1:-1:-1;;;58318:60:0;;39888:2:1;58318:60:0;;;39870:21:1;39927:2;39907:18;;;39900:30;39966:34;39946:18;;;39939:62;40037:20;40017:18;;;40010:48;40075:19;;58318:60:0;39686:414:1;58271:328:0;58549:6;58543:13;58534:6;58530:2;58526:15;58519:38;58008:606;-1:-1:-1;;;;;;58145:62:0;58155:52;58145:62;;-1:-1:-1;58138:69:0;;57972:697;-1:-1:-1;58653:4:0;57801:875;;;;;;:::o;81391:107::-;81443:13;81476:14;81469:21;;;;;:::i;40770:727::-;40826:13;40877:14;40894:28;40916:5;40894:21;:28::i;:::-;40925:1;40894:32;40877:49;;40941:20;40975:6;40964:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40964:18:0;-1:-1:-1;40941:41:0;-1:-1:-1;41106:28:0;;;41122:2;41106:28;41163:288;-1:-1:-1;;41195:5:0;41337:8;41332:2;41321:14;;41316:30;41195:5;41303:44;41393:2;41384:11;;;-1:-1:-1;41414:21:0;41163:288;41414:21;-1:-1:-1;41472:6:0;40770:727;-1:-1:-1;;;40770:727:0:o;61975:248::-;62099:4;-1:-1:-1;;;;;;62123:52:0;;62138:37;62123:52;;:92;;-1:-1:-1;43096:36:0;-1:-1:-1;;;;;;43081:51:0;;;62179:36;42972:168;51888:319;52017:18;52023:2;52027:7;52017:5;:18::i;:::-;52068:53;52099:1;52103:2;52107:7;52116:4;52068:22;:53::i;:::-;52046:153;;;;-1:-1:-1;;;52046:153:0;;39888:2:1;52046:153:0;;;39870:21:1;39927:2;39907:18;;;39900:30;39966:34;39946:18;;;39939:62;40037:20;40017:18;;;40010:48;40075:19;;52046:153:0;39686:414:1;23410:97:0;21086:13;;;;;;;21078:69;;;;-1:-1:-1;;;21078:69:0;;38353:2:1;21078:69:0;;;38335:21:1;38392:2;38372:18;;;38365:30;38431:34;38411:18;;;38404:62;-1:-1:-1;;;38482:18:1;;;38475:41;38533:19;;21078:69:0;38151:407:1;21078:69:0;23473:26:::1;:24;:26::i;44487:163::-:0;21086:13;;;;;;;21078:69;;;;-1:-1:-1;;;21078:69:0;;38353:2:1;21078:69:0;;;38335:21:1;38392:2;38372:18;;;38365:30;38431:34;38411:18;;;38404:62;-1:-1:-1;;;38482:18:1;;;38475:41;38533:19;;21078:69:0;38151:407:1;21078:69:0;44601:5:::1;:13;44609:5:::0;44601;:13:::1;:::i;:::-;-1:-1:-1::0;44625:7:0::1;:17;44635:7:::0;44625;:17:::1;:::i;15325:922::-:0;15378:7;;15465:6;15456:15;;15452:102;;15501:6;15492:15;;;-1:-1:-1;15536:2:0;15526:12;15452:102;15581:6;15572:5;:15;15568:102;;15617:6;15608:15;;;-1:-1:-1;15652:2:0;15642:12;15568:102;15697:6;15688:5;:15;15684:102;;15733:6;15724:15;;;-1:-1:-1;15768:2:0;15758:12;15684:102;15813:5;15804;:14;15800:99;;15848:5;15839:14;;;-1:-1:-1;15882:1:0;15872:11;15800:99;15926:5;15917;:14;15913:99;;15961:5;15952:14;;;-1:-1:-1;15995:1:0;15985:11;15913:99;16039:5;16030;:14;16026:99;;16074:5;16065:14;;;-1:-1:-1;16108:1:0;16098:11;16026:99;16152:5;16143;:14;16139:66;;16188:1;16178:11;16233:6;15325:922;-1:-1:-1;;15325:922:0:o;52543:942::-;-1:-1:-1;;;;;52623:16:0;;52615:61;;;;-1:-1:-1;;;52615:61:0;;42887:2:1;52615:61:0;;;42869:21:1;;;42906:18;;;42899:30;42965:34;42945:18;;;42938:62;43017:18;;52615:61:0;42685:356:1;52615:61:0;50704:4;50302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50302:16:0;50728:31;52687:58;;;;-1:-1:-1;;;52687:58:0;;43248:2:1;52687:58:0;;;43230:21:1;43287:2;43267:18;;;43260:30;43326;43306:18;;;43299:58;43374:18;;52687:58:0;43046:352:1;52687:58:0;52758:48;52787:1;52791:2;52795:7;52804:1;52758:20;:48::i;:::-;50704:4;50302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50302:16:0;50728:31;52896:58;;;;-1:-1:-1;;;52896:58:0;;43248:2:1;52896:58:0;;;43230:21:1;43287:2;43267:18;;;43260:30;43326;43306:18;;;43299:58;43374:18;;52896:58:0;43046:352:1;52896:58:0;-1:-1:-1;;;;;53303:13:0;;;;;;:9;:13;;;;;;;;:18;;53320:1;53303:18;;;53345:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;53345:21:0;;;;;53384:33;53353:7;;53303:13;;53384:33;;53303:13;;53384:33;79817:180;;:::o;23515:113::-;21086:13;;;;;;;21078:69;;;;-1:-1:-1;;;21078:69:0;;38353:2:1;21078:69:0;;;38335:21:1;38392:2;38372:18;;;38365:30;38431:34;38411:18;;;38404:62;-1:-1:-1;;;38482:18:1;;;38475:41;38533:19;;21078:69:0;38151:407:1;21078:69:0;23588:32:::1;22675:10:::0;23588:18:::1;:32::i;14:177:1:-:0;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:154::-;-1:-1:-1;;;;;717:5:1;713:54;706:5;703:65;693:93;;782:1;779;772:12;797:435;864:6;872;925:2;913:9;904:7;900:23;896:32;893:52;;;941:1;938;931:12;893:52;980:9;967:23;999:31;1024:5;999:31;:::i;:::-;1049:5;-1:-1:-1;1106:2:1;1091:18;;1078:32;1154:26;1141:40;;1129:53;;1119:81;;1196:1;1193;1186:12;1119:81;1219:7;1209:17;;;797:435;;;;;:::o;1237:250::-;1322:1;1332:113;1346:6;1343:1;1340:13;1332:113;;;1422:11;;;1416:18;1403:11;;;1396:39;1368:2;1361:10;1332:113;;;-1:-1:-1;;1479:1:1;1461:16;;1454:27;1237:250::o;1492:330::-;1534:3;1572:5;1566:12;1599:6;1594:3;1587:19;1615:76;1684:6;1677:4;1672:3;1668:14;1661:4;1654:5;1650:16;1615:76;:::i;:::-;1736:2;1724:15;-1:-1:-1;;1720:88:1;1711:98;;;;1811:4;1707:109;;1492:330;-1:-1:-1;;1492:330:1:o;1827:220::-;1976:2;1965:9;1958:21;1939:4;1996:45;2037:2;2026:9;2022:18;2014:6;1996:45;:::i;2052:180::-;2111:6;2164:2;2152:9;2143:7;2139:23;2135:32;2132:52;;;2180:1;2177;2170:12;2132:52;-1:-1:-1;2203:23:1;;2052:180;-1:-1:-1;2052:180:1:o;2468:315::-;2536:6;2544;2597:2;2585:9;2576:7;2572:23;2568:32;2565:52;;;2613:1;2610;2603:12;2565:52;2652:9;2639:23;2671:31;2696:5;2671:31;:::i;:::-;2721:5;2773:2;2758:18;;;;2745:32;;-1:-1:-1;;;2468:315:1:o;2788:456::-;2865:6;2873;2881;2934:2;2922:9;2913:7;2909:23;2905:32;2902:52;;;2950:1;2947;2940:12;2902:52;2989:9;2976:23;3008:31;3033:5;3008:31;:::i;:::-;3058:5;-1:-1:-1;3115:2:1;3100:18;;3087:32;3128:33;3087:32;3128:33;:::i;:::-;2788:456;;3180:7;;-1:-1:-1;;;3234:2:1;3219:18;;;;3206:32;;2788:456::o;3249:117::-;3334:6;3327:5;3323:18;3316:5;3313:29;3303:57;;3356:1;3353;3346:12;3371:381;3447:6;3455;3463;3516:2;3504:9;3495:7;3491:23;3487:32;3484:52;;;3532:1;3529;3522:12;3484:52;3568:9;3555:23;3545:33;;3628:2;3617:9;3613:18;3600:32;3641:30;3665:5;3641:30;:::i;3757:248::-;3825:6;3833;3886:2;3874:9;3865:7;3861:23;3857:32;3854:52;;;3902:1;3899;3892:12;3854:52;-1:-1:-1;;3925:23:1;;;3995:2;3980:18;;;3967:32;;-1:-1:-1;3757:248:1:o;4312:184::-;-1:-1:-1;;;4361:1:1;4354:88;4461:4;4458:1;4451:15;4485:4;4482:1;4475:15;4501:253;4573:2;4567:9;4615:4;4603:17;;4650:18;4635:34;;4671:22;;;4632:62;4629:88;;;4697:18;;:::i;:::-;4733:2;4726:22;4501:253;:::o;4759:255::-;4831:2;4825:9;4873:6;4861:19;;4910:18;4895:34;;4931:22;;;4892:62;4889:88;;;4957:18;;:::i;5019:334::-;5090:2;5084:9;5146:2;5136:13;;-1:-1:-1;;5132:86:1;5120:99;;5249:18;5234:34;;5270:22;;;5231:62;5228:88;;;5296:18;;:::i;:::-;5332:2;5325:22;5019:334;;-1:-1:-1;5019:334:1:o;5358:246::-;5407:4;5440:18;5432:6;5429:30;5426:56;;;5462:18;;:::i;:::-;-1:-1:-1;5519:2:1;5507:15;-1:-1:-1;;5503:88:1;5593:4;5499:99;;5358:246::o;5609:338::-;5674:5;5703:53;5719:36;5748:6;5719:36;:::i;:::-;5703:53;:::i;:::-;5694:62;;5779:6;5772:5;5765:21;5819:3;5810:6;5805:3;5801:16;5798:25;5795:45;;;5836:1;5833;5826:12;5795:45;5885:6;5880:3;5873:4;5866:5;5862:16;5849:43;5939:1;5932:4;5923:6;5916:5;5912:18;5908:29;5901:40;5609:338;;;;;:::o;5952:451::-;6021:6;6074:2;6062:9;6053:7;6049:23;6045:32;6042:52;;;6090:1;6087;6080:12;6042:52;6130:9;6117:23;6163:18;6155:6;6152:30;6149:50;;;6195:1;6192;6185:12;6149:50;6218:22;;6271:4;6263:13;;6259:27;-1:-1:-1;6249:55:1;;6300:1;6297;6290:12;6249:55;6323:74;6389:7;6384:2;6371:16;6366:2;6362;6358:11;6323:74;:::i;6408:247::-;6467:6;6520:2;6508:9;6499:7;6495:23;6491:32;6488:52;;;6536:1;6533;6526:12;6488:52;6575:9;6562:23;6594:31;6619:5;6594:31;:::i;6842:221::-;6884:5;6937:3;6930:4;6922:6;6918:17;6914:27;6904:55;;6955:1;6952;6945:12;6904:55;6977:80;7053:3;7044:6;7031:20;7024:4;7016:6;7012:17;6977:80;:::i;7068:320::-;7136:6;7189:2;7177:9;7168:7;7164:23;7160:32;7157:52;;;7205:1;7202;7195:12;7157:52;7245:9;7232:23;7278:18;7270:6;7267:30;7264:50;;;7310:1;7307;7300:12;7264:50;7333:49;7374:7;7365:6;7354:9;7350:22;7333:49;:::i;7393:114::-;7477:4;7470:5;7466:16;7459:5;7456:27;7446:55;;7497:1;7494;7487:12;7512:525;7587:6;7595;7603;7656:2;7644:9;7635:7;7631:23;7627:32;7624:52;;;7672:1;7669;7662:12;7624:52;7711:9;7698:23;7730:31;7755:5;7730:31;:::i;:::-;7780:5;-1:-1:-1;7837:2:1;7822:18;;7809:32;7850:33;7809:32;7850:33;:::i;:::-;7902:7;-1:-1:-1;7961:2:1;7946:18;;7933:32;7974:31;7933:32;7974:31;:::i;:::-;8024:7;8014:17;;;7512:525;;;;;:::o;8042:118::-;8128:5;8121:13;8114:21;8107:5;8104:32;8094:60;;8150:1;8147;8140:12;8165:382;8230:6;8238;8291:2;8279:9;8270:7;8266:23;8262:32;8259:52;;;8307:1;8304;8297:12;8259:52;8346:9;8333:23;8365:31;8390:5;8365:31;:::i;:::-;8415:5;-1:-1:-1;8472:2:1;8457:18;;8444:32;8485:30;8444:32;8485:30;:::i;8552:243::-;8609:6;8662:2;8650:9;8641:7;8637:23;8633:32;8630:52;;;8678:1;8675;8668:12;8630:52;8717:9;8704:23;8736:29;8759:5;8736:29;:::i;8800:313::-;8867:6;8875;8928:2;8916:9;8907:7;8903:23;8899:32;8896:52;;;8944:1;8941;8934:12;8896:52;8983:9;8970:23;9002:30;9026:5;9002:30;:::i;9118:665::-;9213:6;9221;9229;9237;9290:3;9278:9;9269:7;9265:23;9261:33;9258:53;;;9307:1;9304;9297:12;9258:53;9346:9;9333:23;9365:31;9390:5;9365:31;:::i;:::-;9415:5;-1:-1:-1;9472:2:1;9457:18;;9444:32;9485:33;9444:32;9485:33;:::i;:::-;9537:7;-1:-1:-1;9591:2:1;9576:18;;9563:32;;-1:-1:-1;9646:2:1;9631:18;;9618:32;9673:18;9662:30;;9659:50;;;9705:1;9702;9695:12;9659:50;9728:49;9769:7;9760:6;9749:9;9745:22;9728:49;:::i;:::-;9718:59;;;9118:665;;;;;;;:::o;9788:388::-;9856:6;9864;9917:2;9905:9;9896:7;9892:23;9888:32;9885:52;;;9933:1;9930;9923:12;9885:52;9972:9;9959:23;9991:31;10016:5;9991:31;:::i;:::-;10041:5;-1:-1:-1;10098:2:1;10083:18;;10070:32;10111:33;10070:32;10111:33;:::i;10181:437::-;10260:1;10256:12;;;;10303;;;10324:61;;10378:4;10370:6;10366:17;10356:27;;10324:61;10431:2;10423:6;10420:14;10400:18;10397:38;10394:218;;-1:-1:-1;;;10465:1:1;10458:88;10569:4;10566:1;10559:15;10597:4;10594:1;10587:15;10394:218;;10181:437;;;:::o;13152:184::-;-1:-1:-1;;;13201:1:1;13194:88;13301:4;13298:1;13291:15;13325:4;13322:1;13315:15;13341:125;13406:9;;;13427:10;;;13424:36;;;13440:18;;:::i;13999:128::-;14066:9;;;14087:11;;;14084:37;;;14101:18;;:::i;14635:168::-;14708:9;;;14739;;14756:15;;;14750:22;;14736:37;14726:71;;14777:18;;:::i;14997:274::-;15037:1;15063;15053:189;;-1:-1:-1;;;15095:1:1;15088:88;15199:4;15196:1;15189:15;15227:4;15224:1;15217:15;15053:189;-1:-1:-1;15256:9:1;;14997:274::o;16114:195::-;16153:3;-1:-1:-1;;16177:5:1;16174:77;16171:103;;16254:18;;:::i;:::-;-1:-1:-1;16301:1:1;16290:13;;16114:195::o;16793:545::-;16895:2;16890:3;16887:11;16884:448;;;16931:1;16956:5;16952:2;16945:17;17001:4;16997:2;16987:19;17071:2;17059:10;17055:19;17052:1;17048:27;17042:4;17038:38;17107:4;17095:10;17092:20;17089:47;;;-1:-1:-1;17130:4:1;17089:47;17185:2;17180:3;17176:12;17173:1;17169:20;17163:4;17159:31;17149:41;;17240:82;17258:2;17251:5;17248:13;17240:82;;;17303:17;;;17284:1;17273:13;17240:82;;;17244:3;;;16793:545;;;:::o;17574:1471::-;17700:3;17694:10;17727:18;17719:6;17716:30;17713:56;;;17749:18;;:::i;:::-;17778:97;17868:6;17828:38;17860:4;17854:11;17828:38;:::i;:::-;17822:4;17778:97;:::i;:::-;17930:4;;17994:2;17983:14;;18011:1;18006:782;;;;18832:1;18849:6;18846:89;;;-1:-1:-1;18901:19:1;;;18895:26;18846:89;-1:-1:-1;;17471:1:1;17467:11;;;17463:84;17459:89;17449:100;17555:1;17551:11;;;17446:117;18948:81;;17976:1063;;18006:782;16740:1;16733:14;;;16777:4;16764:18;;-1:-1:-1;;18042:79:1;;;18219:236;18233:7;18230:1;18227:14;18219:236;;;18322:19;;;18316:26;18301:42;;18414:27;;;;18382:1;18370:14;;;;18249:19;;18219:236;;;18223:3;18483:6;18474:7;18471:19;18468:261;;;18544:19;;;18538:26;-1:-1:-1;;18627:1:1;18623:14;;;18639:3;18619:24;18615:97;18611:102;18596:118;18581:134;;18468:261;-1:-1:-1;;;;;18775:1:1;18759:14;;;18755:22;18742:36;;-1:-1:-1;17574:1471:1:o;19050:1021::-;19159:4;19188:2;19217;19206:9;19199:21;19240:1;19273:6;19267:13;19303:36;19329:9;19303:36;:::i;:::-;19375:6;19370:2;19359:9;19355:18;19348:34;19401:2;19422:1;19454:2;19443:9;19439:18;19471:1;19466:216;;;;19696:1;19691:354;;;;19432:613;;19466:216;-1:-1:-1;;19518:9:1;19514:82;19509:2;19498:9;19494:18;19487:110;19669:2;19657:6;19650:14;19643:22;19640:1;19636:30;19625:9;19621:46;19617:55;19610:62;;19466:216;;19691:354;19722:6;19719:1;19712:17;19770:2;19767:1;19757:16;19795:1;19809:180;19823:6;19820:1;19817:13;19809:180;;;19916:14;;19892:17;;;19888:26;;19881:50;19959:16;;;;19838:10;;19809:180;;;20013:17;;20009:26;;;-1:-1:-1;;19432:613:1;-1:-1:-1;20062:3:1;;19050:1021;-1:-1:-1;;;;;;;;19050:1021:1:o;21176:136::-;21254:13;;21276:30;21254:13;21276:30;:::i;:::-;21176:136;;;:::o;21317:576::-;21430:6;21438;21446;21454;21462;21515:3;21503:9;21494:7;21490:23;21486:33;21483:53;;;21532:1;21529;21522:12;21483:53;21561:9;21555:16;21545:26;;21614:2;21603:9;21599:18;21593:25;21627:31;21652:5;21627:31;:::i;:::-;21722:2;21707:18;;21701:25;21771:2;21756:18;;21750:25;21677:5;;-1:-1:-1;21701:25:1;-1:-1:-1;21784:32:1;21750:25;21784:32;:::i;:::-;21835:7;21825:17;;;21882:3;21871:9;21867:19;21861:26;21851:36;;21317:576;;;;;;;;:::o;25227:456::-;25459:3;25497:6;25491:13;25513:66;25572:6;25567:3;25560:4;25552:6;25548:17;25513:66;:::i;:::-;25640:7;25601:16;;25626:22;;;-1:-1:-1;25675:1:1;25664:13;;25227:456;-1:-1:-1;25227:456:1:o;28955:382::-;29164:10;29156:6;29152:23;29141:9;29134:42;29212:2;29207;29196:9;29192:18;29185:30;29115:4;29232:45;29273:2;29262:9;29258:18;29250:6;29232:45;:::i;:::-;29224:53;;29325:4;29317:6;29313:17;29308:2;29297:9;29293:18;29286:45;28955:382;;;;;;:::o;29342:175::-;29420:13;;29473:18;29462:30;;29452:41;;29442:69;;29507:1;29504;29497:12;29522:206;29591:6;29644:2;29632:9;29623:7;29619:23;29615:32;29612:52;;;29660:1;29657;29650:12;29612:52;29683:39;29712:9;29683:39;:::i;32368:134::-;32445:13;;32467:29;32445:13;32467:29;:::i;32507:167::-;32585:13;;32638:10;32627:22;;32617:33;;32607:61;;32664:1;32661;32654:12;32679:442;32732:5;32785:3;32778:4;32770:6;32766:17;32762:27;32752:55;;32803:1;32800;32793:12;32752:55;32832:6;32826:13;32863:49;32879:32;32908:2;32879:32;:::i;32863:49::-;32937:2;32928:7;32921:19;32983:3;32976:4;32971:2;32963:6;32959:15;32955:26;32952:35;32949:55;;;33000:1;32997;32990:12;32949:55;33013:77;33087:2;33080:4;33071:7;33067:18;33060:4;33052:6;33048:17;33013:77;:::i;33126:1291::-;33200:5;33253:3;33246:4;33238:6;33234:17;33230:27;33220:55;;33271:1;33268;33261:12;33220:55;33300:6;33294:13;33326:4;33349:18;33345:2;33342:26;33339:52;;;33371:18;;:::i;:::-;33411:36;33443:2;33438;33435:1;33431:10;33427:19;33411:36;:::i;:::-;33481:15;;;33567:1;33563:10;;;;33551:23;;33547:32;;;33512:12;;;;33591:15;;;33588:35;;;33619:1;33616;33609:12;33588:35;33655:2;33647:6;33643:15;33667:721;33683:6;33678:3;33675:15;33667:721;;;33761:4;33755:3;33750;33746:13;33742:24;33739:114;;;33807:1;33836:2;33832;33825:14;33739:114;33879:22;;:::i;:::-;33934:3;33928:10;33921:5;33914:25;33990:2;33985:3;33981:12;33975:19;33970:2;33963:5;33959:14;33952:43;34018:2;34063;34058:3;34054:12;34048:19;34080:31;34103:7;34080:31;:::i;:::-;34131:14;;;34124:31;34178:2;34214:12;;;34208:19;34240:31;34208:19;34240:31;:::i;:::-;34291:14;;;34284:31;34328:18;;34366:12;;;;33709:4;33700:14;33667:721;;;-1:-1:-1;34406:5:1;33126:1291;-1:-1:-1;;;;;;33126:1291:1:o;34422:132::-;34498:13;;34520:28;34498:13;34520:28;:::i;34559:1782::-;34672:6;34680;34688;34741:2;34729:9;34720:7;34716:23;34712:32;34709:52;;;34757:1;34754;34747:12;34709:52;34790:9;34784:16;34819:18;34860:2;34852:6;34849:14;34846:34;;;34876:1;34873;34866:12;34846:34;34899:22;;;;34955:6;34937:16;;;34933:29;34930:49;;;34975:1;34972;34965:12;34930:49;35001:22;;:::i;:::-;35046:31;35074:2;35046:31;:::i;:::-;35039:5;35032:46;35110:41;35147:2;35143;35139:11;35110:41;:::i;:::-;35105:2;35098:5;35094:14;35087:65;35184:41;35221:2;35217;35213:11;35184:41;:::i;:::-;35179:2;35172:5;35168:14;35161:65;35258:41;35295:2;35291;35287:11;35258:41;:::i;:::-;35253:2;35246:5;35242:14;35235:65;35347:3;35343:2;35339:12;35333:19;35327:3;35320:5;35316:15;35309:44;35386:42;35423:3;35419:2;35415:12;35386:42;:::i;:::-;35380:3;35373:5;35369:15;35362:67;35462:41;35498:3;35494:2;35490:12;35462:41;:::i;:::-;35456:3;35449:5;35445:15;35438:66;35543:3;35539:2;35535:12;35529:19;35573:2;35563:8;35560:16;35557:36;;;35589:1;35586;35579:12;35557:36;35626:55;35673:7;35662:8;35658:2;35654:17;35626:55;:::i;:::-;35620:3;35613:5;35609:15;35602:80;;35701:3;35736:41;35773:2;35769;35765:11;35736:41;:::i;:::-;35720:14;;;35713:65;35797:3;35831:11;;;35825:18;35855:16;;;35852:36;;;35884:1;35881;35874:12;35852:36;35920:76;35988:7;35977:8;35973:2;35969:17;35920:76;:::i;:::-;35904:14;;;35897:100;;;;-1:-1:-1;36016:3:1;36057:11;;;36051:18;36035:14;;;36028:42;35908:5;-1:-1:-1;36113:46:1;36155:2;36140:18;;36113:46;:::i;:::-;36103:56;;36205:2;36194:9;36190:18;36184:25;36168:41;;36234:2;36224:8;36221:16;36218:36;;;36250:1;36247;36240:12;36218:36;;36273:62;36327:7;36316:8;36305:9;36301:24;36273:62;:::i;:::-;36263:72;;;34559:1782;;;;;:::o;40105:496::-;40284:3;40322:6;40316:13;40338:66;40397:6;40392:3;40385:4;40377:6;40373:17;40338:66;:::i;:::-;40467:13;;40426:16;;;;40489:70;40467:13;40426:16;40536:4;40524:17;;40489:70;:::i;:::-;40575:20;;40105:496;-1:-1:-1;;;;40105:496:1:o;41368:249::-;41437:6;41490:2;41478:9;41469:7;41465:23;41461:32;41458:52;;;41506:1;41503;41496:12;41458:52;41538:9;41532:16;41557:30;41581:5;41557:30;:::i;41914:512::-;42108:4;-1:-1:-1;;;;;42218:2:1;42210:6;42206:15;42195:9;42188:34;42270:2;42262:6;42258:15;42253:2;42242:9;42238:18;42231:43;;42310:6;42305:2;42294:9;42290:18;42283:34;42353:3;42348:2;42337:9;42333:18;42326:31;42374:46;42415:3;42404:9;42400:19;42392:6;42374:46;:::i;:::-;42366:54;41914:512;-1:-1:-1;;;;;;41914:512:1:o;42431:249::-;42500:6;42553:2;42541:9;42532:7;42528:23;42524:32;42521:52;;;42569:1;42566;42559:12;42521:52;42601:9;42595:16;42620:30;42644:5;42620:30;:::i
Swarm Source
ipfs://368e395c76b602d2e4605784ca717f09e47f0aa3405b1945e2ca01fa2d3a6cdc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.