Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 18824190 | 692 days ago | IN | 0 ETH | 0.00775605 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HunnysHupeScouts
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-20 */ // Sources flattened with hardhat v2.19.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ 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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ 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; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract 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; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract 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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface 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); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ 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); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4906.sol) pragma solidity ^0.8.0; /// @title EIP-721 Metadata Update Extension 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); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), 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; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) 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[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract 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; } // File @openzeppelin/contracts-upgradeable/token/common/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract 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; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface 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); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface 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); } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ 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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ 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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract 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 {} /** * @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 Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } /** * @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; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract 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; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorageUpgradeable is Initializable, IERC4906Upgradeable, ERC721Upgradeable { function __ERC721URIStorage_init() internal onlyInitializing { } function __ERC721URIStorage_init_unchained() internal onlyInitializing { } using StringsUpgradeable for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC165-supportsInterface} */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Emits {MetadataUpdate}. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; emit MetadataUpdate(tokenId); } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[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[49] private __gap; } // File contracts/HunnysHupeScouts.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; /// @title HunnysHupeScouts contract HunnysHupeScouts is Initializable, ERC721Upgradeable, ERC721URIStorageUpgradeable, ERC721RoyaltyUpgradeable, OwnableUpgradeable, UUPSUpgradeable { string private _contractURI; uint256 private _tokenIdCounter; // Initialize the contract function initialize(string memory name, string memory symbol, string memory contractURI_) public initializer { __ERC721_init(name, symbol); __ERC721URIStorage_init(); __ERC721Royalty_init(); __Ownable_init(); __UUPSUpgradeable_init(); _contractURI = contractURI_; _tokenIdCounter = 0; } // Override for UUPS upgradeability function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} // Function to mint new tokens function mint(string memory tokenURI) public { uint256 tokenId = _tokenIdCounter; _tokenIdCounter++; _safeMint(msg.sender, tokenId); _setTokenURI(tokenId, tokenURI); } // Function to set contract URI function setContractURI(string memory newContractURI) public onlyOwner { _contractURI = newContractURI; } // Function to get contract URI function contractURI() public view returns (string memory) { return _contractURI; } // Function to set royalties function setRoyalties(address recipient, uint96 bps) public onlyOwner { _setDefaultRoyalty(recipient, bps); } // Override required by Solidity for ERC721URIStorage function _burn(uint256 tokenId) internal override(ERC721Upgradeable, ERC721URIStorageUpgradeable, ERC721RoyaltyUpgradeable) { super._burn(tokenId); } // Override required by Solidity for ERC721URIStorage function tokenURI(uint256 tokenId) public view override(ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (string memory) { return super.tokenURI(tokenId); } // Override for supportsInterface function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721URIStorageUpgradeable, ERC721RoyaltyUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","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":"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":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"}],"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":"string","name":"tokenURI","type":"string"}],"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":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","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":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint96","name":"bps","type":"uint96"}],"name":"setRoyalties","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":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801561004357600080fd5b50608051614c4961007b60003960008181610a3101528181610abf01528181610bd901528181610c670152610d170152614c496000f3fe6080604052600436106101665760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063d85d3d2711610064578063d85d3d271461052a578063e8a3d48514610553578063e985e9c51461057e578063f2fde38b146105bb57610166565b8063b88d4fde1461049b578063c21b471b146104c4578063c87b56dd146104ed57610166565b8063715018a6146103b35780638da5cb5b146103ca578063938e3d7b146103f557806395d89b411461041e578063a22cb46514610449578063a6487c531461047257610166565b80633659cfe6116101235780633659cfe6146102a057806342842e0e146102c95780634f1ef286146102f257806352d1902d1461030e5780636352211e1461033957806370a082311461037657610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806323b872dd146102395780632a55205a14610262575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061300f565b6105e4565b60405161019f9190613057565b60405180910390f35b3480156101b457600080fd5b506101bd6105f6565b6040516101ca9190613102565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061315a565b610688565b60405161020791906131c8565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061320f565b6106ce565b005b34801561024557600080fd5b50610260600480360381019061025b919061324f565b6107e5565b005b34801561026e57600080fd5b50610289600480360381019061028491906132a2565b610845565b6040516102979291906132f1565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c2919061331a565b610a2f565b005b3480156102d557600080fd5b506102f060048036038101906102eb919061324f565b610bb7565b005b61030c6004803603810190610307919061347c565b610bd7565b005b34801561031a57600080fd5b50610323610d13565b60405161033091906134f1565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b919061315a565b610dcc565b60405161036d91906131c8565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061331a565b610e52565b6040516103aa919061350c565b60405180910390f35b3480156103bf57600080fd5b506103c8610f09565b005b3480156103d657600080fd5b506103df610f1d565b6040516103ec91906131c8565b60405180910390f35b34801561040157600080fd5b5061041c600480360381019061041791906135c8565b610f48565b005b34801561042a57600080fd5b50610433610f64565b6040516104409190613102565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b919061363d565b610ff6565b005b34801561047e57600080fd5b506104996004803603810190610494919061367d565b61100c565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613724565b611189565b005b3480156104d057600080fd5b506104eb60048036038101906104e691906137eb565b6111eb565b005b3480156104f957600080fd5b50610514600480360381019061050f919061315a565b611201565b6040516105219190613102565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c91906135c8565b611213565b005b34801561055f57600080fd5b5061056861124c565b6040516105759190613102565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a0919061382b565b6112df565b6040516105b29190613057565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd919061331a565b611373565b005b60006105ef826113f6565b9050919050565b6060609780546106059061389a565b80601f01602080910402602001604051908101604052809291908181526020018280546106319061389a565b801561067e5780601f106106535761010080835404028352916020019161067e565b820191906000526020600020905b81548152906001019060200180831161066157829003601f168201915b5050505050905090565b600061069382611408565b609b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106d982610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107409061393d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610768611453565b73ffffffffffffffffffffffffffffffffffffffff161480610797575061079681610791611453565b6112df565b5b6107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd906139cf565b60405180910390fd5b6107e0838361145b565b505050565b6107f66107f0611453565b82611514565b610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c90613a61565b60405180910390fd5b6108408383836115a9565b505050565b6000806000606660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036109da5760656040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006109e46118a2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610a109190613ab0565b610a1a9190613b21565b90508160000151819350935050509250929050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613bc4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610afc6118ac565b73ffffffffffffffffffffffffffffffffffffffff1614610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4990613c56565b60405180910390fd5b610b5b81611903565b610bb481600067ffffffffffffffff811115610b7a57610b79613351565b5b6040519080825280601f01601f191660200182016040528015610bac5781602001600182028036833780820191505090505b50600061190e565b50565b610bd283838360405180602001604052806000815250611189565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613bc4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610ca46118ac565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190613c56565b60405180910390fd5b610d0382611903565b610d0f8282600161190e565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90613ce8565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b600080610dd883611a7c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613d54565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb990613de6565b60405180910390fd5b609a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f11611ab9565b610f1b6000611b37565b565b600061012d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f50611ab9565b806101c39081610f609190613fb2565b5050565b606060988054610f739061389a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9f9061389a565b8015610fec5780601f10610fc157610100808354040283529160200191610fec565b820191906000526020600020905b815481529060010190602001808311610fcf57829003601f168201915b5050505050905090565b611008611001611453565b8383611bff565b5050565b60008060019054906101000a900460ff1615905080801561103d5750600160008054906101000a900460ff1660ff16105b8061106a575061104c30611d6b565b1580156110695750600160008054906101000a900460ff1660ff16145b5b6110a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a0906140f6565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156110e6576001600060016101000a81548160ff0219169083151502179055505b6110f08484611d8e565b6110f8611deb565b611100611e3c565b611108611e8d565b611110611ee6565b816101c390816111209190613fb2565b5060006101c48190555080156111835760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161117a919061415e565b60405180910390a15b50505050565b61119a611194611453565b83611514565b6111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d090613a61565b60405180910390fd5b6111e584848484611f37565b50505050565b6111f3611ab9565b6111fd8282611f93565b5050565b606061120c82612128565b9050919050565b60006101c45490506101c4600081548092919061122f90614179565b919050555061123e338261223a565b6112488183612258565b5050565b60606101c3805461125c9061389a565b80601f01602080910402602001604051908101604052809291908181526020018280546112889061389a565b80156112d55780601f106112aa576101008083540402835291602001916112d5565b820191906000526020600020905b8154815290600101906020018083116112b857829003601f168201915b5050505050905090565b6000609c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61137b611ab9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190614233565b60405180910390fd5b6113f381611b37565b50565b6000611401826122fc565b9050919050565b6114118161235d565b611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790613d54565b60405180910390fd5b50565b600033905090565b81609b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114ce83610dcc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061152083610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611562575061156181856112df565b5b806115a057508373ffffffffffffffffffffffffffffffffffffffff1661158884610688565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c982610dcc565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611616906142c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614357565b60405180910390fd5b61169b838383600161239e565b8273ffffffffffffffffffffffffffffffffffffffff166116bb82610dcc565b73ffffffffffffffffffffffffffffffffffffffff1614611711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611708906142c5565b60405180910390fd5b609b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001609a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001609a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816099600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461189d83838360016123a4565b505050565b6000612710905090565b60006118da7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6123aa565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190b611ab9565b50565b61193a7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b6123b4565b60000160009054906101000a900460ff161561195e57611959836123be565b611a77565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156119c657506040513d601f19601f820116820180604052508101906119c391906143a3565b60015b611a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fc90614442565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b8114611a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a61906144d4565b60405180910390fd5b50611a76838383612477565b5b505050565b60006099600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611ac1611453565b73ffffffffffffffffffffffffffffffffffffffff16611adf610f1d565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90614540565b60405180910390fd5b565b600061012d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508161012d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c64906145ac565b60405180910390fd5b80609c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d5e9190613057565b60405180910390a3505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd49061463e565b60405180910390fd5b611de782826124a3565b5050565b600060019054906101000a900460ff16611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e319061463e565b60405180910390fd5b565b600060019054906101000a900460ff16611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e829061463e565b60405180910390fd5b565b600060019054906101000a900460ff16611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed39061463e565b60405180910390fd5b611ee4612516565b565b600060019054906101000a900460ff16611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c9061463e565b60405180910390fd5b565b611f428484846115a9565b611f4e84848484612577565b611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906146d0565b60405180910390fd5b50505050565b611f9b6118a2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090614762565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f906147ce565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250606560008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b606061213382611408565b600060c9600084815260200190815260200160002080546121539061389a565b80601f016020809104026020016040519081016040528092919081815260200182805461217f9061389a565b80156121cc5780601f106121a1576101008083540402835291602001916121cc565b820191906000526020600020905b8154815290600101906020018083116121af57829003601f168201915b5050505050905060006121dd6126fe565b905060008151036121f2578192505050612235565b60008251111561222757808260405160200161220f92919061482a565b60405160208183030381529060405292505050612235565b61223084612715565b925050505b919050565b61225482826040518060200160405280600081525061277d565b5050565b6122618261235d565b6122a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612297906148c0565b60405180910390fd5b8060c9600084815260200190815260200160002090816122c09190613fb2565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516122f0919061350c565b60405180910390a15050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123565750612355826127d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661237f83611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6000819050919050565b6000819050919050565b6123c781611d6b565b612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd90614952565b60405180910390fd5b806124337f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6123aa565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612480836128ba565b60008251118061248d5750805b1561249e5761249c8383612909565b505b505050565b600060019054906101000a900460ff166124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e99061463e565b60405180910390fd5b81609790816125019190613fb2565b5080609890816125119190613fb2565b505050565b600060019054906101000a900460ff16612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c9061463e565b60405180910390fd5b612575612570611453565b611b37565b565b60006125988473ffffffffffffffffffffffffffffffffffffffff16611d6b565b156126f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125c1611453565b8786866040518563ffffffff1660e01b81526004016125e394939291906149c7565b6020604051808303816000875af192505050801561261f57506040513d601f19601f8201168201806040525081019061261c9190614a28565b60015b6126a1573d806000811461264f576040519150601f19603f3d011682016040523d82523d6000602084013e612654565b606091505b506000815103612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906146d0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126f6565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061272082611408565b600061272a6126fe565b9050600081511161274a5760405180602001604052806000815250612775565b8061275484612936565b60405160200161276592919061482a565b6040516020818303038152906040525b915050919050565b6127878383612a04565b6127946000848484612577565b6127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca906146d0565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128a357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128b357506128b282612c21565b5b9050919050565b6128c3816123be565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606061292e8383604051806060016040528060278152602001614bed60279139612c9b565b905092915050565b60606000600161294584612d21565b01905060008167ffffffffffffffff81111561296457612963613351565b5b6040519080825280601f01601f1916602001820160405280156129965781602001600182028036833780820191505090505b509050600082602001820190505b6001156129f9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816129ed576129ec613af2565b5b049450600085036129a4575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6a90614aa1565b60405180910390fd5b612a7c8161235d565b15612abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab390614b0d565b60405180910390fd5b612aca60008383600161239e565b612ad38161235d565b15612b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0a90614b0d565b60405180910390fd5b6001609a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816099600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c1d6000838360016123a4565b5050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c945750612c9382612e74565b5b9050919050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051612cc59190614b69565b600060405180830381855af49150503d8060008114612d00576040519150601f19603f3d011682016040523d82523d6000602084013e612d05565b606091505b5091509150612d1686838387612ede565b925050509392505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d7f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d7557612d74613af2565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612dbc576d04ee2d6d415b85acef81000000008381612db257612db1613af2565b5b0492506020810190505b662386f26fc100008310612deb57662386f26fc100008381612de157612de0613af2565b5b0492506010810190505b6305f5e1008310612e14576305f5e1008381612e0a57612e09613af2565b5b0492506008810190505b6127108310612e39576127108381612e2f57612e2e613af2565b5b0492506004810190505b60648310612e5c5760648381612e5257612e51613af2565b5b0492506002810190505b600a8310612e6b576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60608315612f40576000835103612f3857612ef885611d6b565b612f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2e90614bcc565b60405180910390fd5b5b829050612f4b565b612f4a8383612f53565b5b949350505050565b600082511115612f665781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9a9190613102565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fec81612fb7565b8114612ff757600080fd5b50565b60008135905061300981612fe3565b92915050565b60006020828403121561302557613024612fad565b5b600061303384828501612ffa565b91505092915050565b60008115159050919050565b6130518161303c565b82525050565b600060208201905061306c6000830184613048565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ac578082015181840152602081019050613091565b60008484015250505050565b6000601f19601f8301169050919050565b60006130d482613072565b6130de818561307d565b93506130ee81856020860161308e565b6130f7816130b8565b840191505092915050565b6000602082019050818103600083015261311c81846130c9565b905092915050565b6000819050919050565b61313781613124565b811461314257600080fd5b50565b6000813590506131548161312e565b92915050565b6000602082840312156131705761316f612fad565b5b600061317e84828501613145565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131b282613187565b9050919050565b6131c2816131a7565b82525050565b60006020820190506131dd60008301846131b9565b92915050565b6131ec816131a7565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b6000806040838503121561322657613225612fad565b5b6000613234858286016131fa565b925050602061324585828601613145565b9150509250929050565b60008060006060848603121561326857613267612fad565b5b6000613276868287016131fa565b9350506020613287868287016131fa565b925050604061329886828701613145565b9150509250925092565b600080604083850312156132b9576132b8612fad565b5b60006132c785828601613145565b92505060206132d885828601613145565b9150509250929050565b6132eb81613124565b82525050565b600060408201905061330660008301856131b9565b61331360208301846132e2565b9392505050565b6000602082840312156133305761332f612fad565b5b600061333e848285016131fa565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613389826130b8565b810181811067ffffffffffffffff821117156133a8576133a7613351565b5b80604052505050565b60006133bb612fa3565b90506133c78282613380565b919050565b600067ffffffffffffffff8211156133e7576133e6613351565b5b6133f0826130b8565b9050602081019050919050565b82818337600083830152505050565b600061341f61341a846133cc565b6133b1565b90508281526020810184848401111561343b5761343a61334c565b5b6134468482856133fd565b509392505050565b600082601f83011261346357613462613347565b5b813561347384826020860161340c565b91505092915050565b6000806040838503121561349357613492612fad565b5b60006134a1858286016131fa565b925050602083013567ffffffffffffffff8111156134c2576134c1612fb2565b5b6134ce8582860161344e565b9150509250929050565b6000819050919050565b6134eb816134d8565b82525050565b600060208201905061350660008301846134e2565b92915050565b600060208201905061352160008301846132e2565b92915050565b600067ffffffffffffffff82111561354257613541613351565b5b61354b826130b8565b9050602081019050919050565b600061356b61356684613527565b6133b1565b9050828152602081018484840111156135875761358661334c565b5b6135928482856133fd565b509392505050565b600082601f8301126135af576135ae613347565b5b81356135bf848260208601613558565b91505092915050565b6000602082840312156135de576135dd612fad565b5b600082013567ffffffffffffffff8111156135fc576135fb612fb2565b5b6136088482850161359a565b91505092915050565b61361a8161303c565b811461362557600080fd5b50565b60008135905061363781613611565b92915050565b6000806040838503121561365457613653612fad565b5b6000613662858286016131fa565b925050602061367385828601613628565b9150509250929050565b60008060006060848603121561369657613695612fad565b5b600084013567ffffffffffffffff8111156136b4576136b3612fb2565b5b6136c08682870161359a565b935050602084013567ffffffffffffffff8111156136e1576136e0612fb2565b5b6136ed8682870161359a565b925050604084013567ffffffffffffffff81111561370e5761370d612fb2565b5b61371a8682870161359a565b9150509250925092565b6000806000806080858703121561373e5761373d612fad565b5b600061374c878288016131fa565b945050602061375d878288016131fa565b935050604061376e87828801613145565b925050606085013567ffffffffffffffff81111561378f5761378e612fb2565b5b61379b8782880161344e565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6137c8816137a7565b81146137d357600080fd5b50565b6000813590506137e5816137bf565b92915050565b6000806040838503121561380257613801612fad565b5b6000613810858286016131fa565b9250506020613821858286016137d6565b9150509250929050565b6000806040838503121561384257613841612fad565b5b6000613850858286016131fa565b9250506020613861858286016131fa565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138b257607f821691505b6020821081036138c5576138c461386b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061392760218361307d565b9150613932826138cb565b604082019050919050565b600060208201905081810360008301526139568161391a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006139b9603d8361307d565b91506139c48261395d565b604082019050919050565b600060208201905081810360008301526139e8816139ac565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613a4b602d8361307d565b9150613a56826139ef565b604082019050919050565b60006020820190508181036000830152613a7a81613a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613abb82613124565b9150613ac683613124565b9250828202613ad481613124565b91508282048414831517613aeb57613aea613a81565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b2c82613124565b9150613b3783613124565b925082613b4757613b46613af2565b5b828204905092915050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000613bae602c8361307d565b9150613bb982613b52565b604082019050919050565b60006020820190508181036000830152613bdd81613ba1565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b6000613c40602c8361307d565b9150613c4b82613be4565b604082019050919050565b60006020820190508181036000830152613c6f81613c33565b9050919050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b6000613cd260388361307d565b9150613cdd82613c76565b604082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613d3e60188361307d565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613dd060298361307d565b9150613ddb82613d74565b604082019050919050565b60006020820190508181036000830152613dff81613dc3565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e687fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e2b565b613e728683613e2b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613eaf613eaa613ea584613124565b613e8a565b613124565b9050919050565b6000819050919050565b613ec983613e94565b613edd613ed582613eb6565b848454613e38565b825550505050565b600090565b613ef2613ee5565b613efd818484613ec0565b505050565b5b81811015613f2157613f16600082613eea565b600181019050613f03565b5050565b601f821115613f6657613f3781613e06565b613f4084613e1b565b81016020851015613f4f578190505b613f63613f5b85613e1b565b830182613f02565b50505b505050565b600082821c905092915050565b6000613f8960001984600802613f6b565b1980831691505092915050565b6000613fa28383613f78565b9150826002028217905092915050565b613fbb82613072565b67ffffffffffffffff811115613fd457613fd3613351565b5b613fde825461389a565b613fe9828285613f25565b600060209050601f83116001811461401c576000841561400a578287015190505b6140148582613f96565b86555061407c565b601f19841661402a86613e06565b60005b828110156140525784890151825560018201915060208501945060208101905061402d565b8683101561406f578489015161406b601f891682613f78565b8355505b6001600288020188555050505b505050505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006140e0602e8361307d565b91506140eb82614084565b604082019050919050565b6000602082019050818103600083015261410f816140d3565b9050919050565b6000819050919050565b600060ff82169050919050565b600061414861414361413e84614116565b613e8a565b614120565b9050919050565b6141588161412d565b82525050565b6000602082019050614173600083018461414f565b92915050565b600061418482613124565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141b6576141b5613a81565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061421d60268361307d565b9150614228826141c1565b604082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142af60258361307d565b91506142ba82614253565b604082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061434160248361307d565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b614380816134d8565b811461438b57600080fd5b50565b60008151905061439d81614377565b92915050565b6000602082840312156143b9576143b8612fad565b5b60006143c78482850161438e565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b600061442c602e8361307d565b9150614437826143d0565b604082019050919050565b6000602082019050818103600083015261445b8161441f565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006144be60298361307d565b91506144c982614462565b604082019050919050565b600060208201905081810360008301526144ed816144b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061452a60208361307d565b9150614535826144f4565b602082019050919050565b600060208201905081810360008301526145598161451d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061459660198361307d565b91506145a182614560565b602082019050919050565b600060208201905081810360008301526145c581614589565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614628602b8361307d565b9150614633826145cc565b604082019050919050565b600060208201905081810360008301526146578161461b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146ba60328361307d565b91506146c58261465e565b604082019050919050565b600060208201905081810360008301526146e9816146ad565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061474c602a8361307d565b9150614757826146f0565b604082019050919050565b6000602082019050818103600083015261477b8161473f565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006147b860198361307d565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b600081905092915050565b600061480482613072565b61480e81856147ee565b935061481e81856020860161308e565b80840191505092915050565b600061483682856147f9565b915061484282846147f9565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006148aa602e8361307d565b91506148b58261484e565b604082019050919050565b600060208201905081810360008301526148d98161489d565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b600061493c602d8361307d565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061499982614972565b6149a3818561497d565b93506149b381856020860161308e565b6149bc816130b8565b840191505092915050565b60006080820190506149dc60008301876131b9565b6149e960208301866131b9565b6149f660408301856132e2565b8181036060830152614a08818461498e565b905095945050505050565b600081519050614a2281612fe3565b92915050565b600060208284031215614a3e57614a3d612fad565b5b6000614a4c84828501614a13565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a8b60208361307d565b9150614a9682614a55565b602082019050919050565b60006020820190508181036000830152614aba81614a7e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614af7601c8361307d565b9150614b0282614ac1565b602082019050919050565b60006020820190508181036000830152614b2681614aea565b9050919050565b600081905092915050565b6000614b4382614972565b614b4d8185614b2d565b9350614b5d81856020860161308e565b80840191505092915050565b6000614b758284614b38565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614bb6601d8361307d565b9150614bc182614b80565b602082019050919050565b60006020820190508181036000830152614be581614ba9565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122059b497373346de6c1eeaf019e40654496551140d0e2ec8a0e204c0d2a2c7308464736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101665760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063d85d3d2711610064578063d85d3d271461052a578063e8a3d48514610553578063e985e9c51461057e578063f2fde38b146105bb57610166565b8063b88d4fde1461049b578063c21b471b146104c4578063c87b56dd146104ed57610166565b8063715018a6146103b35780638da5cb5b146103ca578063938e3d7b146103f557806395d89b411461041e578063a22cb46514610449578063a6487c531461047257610166565b80633659cfe6116101235780633659cfe6146102a057806342842e0e146102c95780634f1ef286146102f257806352d1902d1461030e5780636352211e1461033957806370a082311461037657610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806323b872dd146102395780632a55205a14610262575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061300f565b6105e4565b60405161019f9190613057565b60405180910390f35b3480156101b457600080fd5b506101bd6105f6565b6040516101ca9190613102565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061315a565b610688565b60405161020791906131c8565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061320f565b6106ce565b005b34801561024557600080fd5b50610260600480360381019061025b919061324f565b6107e5565b005b34801561026e57600080fd5b50610289600480360381019061028491906132a2565b610845565b6040516102979291906132f1565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c2919061331a565b610a2f565b005b3480156102d557600080fd5b506102f060048036038101906102eb919061324f565b610bb7565b005b61030c6004803603810190610307919061347c565b610bd7565b005b34801561031a57600080fd5b50610323610d13565b60405161033091906134f1565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b919061315a565b610dcc565b60405161036d91906131c8565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061331a565b610e52565b6040516103aa919061350c565b60405180910390f35b3480156103bf57600080fd5b506103c8610f09565b005b3480156103d657600080fd5b506103df610f1d565b6040516103ec91906131c8565b60405180910390f35b34801561040157600080fd5b5061041c600480360381019061041791906135c8565b610f48565b005b34801561042a57600080fd5b50610433610f64565b6040516104409190613102565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b919061363d565b610ff6565b005b34801561047e57600080fd5b506104996004803603810190610494919061367d565b61100c565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613724565b611189565b005b3480156104d057600080fd5b506104eb60048036038101906104e691906137eb565b6111eb565b005b3480156104f957600080fd5b50610514600480360381019061050f919061315a565b611201565b6040516105219190613102565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c91906135c8565b611213565b005b34801561055f57600080fd5b5061056861124c565b6040516105759190613102565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a0919061382b565b6112df565b6040516105b29190613057565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd919061331a565b611373565b005b60006105ef826113f6565b9050919050565b6060609780546106059061389a565b80601f01602080910402602001604051908101604052809291908181526020018280546106319061389a565b801561067e5780601f106106535761010080835404028352916020019161067e565b820191906000526020600020905b81548152906001019060200180831161066157829003601f168201915b5050505050905090565b600061069382611408565b609b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106d982610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107409061393d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610768611453565b73ffffffffffffffffffffffffffffffffffffffff161480610797575061079681610791611453565b6112df565b5b6107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd906139cf565b60405180910390fd5b6107e0838361145b565b505050565b6107f66107f0611453565b82611514565b610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c90613a61565b60405180910390fd5b6108408383836115a9565b505050565b6000806000606660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036109da5760656040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006109e46118a2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610a109190613ab0565b610a1a9190613b21565b90508160000151819350935050509250929050565b7f0000000000000000000000000e58931e2c07d0b4dcef4193689f2026e6e949be73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613bc4565b60405180910390fd5b7f0000000000000000000000000e58931e2c07d0b4dcef4193689f2026e6e949be73ffffffffffffffffffffffffffffffffffffffff16610afc6118ac565b73ffffffffffffffffffffffffffffffffffffffff1614610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4990613c56565b60405180910390fd5b610b5b81611903565b610bb481600067ffffffffffffffff811115610b7a57610b79613351565b5b6040519080825280601f01601f191660200182016040528015610bac5781602001600182028036833780820191505090505b50600061190e565b50565b610bd283838360405180602001604052806000815250611189565b505050565b7f0000000000000000000000000e58931e2c07d0b4dcef4193689f2026e6e949be73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613bc4565b60405180910390fd5b7f0000000000000000000000000e58931e2c07d0b4dcef4193689f2026e6e949be73ffffffffffffffffffffffffffffffffffffffff16610ca46118ac565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190613c56565b60405180910390fd5b610d0382611903565b610d0f8282600161190e565b5050565b60007f0000000000000000000000000e58931e2c07d0b4dcef4193689f2026e6e949be73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90613ce8565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b600080610dd883611a7c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613d54565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb990613de6565b60405180910390fd5b609a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f11611ab9565b610f1b6000611b37565b565b600061012d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f50611ab9565b806101c39081610f609190613fb2565b5050565b606060988054610f739061389a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9f9061389a565b8015610fec5780601f10610fc157610100808354040283529160200191610fec565b820191906000526020600020905b815481529060010190602001808311610fcf57829003601f168201915b5050505050905090565b611008611001611453565b8383611bff565b5050565b60008060019054906101000a900460ff1615905080801561103d5750600160008054906101000a900460ff1660ff16105b8061106a575061104c30611d6b565b1580156110695750600160008054906101000a900460ff1660ff16145b5b6110a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a0906140f6565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156110e6576001600060016101000a81548160ff0219169083151502179055505b6110f08484611d8e565b6110f8611deb565b611100611e3c565b611108611e8d565b611110611ee6565b816101c390816111209190613fb2565b5060006101c48190555080156111835760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161117a919061415e565b60405180910390a15b50505050565b61119a611194611453565b83611514565b6111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d090613a61565b60405180910390fd5b6111e584848484611f37565b50505050565b6111f3611ab9565b6111fd8282611f93565b5050565b606061120c82612128565b9050919050565b60006101c45490506101c4600081548092919061122f90614179565b919050555061123e338261223a565b6112488183612258565b5050565b60606101c3805461125c9061389a565b80601f01602080910402602001604051908101604052809291908181526020018280546112889061389a565b80156112d55780601f106112aa576101008083540402835291602001916112d5565b820191906000526020600020905b8154815290600101906020018083116112b857829003601f168201915b5050505050905090565b6000609c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61137b611ab9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190614233565b60405180910390fd5b6113f381611b37565b50565b6000611401826122fc565b9050919050565b6114118161235d565b611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790613d54565b60405180910390fd5b50565b600033905090565b81609b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114ce83610dcc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061152083610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611562575061156181856112df565b5b806115a057508373ffffffffffffffffffffffffffffffffffffffff1661158884610688565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c982610dcc565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611616906142c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614357565b60405180910390fd5b61169b838383600161239e565b8273ffffffffffffffffffffffffffffffffffffffff166116bb82610dcc565b73ffffffffffffffffffffffffffffffffffffffff1614611711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611708906142c5565b60405180910390fd5b609b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001609a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001609a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816099600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461189d83838360016123a4565b505050565b6000612710905090565b60006118da7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6123aa565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190b611ab9565b50565b61193a7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b6123b4565b60000160009054906101000a900460ff161561195e57611959836123be565b611a77565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156119c657506040513d601f19601f820116820180604052508101906119c391906143a3565b60015b611a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fc90614442565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b8114611a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a61906144d4565b60405180910390fd5b50611a76838383612477565b5b505050565b60006099600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611ac1611453565b73ffffffffffffffffffffffffffffffffffffffff16611adf610f1d565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c90614540565b60405180910390fd5b565b600061012d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508161012d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c64906145ac565b60405180910390fd5b80609c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d5e9190613057565b60405180910390a3505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd49061463e565b60405180910390fd5b611de782826124a3565b5050565b600060019054906101000a900460ff16611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e319061463e565b60405180910390fd5b565b600060019054906101000a900460ff16611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e829061463e565b60405180910390fd5b565b600060019054906101000a900460ff16611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed39061463e565b60405180910390fd5b611ee4612516565b565b600060019054906101000a900460ff16611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c9061463e565b60405180910390fd5b565b611f428484846115a9565b611f4e84848484612577565b611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906146d0565b60405180910390fd5b50505050565b611f9b6118a2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090614762565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f906147ce565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250606560008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b606061213382611408565b600060c9600084815260200190815260200160002080546121539061389a565b80601f016020809104026020016040519081016040528092919081815260200182805461217f9061389a565b80156121cc5780601f106121a1576101008083540402835291602001916121cc565b820191906000526020600020905b8154815290600101906020018083116121af57829003601f168201915b5050505050905060006121dd6126fe565b905060008151036121f2578192505050612235565b60008251111561222757808260405160200161220f92919061482a565b60405160208183030381529060405292505050612235565b61223084612715565b925050505b919050565b61225482826040518060200160405280600081525061277d565b5050565b6122618261235d565b6122a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612297906148c0565b60405180910390fd5b8060c9600084815260200190815260200160002090816122c09190613fb2565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516122f0919061350c565b60405180910390a15050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123565750612355826127d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661237f83611a7c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6000819050919050565b6000819050919050565b6123c781611d6b565b612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd90614952565b60405180910390fd5b806124337f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6123aa565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612480836128ba565b60008251118061248d5750805b1561249e5761249c8383612909565b505b505050565b600060019054906101000a900460ff166124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e99061463e565b60405180910390fd5b81609790816125019190613fb2565b5080609890816125119190613fb2565b505050565b600060019054906101000a900460ff16612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c9061463e565b60405180910390fd5b612575612570611453565b611b37565b565b60006125988473ffffffffffffffffffffffffffffffffffffffff16611d6b565b156126f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125c1611453565b8786866040518563ffffffff1660e01b81526004016125e394939291906149c7565b6020604051808303816000875af192505050801561261f57506040513d601f19601f8201168201806040525081019061261c9190614a28565b60015b6126a1573d806000811461264f576040519150601f19603f3d011682016040523d82523d6000602084013e612654565b606091505b506000815103612699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612690906146d0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126f6565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061272082611408565b600061272a6126fe565b9050600081511161274a5760405180602001604052806000815250612775565b8061275484612936565b60405160200161276592919061482a565b6040516020818303038152906040525b915050919050565b6127878383612a04565b6127946000848484612577565b6127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca906146d0565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128a357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128b357506128b282612c21565b5b9050919050565b6128c3816123be565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606061292e8383604051806060016040528060278152602001614bed60279139612c9b565b905092915050565b60606000600161294584612d21565b01905060008167ffffffffffffffff81111561296457612963613351565b5b6040519080825280601f01601f1916602001820160405280156129965781602001600182028036833780820191505090505b509050600082602001820190505b6001156129f9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816129ed576129ec613af2565b5b049450600085036129a4575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6a90614aa1565b60405180910390fd5b612a7c8161235d565b15612abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab390614b0d565b60405180910390fd5b612aca60008383600161239e565b612ad38161235d565b15612b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0a90614b0d565b60405180910390fd5b6001609a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816099600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c1d6000838360016123a4565b5050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c945750612c9382612e74565b5b9050919050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051612cc59190614b69565b600060405180830381855af49150503d8060008114612d00576040519150601f19603f3d011682016040523d82523d6000602084013e612d05565b606091505b5091509150612d1686838387612ede565b925050509392505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d7f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d7557612d74613af2565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612dbc576d04ee2d6d415b85acef81000000008381612db257612db1613af2565b5b0492506020810190505b662386f26fc100008310612deb57662386f26fc100008381612de157612de0613af2565b5b0492506010810190505b6305f5e1008310612e14576305f5e1008381612e0a57612e09613af2565b5b0492506008810190505b6127108310612e39576127108381612e2f57612e2e613af2565b5b0492506004810190505b60648310612e5c5760648381612e5257612e51613af2565b5b0492506002810190505b600a8310612e6b576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60608315612f40576000835103612f3857612ef885611d6b565b612f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2e90614bcc565b60405180910390fd5b5b829050612f4b565b612f4a8383612f53565b5b949350505050565b600082511115612f665781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9a9190613102565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fec81612fb7565b8114612ff757600080fd5b50565b60008135905061300981612fe3565b92915050565b60006020828403121561302557613024612fad565b5b600061303384828501612ffa565b91505092915050565b60008115159050919050565b6130518161303c565b82525050565b600060208201905061306c6000830184613048565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ac578082015181840152602081019050613091565b60008484015250505050565b6000601f19601f8301169050919050565b60006130d482613072565b6130de818561307d565b93506130ee81856020860161308e565b6130f7816130b8565b840191505092915050565b6000602082019050818103600083015261311c81846130c9565b905092915050565b6000819050919050565b61313781613124565b811461314257600080fd5b50565b6000813590506131548161312e565b92915050565b6000602082840312156131705761316f612fad565b5b600061317e84828501613145565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131b282613187565b9050919050565b6131c2816131a7565b82525050565b60006020820190506131dd60008301846131b9565b92915050565b6131ec816131a7565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b6000806040838503121561322657613225612fad565b5b6000613234858286016131fa565b925050602061324585828601613145565b9150509250929050565b60008060006060848603121561326857613267612fad565b5b6000613276868287016131fa565b9350506020613287868287016131fa565b925050604061329886828701613145565b9150509250925092565b600080604083850312156132b9576132b8612fad565b5b60006132c785828601613145565b92505060206132d885828601613145565b9150509250929050565b6132eb81613124565b82525050565b600060408201905061330660008301856131b9565b61331360208301846132e2565b9392505050565b6000602082840312156133305761332f612fad565b5b600061333e848285016131fa565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613389826130b8565b810181811067ffffffffffffffff821117156133a8576133a7613351565b5b80604052505050565b60006133bb612fa3565b90506133c78282613380565b919050565b600067ffffffffffffffff8211156133e7576133e6613351565b5b6133f0826130b8565b9050602081019050919050565b82818337600083830152505050565b600061341f61341a846133cc565b6133b1565b90508281526020810184848401111561343b5761343a61334c565b5b6134468482856133fd565b509392505050565b600082601f83011261346357613462613347565b5b813561347384826020860161340c565b91505092915050565b6000806040838503121561349357613492612fad565b5b60006134a1858286016131fa565b925050602083013567ffffffffffffffff8111156134c2576134c1612fb2565b5b6134ce8582860161344e565b9150509250929050565b6000819050919050565b6134eb816134d8565b82525050565b600060208201905061350660008301846134e2565b92915050565b600060208201905061352160008301846132e2565b92915050565b600067ffffffffffffffff82111561354257613541613351565b5b61354b826130b8565b9050602081019050919050565b600061356b61356684613527565b6133b1565b9050828152602081018484840111156135875761358661334c565b5b6135928482856133fd565b509392505050565b600082601f8301126135af576135ae613347565b5b81356135bf848260208601613558565b91505092915050565b6000602082840312156135de576135dd612fad565b5b600082013567ffffffffffffffff8111156135fc576135fb612fb2565b5b6136088482850161359a565b91505092915050565b61361a8161303c565b811461362557600080fd5b50565b60008135905061363781613611565b92915050565b6000806040838503121561365457613653612fad565b5b6000613662858286016131fa565b925050602061367385828601613628565b9150509250929050565b60008060006060848603121561369657613695612fad565b5b600084013567ffffffffffffffff8111156136b4576136b3612fb2565b5b6136c08682870161359a565b935050602084013567ffffffffffffffff8111156136e1576136e0612fb2565b5b6136ed8682870161359a565b925050604084013567ffffffffffffffff81111561370e5761370d612fb2565b5b61371a8682870161359a565b9150509250925092565b6000806000806080858703121561373e5761373d612fad565b5b600061374c878288016131fa565b945050602061375d878288016131fa565b935050604061376e87828801613145565b925050606085013567ffffffffffffffff81111561378f5761378e612fb2565b5b61379b8782880161344e565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6137c8816137a7565b81146137d357600080fd5b50565b6000813590506137e5816137bf565b92915050565b6000806040838503121561380257613801612fad565b5b6000613810858286016131fa565b9250506020613821858286016137d6565b9150509250929050565b6000806040838503121561384257613841612fad565b5b6000613850858286016131fa565b9250506020613861858286016131fa565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138b257607f821691505b6020821081036138c5576138c461386b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061392760218361307d565b9150613932826138cb565b604082019050919050565b600060208201905081810360008301526139568161391a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006139b9603d8361307d565b91506139c48261395d565b604082019050919050565b600060208201905081810360008301526139e8816139ac565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613a4b602d8361307d565b9150613a56826139ef565b604082019050919050565b60006020820190508181036000830152613a7a81613a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613abb82613124565b9150613ac683613124565b9250828202613ad481613124565b91508282048414831517613aeb57613aea613a81565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b2c82613124565b9150613b3783613124565b925082613b4757613b46613af2565b5b828204905092915050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000613bae602c8361307d565b9150613bb982613b52565b604082019050919050565b60006020820190508181036000830152613bdd81613ba1565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b6000613c40602c8361307d565b9150613c4b82613be4565b604082019050919050565b60006020820190508181036000830152613c6f81613c33565b9050919050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b6000613cd260388361307d565b9150613cdd82613c76565b604082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613d3e60188361307d565b9150613d4982613d08565b602082019050919050565b60006020820190508181036000830152613d6d81613d31565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613dd060298361307d565b9150613ddb82613d74565b604082019050919050565b60006020820190508181036000830152613dff81613dc3565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e687fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e2b565b613e728683613e2b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613eaf613eaa613ea584613124565b613e8a565b613124565b9050919050565b6000819050919050565b613ec983613e94565b613edd613ed582613eb6565b848454613e38565b825550505050565b600090565b613ef2613ee5565b613efd818484613ec0565b505050565b5b81811015613f2157613f16600082613eea565b600181019050613f03565b5050565b601f821115613f6657613f3781613e06565b613f4084613e1b565b81016020851015613f4f578190505b613f63613f5b85613e1b565b830182613f02565b50505b505050565b600082821c905092915050565b6000613f8960001984600802613f6b565b1980831691505092915050565b6000613fa28383613f78565b9150826002028217905092915050565b613fbb82613072565b67ffffffffffffffff811115613fd457613fd3613351565b5b613fde825461389a565b613fe9828285613f25565b600060209050601f83116001811461401c576000841561400a578287015190505b6140148582613f96565b86555061407c565b601f19841661402a86613e06565b60005b828110156140525784890151825560018201915060208501945060208101905061402d565b8683101561406f578489015161406b601f891682613f78565b8355505b6001600288020188555050505b505050505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006140e0602e8361307d565b91506140eb82614084565b604082019050919050565b6000602082019050818103600083015261410f816140d3565b9050919050565b6000819050919050565b600060ff82169050919050565b600061414861414361413e84614116565b613e8a565b614120565b9050919050565b6141588161412d565b82525050565b6000602082019050614173600083018461414f565b92915050565b600061418482613124565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141b6576141b5613a81565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061421d60268361307d565b9150614228826141c1565b604082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142af60258361307d565b91506142ba82614253565b604082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061434160248361307d565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b614380816134d8565b811461438b57600080fd5b50565b60008151905061439d81614377565b92915050565b6000602082840312156143b9576143b8612fad565b5b60006143c78482850161438e565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b600061442c602e8361307d565b9150614437826143d0565b604082019050919050565b6000602082019050818103600083015261445b8161441f565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006144be60298361307d565b91506144c982614462565b604082019050919050565b600060208201905081810360008301526144ed816144b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061452a60208361307d565b9150614535826144f4565b602082019050919050565b600060208201905081810360008301526145598161451d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061459660198361307d565b91506145a182614560565b602082019050919050565b600060208201905081810360008301526145c581614589565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614628602b8361307d565b9150614633826145cc565b604082019050919050565b600060208201905081810360008301526146578161461b565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146ba60328361307d565b91506146c58261465e565b604082019050919050565b600060208201905081810360008301526146e9816146ad565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600061474c602a8361307d565b9150614757826146f0565b604082019050919050565b6000602082019050818103600083015261477b8161473f565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006147b860198361307d565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b600081905092915050565b600061480482613072565b61480e81856147ee565b935061481e81856020860161308e565b80840191505092915050565b600061483682856147f9565b915061484282846147f9565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006148aa602e8361307d565b91506148b58261484e565b604082019050919050565b600060208201905081810360008301526148d98161489d565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b600061493c602d8361307d565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061499982614972565b6149a3818561497d565b93506149b381856020860161308e565b6149bc816130b8565b840191505092915050565b60006080820190506149dc60008301876131b9565b6149e960208301866131b9565b6149f660408301856132e2565b8181036060830152614a08818461498e565b905095945050505050565b600081519050614a2281612fe3565b92915050565b600060208284031215614a3e57614a3d612fad565b5b6000614a4c84828501614a13565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a8b60208361307d565b9150614a9682614a55565b602082019050919050565b60006020820190508181036000830152614aba81614a7e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614af7601c8361307d565b9150614b0282614ac1565b602082019050919050565b60006020820190508181036000830152614b2681614aea565b9050919050565b600081905092915050565b6000614b4382614972565b614b4d8185614b2d565b9350614b5d81856020860161308e565b80840191505092915050565b6000614b758284614b38565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614bb6601d8361307d565b9150614bc182614b80565b602082019050919050565b60006020820190508181036000830152614be581614ba9565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122059b497373346de6c1eeaf019e40654496551140d0e2ec8a0e204c0d2a2c7308464736f6c63430008120033
Deployed Bytecode Sourcemap
97758:2232:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99768:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77204:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78727:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78234:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79427:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52000:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;46883:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79799:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47412:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46489:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76914:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76645:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20276:103;;;;;;;;;;;;;:::i;:::-;;19635:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98821:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77373:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78970:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98025:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80021:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99124:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99544:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98566:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98985:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79196:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20534:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99768:219;99919:4;99943:36;99967:11;99943:23;:36::i;:::-;99936:43;;99768:219;;;:::o;77204:100::-;77258:13;77291:5;77284:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77204:100;:::o;78727:171::-;78803:7;78823:23;78838:7;78823:14;:23::i;:::-;78866:15;:24;78882:7;78866:24;;;;;;;;;;;;;;;;;;;;;78859:31;;78727:171;;;:::o;78234:427::-;78315:13;78331:34;78357:7;78331:25;:34::i;:::-;78315:50;;78390:5;78384:11;;:2;:11;;;78376:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;78484:5;78468:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;78493:37;78510:5;78517:12;:10;:12::i;:::-;78493:16;:37::i;:::-;78468:62;78446:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;78632:21;78641:2;78645:7;78632:8;:21::i;:::-;78304:357;78234:427;;:::o;79427:301::-;79588:41;79607:12;:10;:12::i;:::-;79621:7;79588:18;:41::i;:::-;79580:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;79692:28;79702:4;79708:2;79712:7;79692:9;:28::i;:::-;79427:301;;;:::o;52000:438::-;52095:7;52104;52124:26;52153:17;:26;52171:7;52153:26;;;;;;;;;;;52124:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52224:1;52196:30;;:7;:16;;;:30;;;52192:92;;52253:19;52243:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52192:92;52296:21;52360:17;:15;:17::i;:::-;52320:57;;52333:7;:23;;;52321:35;;:9;:35;;;;:::i;:::-;52320:57;;;;:::i;:::-;52296:81;;52398:7;:16;;;52416:13;52390:40;;;;;;52000:438;;;;;:::o;46883:198::-;45359:6;45342:23;;45350:4;45342:23;;;45334:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45457:6;45433:30;;:20;:18;:20::i;:::-;:30;;;45425:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46965:36:::1;46983:17;46965;:36::i;:::-;47012:61;47034:17;47063:1;47053:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47067:5;47012:21;:61::i;:::-;46883:198:::0;:::o;79799:151::-;79903:39;79920:4;79926:2;79930:7;79903:39;;;;;;;;;;;;:16;:39::i;:::-;79799:151;;;:::o;47412:223::-;45359:6;45342:23;;45350:4;45342:23;;;45334:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45457:6;45433:30;;:20;:18;:20::i;:::-;:30;;;45425:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47528:36:::1;47546:17;47528;:36::i;:::-;47575:52;47597:17;47616:4;47622;47575:21;:52::i;:::-;47412:223:::0;;:::o;46489:133::-;46567:7;45804:6;45787:23;;45795:4;45787:23;;;45779:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;37846:66:::1;46594:20;;46587:27;;46489:133:::0;:::o;76914:223::-;76986:7;77006:13;77022:17;77031:7;77022:8;:17::i;:::-;77006:33;;77075:1;77058:19;;:5;:19;;;77050:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77124:5;77117:12;;;76914:223;;;:::o;76645:207::-;76717:7;76762:1;76745:19;;:5;:19;;;76737:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;76828:9;:16;76838:5;76828:16;;;;;;;;;;;;;;;;76821:23;;76645:207;;;:::o;20276:103::-;19521:13;:11;:13::i;:::-;20341:30:::1;20368:1;20341:18;:30::i;:::-;20276:103::o:0;19635:87::-;19681:7;19708:6;;;;;;;;;;;19701:13;;19635:87;:::o;98821:119::-;19521:13;:11;:13::i;:::-;98918:14:::1;98903:12;:29;;;;;;:::i;:::-;;98821:119:::0;:::o;77373:104::-;77429:13;77462:7;77455:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77373:104;:::o;78970:155::-;79065:52;79084:12;:10;:12::i;:::-;79098:8;79108;79065:18;:52::i;:::-;78970:155;;:::o;98025:364::-;13241:19;13264:13;;;;;;;;;;;13263:14;13241:36;;13311:14;:34;;;;;13344:1;13329:12;;;;;;;;;;:16;;;13311:34;13310:108;;;;13352:44;13390:4;13352:29;:44::i;:::-;13351:45;:66;;;;;13416:1;13400:12;;;;;;;;;;:17;;;13351:66;13310:108;13288:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;13518:1;13503:12;;:16;;;;;;;;;;;;;;;;;;13534:14;13530:67;;;13581:4;13565:13;;:20;;;;;;;;;;;;;;;;;;13530:67;98145:27:::1;98159:4;98165:6;98145:13;:27::i;:::-;98183:25;:23;:25::i;:::-;98219:22;:20;:22::i;:::-;98252:16;:14;:16::i;:::-;98279:24;:22;:24::i;:::-;98339:12;98324;:27;;;;;;:::i;:::-;;98380:1;98362:15;:19;;;;13623:14:::0;13619:102;;;13670:5;13654:13;;:21;;;;;;;;;;;;;;;;;;13695:14;13707:1;13695:14;;;;;;:::i;:::-;;;;;;;;13619:102;13230:498;98025:364;;;:::o;80021:279::-;80152:41;80171:12;:10;:12::i;:::-;80185:7;80152:18;:41::i;:::-;80144:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;80254:38;80268:4;80274:2;80278:7;80287:4;80254:13;:38::i;:::-;80021:279;;;;:::o;99124:123::-;19521:13;:11;:13::i;:::-;99205:34:::1;99224:9;99235:3;99205:18;:34::i;:::-;99124:123:::0;;:::o;99544:177::-;99657:13;99690:23;99705:7;99690:14;:23::i;:::-;99683:30;;99544:177;;;:::o;98566:210::-;98622:15;98640;;98622:33;;98666:15;;:17;;;;;;;;;:::i;:::-;;;;;;98696:30;98706:10;98718:7;98696:9;:30::i;:::-;98737:31;98750:7;98759:8;98737:12;:31::i;:::-;98611:165;98566:210;:::o;98985:97::-;99029:13;99062:12;99055:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98985:97;:::o;79196:164::-;79293:4;79317:18;:25;79336:5;79317:25;;;;;;;;;;;;;;;:35;79343:8;79317:35;;;;;;;;;;;;;;;;;;;;;;;;;79310:42;;79196:164;;;;:::o;20534:201::-;19521:13;:11;:13::i;:::-;20643:1:::1;20623:22;;:8;:22;;::::0;20615:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;20699:28;20718:8;20699:18;:28::i;:::-;20534:201:::0;:::o;93890:192::-;94014:4;94038:36;94062:11;94038:23;:36::i;:::-;94031:43;;93890:192;;;:::o;88356:135::-;88438:16;88446:7;88438;:16::i;:::-;88430:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;88356:135;:::o;17618:98::-;17671:7;17698:10;17691:17;;17618:98;:::o;87658:185::-;87760:2;87733:15;:24;87749:7;87733:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;87827:7;87823:2;87778:57;;87787:34;87813:7;87787:25;:34::i;:::-;87778:57;;;;;;;;;;;;87658:185;;:::o;82290:275::-;82383:4;82400:13;82416:34;82442:7;82416:25;:34::i;:::-;82400:50;;82480:5;82469:16;;:7;:16;;;:52;;;;82489:32;82506:5;82513:7;82489:16;:32::i;:::-;82469:52;:87;;;;82549:7;82525:31;;:20;82537:7;82525:11;:20::i;:::-;:31;;;82469:87;82461:96;;;82290:275;;;;:::o;86288:1251::-;86424:4;86386:42;;:34;86412:7;86386:25;:34::i;:::-;:42;;;86378:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;86503:1;86489:16;;:2;:16;;;86481:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;86559:42;86580:4;86586:2;86590:7;86599:1;86559:20;:42::i;:::-;86742:4;86704:42;;:34;86730:7;86704:25;:34::i;:::-;:42;;;86696:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;86860:15;:24;86876:7;86860:24;;;;;;;;;;;;86853:31;;;;;;;;;;;87355:1;87336:9;:15;87346:4;87336:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;87388:1;87371:9;:13;87381:2;87371:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;87430:2;87411:7;:16;87419:7;87411:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;87469:7;87465:2;87450:27;;87459:4;87450:27;;;;;;;;;;;;87490:41;87510:4;87516:2;87520:7;87529:1;87490:19;:41::i;:::-;86288:1251;;;:::o;52720:97::-;52778:6;52804:5;52797:12;;52720:97;:::o;37996:153::-;38049:7;38076:59;37846:66;38114:20;;38076:37;:59::i;:::-;:65;;;;;;;;;;;;38069:72;;37996:153;:::o;98438:84::-;19521:13;:11;:13::i;:::-;98438:84;:::o;39398:958::-;39818:53;37498:66;39856:14;;39818:37;:53::i;:::-;:59;;;;;;;;;;;;39814:535;;;39894:37;39913:17;39894:18;:37::i;:::-;39814:535;;;39997:17;39968:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39964:306;;40198:56;;;;;;;;;;:::i;:::-;;;;;;;;39964:306;37846:66;40090:20;;40082:4;:28;40074:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;40032:140;40284:53;40302:17;40321:4;40327:9;40284:17;:53::i;:::-;39814:535;39398:958;;;:::o;81565:117::-;81631:7;81658;:16;81666:7;81658:16;;;;;;;;;;;;;;;;;;;;;81651:23;;81565:117;;;:::o;19800:132::-;19875:12;:10;:12::i;:::-;19864:23;;:7;:5;:7::i;:::-;:23;;;19856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19800:132::o;20895:191::-;20969:16;20988:6;;;;;;;;;;;20969:25;;21014:8;21005:6;;:17;;;;;;;;;;;;;;;;;;21069:8;21038:40;;21059:8;21038:40;;;;;;;;;;;;20958:128;20895:191;:::o;87986:281::-;88107:8;88098:17;;:5;:17;;;88090:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;88194:8;88156:18;:25;88175:5;88156:25;;;;;;;;;;;;;;;:35;88182:8;88156:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;88240:8;88218:41;;88233:5;88218:41;;;88250:8;88218:41;;;;;;:::i;:::-;;;;;;;;87986:281;;;:::o;1663:326::-;1723:4;1980:1;1958:7;:19;;;:23;1951:30;;1663:326;;;:::o;75838:151::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;75942:39:::1;75966:5;75973:7;75942:23;:39::i;:::-;75838:151:::0;;:::o;95129:69::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;95129:::o;93670:66::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;93670:66::o;19178:97::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;19241:26:::1;:24;:26::i;:::-;19178:97::o:0;44487:68::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44487:68::o;81181:270::-;81294:28;81304:4;81310:2;81314:7;81294:9;:28::i;:::-;81341:47;81364:4;81370:2;81374:7;81383:4;81341:22;:47::i;:::-;81333:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;81181:270;;;;:::o;53088:332::-;53207:17;:15;:17::i;:::-;53191:33;;:12;:33;;;;53183:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53310:1;53290:22;;:8;:22;;;53282:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53377:35;;;;;;;;53389:8;53377:35;;;;;;53399:12;53377:35;;;;;53355:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53088:332;;:::o;95793:624::-;95866:13;95892:23;95907:7;95892:14;:23::i;:::-;95928;95954:10;:19;95965:7;95954:19;;;;;;;;;;;95928:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95984:18;96005:10;:8;:10::i;:::-;95984:31;;96113:1;96097:4;96091:18;:23;96087:72;;96138:9;96131:16;;;;;;96087:72;96289:1;96269:9;96263:23;:27;96259:108;;;96338:4;96344:9;96321:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96307:48;;;;;;96259:108;96386:23;96401:7;96386:14;:23::i;:::-;96379:30;;;;95793:624;;;;:::o;82907:110::-;82983:26;82993:2;82997:7;82983:26;;;;;;;;;;;;:9;:26::i;:::-;82907:110;;:::o;96613:258::-;96713:16;96721:7;96713;:16::i;:::-;96705:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;96813:9;96791:10;:19;96802:7;96791:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;96840:23;96855:7;96840:23;;;;;;:::i;:::-;;;;;;;;96613:258;;:::o;95493:229::-;95617:4;95663:10;95656:18;;95641:33;;;:11;:33;;;;:73;;;;95678:36;95702:11;95678:23;:36::i;:::-;95641:73;95634:80;;95493:229;;;:::o;81995:128::-;82060:4;82113:1;82084:31;;:17;82093:7;82084:8;:17::i;:::-;:31;;;;82077:38;;81995:128;;;:::o;90662:116::-;;;;;:::o;91500:115::-;;;;;:::o;34338:195::-;34399:21;34511:4;34501:14;;34338:195;;;:::o;34636:::-;34697:21;34809:4;34799:14;;34636:195;;;:::o;38245:284::-;38327:48;38357:17;38327:29;:48::i;:::-;38319:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;38504:17;38436:59;37846:66;38474:20;;38436:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;38245:284;:::o;38938:281::-;39047:29;39058:17;39047:10;:29::i;:::-;39105:1;39091:4;:11;:15;:28;;;;39110:9;39091:28;39087:125;;;39136:64;39176:17;39195:4;39136:39;:64::i;:::-;;39087:125;38938:281;;;:::o;75997:163::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76119:5:::1;76111;:13;;;;;;:::i;:::-;;76145:7;76135;:17;;;;;;:::i;:::-;;75997:163:::0;;:::o;19283:113::-;15384:13;;;;;;;;;;;15376:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;19356:32:::1;19375:12;:10;:12::i;:::-;19356:18;:32::i;:::-;19283:113::o:0;89055:875::-;89209:4;89230:15;:2;:13;;;:15::i;:::-;89226:697;;;89293:2;89266:47;;;89314:12;:10;:12::i;:::-;89328:4;89334:7;89343:4;89266:82;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;89262:606;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89546:1;89529:6;:13;:18;89525:328;;89572:60;;;;;;;;;;:::i;:::-;;;;;;;;89525:328;89803:6;89797:13;89788:6;89784:2;89780:15;89773:38;89262:606;89409:52;;;89399:62;;;:6;:62;;;;89392:69;;;;;89226:697;89907:4;89900:11;;89055:875;;;;;;;:::o;78078:94::-;78129:13;78155:9;;;;;;;;;;;;;;78078:94;:::o;77548:281::-;77621:13;77647:23;77662:7;77647:14;:23::i;:::-;77683:21;77707:10;:8;:10::i;:::-;77683:34;;77759:1;77741:7;77735:21;:25;:86;;;;;;;;;;;;;;;;;77787:7;77796:18;:7;:16;:18::i;:::-;77770:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77735:86;77728:93;;;77548:281;;;:::o;83244:285::-;83339:18;83345:2;83349:7;83339:5;:18::i;:::-;83390:53;83421:1;83425:2;83429:7;83438:4;83390:22;:53::i;:::-;83368:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;83244:285;;;:::o;76232:349::-;76356:4;76408:36;76393:51;;;:11;:51;;;;:127;;;;76476:44;76461:59;;;:11;:59;;;;76393:127;:180;;;;76537:36;76561:11;76537:23;:36::i;:::-;76393:180;76373:200;;76232:349;;;:::o;38642:155::-;38709:37;38728:17;38709:18;:37::i;:::-;38771:17;38762:27;;;;;;;;;;;;38642:155;:::o;7055:200::-;7138:12;7170:77;7191:6;7199:4;7170:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;7163:84;;7055:200;;;;:::o;72012:727::-;72068:13;72119:14;72167:1;72136:28;72158:5;72136:21;:28::i;:::-;:32;72119:49;;72183:20;72217:6;72206:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72183:41;;72239:11;72368:6;72364:2;72360:15;72352:6;72348:28;72341:35;;72405:288;72412:4;72405:288;;;72437:5;;;;;;;;72579:8;72574:2;72567:5;72563:14;72558:30;72553:3;72545:44;72635:2;72626:11;;;;;;:::i;:::-;;;;;72669:1;72660:5;:10;72405:288;72656:21;72405:288;72714:6;72707:13;;;;;72012:727;;;:::o;83865:942::-;83959:1;83945:16;;:2;:16;;;83937:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;84018:16;84026:7;84018;:16::i;:::-;84017:17;84009:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;84080:48;84109:1;84113:2;84117:7;84126:1;84080:20;:48::i;:::-;84227:16;84235:7;84227;:16::i;:::-;84226:17;84218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;84642:1;84625:9;:13;84635:2;84625:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;84686:2;84667:7;:16;84675:7;84667:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;84731:7;84727:2;84706:33;;84723:1;84706:33;;;;;;;;;;;;84752:47;84780:1;84784:2;84788:7;84797:1;84752:19;:47::i;:::-;83865:942;;:::o;51686:248::-;51810:4;51849:37;51834:52;;;:11;:52;;;;:92;;;;51890:36;51914:11;51890:23;:36::i;:::-;51834:92;51827:99;;51686:248;;;:::o;7449:332::-;7594:12;7620;7634:23;7661:6;:19;;7681:4;7661:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7619:67;;;;7704:69;7731:6;7739:7;7748:10;7760:12;7704:26;:69::i;:::-;7697:76;;;;7449:332;;;;;:::o;67327:948::-;67380:7;67400:14;67417:1;67400:18;;67467:8;67458:5;:17;67454:106;;67505:8;67496:17;;;;;;:::i;:::-;;;;;67542:2;67532:12;;;;67454:106;67587:8;67578:5;:17;67574:106;;67625:8;67616:17;;;;;;:::i;:::-;;;;;67662:2;67652:12;;;;67574:106;67707:8;67698:5;:17;67694:106;;67745:8;67736:17;;;;;;:::i;:::-;;;;;67782:2;67772:12;;;;67694:106;67827:7;67818:5;:16;67814:103;;67864:7;67855:16;;;;;;:::i;:::-;;;;;67900:1;67890:11;;;;67814:103;67944:7;67935:5;:16;67931:103;;67981:7;67972:16;;;;;;:::i;:::-;;;;;68017:1;68007:11;;;;67931:103;68061:7;68052:5;:16;68048:103;;68098:7;68089:16;;;;;;:::i;:::-;;;;;68134:1;68124:11;;;;68048:103;68178:7;68169:5;:16;68165:68;;68216:1;68206:11;;;;68165:68;68261:6;68254:13;;;67327:948;;;:::o;49555:168::-;49640:4;49679:36;49664:51;;;:11;:51;;;;49657:58;;49555:168;;;:::o;8077:644::-;8262:12;8291:7;8287:427;;;8340:1;8319:10;:17;:22;8315:290;;8537:18;8548:6;8537:10;:18::i;:::-;8529:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8315:290;8626:10;8619:17;;;;8287:427;8669:33;8677:10;8689:12;8669:7;:33::i;:::-;8077:644;;;;;;;:::o;9263:552::-;9444:1;9424:10;:17;:21;9420:388;;;9656:10;9650:17;9713:15;9700:10;9696:2;9692:19;9685:44;9420:388;9783:12;9776:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:75:1;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:474::-;5583:6;5591;5640:2;5628:9;5619:7;5615:23;5611:32;5608:119;;;5646:79;;:::i;:::-;5608:119;5766:1;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5737:117;5893:2;5919:53;5964:7;5955:6;5944:9;5940:22;5919:53;:::i;:::-;5909:63;;5864:118;5515:474;;;;;:::o;5995:118::-;6082:24;6100:5;6082:24;:::i;:::-;6077:3;6070:37;5995:118;;:::o;6119:332::-;6240:4;6278:2;6267:9;6263:18;6255:26;;6291:71;6359:1;6348:9;6344:17;6335:6;6291:71;:::i;:::-;6372:72;6440:2;6429:9;6425:18;6416:6;6372:72;:::i;:::-;6119:332;;;;;:::o;6457:329::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6662:117;6457:329;;;;:::o;6792:117::-;6901:1;6898;6891:12;6915:117;7024:1;7021;7014:12;7038:180;7086:77;7083:1;7076:88;7183:4;7180:1;7173:15;7207:4;7204:1;7197:15;7224:281;7307:27;7329:4;7307:27;:::i;:::-;7299:6;7295:40;7437:6;7425:10;7422:22;7401:18;7389:10;7386:34;7383:62;7380:88;;;7448:18;;:::i;:::-;7380:88;7488:10;7484:2;7477:22;7267:238;7224:281;;:::o;7511:129::-;7545:6;7572:20;;:::i;:::-;7562:30;;7601:33;7629:4;7621:6;7601:33;:::i;:::-;7511:129;;;:::o;7646:307::-;7707:4;7797:18;7789:6;7786:30;7783:56;;;7819:18;;:::i;:::-;7783:56;7857:29;7879:6;7857:29;:::i;:::-;7849:37;;7941:4;7935;7931:15;7923:23;;7646:307;;;:::o;7959:146::-;8056:6;8051:3;8046;8033:30;8097:1;8088:6;8083:3;8079:16;8072:27;7959:146;;;:::o;8111:423::-;8188:5;8213:65;8229:48;8270:6;8229:48;:::i;:::-;8213:65;:::i;:::-;8204:74;;8301:6;8294:5;8287:21;8339:4;8332:5;8328:16;8377:3;8368:6;8363:3;8359:16;8356:25;8353:112;;;8384:79;;:::i;:::-;8353:112;8474:54;8521:6;8516:3;8511;8474:54;:::i;:::-;8194:340;8111:423;;;;;:::o;8553:338::-;8608:5;8657:3;8650:4;8642:6;8638:17;8634:27;8624:122;;8665:79;;:::i;:::-;8624:122;8782:6;8769:20;8807:78;8881:3;8873:6;8866:4;8858:6;8854:17;8807:78;:::i;:::-;8798:87;;8614:277;8553:338;;;;:::o;8897:652::-;8974:6;8982;9031:2;9019:9;9010:7;9006:23;9002:32;8999:119;;;9037:79;;:::i;:::-;8999:119;9157:1;9182:53;9227:7;9218:6;9207:9;9203:22;9182:53;:::i;:::-;9172:63;;9128:117;9312:2;9301:9;9297:18;9284:32;9343:18;9335:6;9332:30;9329:117;;;9365:79;;:::i;:::-;9329:117;9470:62;9524:7;9515:6;9504:9;9500:22;9470:62;:::i;:::-;9460:72;;9255:287;8897:652;;;;;:::o;9555:77::-;9592:7;9621:5;9610:16;;9555:77;;;:::o;9638:118::-;9725:24;9743:5;9725:24;:::i;:::-;9720:3;9713:37;9638:118;;:::o;9762:222::-;9855:4;9893:2;9882:9;9878:18;9870:26;;9906:71;9974:1;9963:9;9959:17;9950:6;9906:71;:::i;:::-;9762:222;;;;:::o;9990:::-;10083:4;10121:2;10110:9;10106:18;10098:26;;10134:71;10202:1;10191:9;10187:17;10178:6;10134:71;:::i;:::-;9990:222;;;;:::o;10218:308::-;10280:4;10370:18;10362:6;10359:30;10356:56;;;10392:18;;:::i;:::-;10356:56;10430:29;10452:6;10430:29;:::i;:::-;10422:37;;10514:4;10508;10504:15;10496:23;;10218:308;;;:::o;10532:425::-;10610:5;10635:66;10651:49;10693:6;10651:49;:::i;:::-;10635:66;:::i;:::-;10626:75;;10724:6;10717:5;10710:21;10762:4;10755:5;10751:16;10800:3;10791:6;10786:3;10782:16;10779:25;10776:112;;;10807:79;;:::i;:::-;10776:112;10897:54;10944:6;10939:3;10934;10897:54;:::i;:::-;10616:341;10532:425;;;;;:::o;10977:340::-;11033:5;11082:3;11075:4;11067:6;11063:17;11059:27;11049:122;;11090:79;;:::i;:::-;11049:122;11207:6;11194:20;11232:79;11307:3;11299:6;11292:4;11284:6;11280:17;11232:79;:::i;:::-;11223:88;;11039:278;10977:340;;;;:::o;11323:509::-;11392:6;11441:2;11429:9;11420:7;11416:23;11412:32;11409:119;;;11447:79;;:::i;:::-;11409:119;11595:1;11584:9;11580:17;11567:31;11625:18;11617:6;11614:30;11611:117;;;11647:79;;:::i;:::-;11611:117;11752:63;11807:7;11798:6;11787:9;11783:22;11752:63;:::i;:::-;11742:73;;11538:287;11323:509;;;;:::o;11838:116::-;11908:21;11923:5;11908:21;:::i;:::-;11901:5;11898:32;11888:60;;11944:1;11941;11934:12;11888:60;11838:116;:::o;11960:133::-;12003:5;12041:6;12028:20;12019:29;;12057:30;12081:5;12057:30;:::i;:::-;11960:133;;;;:::o;12099:468::-;12164:6;12172;12221:2;12209:9;12200:7;12196:23;12192:32;12189:119;;;12227:79;;:::i;:::-;12189:119;12347:1;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12318:117;12474:2;12500:50;12542:7;12533:6;12522:9;12518:22;12500:50;:::i;:::-;12490:60;;12445:115;12099:468;;;;;:::o;12573:1159::-;12680:6;12688;12696;12745:2;12733:9;12724:7;12720:23;12716:32;12713:119;;;12751:79;;:::i;:::-;12713:119;12899:1;12888:9;12884:17;12871:31;12929:18;12921:6;12918:30;12915:117;;;12951:79;;:::i;:::-;12915:117;13056:63;13111:7;13102:6;13091:9;13087:22;13056:63;:::i;:::-;13046:73;;12842:287;13196:2;13185:9;13181:18;13168:32;13227:18;13219:6;13216:30;13213:117;;;13249:79;;:::i;:::-;13213:117;13354:63;13409:7;13400:6;13389:9;13385:22;13354:63;:::i;:::-;13344:73;;13139:288;13494:2;13483:9;13479:18;13466:32;13525:18;13517:6;13514:30;13511:117;;;13547:79;;:::i;:::-;13511:117;13652:63;13707:7;13698:6;13687:9;13683:22;13652:63;:::i;:::-;13642:73;;13437:288;12573:1159;;;;;:::o;13738:943::-;13833:6;13841;13849;13857;13906:3;13894:9;13885:7;13881:23;13877:33;13874:120;;;13913:79;;:::i;:::-;13874:120;14033:1;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14004:117;14160:2;14186:53;14231:7;14222:6;14211:9;14207:22;14186:53;:::i;:::-;14176:63;;14131:118;14288:2;14314:53;14359:7;14350:6;14339:9;14335:22;14314:53;:::i;:::-;14304:63;;14259:118;14444:2;14433:9;14429:18;14416:32;14475:18;14467:6;14464:30;14461:117;;;14497:79;;:::i;:::-;14461:117;14602:62;14656:7;14647:6;14636:9;14632:22;14602:62;:::i;:::-;14592:72;;14387:287;13738:943;;;;;;;:::o;14687:109::-;14723:7;14763:26;14756:5;14752:38;14741:49;;14687:109;;;:::o;14802:120::-;14874:23;14891:5;14874:23;:::i;:::-;14867:5;14864:34;14854:62;;14912:1;14909;14902:12;14854:62;14802:120;:::o;14928:137::-;14973:5;15011:6;14998:20;14989:29;;15027:32;15053:5;15027:32;:::i;:::-;14928:137;;;;:::o;15071:472::-;15138:6;15146;15195:2;15183:9;15174:7;15170:23;15166:32;15163:119;;;15201:79;;:::i;:::-;15163:119;15321:1;15346:53;15391:7;15382:6;15371:9;15367:22;15346:53;:::i;:::-;15336:63;;15292:117;15448:2;15474:52;15518:7;15509:6;15498:9;15494:22;15474:52;:::i;:::-;15464:62;;15419:117;15071:472;;;;;:::o;15549:474::-;15617:6;15625;15674:2;15662:9;15653:7;15649:23;15645:32;15642:119;;;15680:79;;:::i;:::-;15642:119;15800:1;15825:53;15870:7;15861:6;15850:9;15846:22;15825:53;:::i;:::-;15815:63;;15771:117;15927:2;15953:53;15998:7;15989:6;15978:9;15974:22;15953:53;:::i;:::-;15943:63;;15898:118;15549:474;;;;;:::o;16029:180::-;16077:77;16074:1;16067:88;16174:4;16171:1;16164:15;16198:4;16195:1;16188:15;16215:320;16259:6;16296:1;16290:4;16286:12;16276:22;;16343:1;16337:4;16333:12;16364:18;16354:81;;16420:4;16412:6;16408:17;16398:27;;16354:81;16482:2;16474:6;16471:14;16451:18;16448:38;16445:84;;16501:18;;:::i;:::-;16445:84;16266:269;16215:320;;;:::o;16541:220::-;16681:34;16677:1;16669:6;16665:14;16658:58;16750:3;16745:2;16737:6;16733:15;16726:28;16541:220;:::o;16767:366::-;16909:3;16930:67;16994:2;16989:3;16930:67;:::i;:::-;16923:74;;17006:93;17095:3;17006:93;:::i;:::-;17124:2;17119:3;17115:12;17108:19;;16767:366;;;:::o;17139:419::-;17305:4;17343:2;17332:9;17328:18;17320:26;;17392:9;17386:4;17382:20;17378:1;17367:9;17363:17;17356:47;17420:131;17546:4;17420:131;:::i;:::-;17412:139;;17139:419;;;:::o;17564:248::-;17704:34;17700:1;17692:6;17688:14;17681:58;17773:31;17768:2;17760:6;17756:15;17749:56;17564:248;:::o;17818:366::-;17960:3;17981:67;18045:2;18040:3;17981:67;:::i;:::-;17974:74;;18057:93;18146:3;18057:93;:::i;:::-;18175:2;18170:3;18166:12;18159:19;;17818:366;;;:::o;18190:419::-;18356:4;18394:2;18383:9;18379:18;18371:26;;18443:9;18437:4;18433:20;18429:1;18418:9;18414:17;18407:47;18471:131;18597:4;18471:131;:::i;:::-;18463:139;;18190:419;;;:::o;18615:232::-;18755:34;18751:1;18743:6;18739:14;18732:58;18824:15;18819:2;18811:6;18807:15;18800:40;18615:232;:::o;18853:366::-;18995:3;19016:67;19080:2;19075:3;19016:67;:::i;:::-;19009:74;;19092:93;19181:3;19092:93;:::i;:::-;19210:2;19205:3;19201:12;19194:19;;18853:366;;;:::o;19225:419::-;19391:4;19429:2;19418:9;19414:18;19406:26;;19478:9;19472:4;19468:20;19464:1;19453:9;19449:17;19442:47;19506:131;19632:4;19506:131;:::i;:::-;19498:139;;19225:419;;;:::o;19650:180::-;19698:77;19695:1;19688:88;19795:4;19792:1;19785:15;19819:4;19816:1;19809:15;19836:410;19876:7;19899:20;19917:1;19899:20;:::i;:::-;19894:25;;19933:20;19951:1;19933:20;:::i;:::-;19928:25;;19988:1;19985;19981:9;20010:30;20028:11;20010:30;:::i;:::-;19999:41;;20189:1;20180:7;20176:15;20173:1;20170:22;20150:1;20143:9;20123:83;20100:139;;20219:18;;:::i;:::-;20100:139;19884:362;19836:410;;;;:::o;20252:180::-;20300:77;20297:1;20290:88;20397:4;20394:1;20387:15;20421:4;20418:1;20411:15;20438:185;20478:1;20495:20;20513:1;20495:20;:::i;:::-;20490:25;;20529:20;20547:1;20529:20;:::i;:::-;20524:25;;20568:1;20558:35;;20573:18;;:::i;:::-;20558:35;20615:1;20612;20608:9;20603:14;;20438:185;;;;:::o;20629:231::-;20769:34;20765:1;20757:6;20753:14;20746:58;20838:14;20833:2;20825:6;20821:15;20814:39;20629:231;:::o;20866:366::-;21008:3;21029:67;21093:2;21088:3;21029:67;:::i;:::-;21022:74;;21105:93;21194:3;21105:93;:::i;:::-;21223:2;21218:3;21214:12;21207:19;;20866:366;;;:::o;21238:419::-;21404:4;21442:2;21431:9;21427:18;21419:26;;21491:9;21485:4;21481:20;21477:1;21466:9;21462:17;21455:47;21519:131;21645:4;21519:131;:::i;:::-;21511:139;;21238:419;;;:::o;21663:231::-;21803:34;21799:1;21791:6;21787:14;21780:58;21872:14;21867:2;21859:6;21855:15;21848:39;21663:231;:::o;21900:366::-;22042:3;22063:67;22127:2;22122:3;22063:67;:::i;:::-;22056:74;;22139:93;22228:3;22139:93;:::i;:::-;22257:2;22252:3;22248:12;22241:19;;21900:366;;;:::o;22272:419::-;22438:4;22476:2;22465:9;22461:18;22453:26;;22525:9;22519:4;22515:20;22511:1;22500:9;22496:17;22489:47;22553:131;22679:4;22553:131;:::i;:::-;22545:139;;22272:419;;;:::o;22697:243::-;22837:34;22833:1;22825:6;22821:14;22814:58;22906:26;22901:2;22893:6;22889:15;22882:51;22697:243;:::o;22946:366::-;23088:3;23109:67;23173:2;23168:3;23109:67;:::i;:::-;23102:74;;23185:93;23274:3;23185:93;:::i;:::-;23303:2;23298:3;23294:12;23287:19;;22946:366;;;:::o;23318:419::-;23484:4;23522:2;23511:9;23507:18;23499:26;;23571:9;23565:4;23561:20;23557:1;23546:9;23542:17;23535:47;23599:131;23725:4;23599:131;:::i;:::-;23591:139;;23318:419;;;:::o;23743:174::-;23883:26;23879:1;23871:6;23867:14;23860:50;23743:174;:::o;23923:366::-;24065:3;24086:67;24150:2;24145:3;24086:67;:::i;:::-;24079:74;;24162:93;24251:3;24162:93;:::i;:::-;24280:2;24275:3;24271:12;24264:19;;23923:366;;;:::o;24295:419::-;24461:4;24499:2;24488:9;24484:18;24476:26;;24548:9;24542:4;24538:20;24534:1;24523:9;24519:17;24512:47;24576:131;24702:4;24576:131;:::i;:::-;24568:139;;24295:419;;;:::o;24720:228::-;24860:34;24856:1;24848:6;24844:14;24837:58;24929:11;24924:2;24916:6;24912:15;24905:36;24720:228;:::o;24954:366::-;25096:3;25117:67;25181:2;25176:3;25117:67;:::i;:::-;25110:74;;25193:93;25282:3;25193:93;:::i;:::-;25311:2;25306:3;25302:12;25295:19;;24954:366;;;:::o;25326:419::-;25492:4;25530:2;25519:9;25515:18;25507:26;;25579:9;25573:4;25569:20;25565:1;25554:9;25550:17;25543:47;25607:131;25733:4;25607:131;:::i;:::-;25599:139;;25326:419;;;:::o;25751:141::-;25800:4;25823:3;25815:11;;25846:3;25843:1;25836:14;25880:4;25877:1;25867:18;25859:26;;25751:141;;;:::o;25898:93::-;25935:6;25982:2;25977;25970:5;25966:14;25962:23;25952:33;;25898:93;;;:::o;25997:107::-;26041:8;26091:5;26085:4;26081:16;26060:37;;25997:107;;;;:::o;26110:393::-;26179:6;26229:1;26217:10;26213:18;26252:97;26282:66;26271:9;26252:97;:::i;:::-;26370:39;26400:8;26389:9;26370:39;:::i;:::-;26358:51;;26442:4;26438:9;26431:5;26427:21;26418:30;;26491:4;26481:8;26477:19;26470:5;26467:30;26457:40;;26186:317;;26110:393;;;;;:::o;26509:60::-;26537:3;26558:5;26551:12;;26509:60;;;:::o;26575:142::-;26625:9;26658:53;26676:34;26685:24;26703:5;26685:24;:::i;:::-;26676:34;:::i;:::-;26658:53;:::i;:::-;26645:66;;26575:142;;;:::o;26723:75::-;26766:3;26787:5;26780:12;;26723:75;;;:::o;26804:269::-;26914:39;26945:7;26914:39;:::i;:::-;26975:91;27024:41;27048:16;27024:41;:::i;:::-;27016:6;27009:4;27003:11;26975:91;:::i;:::-;26969:4;26962:105;26880:193;26804:269;;;:::o;27079:73::-;27124:3;27079:73;:::o;27158:189::-;27235:32;;:::i;:::-;27276:65;27334:6;27326;27320:4;27276:65;:::i;:::-;27211:136;27158:189;;:::o;27353:186::-;27413:120;27430:3;27423:5;27420:14;27413:120;;;27484:39;27521:1;27514:5;27484:39;:::i;:::-;27457:1;27450:5;27446:13;27437:22;;27413:120;;;27353:186;;:::o;27545:543::-;27646:2;27641:3;27638:11;27635:446;;;27680:38;27712:5;27680:38;:::i;:::-;27764:29;27782:10;27764:29;:::i;:::-;27754:8;27750:44;27947:2;27935:10;27932:18;27929:49;;;27968:8;27953:23;;27929:49;27991:80;28047:22;28065:3;28047:22;:::i;:::-;28037:8;28033:37;28020:11;27991:80;:::i;:::-;27650:431;;27635:446;27545:543;;;:::o;28094:117::-;28148:8;28198:5;28192:4;28188:16;28167:37;;28094:117;;;;:::o;28217:169::-;28261:6;28294:51;28342:1;28338:6;28330:5;28327:1;28323:13;28294:51;:::i;:::-;28290:56;28375:4;28369;28365:15;28355:25;;28268:118;28217:169;;;;:::o;28391:295::-;28467:4;28613:29;28638:3;28632:4;28613:29;:::i;:::-;28605:37;;28675:3;28672:1;28668:11;28662:4;28659:21;28651:29;;28391:295;;;;:::o;28691:1395::-;28808:37;28841:3;28808:37;:::i;:::-;28910:18;28902:6;28899:30;28896:56;;;28932:18;;:::i;:::-;28896:56;28976:38;29008:4;29002:11;28976:38;:::i;:::-;29061:67;29121:6;29113;29107:4;29061:67;:::i;:::-;29155:1;29179:4;29166:17;;29211:2;29203:6;29200:14;29228:1;29223:618;;;;29885:1;29902:6;29899:77;;;29951:9;29946:3;29942:19;29936:26;29927:35;;29899:77;30002:67;30062:6;30055:5;30002:67;:::i;:::-;29996:4;29989:81;29858:222;29193:887;;29223:618;29275:4;29271:9;29263:6;29259:22;29309:37;29341:4;29309:37;:::i;:::-;29368:1;29382:208;29396:7;29393:1;29390:14;29382:208;;;29475:9;29470:3;29466:19;29460:26;29452:6;29445:42;29526:1;29518:6;29514:14;29504:24;;29573:2;29562:9;29558:18;29545:31;;29419:4;29416:1;29412:12;29407:17;;29382:208;;;29618:6;29609:7;29606:19;29603:179;;;29676:9;29671:3;29667:19;29661:26;29719:48;29761:4;29753:6;29749:17;29738:9;29719:48;:::i;:::-;29711:6;29704:64;29626:156;29603:179;29828:1;29824;29816:6;29812:14;29808:22;29802:4;29795:36;29230:611;;;29193:887;;28783:1303;;;28691:1395;;:::o;30092:233::-;30232:34;30228:1;30220:6;30216:14;30209:58;30301:16;30296:2;30288:6;30284:15;30277:41;30092:233;:::o;30331:366::-;30473:3;30494:67;30558:2;30553:3;30494:67;:::i;:::-;30487:74;;30570:93;30659:3;30570:93;:::i;:::-;30688:2;30683:3;30679:12;30672:19;;30331:366;;;:::o;30703:419::-;30869:4;30907:2;30896:9;30892:18;30884:26;;30956:9;30950:4;30946:20;30942:1;30931:9;30927:17;30920:47;30984:131;31110:4;30984:131;:::i;:::-;30976:139;;30703:419;;;:::o;31128:85::-;31173:7;31202:5;31191:16;;31128:85;;;:::o;31219:86::-;31254:7;31294:4;31287:5;31283:16;31272:27;;31219:86;;;:::o;31311:154::-;31367:9;31400:59;31416:42;31425:32;31451:5;31425:32;:::i;:::-;31416:42;:::i;:::-;31400:59;:::i;:::-;31387:72;;31311:154;;;:::o;31471:143::-;31564:43;31601:5;31564:43;:::i;:::-;31559:3;31552:56;31471:143;;:::o;31620:234::-;31719:4;31757:2;31746:9;31742:18;31734:26;;31770:77;31844:1;31833:9;31829:17;31820:6;31770:77;:::i;:::-;31620:234;;;;:::o;31860:233::-;31899:3;31922:24;31940:5;31922:24;:::i;:::-;31913:33;;31968:66;31961:5;31958:77;31955:103;;32038:18;;:::i;:::-;31955:103;32085:1;32078:5;32074:13;32067:20;;31860:233;;;:::o;32099:225::-;32239:34;32235:1;32227:6;32223:14;32216:58;32308:8;32303:2;32295:6;32291:15;32284:33;32099:225;:::o;32330:366::-;32472:3;32493:67;32557:2;32552:3;32493:67;:::i;:::-;32486:74;;32569:93;32658:3;32569:93;:::i;:::-;32687:2;32682:3;32678:12;32671:19;;32330:366;;;:::o;32702:419::-;32868:4;32906:2;32895:9;32891:18;32883:26;;32955:9;32949:4;32945:20;32941:1;32930:9;32926:17;32919:47;32983:131;33109:4;32983:131;:::i;:::-;32975:139;;32702:419;;;:::o;33127:224::-;33267:34;33263:1;33255:6;33251:14;33244:58;33336:7;33331:2;33323:6;33319:15;33312:32;33127:224;:::o;33357:366::-;33499:3;33520:67;33584:2;33579:3;33520:67;:::i;:::-;33513:74;;33596:93;33685:3;33596:93;:::i;:::-;33714:2;33709:3;33705:12;33698:19;;33357:366;;;:::o;33729:419::-;33895:4;33933:2;33922:9;33918:18;33910:26;;33982:9;33976:4;33972:20;33968:1;33957:9;33953:17;33946:47;34010:131;34136:4;34010:131;:::i;:::-;34002:139;;33729:419;;;:::o;34154:223::-;34294:34;34290:1;34282:6;34278:14;34271:58;34363:6;34358:2;34350:6;34346:15;34339:31;34154:223;:::o;34383:366::-;34525:3;34546:67;34610:2;34605:3;34546:67;:::i;:::-;34539:74;;34622:93;34711:3;34622:93;:::i;:::-;34740:2;34735:3;34731:12;34724:19;;34383:366;;;:::o;34755:419::-;34921:4;34959:2;34948:9;34944:18;34936:26;;35008:9;35002:4;34998:20;34994:1;34983:9;34979:17;34972:47;35036:131;35162:4;35036:131;:::i;:::-;35028:139;;34755:419;;;:::o;35180:122::-;35253:24;35271:5;35253:24;:::i;:::-;35246:5;35243:35;35233:63;;35292:1;35289;35282:12;35233:63;35180:122;:::o;35308:143::-;35365:5;35396:6;35390:13;35381:22;;35412:33;35439:5;35412:33;:::i;:::-;35308:143;;;;:::o;35457:351::-;35527:6;35576:2;35564:9;35555:7;35551:23;35547:32;35544:119;;;35582:79;;:::i;:::-;35544:119;35702:1;35727:64;35783:7;35774:6;35763:9;35759:22;35727:64;:::i;:::-;35717:74;;35673:128;35457:351;;;;:::o;35814:233::-;35954:34;35950:1;35942:6;35938:14;35931:58;36023:16;36018:2;36010:6;36006:15;35999:41;35814:233;:::o;36053:366::-;36195:3;36216:67;36280:2;36275:3;36216:67;:::i;:::-;36209:74;;36292:93;36381:3;36292:93;:::i;:::-;36410:2;36405:3;36401:12;36394:19;;36053:366;;;:::o;36425:419::-;36591:4;36629:2;36618:9;36614:18;36606:26;;36678:9;36672:4;36668:20;36664:1;36653:9;36649:17;36642:47;36706:131;36832:4;36706:131;:::i;:::-;36698:139;;36425:419;;;:::o;36850:228::-;36990:34;36986:1;36978:6;36974:14;36967:58;37059:11;37054:2;37046:6;37042:15;37035:36;36850:228;:::o;37084:366::-;37226:3;37247:67;37311:2;37306:3;37247:67;:::i;:::-;37240:74;;37323:93;37412:3;37323:93;:::i;:::-;37441:2;37436:3;37432:12;37425:19;;37084:366;;;:::o;37456:419::-;37622:4;37660:2;37649:9;37645:18;37637:26;;37709:9;37703:4;37699:20;37695:1;37684:9;37680:17;37673:47;37737:131;37863:4;37737:131;:::i;:::-;37729:139;;37456:419;;;:::o;37881:182::-;38021:34;38017:1;38009:6;38005:14;37998:58;37881:182;:::o;38069:366::-;38211:3;38232:67;38296:2;38291:3;38232:67;:::i;:::-;38225:74;;38308:93;38397:3;38308:93;:::i;:::-;38426:2;38421:3;38417:12;38410:19;;38069:366;;;:::o;38441:419::-;38607:4;38645:2;38634:9;38630:18;38622:26;;38694:9;38688:4;38684:20;38680:1;38669:9;38665:17;38658:47;38722:131;38848:4;38722:131;:::i;:::-;38714:139;;38441:419;;;:::o;38866:175::-;39006:27;39002:1;38994:6;38990:14;38983:51;38866:175;:::o;39047:366::-;39189:3;39210:67;39274:2;39269:3;39210:67;:::i;:::-;39203:74;;39286:93;39375:3;39286:93;:::i;:::-;39404:2;39399:3;39395:12;39388:19;;39047:366;;;:::o;39419:419::-;39585:4;39623:2;39612:9;39608:18;39600:26;;39672:9;39666:4;39662:20;39658:1;39647:9;39643:17;39636:47;39700:131;39826:4;39700:131;:::i;:::-;39692:139;;39419:419;;;:::o;39844:230::-;39984:34;39980:1;39972:6;39968:14;39961:58;40053:13;40048:2;40040:6;40036:15;40029:38;39844:230;:::o;40080:366::-;40222:3;40243:67;40307:2;40302:3;40243:67;:::i;:::-;40236:74;;40319:93;40408:3;40319:93;:::i;:::-;40437:2;40432:3;40428:12;40421:19;;40080:366;;;:::o;40452:419::-;40618:4;40656:2;40645:9;40641:18;40633:26;;40705:9;40699:4;40695:20;40691:1;40680:9;40676:17;40669:47;40733:131;40859:4;40733:131;:::i;:::-;40725:139;;40452:419;;;:::o;40877:237::-;41017:34;41013:1;41005:6;41001:14;40994:58;41086:20;41081:2;41073:6;41069:15;41062:45;40877:237;:::o;41120:366::-;41262:3;41283:67;41347:2;41342:3;41283:67;:::i;:::-;41276:74;;41359:93;41448:3;41359:93;:::i;:::-;41477:2;41472:3;41468:12;41461:19;;41120:366;;;:::o;41492:419::-;41658:4;41696:2;41685:9;41681:18;41673:26;;41745:9;41739:4;41735:20;41731:1;41720:9;41716:17;41709:47;41773:131;41899:4;41773:131;:::i;:::-;41765:139;;41492:419;;;:::o;41917:229::-;42057:34;42053:1;42045:6;42041:14;42034:58;42126:12;42121:2;42113:6;42109:15;42102:37;41917:229;:::o;42152:366::-;42294:3;42315:67;42379:2;42374:3;42315:67;:::i;:::-;42308:74;;42391:93;42480:3;42391:93;:::i;:::-;42509:2;42504:3;42500:12;42493:19;;42152:366;;;:::o;42524:419::-;42690:4;42728:2;42717:9;42713:18;42705:26;;42777:9;42771:4;42767:20;42763:1;42752:9;42748:17;42741:47;42805:131;42931:4;42805:131;:::i;:::-;42797:139;;42524:419;;;:::o;42949:175::-;43089:27;43085:1;43077:6;43073:14;43066:51;42949:175;:::o;43130:366::-;43272:3;43293:67;43357:2;43352:3;43293:67;:::i;:::-;43286:74;;43369:93;43458:3;43369:93;:::i;:::-;43487:2;43482:3;43478:12;43471:19;;43130:366;;;:::o;43502:419::-;43668:4;43706:2;43695:9;43691:18;43683:26;;43755:9;43749:4;43745:20;43741:1;43730:9;43726:17;43719:47;43783:131;43909:4;43783:131;:::i;:::-;43775:139;;43502:419;;;:::o;43927:148::-;44029:11;44066:3;44051:18;;43927:148;;;;:::o;44081:390::-;44187:3;44215:39;44248:5;44215:39;:::i;:::-;44270:89;44352:6;44347:3;44270:89;:::i;:::-;44263:96;;44368:65;44426:6;44421:3;44414:4;44407:5;44403:16;44368:65;:::i;:::-;44458:6;44453:3;44449:16;44442:23;;44191:280;44081:390;;;;:::o;44477:435::-;44657:3;44679:95;44770:3;44761:6;44679:95;:::i;:::-;44672:102;;44791:95;44882:3;44873:6;44791:95;:::i;:::-;44784:102;;44903:3;44896:10;;44477:435;;;;;:::o;44918:233::-;45058:34;45054:1;45046:6;45042:14;45035:58;45127:16;45122:2;45114:6;45110:15;45103:41;44918:233;:::o;45157:366::-;45299:3;45320:67;45384:2;45379:3;45320:67;:::i;:::-;45313:74;;45396:93;45485:3;45396:93;:::i;:::-;45514:2;45509:3;45505:12;45498:19;;45157:366;;;:::o;45529:419::-;45695:4;45733:2;45722:9;45718:18;45710:26;;45782:9;45776:4;45772:20;45768:1;45757:9;45753:17;45746:47;45810:131;45936:4;45810:131;:::i;:::-;45802:139;;45529:419;;;:::o;45954:232::-;46094:34;46090:1;46082:6;46078:14;46071:58;46163:15;46158:2;46150:6;46146:15;46139:40;45954:232;:::o;46192:366::-;46334:3;46355:67;46419:2;46414:3;46355:67;:::i;:::-;46348:74;;46431:93;46520:3;46431:93;:::i;:::-;46549:2;46544:3;46540:12;46533:19;;46192:366;;;:::o;46564:419::-;46730:4;46768:2;46757:9;46753:18;46745:26;;46817:9;46811:4;46807:20;46803:1;46792:9;46788:17;46781:47;46845:131;46971:4;46845:131;:::i;:::-;46837:139;;46564:419;;;:::o;46989:98::-;47040:6;47074:5;47068:12;47058:22;;46989:98;;;:::o;47093:168::-;47176:11;47210:6;47205:3;47198:19;47250:4;47245:3;47241:14;47226:29;;47093:168;;;;:::o;47267:373::-;47353:3;47381:38;47413:5;47381:38;:::i;:::-;47435:70;47498:6;47493:3;47435:70;:::i;:::-;47428:77;;47514:65;47572:6;47567:3;47560:4;47553:5;47549:16;47514:65;:::i;:::-;47604:29;47626:6;47604:29;:::i;:::-;47599:3;47595:39;47588:46;;47357:283;47267:373;;;;:::o;47646:640::-;47841:4;47879:3;47868:9;47864:19;47856:27;;47893:71;47961:1;47950:9;47946:17;47937:6;47893:71;:::i;:::-;47974:72;48042:2;48031:9;48027:18;48018:6;47974:72;:::i;:::-;48056;48124:2;48113:9;48109:18;48100:6;48056:72;:::i;:::-;48175:9;48169:4;48165:20;48160:2;48149:9;48145:18;48138:48;48203:76;48274:4;48265:6;48203:76;:::i;:::-;48195:84;;47646:640;;;;;;;:::o;48292:141::-;48348:5;48379:6;48373:13;48364:22;;48395:32;48421:5;48395:32;:::i;:::-;48292:141;;;;:::o;48439:349::-;48508:6;48557:2;48545:9;48536:7;48532:23;48528:32;48525:119;;;48563:79;;:::i;:::-;48525:119;48683:1;48708:63;48763:7;48754:6;48743:9;48739:22;48708:63;:::i;:::-;48698:73;;48654:127;48439:349;;;;:::o;48794:182::-;48934:34;48930:1;48922:6;48918:14;48911:58;48794:182;:::o;48982:366::-;49124:3;49145:67;49209:2;49204:3;49145:67;:::i;:::-;49138:74;;49221:93;49310:3;49221:93;:::i;:::-;49339:2;49334:3;49330:12;49323:19;;48982:366;;;:::o;49354:419::-;49520:4;49558:2;49547:9;49543:18;49535:26;;49607:9;49601:4;49597:20;49593:1;49582:9;49578:17;49571:47;49635:131;49761:4;49635:131;:::i;:::-;49627:139;;49354:419;;;:::o;49779:178::-;49919:30;49915:1;49907:6;49903:14;49896:54;49779:178;:::o;49963:366::-;50105:3;50126:67;50190:2;50185:3;50126:67;:::i;:::-;50119:74;;50202:93;50291:3;50202:93;:::i;:::-;50320:2;50315:3;50311:12;50304:19;;49963:366;;;:::o;50335:419::-;50501:4;50539:2;50528:9;50524:18;50516:26;;50588:9;50582:4;50578:20;50574:1;50563:9;50559:17;50552:47;50616:131;50742:4;50616:131;:::i;:::-;50608:139;;50335:419;;;:::o;50760:147::-;50861:11;50898:3;50883:18;;50760:147;;;;:::o;50913:386::-;51017:3;51045:38;51077:5;51045:38;:::i;:::-;51099:88;51180:6;51175:3;51099:88;:::i;:::-;51092:95;;51196:65;51254:6;51249:3;51242:4;51235:5;51231:16;51196:65;:::i;:::-;51286:6;51281:3;51277:16;51270:23;;51021:278;50913:386;;;;:::o;51305:271::-;51435:3;51457:93;51546:3;51537:6;51457:93;:::i;:::-;51450:100;;51567:3;51560:10;;51305:271;;;;:::o;51582:179::-;51722:31;51718:1;51710:6;51706:14;51699:55;51582:179;:::o;51767:366::-;51909:3;51930:67;51994:2;51989:3;51930:67;:::i;:::-;51923:74;;52006:93;52095:3;52006:93;:::i;:::-;52124:2;52119:3;52115:12;52108:19;;51767:366;;;:::o;52139:419::-;52305:4;52343:2;52332:9;52328:18;52320:26;;52392:9;52386:4;52382:20;52378:1;52367:9;52363:17;52356:47;52420:131;52546:4;52420:131;:::i;:::-;52412:139;;52139:419;;;:::o
Swarm Source
ipfs://59b497373346de6c1eeaf019e40654496551140d0e2ec8a0e204c0d2a2c73084
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.