Source Code
Latest 25 from a total of 1,052 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Release | 24395724 | 40 days ago | IN | 0 ETH | 0.00002514 | ||||
| Release | 24337280 | 48 days ago | IN | 0 ETH | 0.00507159 | ||||
| Release | 23968502 | 99 days ago | IN | 0 ETH | 0.00002395 | ||||
| Release | 23921771 | 106 days ago | IN | 0 ETH | 0.00009639 | ||||
| Release | 23921765 | 106 days ago | IN | 0 ETH | 0.0000972 | ||||
| Release | 23918907 | 106 days ago | IN | 0 ETH | 0.00000389 | ||||
| Release | 23604647 | 150 days ago | IN | 0 ETH | 0.0000072 | ||||
| Release | 23479844 | 168 days ago | IN | 0 ETH | 0.00011577 | ||||
| Release | 23348555 | 186 days ago | IN | 0 ETH | 0.0001492 | ||||
| Release | 23257675 | 199 days ago | IN | 0 ETH | 0.00010304 | ||||
| Release | 23223496 | 204 days ago | IN | 0 ETH | 0.00001471 | ||||
| Release | 23147168 | 214 days ago | IN | 0 ETH | 0.00024853 | ||||
| Release | 23139055 | 215 days ago | IN | 0 ETH | 0.00018268 | ||||
| Release | 23139046 | 215 days ago | IN | 0 ETH | 0.00021164 | ||||
| Release | 23067488 | 225 days ago | IN | 0 ETH | 0.00014975 | ||||
| Release | 23067486 | 225 days ago | IN | 0 ETH | 0.00015027 | ||||
| Release | 23067481 | 225 days ago | IN | 0 ETH | 0.00018692 | ||||
| Release | 22993839 | 236 days ago | IN | 0 ETH | 0.00183323 | ||||
| Release | 22982667 | 237 days ago | IN | 0 ETH | 0.00025934 | ||||
| Release | 22980744 | 238 days ago | IN | 0 ETH | 0.00001655 | ||||
| Release | 22980160 | 238 days ago | IN | 0 ETH | 0.00004696 | ||||
| Release | 22980023 | 238 days ago | IN | 0 ETH | 0.00269772 | ||||
| Release | 22979671 | 238 days ago | IN | 0 ETH | 0.00226164 | ||||
| Release | 22979668 | 238 days ago | IN | 0 ETH | 0.00238217 | ||||
| Release | 22970143 | 239 days ago | IN | 0 ETH | 0.00005438 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FoundersKeyQBXVestingManaged
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-12-08
*/
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/utils/Pausable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
bool private _paused;
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
/**
* @dev The operation failed because the contract is paused.
*/
error EnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/
error ExpectedPause();
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) 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 FailedInnerCall();
}
}
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* 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: contracts/IFoundersNFT.sol
// contracts/IFoundersNFT.sol
pragma solidity ^0.8.24;
interface IFoundersNFT is IERC721 {
function tokensOfOwner(address beneficiary) external view returns (uint256[] calldata ids);
}
// File: contracts/FoundersKeyQBXVestingManaged.sol
pragma solidity ^0.8.24;
// Uncomment this line to use console.log
// import "hardhat/console.sol";
contract FoundersKeyQBXVestingManaged is Context, Ownable, Pausable {
using SafeERC20 for IERC20;
uint64 public immutable startTime;
uint8 public immutable tgeVestingPercentage;
// in seconds
uint64 public immutable duration;
uint64 public immutable cliff;
IERC20 public immutable qiibeeCoin;
IFoundersNFT public immutable founderNFT;
// `62179` tokens per NFT holder
uint256 public immutable QBX_AMOUNT = 62179 * (10 ** 18);
// NFT IDs on-chain from [1->888]
uint256 public immutable NFT_COUNT = 888;
/**
* @dev amount of QBX per nNFT
*/
mapping(uint256 => uint) public amounts;
/**
* @dev amount of QBX released per NFT
*/
mapping(uint256 => uint) public released;
event ERC20Released(uint256 indexed nftId, uint256 amount);
event OwnerWithdraw(address indexed owner, uint256 amount);
modifier ifVestingStarted() {
require(
startTime < uint64(block.timestamp),
"Vesting period hasn't started"
);
_;
}
modifier ifNftOwned(uint256 nftId) {
require(
founderNFT.ownerOf(nftId) == _msgSender(),
"Only NFT owner can claim vested tokens"
);
_;
}
constructor(
uint64 startTime_,
uint64 durationDays_,
uint64 cliffDays_,
uint8 tgeVestingPercentage_,
IERC20 qbxContractAddress_,
IFoundersNFT founderNFTAddress_
) Ownable(msg.sender) {
require(
startTime_ > uint64(block.timestamp),
"startTime_ cannot be in the past"
);
require(
tgeVestingPercentage >= 0,
"tgeVestingPercentage must be greater than or equal to 0"
);
require(
tgeVestingPercentage <= 100,
"tgeVestingPercentage must be less than or equal to 100"
);
require(durationDays_ > 0, "durationDays_ should be greater than 0");
require(
durationDays_ > cliffDays_,
"durationDays_ should be greater than cliffDays_"
);
startTime = startTime_;
tgeVestingPercentage = tgeVestingPercentage_;
// convert into seconds
duration = durationDays_ * 1 days;
cliff = cliffDays_ * 1 days;
qiibeeCoin = qbxContractAddress_;
founderNFT = founderNFTAddress_;
}
/**
* @dev Getter for the end timestamp.
*/
function endTime() public view returns (uint64) {
return startTime + duration;
}
/**
* @dev Pause contract.
*/
function pause() public onlyOwner {
_pause();
}
/**
* @dev Unpause contract.
*/
function unpause() public onlyOwner {
_unpause();
}
/**
* @dev Withdraw the QBX balance of this contract after pausing in case of emergency.
* Can only be called by the owner
*/
function withdraw() public onlyOwner whenPaused returns (uint256) {
uint256 balance = qiibeeCoin.balanceOf(address(this));
qiibeeCoin.safeTransfer(owner(), balance);
emit OwnerWithdraw(owner(), balance);
return balance;
}
/**
* @dev Call after calling `allow` on QBX token contract.
* Will withdraw required QBX from `spender`
* Will add `QBX_AMOUNT`.
* Cannot be called after vesting period has started.
* Note that from and toIndex are inclusive - [1, 888], [1,1] - to seed a single one
*/
function addTokens(
uint256 fromIndex,
uint256 toIndex,
address spender
) public onlyOwner {
require(
startTime > uint64(block.timestamp),
"Cannot add funds after vesting period has started"
);
require(toIndex <= NFT_COUNT, "toIndex greater than max NFT count");
// +1 to have inclusive range: [1, 2] instead of [1, 2)
uint256 totalAmount = (toIndex - fromIndex + 1) * QBX_AMOUNT;
require(
qiibeeCoin.transferFrom(spender, address(this), totalAmount),
"Transfer from failed"
);
for (uint256 nftId = fromIndex; nftId <= toIndex; nftId++) {
amounts[nftId] += QBX_AMOUNT;
}
}
/**
* @dev Release all the QBX that have already vested across all the NFTs the caller owns.
*
* Emits {ERC20Released} events.
*/
function release()
public
ifVestingStarted
whenNotPaused
returns (uint256[] memory)
{
address beneficiary = _msgSender();
uint256[] memory nftsHeld = founderNFT.tokensOfOwner(beneficiary);
uint256[] memory releasedAmounts = new uint256[](nftsHeld.length);
for (uint256 i = 0; i < nftsHeld.length; i++) {
uint256 nftId = nftsHeld[i];
uint256 amount = releaseable(nftId);
_release(nftId, amount);
releasedAmounts[i] = amount;
}
return releasedAmounts;
}
/**
* @dev Release all the QBX that have already vested for a particular NFT id.
* Can only be called by the owner of the NFT.
*
* Emits a {ERC20Released} event.
*/
function release(
uint256 nftId
)
public
ifVestingStarted
ifNftOwned(nftId)
whenNotPaused
returns (uint256)
{
uint256 amount = releaseable(nftId);
_release(nftId, amount);
return amount;
}
/**
* @dev Release `amount` QBX from those have already vested for a particular NFT id.
* Can only be called by the owner of the NFT.
*
* Emits a {ERC20Released} event.
*/
function release(
uint256 nftId,
uint256 amount
)
public
ifVestingStarted
ifNftOwned(nftId)
whenNotPaused
returns (uint256)
{
uint256 amountReleaseable = releaseable(nftId);
require(
amount <= amountReleaseable,
"Amount exceeds releaseable amount"
);
_release(nftId, amount);
return amount;
}
/**
* @dev Release `amount` for a particular `nftId`.
* IMPORTANT: No checks performed here. Use with care
*
* Emits a {ERC20Released} event.
*/
function _release(
uint256 nftId,
uint256 amount
) internal returns (uint256) {
address beneficiary = _msgSender();
released[nftId] += amount;
emit ERC20Released(nftId, amount);
qiibeeCoin.safeTransfer(beneficiary, amount);
return amount;
}
/**
* @dev Calculates the total amount of releasable QBX. Vested - released. `beneficiary` is the address to check for.
*/
function releaseable(uint256 nftId) public view returns (uint256) {
return vestedAmount(nftId) - released[nftId];
}
/**
* @dev Calculates the total amount of vested QBX. `nftId` is the nft id to check for.
*/
function vestedAmount(uint256 nftId) public view returns (uint256) {
return vestedAmount(nftId, uint64(block.timestamp));
}
/**
* @dev Calculates the total amount of vested QBX at a certain time.
* `nftId` is the NFT & `timestamp` is the time at which to check for.
*/
function vestedAmount(
uint256 nftId,
uint256 timestamp
) public view returns (uint256) {
uint256 totalAmount = amounts[nftId];
if (timestamp <= startTime) {
return 0; // Pre TGE; no tokens vested yet
} else if (timestamp >= (startTime + duration)) {
return totalAmount; // Vesting period completed: all tokens vested
} else if (timestamp <= (startTime + cliff)) {
// Cliff not passed. Calculate the amount vested at TGE
return vestedAtTGE(totalAmount);
} else {
// Calculate the amount vested after the cliff
uint256 amountVestedAtTGE = vestedAtTGE(totalAmount);
uint256 remainingAmount = totalAmount - amountVestedAtTGE; // Remaining tokens after those vested at TGE
// Linear vesting starts from the end of the cliff
uint256 vestingStartTime = startTime + cliff;
uint256 elapsedTime = timestamp - vestingStartTime;
uint256 effectiveDuration = duration - cliff;
uint256 amountVestedSinceCliff = (remainingAmount * elapsedTime) /
effectiveDuration;
return amountVestedAtTGE + amountVestedSinceCliff;
}
}
function vestedAtTGE(uint256 amount) internal view returns (uint256) {
return (amount * tgeVestingPercentage) / 100;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint64","name":"startTime_","type":"uint64"},{"internalType":"uint64","name":"durationDays_","type":"uint64"},{"internalType":"uint64","name":"cliffDays_","type":"uint64"},{"internalType":"uint8","name":"tgeVestingPercentage_","type":"uint8"},{"internalType":"contract IERC20","name":"qbxContractAddress_","type":"address"},{"internalType":"contract IFoundersNFT","name":"founderNFTAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"NFT_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QBX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromIndex","type":"uint256"},{"internalType":"uint256","name":"toIndex","type":"uint256"},{"internalType":"address","name":"spender","type":"address"}],"name":"addTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"amounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cliff","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderNFT","outputs":[{"internalType":"contract IFoundersNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qiibeeCoin","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"release","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"release","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"releaseable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tgeVestingPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"vestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"vestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
610180604052690d2abaf7d589f5ac000061014090815250610378610160908152503480156200002d575f80fd5b506040516200309a3803806200309a83398181016040528101906200005391906200057a565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000c7575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000be919062000623565b60405180910390fd5b620000d8816200038260201b60201c565b505f8060146101000a81548160ff0219169083151502179055504267ffffffffffffffff168667ffffffffffffffff16116200014b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000142906200069c565b60405180910390fd5b5f60a05160ff16101562000196576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018d9062000730565b60405180910390fd5b606460a05160ff161115620001e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d990620007c4565b60405180910390fd5b5f8567ffffffffffffffff161162000231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002289062000858565b60405180910390fd5b8367ffffffffffffffff168567ffffffffffffffff16116200028a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028190620008ec565b60405180910390fd5b8567ffffffffffffffff1660808167ffffffffffffffff16815250508260ff1660a08160ff16815250506201518085620002c5919062000939565b67ffffffffffffffff1660c08167ffffffffffffffff16815250506201518084620002f1919062000939565b67ffffffffffffffff1660e08167ffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250505050505050506200097e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f67ffffffffffffffff82169050919050565b620004658162000447565b811462000470575f80fd5b50565b5f8151905062000483816200045a565b92915050565b5f60ff82169050919050565b620004a08162000489565b8114620004ab575f80fd5b50565b5f81519050620004be8162000495565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620004ef82620004c4565b9050919050565b5f6200050282620004e3565b9050919050565b6200051481620004f6565b81146200051f575f80fd5b50565b5f81519050620005328162000509565b92915050565b5f6200054482620004e3565b9050919050565b620005568162000538565b811462000561575f80fd5b50565b5f8151905062000574816200054b565b92915050565b5f805f805f8060c0878903121562000597576200059662000443565b5b5f620005a689828a0162000473565b9650506020620005b989828a0162000473565b9550506040620005cc89828a0162000473565b9450506060620005df89828a01620004ae565b9350506080620005f289828a0162000522565b92505060a06200060589828a0162000564565b9150509295509295509295565b6200061d81620004e3565b82525050565b5f602082019050620006385f83018462000612565b92915050565b5f82825260208201905092915050565b7f737461727454696d655f2063616e6e6f7420626520696e2074686520706173745f82015250565b5f620006846020836200063e565b915062000691826200064e565b602082019050919050565b5f6020820190508181035f830152620006b58162000676565b9050919050565b7f74676556657374696e6750657263656e74616765206d757374206265206772655f8201527f61746572207468616e206f7220657175616c20746f2030000000000000000000602082015250565b5f620007186037836200063e565b91506200072582620006bc565b604082019050919050565b5f6020820190508181035f83015262000749816200070a565b9050919050565b7f74676556657374696e6750657263656e74616765206d757374206265206c65735f8201527f73207468616e206f7220657175616c20746f2031303000000000000000000000602082015250565b5f620007ac6036836200063e565b9150620007b98262000750565b604082019050919050565b5f6020820190508181035f830152620007dd816200079e565b9050919050565b7f6475726174696f6e446179735f2073686f756c642062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f620008406026836200063e565b91506200084d82620007e4565b604082019050919050565b5f6020820190508181035f830152620008718162000832565b9050919050565b7f6475726174696f6e446179735f2073686f756c642062652067726561746572205f8201527f7468616e20636c696666446179735f0000000000000000000000000000000000602082015250565b5f620008d4602f836200063e565b9150620008e18262000878565b604082019050919050565b5f6020820190508181035f8301526200090581620008c6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620009458262000447565b9150620009528362000447565b9250828202620009628162000447565b91508082146200097757620009766200090c565b5b5092915050565b60805160a05160c05160e0516101005161012051610140516101605161260a62000a905f395f8181610d36015261107f01525f8181610a9c015281816110e3015261121001525f81816105ef015281816107e001528181610e530152610fdd01525f8181610909015281816109af01528181610d5a0152818161112801526113c201525f81816104c701528181610b7501528181610bfe0152610c6601525f81816104a30152818161050801528181610b100152610c8701525f8181610a6301526115bc01525f8181610529015281816105650152818161075601528181610ad601528181610b3101528181610b9601528181610c1f01528181610d9101528181610dd40152611014015261260a5ff3fe608060405234801561000f575f80fd5b5060043610610171575f3560e01c80635c975abb116100dc5780638456cb5911610095578063935b7aca1161006f578063935b7aca1461041b578063a6496df214610439578063a94d373b14610455578063f2fde38b1461048557610171565b80638456cb59146103d557806386d1a69f146103df5780638da5cb5b146103fd57610171565b80635c975abb146103235780636582f4fa146103415780636e99fddf1461037157806370d0d3991461038f578063715018a6146103ad57806378e97925146103b757610171565b80633ccfd60b1161012e5780633ccfd60b1461025f5780633f4ba83a1461027d578063459531fe1461028757806345f0a44f146102a5578063515f8e7f146102d557806354b547a5146102f357610171565b80630fb5a6b41461017557806313d033c0146101935780631bfce853146101b15780633197cbb6146101e1578063366a4120146101ff57806337bdc99b1461022f575b5f80fd5b61017d6104a1565b60405161018a9190611983565b60405180910390f35b61019b6104c5565b6040516101a89190611983565b60405180910390f35b6101cb60048036038101906101c691906119e0565b6104e9565b6040516101d89190611a1a565b60405180910390f35b6101e9610505565b6040516101f69190611983565b60405180910390f35b61021960048036038101906102149190611a33565b610557565b6040516102269190611a1a565b60405180910390f35b610249600480360381019061024491906119e0565b610748565b6040516102569190611a1a565b60405180910390f35b6102676108f5565b6040516102749190611a1a565b60405180910390f35b610285610a4f565b005b61028f610a61565b60405161029c9190611a8c565b60405180910390f35b6102bf60048036038101906102ba91906119e0565b610a85565b6040516102cc9190611a1a565b60405180910390f35b6102dd610a9a565b6040516102ea9190611a1a565b60405180910390f35b61030d60048036038101906103089190611a33565b610abe565b60405161031a9190611a1a565b60405180910390f35b61032b610cf2565b6040516103389190611abf565b60405180910390f35b61035b600480360381019061035691906119e0565b610d07565b6040516103689190611a1a565b60405180910390f35b610379610d34565b6040516103869190611a1a565b60405180910390f35b610397610d58565b6040516103a49190611b52565b60405180910390f35b6103b5610d7c565b005b6103bf610d8f565b6040516103cc9190611983565b60405180910390f35b6103dd610db3565b005b6103e7610dc5565b6040516103f49190611c22565b60405180910390f35b610405610fb4565b6040516104129190611c62565b60405180910390f35b610423610fdb565b6040516104309190611c9b565b60405180910390f35b610453600480360381019061044e9190611cde565b610fff565b005b61046f600480360381019061046a91906119e0565b61126f565b60405161047c9190611a1a565b60405180910390f35b61049f600480360381019061049a9190611d2e565b611284565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f6104fe824267ffffffffffffffff16610abe565b9050919050565b5f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006105529190611d86565b905090565b5f4267ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16106105ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c590611e1b565b60405180910390fd5b826105d7611308565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016106469190611a1a565b602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611e4d565b73ffffffffffffffffffffffffffffffffffffffff16146106db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d290611ee8565b60405180910390fd5b6106e361130f565b5f6106ed85610d07565b905080841115610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990611f76565b60405180910390fd5b61073c8585611350565b50839250505092915050565b5f4267ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16106107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b690611e1b565b60405180910390fd5b816107c8611308565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016108379190611a1a565b602060405180830381865afa158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190611e4d565b73ffffffffffffffffffffffffffffffffffffffff16146108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c390611ee8565b60405180910390fd5b6108d461130f565b5f6108de84610d07565b90506108ea8482611350565b508092505050919050565b5f6108fe611410565b610906611497565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109609190611c62565b602060405180830381865afa15801561097b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099f9190611fa8565b90506109f36109ac610fb4565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166114d79092919063ffffffff16565b6109fb610fb4565b73ffffffffffffffffffffffffffffffffffffffff167f13c461eb29f5d65800bbef5a5b05a06ea13b8b2ef4b889ee170f149bc1c8f8bd82604051610a409190611a1a565b60405180910390a28091505090565b610a57611410565b610a5f611556565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8060015f8581526020019081526020015f205490507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168311610b0e575f915050610cec565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610b5a9190611d86565b67ffffffffffffffff168310610b735780915050610cec565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610bbf9190611d86565b67ffffffffffffffff168311610be057610bd8816115b7565b915050610cec565b5f610bea826115b7565b90505f8183610bf99190611fd3565b90505f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610c489190611d86565b67ffffffffffffffff1690505f8187610c619190611fd3565b90505f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610cb09190612006565b67ffffffffffffffff1690505f818386610cca9190612041565b610cd491906120af565b90508086610ce291906120df565b9750505050505050505b92915050565b5f8060149054906101000a900460ff16905090565b5f60025f8381526020019081526020015f2054610d23836104e9565b610d2d9190611fd3565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d84611410565b610d8d5f6115fa565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b610dbb611410565b610dc36116bb565b565b60604267ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1610610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3490611e1b565b60405180910390fd5b610e4561130f565b5f610e4e611308565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638462151c836040518263ffffffff1660e01b8152600401610eaa9190611c62565b5f60405180830381865afa158015610ec4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610eec9190612262565b90505f815167ffffffffffffffff811115610f0a57610f09612126565b5b604051908082528060200260200182016040528015610f385781602001602082028036833780820191505090505b5090505f5b8251811015610faa575f838281518110610f5a57610f596122a9565b5b602002602001015190505f610f6e82610d07565b9050610f7a8282611350565b5080848481518110610f8f57610f8e6122a9565b5b60200260200101818152505050508080600101915050610f3d565b5080935050505090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b611007611410565b4267ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff161161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490612346565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008211156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906123d4565b60405180910390fd5b5f7f0000000000000000000000000000000000000000000000000000000000000000600185856111109190611fd3565b61111a91906120df565b6111249190612041565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b8152600401611183939291906123f2565b6020604051808303815f875af115801561119f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c39190612451565b611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906124c6565b60405180910390fd5b5f8490505b838111611268577f000000000000000000000000000000000000000000000000000000000000000060015f8381526020019081526020015f205f82825461124e91906120df565b925050819055508080611260906124e4565b915050611207565b5050505050565b6002602052805f5260405f205f915090505481565b61128c611410565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112fc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112f39190611c62565b60405180910390fd5b611305816115fa565b50565b5f33905090565b611317610cf2565b1561134e576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f8061135a611308565b90508260025f8681526020019081526020015f205f82825461137c91906120df565b92505081905550837fe7e7e986be0b17af2b440da2909ef07857e9190cfecff7711e513d5fc081ec6b846040516113b39190611a1a565b60405180910390a261140681847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166114d79092919063ffffffff16565b8291505092915050565b611418611308565b73ffffffffffffffffffffffffffffffffffffffff16611436610fb4565b73ffffffffffffffffffffffffffffffffffffffff161461149557611459611308565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161148c9190611c62565b60405180910390fd5b565b61149f610cf2565b6114d5576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611551838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161150a92919061252b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061171d565b505050565b61155e611497565b5f8060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115a0611308565b6040516115ad9190611c62565b60405180910390a1565b5f60647f000000000000000000000000000000000000000000000000000000000000000060ff16836115e99190612041565b6115f391906120af565b9050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116c361130f565b60015f60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611706611308565b6040516117139190611c62565b60405180910390a1565b5f611747828473ffffffffffffffffffffffffffffffffffffffff166117b290919063ffffffff16565b90505f81511415801561176b5750808060200190518101906117699190612451565b155b156117ad57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117a49190611c62565b60405180910390fd5b505050565b60606117bf83835f6117c7565b905092915050565b60608147101561180e57306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016118059190611c62565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161183691906125be565b5f6040518083038185875af1925050503d805f8114611870576040519150601f19603f3d011682016040523d82523d5f602084013e611875565b606091505b5091509150611885868383611890565b925050509392505050565b6060826118a5576118a08261191d565b611915565b5f82511480156118cb57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561190d57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016119049190611c62565b60405180910390fd5b819050611916565b5b9392505050565b5f8151111561192f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f67ffffffffffffffff82169050919050565b61197d81611961565b82525050565b5f6020820190506119965f830184611974565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6119bf816119ad565b81146119c9575f80fd5b50565b5f813590506119da816119b6565b92915050565b5f602082840312156119f5576119f46119a5565b5b5f611a02848285016119cc565b91505092915050565b611a14816119ad565b82525050565b5f602082019050611a2d5f830184611a0b565b92915050565b5f8060408385031215611a4957611a486119a5565b5b5f611a56858286016119cc565b9250506020611a67858286016119cc565b9150509250929050565b5f60ff82169050919050565b611a8681611a71565b82525050565b5f602082019050611a9f5f830184611a7d565b92915050565b5f8115159050919050565b611ab981611aa5565b82525050565b5f602082019050611ad25f830184611ab0565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f611b1a611b15611b1084611ad8565b611af7565b611ad8565b9050919050565b5f611b2b82611b00565b9050919050565b5f611b3c82611b21565b9050919050565b611b4c81611b32565b82525050565b5f602082019050611b655f830184611b43565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b9d816119ad565b82525050565b5f611bae8383611b94565b60208301905092915050565b5f602082019050919050565b5f611bd082611b6b565b611bda8185611b75565b9350611be583611b85565b805f5b83811015611c15578151611bfc8882611ba3565b9750611c0783611bba565b925050600181019050611be8565b5085935050505092915050565b5f6020820190508181035f830152611c3a8184611bc6565b905092915050565b5f611c4c82611ad8565b9050919050565b611c5c81611c42565b82525050565b5f602082019050611c755f830184611c53565b92915050565b5f611c8582611b21565b9050919050565b611c9581611c7b565b82525050565b5f602082019050611cae5f830184611c8c565b92915050565b611cbd81611c42565b8114611cc7575f80fd5b50565b5f81359050611cd881611cb4565b92915050565b5f805f60608486031215611cf557611cf46119a5565b5b5f611d02868287016119cc565b9350506020611d13868287016119cc565b9250506040611d2486828701611cca565b9150509250925092565b5f60208284031215611d4357611d426119a5565b5b5f611d5084828501611cca565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d9082611961565b9150611d9b83611961565b9250828201905067ffffffffffffffff811115611dbb57611dba611d59565b5b92915050565b5f82825260208201905092915050565b7f56657374696e6720706572696f64206861736e277420737461727465640000005f82015250565b5f611e05601d83611dc1565b9150611e1082611dd1565b602082019050919050565b5f6020820190508181035f830152611e3281611df9565b9050919050565b5f81519050611e4781611cb4565b92915050565b5f60208284031215611e6257611e616119a5565b5b5f611e6f84828501611e39565b91505092915050565b7f4f6e6c79204e4654206f776e65722063616e20636c61696d20766573746564205f8201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b5f611ed2602683611dc1565b9150611edd82611e78565b604082019050919050565b5f6020820190508181035f830152611eff81611ec6565b9050919050565b7f416d6f756e7420657863656564732072656c6561736561626c6520616d6f756e5f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f611f60602183611dc1565b9150611f6b82611f06565b604082019050919050565b5f6020820190508181035f830152611f8d81611f54565b9050919050565b5f81519050611fa2816119b6565b92915050565b5f60208284031215611fbd57611fbc6119a5565b5b5f611fca84828501611f94565b91505092915050565b5f611fdd826119ad565b9150611fe8836119ad565b925082820390508181111561200057611fff611d59565b5b92915050565b5f61201082611961565b915061201b83611961565b9250828203905067ffffffffffffffff81111561203b5761203a611d59565b5b92915050565b5f61204b826119ad565b9150612056836119ad565b9250828202612064816119ad565b9150828204841483151761207b5761207a611d59565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6120b9826119ad565b91506120c4836119ad565b9250826120d4576120d3612082565b5b828204905092915050565b5f6120e9826119ad565b91506120f4836119ad565b925082820190508082111561210c5761210b611d59565b5b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61215c82612116565b810181811067ffffffffffffffff8211171561217b5761217a612126565b5b80604052505050565b5f61218d61199c565b90506121998282612153565b919050565b5f67ffffffffffffffff8211156121b8576121b7612126565b5b602082029050602081019050919050565b5f80fd5b5f6121df6121da8461219e565b612184565b90508083825260208201905060208402830185811115612202576122016121c9565b5b835b8181101561222b57806122178882611f94565b845260208401935050602081019050612204565b5050509392505050565b5f82601f83011261224957612248612112565b5b81516122598482602086016121cd565b91505092915050565b5f60208284031215612277576122766119a5565b5b5f82015167ffffffffffffffff811115612294576122936119a9565b5b6122a084828501612235565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f43616e6e6f74206164642066756e64732061667465722076657374696e6720705f8201527f6572696f64206861732073746172746564000000000000000000000000000000602082015250565b5f612330603183611dc1565b915061233b826122d6565b604082019050919050565b5f6020820190508181035f83015261235d81612324565b9050919050565b7f746f496e6465782067726561746572207468616e206d6178204e465420636f755f8201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b5f6123be602283611dc1565b91506123c982612364565b604082019050919050565b5f6020820190508181035f8301526123eb816123b2565b9050919050565b5f6060820190506124055f830186611c53565b6124126020830185611c53565b61241f6040830184611a0b565b949350505050565b61243081611aa5565b811461243a575f80fd5b50565b5f8151905061244b81612427565b92915050565b5f60208284031215612466576124656119a5565b5b5f6124738482850161243d565b91505092915050565b7f5472616e736665722066726f6d206661696c65640000000000000000000000005f82015250565b5f6124b0601483611dc1565b91506124bb8261247c565b602082019050919050565b5f6020820190508181035f8301526124dd816124a4565b9050919050565b5f6124ee826119ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125205761251f611d59565b5b600182019050919050565b5f60408201905061253e5f830185611c53565b61254b6020830184611a0b565b9392505050565b5f81519050919050565b5f81905092915050565b5f5b83811015612583578082015181840152602081019050612568565b5f8484015250505050565b5f61259882612552565b6125a2818561255c565b93506125b2818560208601612566565b80840191505092915050565b5f6125c9828461258e565b91508190509291505056fea26469706673582212209ed9a090dfa500dd2c57374cedc1ac809e03515b65d36dfda366764e86ee450764736f6c6343000818003300000000000000000000000000000000000000000000000000000000675a980000000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b10000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b58
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610171575f3560e01c80635c975abb116100dc5780638456cb5911610095578063935b7aca1161006f578063935b7aca1461041b578063a6496df214610439578063a94d373b14610455578063f2fde38b1461048557610171565b80638456cb59146103d557806386d1a69f146103df5780638da5cb5b146103fd57610171565b80635c975abb146103235780636582f4fa146103415780636e99fddf1461037157806370d0d3991461038f578063715018a6146103ad57806378e97925146103b757610171565b80633ccfd60b1161012e5780633ccfd60b1461025f5780633f4ba83a1461027d578063459531fe1461028757806345f0a44f146102a5578063515f8e7f146102d557806354b547a5146102f357610171565b80630fb5a6b41461017557806313d033c0146101935780631bfce853146101b15780633197cbb6146101e1578063366a4120146101ff57806337bdc99b1461022f575b5f80fd5b61017d6104a1565b60405161018a9190611983565b60405180910390f35b61019b6104c5565b6040516101a89190611983565b60405180910390f35b6101cb60048036038101906101c691906119e0565b6104e9565b6040516101d89190611a1a565b60405180910390f35b6101e9610505565b6040516101f69190611983565b60405180910390f35b61021960048036038101906102149190611a33565b610557565b6040516102269190611a1a565b60405180910390f35b610249600480360381019061024491906119e0565b610748565b6040516102569190611a1a565b60405180910390f35b6102676108f5565b6040516102749190611a1a565b60405180910390f35b610285610a4f565b005b61028f610a61565b60405161029c9190611a8c565b60405180910390f35b6102bf60048036038101906102ba91906119e0565b610a85565b6040516102cc9190611a1a565b60405180910390f35b6102dd610a9a565b6040516102ea9190611a1a565b60405180910390f35b61030d60048036038101906103089190611a33565b610abe565b60405161031a9190611a1a565b60405180910390f35b61032b610cf2565b6040516103389190611abf565b60405180910390f35b61035b600480360381019061035691906119e0565b610d07565b6040516103689190611a1a565b60405180910390f35b610379610d34565b6040516103869190611a1a565b60405180910390f35b610397610d58565b6040516103a49190611b52565b60405180910390f35b6103b5610d7c565b005b6103bf610d8f565b6040516103cc9190611983565b60405180910390f35b6103dd610db3565b005b6103e7610dc5565b6040516103f49190611c22565b60405180910390f35b610405610fb4565b6040516104129190611c62565b60405180910390f35b610423610fdb565b6040516104309190611c9b565b60405180910390f35b610453600480360381019061044e9190611cde565b610fff565b005b61046f600480360381019061046a91906119e0565b61126f565b60405161047c9190611a1a565b60405180910390f35b61049f600480360381019061049a9190611d2e565b611284565b005b7f0000000000000000000000000000000000000000000000000000000000ed4e0081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f6104fe824267ffffffffffffffff16610abe565b9050919050565b5f7f0000000000000000000000000000000000000000000000000000000000ed4e007f00000000000000000000000000000000000000000000000000000000675a98006105529190611d86565b905090565b5f4267ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000675a980067ffffffffffffffff16106105ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c590611e1b565b60405180910390fd5b826105d7611308565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b5873ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016106469190611a1a565b602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611e4d565b73ffffffffffffffffffffffffffffffffffffffff16146106db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d290611ee8565b60405180910390fd5b6106e361130f565b5f6106ed85610d07565b905080841115610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072990611f76565b60405180910390fd5b61073c8585611350565b50839250505092915050565b5f4267ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000675a980067ffffffffffffffff16106107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b690611e1b565b60405180910390fd5b816107c8611308565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b5873ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016108379190611a1a565b602060405180830381865afa158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190611e4d565b73ffffffffffffffffffffffffffffffffffffffff16146108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c390611ee8565b60405180910390fd5b6108d461130f565b5f6108de84610d07565b90506108ea8482611350565b508092505050919050565b5f6108fe611410565b610906611497565b5f7f00000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109609190611c62565b602060405180830381865afa15801561097b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099f9190611fa8565b90506109f36109ac610fb4565b827f00000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b173ffffffffffffffffffffffffffffffffffffffff166114d79092919063ffffffff16565b6109fb610fb4565b73ffffffffffffffffffffffffffffffffffffffff167f13c461eb29f5d65800bbef5a5b05a06ea13b8b2ef4b889ee170f149bc1c8f8bd82604051610a409190611a1a565b60405180910390a28091505090565b610a57611410565b610a5f611556565b565b7f000000000000000000000000000000000000000000000000000000000000001981565b6001602052805f5260405f205f915090505481565b7f000000000000000000000000000000000000000000000d2abaf7d589f5ac000081565b5f8060015f8581526020019081526020015f205490507f00000000000000000000000000000000000000000000000000000000675a980067ffffffffffffffff168311610b0e575f915050610cec565b7f0000000000000000000000000000000000000000000000000000000000ed4e007f00000000000000000000000000000000000000000000000000000000675a9800610b5a9190611d86565b67ffffffffffffffff168310610b735780915050610cec565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000675a9800610bbf9190611d86565b67ffffffffffffffff168311610be057610bd8816115b7565b915050610cec565b5f610bea826115b7565b90505f8183610bf99190611fd3565b90505f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000675a9800610c489190611d86565b67ffffffffffffffff1690505f8187610c619190611fd3565b90505f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000ed4e00610cb09190612006565b67ffffffffffffffff1690505f818386610cca9190612041565b610cd491906120af565b90508086610ce291906120df565b9750505050505050505b92915050565b5f8060149054906101000a900460ff16905090565b5f60025f8381526020019081526020015f2054610d23836104e9565b610d2d9190611fd3565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000037881565b7f00000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b181565b610d84611410565b610d8d5f6115fa565b565b7f00000000000000000000000000000000000000000000000000000000675a980081565b610dbb611410565b610dc36116bb565b565b60604267ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000675a980067ffffffffffffffff1610610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3490611e1b565b60405180910390fd5b610e4561130f565b5f610e4e611308565b90505f7f0000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b5873ffffffffffffffffffffffffffffffffffffffff16638462151c836040518263ffffffff1660e01b8152600401610eaa9190611c62565b5f60405180830381865afa158015610ec4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610eec9190612262565b90505f815167ffffffffffffffff811115610f0a57610f09612126565b5b604051908082528060200260200182016040528015610f385781602001602082028036833780820191505090505b5090505f5b8251811015610faa575f838281518110610f5a57610f596122a9565b5b602002602001015190505f610f6e82610d07565b9050610f7a8282611350565b5080848481518110610f8f57610f8e6122a9565b5b60200260200101818152505050508080600101915050610f3d565b5080935050505090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f0000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b5881565b611007611410565b4267ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000675a980067ffffffffffffffff161161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490612346565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003788211156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7906123d4565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000d2abaf7d589f5ac0000600185856111109190611fd3565b61111a91906120df565b6111249190612041565b90507f00000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b173ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b8152600401611183939291906123f2565b6020604051808303815f875af115801561119f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c39190612451565b611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906124c6565b60405180910390fd5b5f8490505b838111611268577f000000000000000000000000000000000000000000000d2abaf7d589f5ac000060015f8381526020019081526020015f205f82825461124e91906120df565b925050819055508080611260906124e4565b915050611207565b5050505050565b6002602052805f5260405f205f915090505481565b61128c611410565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112fc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112f39190611c62565b60405180910390fd5b611305816115fa565b50565b5f33905090565b611317610cf2565b1561134e576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f8061135a611308565b90508260025f8681526020019081526020015f205f82825461137c91906120df565b92505081905550837fe7e7e986be0b17af2b440da2909ef07857e9190cfecff7711e513d5fc081ec6b846040516113b39190611a1a565b60405180910390a261140681847f00000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b173ffffffffffffffffffffffffffffffffffffffff166114d79092919063ffffffff16565b8291505092915050565b611418611308565b73ffffffffffffffffffffffffffffffffffffffff16611436610fb4565b73ffffffffffffffffffffffffffffffffffffffff161461149557611459611308565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161148c9190611c62565b60405180910390fd5b565b61149f610cf2565b6114d5576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611551838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161150a92919061252b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061171d565b505050565b61155e611497565b5f8060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6115a0611308565b6040516115ad9190611c62565b60405180910390a1565b5f60647f000000000000000000000000000000000000000000000000000000000000001960ff16836115e99190612041565b6115f391906120af565b9050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116c361130f565b60015f60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611706611308565b6040516117139190611c62565b60405180910390a1565b5f611747828473ffffffffffffffffffffffffffffffffffffffff166117b290919063ffffffff16565b90505f81511415801561176b5750808060200190518101906117699190612451565b155b156117ad57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117a49190611c62565b60405180910390fd5b505050565b60606117bf83835f6117c7565b905092915050565b60608147101561180e57306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016118059190611c62565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161183691906125be565b5f6040518083038185875af1925050503d805f8114611870576040519150601f19603f3d011682016040523d82523d5f602084013e611875565b606091505b5091509150611885868383611890565b925050509392505050565b6060826118a5576118a08261191d565b611915565b5f82511480156118cb57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561190d57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016119049190611c62565b60405180910390fd5b819050611916565b5b9392505050565b5f8151111561192f5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f67ffffffffffffffff82169050919050565b61197d81611961565b82525050565b5f6020820190506119965f830184611974565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6119bf816119ad565b81146119c9575f80fd5b50565b5f813590506119da816119b6565b92915050565b5f602082840312156119f5576119f46119a5565b5b5f611a02848285016119cc565b91505092915050565b611a14816119ad565b82525050565b5f602082019050611a2d5f830184611a0b565b92915050565b5f8060408385031215611a4957611a486119a5565b5b5f611a56858286016119cc565b9250506020611a67858286016119cc565b9150509250929050565b5f60ff82169050919050565b611a8681611a71565b82525050565b5f602082019050611a9f5f830184611a7d565b92915050565b5f8115159050919050565b611ab981611aa5565b82525050565b5f602082019050611ad25f830184611ab0565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f611b1a611b15611b1084611ad8565b611af7565b611ad8565b9050919050565b5f611b2b82611b00565b9050919050565b5f611b3c82611b21565b9050919050565b611b4c81611b32565b82525050565b5f602082019050611b655f830184611b43565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b9d816119ad565b82525050565b5f611bae8383611b94565b60208301905092915050565b5f602082019050919050565b5f611bd082611b6b565b611bda8185611b75565b9350611be583611b85565b805f5b83811015611c15578151611bfc8882611ba3565b9750611c0783611bba565b925050600181019050611be8565b5085935050505092915050565b5f6020820190508181035f830152611c3a8184611bc6565b905092915050565b5f611c4c82611ad8565b9050919050565b611c5c81611c42565b82525050565b5f602082019050611c755f830184611c53565b92915050565b5f611c8582611b21565b9050919050565b611c9581611c7b565b82525050565b5f602082019050611cae5f830184611c8c565b92915050565b611cbd81611c42565b8114611cc7575f80fd5b50565b5f81359050611cd881611cb4565b92915050565b5f805f60608486031215611cf557611cf46119a5565b5b5f611d02868287016119cc565b9350506020611d13868287016119cc565b9250506040611d2486828701611cca565b9150509250925092565b5f60208284031215611d4357611d426119a5565b5b5f611d5084828501611cca565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d9082611961565b9150611d9b83611961565b9250828201905067ffffffffffffffff811115611dbb57611dba611d59565b5b92915050565b5f82825260208201905092915050565b7f56657374696e6720706572696f64206861736e277420737461727465640000005f82015250565b5f611e05601d83611dc1565b9150611e1082611dd1565b602082019050919050565b5f6020820190508181035f830152611e3281611df9565b9050919050565b5f81519050611e4781611cb4565b92915050565b5f60208284031215611e6257611e616119a5565b5b5f611e6f84828501611e39565b91505092915050565b7f4f6e6c79204e4654206f776e65722063616e20636c61696d20766573746564205f8201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b5f611ed2602683611dc1565b9150611edd82611e78565b604082019050919050565b5f6020820190508181035f830152611eff81611ec6565b9050919050565b7f416d6f756e7420657863656564732072656c6561736561626c6520616d6f756e5f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f611f60602183611dc1565b9150611f6b82611f06565b604082019050919050565b5f6020820190508181035f830152611f8d81611f54565b9050919050565b5f81519050611fa2816119b6565b92915050565b5f60208284031215611fbd57611fbc6119a5565b5b5f611fca84828501611f94565b91505092915050565b5f611fdd826119ad565b9150611fe8836119ad565b925082820390508181111561200057611fff611d59565b5b92915050565b5f61201082611961565b915061201b83611961565b9250828203905067ffffffffffffffff81111561203b5761203a611d59565b5b92915050565b5f61204b826119ad565b9150612056836119ad565b9250828202612064816119ad565b9150828204841483151761207b5761207a611d59565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6120b9826119ad565b91506120c4836119ad565b9250826120d4576120d3612082565b5b828204905092915050565b5f6120e9826119ad565b91506120f4836119ad565b925082820190508082111561210c5761210b611d59565b5b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61215c82612116565b810181811067ffffffffffffffff8211171561217b5761217a612126565b5b80604052505050565b5f61218d61199c565b90506121998282612153565b919050565b5f67ffffffffffffffff8211156121b8576121b7612126565b5b602082029050602081019050919050565b5f80fd5b5f6121df6121da8461219e565b612184565b90508083825260208201905060208402830185811115612202576122016121c9565b5b835b8181101561222b57806122178882611f94565b845260208401935050602081019050612204565b5050509392505050565b5f82601f83011261224957612248612112565b5b81516122598482602086016121cd565b91505092915050565b5f60208284031215612277576122766119a5565b5b5f82015167ffffffffffffffff811115612294576122936119a9565b5b6122a084828501612235565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f43616e6e6f74206164642066756e64732061667465722076657374696e6720705f8201527f6572696f64206861732073746172746564000000000000000000000000000000602082015250565b5f612330603183611dc1565b915061233b826122d6565b604082019050919050565b5f6020820190508181035f83015261235d81612324565b9050919050565b7f746f496e6465782067726561746572207468616e206d6178204e465420636f755f8201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b5f6123be602283611dc1565b91506123c982612364565b604082019050919050565b5f6020820190508181035f8301526123eb816123b2565b9050919050565b5f6060820190506124055f830186611c53565b6124126020830185611c53565b61241f6040830184611a0b565b949350505050565b61243081611aa5565b811461243a575f80fd5b50565b5f8151905061244b81612427565b92915050565b5f60208284031215612466576124656119a5565b5b5f6124738482850161243d565b91505092915050565b7f5472616e736665722066726f6d206661696c65640000000000000000000000005f82015250565b5f6124b0601483611dc1565b91506124bb8261247c565b602082019050919050565b5f6020820190508181035f8301526124dd816124a4565b9050919050565b5f6124ee826119ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125205761251f611d59565b5b600182019050919050565b5f60408201905061253e5f830185611c53565b61254b6020830184611a0b565b9392505050565b5f81519050919050565b5f81905092915050565b5f5b83811015612583578082015181840152602081019050612568565b5f8484015250505050565b5f61259882612552565b6125a2818561255c565b93506125b2818560208601612566565b80840191505092915050565b5f6125c9828461258e565b91508190509291505056fea26469706673582212209ed9a090dfa500dd2c57374cedc1ac809e03515b65d36dfda366764e86ee450764736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000675a980000000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b10000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b58
-----Decoded View---------------
Arg [0] : startTime_ (uint64): 1733990400
Arg [1] : durationDays_ (uint64): 180
Arg [2] : cliffDays_ (uint64): 0
Arg [3] : tgeVestingPercentage_ (uint8): 25
Arg [4] : qbxContractAddress_ (address): 0x72FDc31f4a9a1EDF6B6132D3C1754F1CdcF5D9B1
Arg [5] : founderNFTAddress_ (address): 0x7AadA103F7852c7E7Da61E100d6277A3Fd199B58
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000675a9800
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000b4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 00000000000000000000000072fdc31f4a9a1edf6b6132d3c1754f1cdcf5d9b1
Arg [5] : 0000000000000000000000007aada103f7852c7e7da61e100d6277a3fd199b58
Deployed Bytecode Sourcemap
32553:8950:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32772:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32811:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39767:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35096:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38418:447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37915:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35585:262;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35363:65;;;:::i;:::-;;32703:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33180:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32975:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40080:1280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6097:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39520:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33077:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32847:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3361:103;;;:::i;:::-;;32663:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35245:61;;;:::i;:::-;;37096:611;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2686:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32888:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36166:763;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33288:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3619:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32772:32;;;:::o;32811:29::-;;;:::o;39767:137::-;39825:7;39852:44;39865:5;39879:15;39852:44;;:12;:44::i;:::-;39845:51;;39767:137;;;:::o;35096:94::-;35136:6;35174:8;35162:9;:20;;;;:::i;:::-;35155:27;;35096:94;:::o;38418:447::-;38601:7;33549:15;33530:35;;:9;:35;;;33508:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;38553:5:::1;33747:12;:10;:12::i;:::-;33718:41;;:10;:18;;;33737:5;33718:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;33696:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;5702:19:::2;:17;:19::i;:::-;38626:25:::3;38654:18;38666:5;38654:11;:18::i;:::-;38626:46;;38717:17;38707:6;:27;;38685:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38808:23;38817:5;38824:6;38808:8;:23::i;:::-;;38851:6;38844:13;;;33633:1:::1;38418:447:::0;;;;:::o;37915:288::-;38073:7;33549:15;33530:35;;:9;:35;;;33508:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;38025:5:::1;33747:12;:10;:12::i;:::-;33718:41;;:10;:18;;;33737:5;33718:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;33696:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;5702:19:::2;:17;:19::i;:::-;38098:14:::3;38115:18;38127:5;38115:11;:18::i;:::-;38098:35;;38146:23;38155:5;38162:6;38146:8;:23::i;:::-;;38189:6;38182:13;;;33633:1:::1;37915:288:::0;;;:::o;35585:262::-;35642:7;2572:13;:11;:13::i;:::-;5961:16:::1;:14;:16::i;:::-;35662:15:::2;35680:10;:20;;;35709:4;35680:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35662:53;;35726:41;35750:7;:5;:7::i;:::-;35759;35726:10;:23;;;;:41;;;;;:::i;:::-;35797:7;:5;:7::i;:::-;35783:31;;;35806:7;35783:31;;;;;;:::i;:::-;;;;;;;;35832:7;35825:14;;;35585:262:::0;:::o;35363:65::-;2572:13;:11;:13::i;:::-;35410:10:::1;:8;:10::i;:::-;35363:65::o:0;32703:43::-;;;:::o;33180:39::-;;;;;;;;;;;;;;;;;:::o;32975:56::-;;;:::o;40080:1280::-;40182:7;40202:19;40224:7;:14;40232:5;40224:14;;;;;;;;;;;;40202:36;;40268:9;40255:22;;:9;:22;40251:1102;;40301:1;40294:8;;;;;40251:1102;40383:8;40371:9;:20;;;;:::i;:::-;40357:35;;:9;:35;40353:1000;;40416:11;40409:18;;;;;40353:1000;40522:5;40510:9;:17;;;;:::i;:::-;40496:32;;:9;:32;40492:861;;40621:24;40633:11;40621;:24::i;:::-;40614:31;;;;;40492:861;40738:25;40766:24;40778:11;40766;:24::i;:::-;40738:52;;40805:23;40845:17;40831:11;:31;;;;:::i;:::-;40805:57;;40989:24;41028:5;41016:9;:17;;;;:::i;:::-;40989:44;;;;41048:19;41082:16;41070:9;:28;;;;:::i;:::-;41048:50;;41113:25;41152:5;41141:8;:16;;;;:::i;:::-;41113:44;;;;41174:30;41258:17;41226:11;41208:15;:29;;;;:::i;:::-;41207:68;;;;:::i;:::-;41174:101;;41319:22;41299:17;:42;;;;:::i;:::-;41292:49;;;;;;;;;40080:1280;;;;;:::o;6097:86::-;6144:4;6168:7;;;;;;;;;;;6161:14;;6097:86;:::o;39520:129::-;39577:7;39626:8;:15;39635:5;39626:15;;;;;;;;;;;;39604:19;39617:5;39604:12;:19::i;:::-;:37;;;;:::i;:::-;39597:44;;39520:129;;;:::o;33077:40::-;;;:::o;32847:34::-;;;:::o;3361:103::-;2572:13;:11;:13::i;:::-;3426:30:::1;3453:1;3426:18;:30::i;:::-;3361:103::o:0;32663:33::-;;;:::o;35245:61::-;2572:13;:11;:13::i;:::-;35290:8:::1;:6;:8::i;:::-;35245:61::o:0;37096:611::-;37198:16;33549:15;33530:35;;:9;:35;;;33508:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;5702:19:::1;:17;:19::i;:::-;37232::::2;37254:12;:10;:12::i;:::-;37232:34;;37279:25;37307:10;:24;;;37332:11;37307:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37279:65;;37355:32;37404:8;:15;37390:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37355:65;;37438:9;37433:232;37457:8;:15;37453:1;:19;37433:232;;;37494:13;37510:8;37519:1;37510:11;;;;;;;;:::i;:::-;;;;;;;;37494:27;;37538:14;37555:18;37567:5;37555:11;:18::i;:::-;37538:35;;37588:23;37597:5;37604:6;37588:8;:23::i;:::-;;37647:6;37626:15;37642:1;37626:18;;;;;;;;:::i;:::-;;;;;;;:27;;;::::0;::::2;37479:186;;37474:3;;;;;;;37433:232;;;;37684:15;37677:22;;;;;37096:611:::0;:::o;2686:87::-;2732:7;2759:6;;;;;;;;;;;2752:13;;2686:87;:::o;32888:40::-;;;:::o;36166:763::-;2572:13;:11;:13::i;:::-;36341:15:::1;36322:35;;:9;:35;;;36300:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;36466:9;36455:7;:20;;36447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36592:19;36642:10;36637:1;36625:9;36615:7;:19;;;;:::i;:::-;:23;;;;:::i;:::-;36614:38;;;;:::i;:::-;36592:60;;36687:10;:23;;;36711:7;36728:4;36735:11;36687:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36665:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;36813:13;36829:9;36813:25;;36808:114;36849:7;36840:5;:16;36808:114;;36900:10;36882:7;:14;36890:5;36882:14;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;36858:7;;;;;:::i;:::-;;;;36808:114;;;;36289:640;36166:763:::0;;;:::o;33288:40::-;;;;;;;;;;;;;;;;;:::o;3619:220::-;2572:13;:11;:13::i;:::-;3724:1:::1;3704:22;;:8;:22;;::::0;3700:93:::1;;3778:1;3750:31;;;;;;;;;;;:::i;:::-;;;;;;;;3700:93;3803:28;3822:8;3803:18;:28::i;:::-;3619:220:::0;:::o;695:98::-;748:7;775:10;768:17;;695:98;:::o;6256:132::-;6322:8;:6;:8::i;:::-;6318:63;;;6354:15;;;;;;;;;;;;;;6318:63;6256:132::o;39053:319::-;39145:7;39165:19;39187:12;:10;:12::i;:::-;39165:34;;39231:6;39212:8;:15;39221:5;39212:15;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;39267:5;39253:28;39274:6;39253:28;;;;;;:::i;:::-;;;;;;;;39294:44;39318:11;39331:6;39294:10;:23;;;;:44;;;;;:::i;:::-;39358:6;39351:13;;;39053:319;;;;:::o;2851:166::-;2922:12;:10;:12::i;:::-;2911:23;;:7;:5;:7::i;:::-;:23;;;2907:103;;2985:12;:10;:12::i;:::-;2958:40;;;;;;;;;;;:::i;:::-;;;;;;;;2907:103;2851:166::o;6465:130::-;6529:8;:6;:8::i;:::-;6524:64;;6561:15;;;;;;;;;;;;;;6524:64;6465:130::o;21624:162::-;21707:71;21727:5;21749;:14;;;21766:2;21770:5;21734:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21707:19;:71::i;:::-;21624:162;;;:::o;6998:120::-;5961:16;:14;:16::i;:::-;7067:5:::1;7057:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;7088:22;7097:12;:10;:12::i;:::-;7088:22;;;;;;:::i;:::-;;;;;;;;6998:120::o:0;41368:132::-;41428:7;41489:3;41465:20;41456:29;;:6;:29;;;;:::i;:::-;41455:37;;;;:::i;:::-;41448:44;;41368:132;;;:::o;3999:191::-;4073:16;4092:6;;;;;;;;;;;4073:25;;4118:8;4109:6;;:17;;;;;;;;;;;;;;;;;;4173:8;4142:40;;4163:8;4142:40;;;;;;;;;;;;4062:128;3999:191;:::o;6739:118::-;5702:19;:17;:19::i;:::-;6809:4:::1;6799:7;;:14;;;;;;;;;;;;;;;;;;6829:20;6836:12;:10;:12::i;:::-;6829:20;;;;;;:::i;:::-;;;;;;;;6739:118::o:0;24435:638::-;24859:23;24885:33;24913:4;24893:5;24885:27;;;;:33;;;;:::i;:::-;24859:59;;24954:1;24933:10;:17;:22;;:57;;;;;24971:10;24960:30;;;;;;;;;;;;:::i;:::-;24959:31;24933:57;24929:137;;;25047:5;25014:40;;;;;;;;;;;:::i;:::-;;;;;;;;24929:137;24505:568;24435:638;;:::o;16750:153::-;16825:12;16857:38;16879:6;16887:4;16893:1;16857:21;:38::i;:::-;16850:45;;16750:153;;;;:::o;17238:398::-;17337:12;17390:5;17366:21;:29;17362:110;;;17454:4;17419:41;;;;;;;;;;;:::i;:::-;;;;;;;;17362:110;17483:12;17497:23;17524:6;:11;;17543:5;17550:4;17524:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17482:73;;;;17573:55;17600:6;17608:7;17617:10;17573:26;:55::i;:::-;17566:62;;;;17238:398;;;;;:::o;18714:597::-;18862:12;18892:7;18887:417;;18916:19;18924:10;18916:7;:19::i;:::-;18887:417;;;19165:1;19144:10;:17;:22;:49;;;;;19192:1;19170:6;:18;;;:23;19144:49;19140:121;;;19238:6;19221:24;;;;;;;;;;;:::i;:::-;;;;;;;;19140:121;19282:10;19275:17;;;;18887:417;18714:597;;;;;;:::o;19864:528::-;20017:1;19997:10;:17;:21;19993:392;;;20229:10;20223:17;20286:15;20273:10;20269:2;20265:19;20258:44;19993:392;20356:17;;;;;;;;;;;;;;7:101:1;43:7;83:18;76:5;72:30;61:41;;7:101;;;:::o;114:115::-;199:23;216:5;199:23;:::i;:::-;194:3;187:36;114:115;;:::o;235:218::-;326:4;364:2;353:9;349:18;341:26;;377:69;443:1;432:9;428:17;419:6;377:69;:::i;:::-;235:218;;;;:::o;459:75::-;492:6;525:2;519:9;509:19;;459:75;:::o;540:117::-;649:1;646;639:12;663:117;772:1;769;762:12;786:77;823:7;852:5;841:16;;786:77;;;:::o;869:122::-;942:24;960:5;942:24;:::i;:::-;935:5;932:35;922:63;;981:1;978;971:12;922:63;869:122;:::o;997:139::-;1043:5;1081:6;1068:20;1059:29;;1097:33;1124:5;1097:33;:::i;:::-;997:139;;;;:::o;1142:329::-;1201:6;1250:2;1238:9;1229:7;1225:23;1221:32;1218:119;;;1256:79;;:::i;:::-;1218:119;1376:1;1401:53;1446:7;1437:6;1426:9;1422:22;1401:53;:::i;:::-;1391:63;;1347:117;1142:329;;;;:::o;1477:118::-;1564:24;1582:5;1564:24;:::i;:::-;1559:3;1552:37;1477:118;;:::o;1601:222::-;1694:4;1732:2;1721:9;1717:18;1709:26;;1745:71;1813:1;1802:9;1798:17;1789:6;1745:71;:::i;:::-;1601:222;;;;:::o;1829:474::-;1897:6;1905;1954:2;1942:9;1933:7;1929:23;1925:32;1922:119;;;1960:79;;:::i;:::-;1922:119;2080:1;2105:53;2150:7;2141:6;2130:9;2126:22;2105:53;:::i;:::-;2095:63;;2051:117;2207:2;2233:53;2278:7;2269:6;2258:9;2254:22;2233:53;:::i;:::-;2223:63;;2178:118;1829:474;;;;;:::o;2309:86::-;2344:7;2384:4;2377:5;2373:16;2362:27;;2309:86;;;:::o;2401:112::-;2484:22;2500:5;2484:22;:::i;:::-;2479:3;2472:35;2401:112;;:::o;2519:214::-;2608:4;2646:2;2635:9;2631:18;2623:26;;2659:67;2723:1;2712:9;2708:17;2699:6;2659:67;:::i;:::-;2519:214;;;;:::o;2739:90::-;2773:7;2816:5;2809:13;2802:21;2791:32;;2739:90;;;:::o;2835:109::-;2916:21;2931:5;2916:21;:::i;:::-;2911:3;2904:34;2835:109;;:::o;2950:210::-;3037:4;3075:2;3064:9;3060:18;3052:26;;3088:65;3150:1;3139:9;3135:17;3126:6;3088:65;:::i;:::-;2950:210;;;;:::o;3166:126::-;3203:7;3243:42;3236:5;3232:54;3221:65;;3166:126;;;:::o;3298:60::-;3326:3;3347:5;3340:12;;3298:60;;;:::o;3364:142::-;3414:9;3447:53;3465:34;3474:24;3492:5;3474:24;:::i;:::-;3465:34;:::i;:::-;3447:53;:::i;:::-;3434:66;;3364:142;;;:::o;3512:126::-;3562:9;3595:37;3626:5;3595:37;:::i;:::-;3582:50;;3512:126;;;:::o;3644:140::-;3708:9;3741:37;3772:5;3741:37;:::i;:::-;3728:50;;3644:140;;;:::o;3790:159::-;3891:51;3936:5;3891:51;:::i;:::-;3886:3;3879:64;3790:159;;:::o;3955:250::-;4062:4;4100:2;4089:9;4085:18;4077:26;;4113:85;4195:1;4184:9;4180:17;4171:6;4113:85;:::i;:::-;3955:250;;;;:::o;4211:114::-;4278:6;4312:5;4306:12;4296:22;;4211:114;;;:::o;4331:184::-;4430:11;4464:6;4459:3;4452:19;4504:4;4499:3;4495:14;4480:29;;4331:184;;;;:::o;4521:132::-;4588:4;4611:3;4603:11;;4641:4;4636:3;4632:14;4624:22;;4521:132;;;:::o;4659:108::-;4736:24;4754:5;4736:24;:::i;:::-;4731:3;4724:37;4659:108;;:::o;4773:179::-;4842:10;4863:46;4905:3;4897:6;4863:46;:::i;:::-;4941:4;4936:3;4932:14;4918:28;;4773:179;;;;:::o;4958:113::-;5028:4;5060;5055:3;5051:14;5043:22;;4958:113;;;:::o;5107:732::-;5226:3;5255:54;5303:5;5255:54;:::i;:::-;5325:86;5404:6;5399:3;5325:86;:::i;:::-;5318:93;;5435:56;5485:5;5435:56;:::i;:::-;5514:7;5545:1;5530:284;5555:6;5552:1;5549:13;5530:284;;;5631:6;5625:13;5658:63;5717:3;5702:13;5658:63;:::i;:::-;5651:70;;5744:60;5797:6;5744:60;:::i;:::-;5734:70;;5590:224;5577:1;5574;5570:9;5565:14;;5530:284;;;5534:14;5830:3;5823:10;;5231:608;;;5107:732;;;;:::o;5845:373::-;5988:4;6026:2;6015:9;6011:18;6003:26;;6075:9;6069:4;6065:20;6061:1;6050:9;6046:17;6039:47;6103:108;6206:4;6197:6;6103:108;:::i;:::-;6095:116;;5845:373;;;;:::o;6224:96::-;6261:7;6290:24;6308:5;6290:24;:::i;:::-;6279:35;;6224:96;;;:::o;6326:118::-;6413:24;6431:5;6413:24;:::i;:::-;6408:3;6401:37;6326:118;;:::o;6450:222::-;6543:4;6581:2;6570:9;6566:18;6558:26;;6594:71;6662:1;6651:9;6647:17;6638:6;6594:71;:::i;:::-;6450:222;;;;:::o;6678:147::-;6749:9;6782:37;6813:5;6782:37;:::i;:::-;6769:50;;6678:147;;;:::o;6831:173::-;6939:58;6991:5;6939:58;:::i;:::-;6934:3;6927:71;6831:173;;:::o;7010:264::-;7124:4;7162:2;7151:9;7147:18;7139:26;;7175:92;7264:1;7253:9;7249:17;7240:6;7175:92;:::i;:::-;7010:264;;;;:::o;7280:122::-;7353:24;7371:5;7353:24;:::i;:::-;7346:5;7343:35;7333:63;;7392:1;7389;7382:12;7333:63;7280:122;:::o;7408:139::-;7454:5;7492:6;7479:20;7470:29;;7508:33;7535:5;7508:33;:::i;:::-;7408:139;;;;:::o;7553:619::-;7630:6;7638;7646;7695:2;7683:9;7674:7;7670:23;7666:32;7663:119;;;7701:79;;:::i;:::-;7663:119;7821:1;7846:53;7891:7;7882:6;7871:9;7867:22;7846:53;:::i;:::-;7836:63;;7792:117;7948:2;7974:53;8019:7;8010:6;7999:9;7995:22;7974:53;:::i;:::-;7964:63;;7919:118;8076:2;8102:53;8147:7;8138:6;8127:9;8123:22;8102:53;:::i;:::-;8092:63;;8047:118;7553:619;;;;;:::o;8178:329::-;8237:6;8286:2;8274:9;8265:7;8261:23;8257:32;8254:119;;;8292:79;;:::i;:::-;8254:119;8412:1;8437:53;8482:7;8473:6;8462:9;8458:22;8437:53;:::i;:::-;8427:63;;8383:117;8178:329;;;;:::o;8513:180::-;8561:77;8558:1;8551:88;8658:4;8655:1;8648:15;8682:4;8679:1;8672:15;8699:205;8738:3;8757:19;8774:1;8757:19;:::i;:::-;8752:24;;8790:19;8807:1;8790:19;:::i;:::-;8785:24;;8832:1;8829;8825:9;8818:16;;8855:18;8850:3;8847:27;8844:53;;;8877:18;;:::i;:::-;8844:53;8699:205;;;;:::o;8910:169::-;8994:11;9028:6;9023:3;9016:19;9068:4;9063:3;9059:14;9044:29;;8910:169;;;;:::o;9085:179::-;9225:31;9221:1;9213:6;9209:14;9202:55;9085:179;:::o;9270:366::-;9412:3;9433:67;9497:2;9492:3;9433:67;:::i;:::-;9426:74;;9509:93;9598:3;9509:93;:::i;:::-;9627:2;9622:3;9618:12;9611:19;;9270:366;;;:::o;9642:419::-;9808:4;9846:2;9835:9;9831:18;9823:26;;9895:9;9889:4;9885:20;9881:1;9870:9;9866:17;9859:47;9923:131;10049:4;9923:131;:::i;:::-;9915:139;;9642:419;;;:::o;10067:143::-;10124:5;10155:6;10149:13;10140:22;;10171:33;10198:5;10171:33;:::i;:::-;10067:143;;;;:::o;10216:351::-;10286:6;10335:2;10323:9;10314:7;10310:23;10306:32;10303:119;;;10341:79;;:::i;:::-;10303:119;10461:1;10486:64;10542:7;10533:6;10522:9;10518:22;10486:64;:::i;:::-;10476:74;;10432:128;10216:351;;;;:::o;10573:225::-;10713:34;10709:1;10701:6;10697:14;10690:58;10782:8;10777:2;10769:6;10765:15;10758:33;10573:225;:::o;10804:366::-;10946:3;10967:67;11031:2;11026:3;10967:67;:::i;:::-;10960:74;;11043:93;11132:3;11043:93;:::i;:::-;11161:2;11156:3;11152:12;11145:19;;10804:366;;;:::o;11176:419::-;11342:4;11380:2;11369:9;11365:18;11357:26;;11429:9;11423:4;11419:20;11415:1;11404:9;11400:17;11393:47;11457:131;11583:4;11457:131;:::i;:::-;11449:139;;11176:419;;;:::o;11601:220::-;11741:34;11737:1;11729:6;11725:14;11718:58;11810:3;11805:2;11797:6;11793:15;11786:28;11601:220;:::o;11827:366::-;11969:3;11990:67;12054:2;12049:3;11990:67;:::i;:::-;11983:74;;12066:93;12155:3;12066:93;:::i;:::-;12184:2;12179:3;12175:12;12168:19;;11827:366;;;:::o;12199:419::-;12365:4;12403:2;12392:9;12388:18;12380:26;;12452:9;12446:4;12442:20;12438:1;12427:9;12423:17;12416:47;12480:131;12606:4;12480:131;:::i;:::-;12472:139;;12199:419;;;:::o;12624:143::-;12681:5;12712:6;12706:13;12697:22;;12728:33;12755:5;12728:33;:::i;:::-;12624:143;;;;:::o;12773:351::-;12843:6;12892:2;12880:9;12871:7;12867:23;12863:32;12860:119;;;12898:79;;:::i;:::-;12860:119;13018:1;13043:64;13099:7;13090:6;13079:9;13075:22;13043:64;:::i;:::-;13033:74;;12989:128;12773:351;;;;:::o;13130:194::-;13170:4;13190:20;13208:1;13190:20;:::i;:::-;13185:25;;13224:20;13242:1;13224:20;:::i;:::-;13219:25;;13268:1;13265;13261:9;13253:17;;13292:1;13286:4;13283:11;13280:37;;;13297:18;;:::i;:::-;13280:37;13130:194;;;;:::o;13330:208::-;13369:4;13389:19;13406:1;13389:19;:::i;:::-;13384:24;;13422:19;13439:1;13422:19;:::i;:::-;13417:24;;13465:1;13462;13458:9;13450:17;;13489:18;13483:4;13480:28;13477:54;;;13511:18;;:::i;:::-;13477:54;13330:208;;;;:::o;13544:410::-;13584:7;13607:20;13625:1;13607:20;:::i;:::-;13602:25;;13641:20;13659:1;13641:20;:::i;:::-;13636:25;;13696:1;13693;13689:9;13718:30;13736:11;13718:30;:::i;:::-;13707:41;;13897:1;13888:7;13884:15;13881:1;13878:22;13858:1;13851:9;13831:83;13808:139;;13927:18;;:::i;:::-;13808:139;13592:362;13544:410;;;;:::o;13960:180::-;14008:77;14005:1;13998:88;14105:4;14102:1;14095:15;14129:4;14126:1;14119:15;14146:185;14186:1;14203:20;14221:1;14203:20;:::i;:::-;14198:25;;14237:20;14255:1;14237:20;:::i;:::-;14232:25;;14276:1;14266:35;;14281:18;;:::i;:::-;14266:35;14323:1;14320;14316:9;14311:14;;14146:185;;;;:::o;14337:191::-;14377:3;14396:20;14414:1;14396:20;:::i;:::-;14391:25;;14430:20;14448:1;14430:20;:::i;:::-;14425:25;;14473:1;14470;14466:9;14459:16;;14494:3;14491:1;14488:10;14485:36;;;14501:18;;:::i;:::-;14485:36;14337:191;;;;:::o;14534:117::-;14643:1;14640;14633:12;14657:102;14698:6;14749:2;14745:7;14740:2;14733:5;14729:14;14725:28;14715:38;;14657:102;;;:::o;14765:180::-;14813:77;14810:1;14803:88;14910:4;14907:1;14900:15;14934:4;14931:1;14924:15;14951:281;15034:27;15056:4;15034:27;:::i;:::-;15026:6;15022:40;15164:6;15152:10;15149:22;15128:18;15116:10;15113:34;15110:62;15107:88;;;15175:18;;:::i;:::-;15107:88;15215:10;15211:2;15204:22;14994:238;14951:281;;:::o;15238:129::-;15272:6;15299:20;;:::i;:::-;15289:30;;15328:33;15356:4;15348:6;15328:33;:::i;:::-;15238:129;;;:::o;15373:311::-;15450:4;15540:18;15532:6;15529:30;15526:56;;;15562:18;;:::i;:::-;15526:56;15612:4;15604:6;15600:17;15592:25;;15672:4;15666;15662:15;15654:23;;15373:311;;;:::o;15690:117::-;15799:1;15796;15789:12;15830:732;15937:5;15962:81;15978:64;16035:6;15978:64;:::i;:::-;15962:81;:::i;:::-;15953:90;;16063:5;16092:6;16085:5;16078:21;16126:4;16119:5;16115:16;16108:23;;16179:4;16171:6;16167:17;16159:6;16155:30;16208:3;16200:6;16197:15;16194:122;;;16227:79;;:::i;:::-;16194:122;16342:6;16325:231;16359:6;16354:3;16351:15;16325:231;;;16434:3;16463:48;16507:3;16495:10;16463:48;:::i;:::-;16458:3;16451:61;16541:4;16536:3;16532:14;16525:21;;16401:155;16385:4;16380:3;16376:14;16369:21;;16325:231;;;16329:21;15943:619;;15830:732;;;;;:::o;16585:385::-;16667:5;16716:3;16709:4;16701:6;16697:17;16693:27;16683:122;;16724:79;;:::i;:::-;16683:122;16834:6;16828:13;16859:105;16960:3;16952:6;16945:4;16937:6;16933:17;16859:105;:::i;:::-;16850:114;;16673:297;16585:385;;;;:::o;16976:554::-;17071:6;17120:2;17108:9;17099:7;17095:23;17091:32;17088:119;;;17126:79;;:::i;:::-;17088:119;17267:1;17256:9;17252:17;17246:24;17297:18;17289:6;17286:30;17283:117;;;17319:79;;:::i;:::-;17283:117;17424:89;17505:7;17496:6;17485:9;17481:22;17424:89;:::i;:::-;17414:99;;17217:306;16976:554;;;;:::o;17536:180::-;17584:77;17581:1;17574:88;17681:4;17678:1;17671:15;17705:4;17702:1;17695:15;17722:236;17862:34;17858:1;17850:6;17846:14;17839:58;17931:19;17926:2;17918:6;17914:15;17907:44;17722:236;:::o;17964:366::-;18106:3;18127:67;18191:2;18186:3;18127:67;:::i;:::-;18120:74;;18203:93;18292:3;18203:93;:::i;:::-;18321:2;18316:3;18312:12;18305:19;;17964:366;;;:::o;18336:419::-;18502:4;18540:2;18529:9;18525:18;18517:26;;18589:9;18583:4;18579:20;18575:1;18564:9;18560:17;18553:47;18617:131;18743:4;18617:131;:::i;:::-;18609:139;;18336:419;;;:::o;18761:221::-;18901:34;18897:1;18889:6;18885:14;18878:58;18970:4;18965:2;18957:6;18953:15;18946:29;18761:221;:::o;18988:366::-;19130:3;19151:67;19215:2;19210:3;19151:67;:::i;:::-;19144:74;;19227:93;19316:3;19227:93;:::i;:::-;19345:2;19340:3;19336:12;19329:19;;18988:366;;;:::o;19360:419::-;19526:4;19564:2;19553:9;19549:18;19541:26;;19613:9;19607:4;19603:20;19599:1;19588:9;19584:17;19577:47;19641:131;19767:4;19641:131;:::i;:::-;19633:139;;19360:419;;;:::o;19785:442::-;19934:4;19972:2;19961:9;19957:18;19949:26;;19985:71;20053:1;20042:9;20038:17;20029:6;19985:71;:::i;:::-;20066:72;20134:2;20123:9;20119:18;20110:6;20066:72;:::i;:::-;20148;20216:2;20205:9;20201:18;20192:6;20148:72;:::i;:::-;19785:442;;;;;;:::o;20233:116::-;20303:21;20318:5;20303:21;:::i;:::-;20296:5;20293:32;20283:60;;20339:1;20336;20329:12;20283:60;20233:116;:::o;20355:137::-;20409:5;20440:6;20434:13;20425:22;;20456:30;20480:5;20456:30;:::i;:::-;20355:137;;;;:::o;20498:345::-;20565:6;20614:2;20602:9;20593:7;20589:23;20585:32;20582:119;;;20620:79;;:::i;:::-;20582:119;20740:1;20765:61;20818:7;20809:6;20798:9;20794:22;20765:61;:::i;:::-;20755:71;;20711:125;20498:345;;;;:::o;20849:170::-;20989:22;20985:1;20977:6;20973:14;20966:46;20849:170;:::o;21025:366::-;21167:3;21188:67;21252:2;21247:3;21188:67;:::i;:::-;21181:74;;21264:93;21353:3;21264:93;:::i;:::-;21382:2;21377:3;21373:12;21366:19;;21025:366;;;:::o;21397:419::-;21563:4;21601:2;21590:9;21586:18;21578:26;;21650:9;21644:4;21640:20;21636:1;21625:9;21621:17;21614:47;21678:131;21804:4;21678:131;:::i;:::-;21670:139;;21397:419;;;:::o;21822:233::-;21861:3;21884:24;21902:5;21884:24;:::i;:::-;21875:33;;21930:66;21923:5;21920:77;21917:103;;22000:18;;:::i;:::-;21917:103;22047:1;22040:5;22036:13;22029:20;;21822:233;;;:::o;22061:332::-;22182:4;22220:2;22209:9;22205:18;22197:26;;22233:71;22301:1;22290:9;22286:17;22277:6;22233:71;:::i;:::-;22314:72;22382:2;22371:9;22367:18;22358:6;22314:72;:::i;:::-;22061:332;;;;;:::o;22399:98::-;22450:6;22484:5;22478:12;22468:22;;22399:98;;;:::o;22503:147::-;22604:11;22641:3;22626:18;;22503:147;;;;:::o;22656:246::-;22737:1;22747:113;22761:6;22758:1;22755:13;22747:113;;;22846:1;22841:3;22837:11;22831:18;22827:1;22822:3;22818:11;22811:39;22783:2;22780:1;22776:10;22771:15;;22747:113;;;22894:1;22885:6;22880:3;22876:16;22869:27;22718:184;22656:246;;;:::o;22908:386::-;23012:3;23040:38;23072:5;23040:38;:::i;:::-;23094:88;23175:6;23170:3;23094:88;:::i;:::-;23087:95;;23191:65;23249:6;23244:3;23237:4;23230:5;23226:16;23191:65;:::i;:::-;23281:6;23276:3;23272:16;23265:23;;23016:278;22908:386;;;;:::o;23300:271::-;23430:3;23452:93;23541:3;23532:6;23452:93;:::i;:::-;23445:100;;23562:3;23555:10;;23300:271;;;;:::o
Swarm Source
ipfs://9ed9a090dfa500dd2c57374cedc1ac809e03515b65d36dfda366764e86ee4507
Loading...
Loading
Loading...
Loading
Net Worth in USD
$16,372.64
Net Worth in ETH
7.080733
Token Allocations
QBX
100.00%
Multichain Portfolio | 33 Chains
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.