Latest 25 from a total of 9,301 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim All Gas | 13223746 | 395 days ago | IN | 0 ETH | 0.00000024 | ||||
| End Hunt | 12930450 | 401 days ago | IN | 0 ETH | 0.00000343 | ||||
| Start Hunt | 12930257 | 401 days ago | IN | 0 ETH | 0.00000418 | ||||
| End Hunt | 12887552 | 402 days ago | IN | 0 ETH | 0.00000044 | ||||
| Start Hunt | 12887473 | 402 days ago | IN | 0 ETH | 0.00000066 | ||||
| End Hunt | 12887351 | 402 days ago | IN | 0 ETH | 0.00000044 | ||||
| End Hunt | 12887157 | 402 days ago | IN | 0 ETH | 0.0000004 | ||||
| Start Hunt | 12887151 | 402 days ago | IN | 0 ETH | 0.0000007 | ||||
| End Hunt | 12887088 | 402 days ago | IN | 0 ETH | 0.00000046 | ||||
| Start Hunt | 12886636 | 402 days ago | IN | 0 ETH | 0.00000077 | ||||
| End Hunt | 12886610 | 402 days ago | IN | 0 ETH | 0.00000051 | ||||
| Start Hunt | 12886311 | 402 days ago | IN | 0 ETH | 0.00000078 | ||||
| Start Hunt | 12886212 | 402 days ago | IN | 0 ETH | 0.00000084 | ||||
| End Hunt | 12886135 | 402 days ago | IN | 0 ETH | 0.00000052 | ||||
| End Hunt | 12886092 | 402 days ago | IN | 0 ETH | 0.0000005 | ||||
| Start Hunt | 12886063 | 402 days ago | IN | 0 ETH | 0.00000084 | ||||
| End Hunt | 12885993 | 402 days ago | IN | 0 ETH | 0.00000047 | ||||
| Start Hunt | 12885901 | 403 days ago | IN | 0 ETH | 0.00000081 | ||||
| Start Hunt | 12885773 | 403 days ago | IN | 0 ETH | 0.000001 | ||||
| End Hunt | 12885735 | 403 days ago | IN | 0 ETH | 0.00000061 | ||||
| End Hunt | 12885702 | 403 days ago | IN | 0 ETH | 0.00000073 | ||||
| Start Hunt | 12885503 | 403 days ago | IN | 0 ETH | 0.00000156 | ||||
| End Hunt | 12885448 | 403 days ago | IN | 0 ETH | 0.00000099 | ||||
| Start Hunt | 12885263 | 403 days ago | IN | 0 ETH | 0.00000156 | ||||
| End Hunt | 12885228 | 403 days ago | IN | 0 ETH | 0.00000093 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-10-23
*/
// SPDX-License-Identifier: None
// 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: @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/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/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: interfaces/IBlast.sol
pragma solidity ^0.8.28;
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IBlast{
// configure
function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;
function configure(YieldMode _yield, GasMode gasMode, address governor) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;
// claim yield
function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);
// claim gas
function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}
// File: WOB-Game.sol
pragma solidity ^0.8.28;
interface IMonsterContract {
struct Monster {
uint256 id;
string name;
uint256 weight;
}
function drawMonster() external view returns (Monster memory);
}
interface IExtendedERC721 is IERC721 {
function authorizeContract(
address contractAddress,
uint256 tokenId,
bool authorized
) external;
function getItemDetails(uint256 tokenId)
external
view
returns (
string memory name,
string memory description,
uint256 damage,
uint256 attackSpeed,
uint256 durability,
uint256 durabilityPerUse,
uint256 maxDurability,
string memory weaponType,
string memory imageUrl
);
function updateDurability(uint256 tokenId, uint256 newDurability) external;
function setStakedStatus(uint256 tokenId, bool status) external;
}
interface WorldOfBlastDrop {
function handleTokenEarnings(address to, uint256 total)
external
returns (uint256);
function handleNFTEarnings(address to) external;
}
contract WorldOfBlastGame is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
IExtendedERC721 public NFTContract;
struct Hunt {
uint256 id;
address hunter;
address location;
uint256 weapon;
uint256 startTime;
uint256 endTime;
IMonsterContract.Monster monster;
address nftContract;
}
struct WeaponToken {
uint256 damage;
uint256 attackSpeed;
uint256 durability;
uint256 durabilityPerUse;
}
IBlast public constant BLAST =
IBlast(0x4300000000000000000000000000000000000002);
address[] public locations;
uint256 public huntCount = 0;
mapping(address => uint256) public huntStartTimes;
mapping(address => uint256) public activeHuntId;
mapping(address => bool) public authorizedNFTContracts;
mapping(address => mapping(uint256 => bool)) public nftInHunt;
mapping(uint256 => Hunt) public hunts;
event HuntHasBegun(
uint256 indexed huntId,
uint256 startTime,
address indexed nftContract,
uint256 indexed weapon,
address hunter,
address location,
string monster
);
event HuntEnd(
uint256 indexed huntId,
uint256 startTime,
uint256 endTime,
uint256 hitCounter,
uint256 durability
);
address public contractDropAddress;
bool public paused;
constructor() Ownable(msg.sender) {
paused = false;
BLAST.configureClaimableGas();
}
// Blast functions
function claimAllGas() external onlyOwner {
BLAST.claimAllGas(address(this), msg.sender);
}
function claimGasAtMinClaimRate(
address recipientOfGas,
uint256 minClaimRateBips
) external onlyOwner {
BLAST.claimGasAtMinClaimRate(
address(this),
recipientOfGas,
minClaimRateBips
);
}
function claimGas(
address recipientOfGas,
uint256 gasToClaim,
uint256 gasSecondsToConsume
) external onlyOwner {
BLAST.claimGas(
address(this),
recipientOfGas,
gasToClaim,
gasSecondsToConsume
);
}
function readGasParams()
external
view
returns (
uint256 etherSeconds,
uint256 etherBalance,
uint256 lastUpdated,
GasMode
)
{
return BLAST.readGasParams(address(this));
}
function configureClaimableGasOnBehalf() external onlyOwner {
BLAST.configureClaimableGasOnBehalf(address(this));
}
function pauseGame() external onlyOwner {
paused = true;
}
function unpauseGame() external onlyOwner {
paused = false;
}
function getActiveHuntDetails(address userAddress)
public
view
returns (
uint256 huntId,
address location,
uint256 weapon,
uint256 startTime,
uint256 endTime,
string memory monsterName,
uint256 monsterWeight
)
{
for (uint256 i = 1; i <= huntCount; i++) {
if (hunts[i].hunter == userAddress && hunts[i].endTime == 0) {
Hunt memory activeHunt = hunts[i];
return (
activeHunt.id,
activeHunt.location,
activeHunt.weapon,
activeHunt.startTime,
activeHunt.endTime,
activeHunt.monster.name,
activeHunt.monster.weight
);
}
}
revert("No active hunt found for this user");
}
function setAuthorizedNFTContract(address nftContract, bool authorized)
public
onlyOwner
{
authorizedNFTContracts[nftContract] = authorized;
}
function setContractDropAddress(address _contractDropAddress)
external
onlyOwner
{
contractDropAddress = _contractDropAddress;
}
function getWeaponToken(uint256 huntId)
public
view
returns (WeaponToken memory)
{
uint256 weaponTokenId = hunts[huntId].weapon;
IExtendedERC721 nft = IExtendedERC721(hunts[huntId].nftContract);
(
,
,
uint256 damage,
uint256 attackSpeed,
uint256 durability,
uint256 durabilityPerUse,
,
,
) = nft.getItemDetails(weaponTokenId);
WeaponToken memory weaponToken = WeaponToken({
damage: damage,
attackSpeed: attackSpeed,
durability: durability,
durabilityPerUse: durabilityPerUse
});
return weaponToken;
}
// Calculates effective number of hits.
function handleCharacterBattleHits(
uint256 attackSpeed,
uint256 durability,
uint256 durabilityPerUse,
uint256 startTime,
uint256 endTime
) internal pure returns (uint256) {
require(startTime < endTime, "Start time must be before end time");
uint256 maxHitsBeforeBroke = durability / durabilityPerUse;
uint256 duration = (endTime - startTime);
uint256 totalPotentialHits = (duration * attackSpeed);
// Calculate effective hits to reward
uint256 totalEffectiveHits = totalPotentialHits > maxHitsBeforeBroke
? maxHitsBeforeBroke
: totalPotentialHits;
return (totalEffectiveHits);
}
// Reduces Item durability based on hits.
function handleCharacterBattleDurability(
uint256 durability,
uint256 durabilityPerUse,
uint256 totalEffectiveHits
) internal pure returns (uint256) {
durability -= totalEffectiveHits * durabilityPerUse;
return (durability);
}
function isEOA(address _address) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(_address)
}
return size == 0;
}
function startHunt(
address _location,
address nftContract,
uint256 nftId
) public nonReentrant returns (uint256) {
require(!paused, "Game is paused");
require(
authorizedNFTContracts[nftContract],
"NFT contract not authorized"
);
IExtendedERC721 nft = IExtendedERC721(nftContract);
require(nft.ownerOf(nftId) == msg.sender, "Not the owner of the NFT");
require(huntStartTimes[msg.sender] == 0, "Hunt already started");
require(
isEOA(msg.sender),
"Only externally owned accounts can call this function"
);
require(!nftInHunt[nftContract][nftId], "NFT is already in a hunt");
nft.setStakedStatus(nftId, true);
IMonsterContract monsterContract = IMonsterContract(_location);
IMonsterContract.Monster memory monster = monsterContract.drawMonster();
huntCount++;
Hunt memory newHunt = Hunt({
id: huntCount,
hunter: msg.sender,
location: _location,
weapon: nftId,
startTime: block.timestamp,
endTime: 0,
monster: monster,
nftContract: nftContract
});
hunts[huntCount] = newHunt;
activeHuntId[msg.sender] = huntCount;
huntStartTimes[msg.sender] = block.timestamp;
nftInHunt[nftContract][nftId] = true;
emit HuntHasBegun(
huntCount,
newHunt.startTime,
nftContract,
nftId,
msg.sender,
_location,
monster.name
);
return huntCount;
}
function endHunt(uint256 huntId) public nonReentrant {
require(
hunts[huntId].hunter == msg.sender,
"Not the hunter of this hunt"
);
require(hunts[huntId].endTime == 0, "Hunt already ended");
hunts[huntId].endTime = block.timestamp;
huntStartTimes[msg.sender] = 0;
activeHuntId[msg.sender] = 0;
address _nftContract = hunts[huntId].nftContract;
IExtendedERC721 nft = IExtendedERC721(_nftContract);
WeaponToken memory weaponToken = getWeaponToken(huntId);
uint256 effectiveHitCounter = handleCharacterBattleHits(
weaponToken.attackSpeed,
weaponToken.durability,
weaponToken.durabilityPerUse,
hunts[huntId].startTime,
hunts[huntId].endTime
);
uint256 currentDurability = handleCharacterBattleDurability(
weaponToken.durability,
weaponToken.durabilityPerUse,
effectiveHitCounter
);
emit HuntEnd(
huntId,
hunts[huntId].startTime,
hunts[huntId].endTime,
effectiveHitCounter,
currentDurability
);
nft.updateDurability(hunts[huntId].weapon, currentDurability);
nft.setStakedStatus(hunts[huntId].weapon, false);
nftInHunt[_nftContract][hunts[huntId].weapon] = false;
WorldOfBlastDrop worldOfBlastDrop = WorldOfBlastDrop(
contractDropAddress
);
worldOfBlastDrop.handleTokenEarnings(
msg.sender,
effectiveHitCounter * weaponToken.damage
);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"huntId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hitCounter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"durability","type":"uint256"}],"name":"HuntEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"huntId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":true,"internalType":"address","name":"nftContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"weapon","type":"uint256"},{"indexed":false,"internalType":"address","name":"hunter","type":"address"},{"indexed":false,"internalType":"address","name":"location","type":"address"},{"indexed":false,"internalType":"string","name":"monster","type":"string"}],"name":"HuntHasBegun","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"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTContract","outputs":[{"internalType":"contract IExtendedERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"activeHuntId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedNFTContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipientOfGas","type":"address"},{"internalType":"uint256","name":"gasToClaim","type":"uint256"},{"internalType":"uint256","name":"gasSecondsToConsume","type":"uint256"}],"name":"claimGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipientOfGas","type":"address"},{"internalType":"uint256","name":"minClaimRateBips","type":"uint256"}],"name":"claimGasAtMinClaimRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureClaimableGasOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractDropAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"huntId","type":"uint256"}],"name":"endHunt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getActiveHuntDetails","outputs":[{"internalType":"uint256","name":"huntId","type":"uint256"},{"internalType":"address","name":"location","type":"address"},{"internalType":"uint256","name":"weapon","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"string","name":"monsterName","type":"string"},{"internalType":"uint256","name":"monsterWeight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"huntId","type":"uint256"}],"name":"getWeaponToken","outputs":[{"components":[{"internalType":"uint256","name":"damage","type":"uint256"},{"internalType":"uint256","name":"attackSpeed","type":"uint256"},{"internalType":"uint256","name":"durability","type":"uint256"},{"internalType":"uint256","name":"durabilityPerUse","type":"uint256"}],"internalType":"struct WorldOfBlastGame.WeaponToken","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"huntCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"huntStartTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hunts","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"hunter","type":"address"},{"internalType":"address","name":"location","type":"address"},{"internalType":"uint256","name":"weapon","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"weight","type":"uint256"}],"internalType":"struct IMonsterContract.Monster","name":"monster","type":"tuple"},{"internalType":"address","name":"nftContract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locations","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftInHunt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readGasParams","outputs":[{"internalType":"uint256","name":"etherSeconds","type":"uint256"},{"internalType":"uint256","name":"etherBalance","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"enum GasMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setAuthorizedNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractDropAddress","type":"address"}],"name":"setContractDropAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_location","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"startHunt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseGame","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040525f600455348015610013575f5ffd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610085575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161007c919061022a565b60405180910390fd5b6100948161012a60201b60201c565b50600180819055505f600a60146101000a81548160ff02191690831515021790555073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16634e606c476040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561010f575f5ffd5b505af1158015610121573d5f5f3e3d5ffd5b50505050610243565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610214826101eb565b9050919050565b6102248161020a565b82525050565b5f60208201905061023d5f83018461021b565b92915050565b6134ae806102505f395ff3fe608060405234801561000f575f5ffd5b50600436106101a7575f3560e01c806369f5b93c116100f7578063986ed78511610095578063b9e0db351161006f578063b9e0db3514610479578063bcd2bf25146104a9578063e00c543f146104c5578063f2fde38b146104fb576101a7565b8063986ed785146103fd5780639ce8a6611461042d578063a1c327251461045d576101a7565b80638aaa8f24116100d15780638aaa8f24146103755780638da5cb5b146103a557806392528021146103c357806397d75776146103df576101a7565b806369f5b93c1461031d578063715018a61461034d57806377d7847114610357576101a7565b806347a279a611610164578063588a81431161013e578063588a8143146102bd5780635c975abb146102d9578063645dd1fa146102f75780636897678614610301576101a7565b806347a279a614610274578063491ae34814610292578063499831f2146102b3576101a7565b806309250e4e146101ab57806310cb8e66146101db57806315f3598b1461020b578063305243d91461024257806331c2273b1461024c5780633eb947da1461026a575b5f5ffd5b6101c560048036038101906101c09190611fc9565b610517565b6040516101d29190612028565b60405180910390f35b6101f560048036038101906101f09190612041565b610c5d565b6040516102029190612028565b60405180910390f35b6102256004803603810190610220919061206c565b610c72565b604051610239989796959493929190612172565b60405180910390f35b61024a610dc0565b005b610254610de4565b6040516102619190612250565b60405180910390f35b610272610e09565b005b61027c610e8d565b6040516102899190612028565b60405180910390f35b61029a610e93565b6040516102aa94939291906122dc565b60405180910390f35b6102bb610f31565b005b6102d760048036038101906102d29190612354565b610f56565b005b6102e1610fb6565b6040516102ee91906123a1565b60405180910390f35b6102ff610fc9565b005b61031b6004803603810190610316919061206c565b611063565b005b6103376004803603810190610332919061206c565b611534565b604051610344919061240d565b60405180910390f35b61035561164a565b005b61035f61165d565b60405161036c9190612426565b60405180910390f35b61038f600480360381019061038a9190612041565b611682565b60405161039c91906123a1565b60405180910390f35b6103ad61169f565b6040516103ba9190612426565b60405180910390f35b6103dd60048036038101906103d89190612041565b6116c6565b005b6103e7611711565b6040516103f4919061245f565b60405180910390f35b61041760048036038101906104129190612041565b611729565b6040516104249190612028565b60405180910390f35b61044760048036038101906104429190612478565b61173e565b60405161045491906123a1565b60405180910390f35b610477600480360381019061047291906124b6565b611768565b005b610493600480360381019061048e919061206c565b611809565b6040516104a09190612426565b60405180910390f35b6104c360048036038101906104be9190612478565b611844565b005b6104df60048036038101906104da9190612041565b6118e2565b6040516104f2979695949392919061254e565b60405180910390f35b61051560048036038101906105109190612041565b611c15565b005b5f610520611c99565b600a60149054906101000a900460ff1615610570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105679061260c565b60405180910390fd5b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f090612674565b60405180910390fd5b5f8390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b815260040161064d9190612028565b602060405180830381865afa158015610668573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068c91906126a6565b73ffffffffffffffffffffffffffffffffffffffff16146106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d99061271b565b60405180910390fd5b5f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414610761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075890612783565b60405180910390fd5b61076a33611ce8565b6107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a090612811565b60405180910390fd5b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205f9054906101000a900460ff1615610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612879565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16629c7dc98460016040518363ffffffff1660e01b815260040161087d929190612897565b5f604051808303815f87803b158015610894575f5ffd5b505af11580156108a6573d5f5f3e3d5ffd5b505050505f8590505f8173ffffffffffffffffffffffffffffffffffffffff1663910946146040518163ffffffff1660e01b81526004015f60405180830381865afa1580156108f7573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061091f9190612a75565b905060045f81548092919061093390612ae9565b91905055505f60405180610100016040528060045481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018781526020014281526020015f81526020018381526020018873ffffffffffffffffffffffffffffffffffffffff1681525090508060095f60045481526020019081526020015f205f820151815f01556020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015f820151815f01556020820151816001019081610aa59190612d24565b5060408201518160020155505060e0820151816009015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505060045460065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550858773ffffffffffffffffffffffffffffffffffffffff166004547f6c5bdef5a63e7ccddb6dbcdc1d7315f4919f7ce1d203190005f64b78205c062b8460800151338d8860200151604051610c3d9493929190612df3565b60405180910390a4600454945050505050610c56611cf9565b9392505050565b6005602052805f5260405f205f915090505481565b6009602052805f5260405f205f91509050805f015490806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806003015490806004015490806005015490806006016040518060600160405290815f8201548152602001600182018054610d0c90612b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3890612b5d565b8015610d835780601f10610d5a57610100808354040283529160200191610d83565b820191905f5260205f20905b815481529060010190602001808311610d6657829003601f168201915b5050505050815260200160028201548152505090806009015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905088565b610dc8611d02565b5f600a60146101000a81548160ff021916908315150217905550565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e11611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663908c8502306040518263ffffffff1660e01b8152600401610e5e9190612426565b5f604051808303815f87803b158015610e75575f5ffd5b505af1158015610e87573d5f5f3e3d5ffd5b50505050565b60045481565b5f5f5f5f73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663dde798a4306040518263ffffffff1660e01b8152600401610ee49190612426565b608060405180830381865afa158015610eff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f239190612e60565b935093509350935090919293565b610f39611d02565b6001600a60146101000a81548160ff021916908315150217905550565b610f5e611d02565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b600a60149054906101000a900460ff1681565b610fd1611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30336040518363ffffffff1660e01b8152600401611020929190612ec4565b6020604051808303815f875af115801561103c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110609190612eeb565b50565b61106b611c99565b3373ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461110c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110390612f60565b60405180910390fd5b5f60095f8381526020019081526020015f206005015414611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612fc8565b60405180910390fd5b4260095f8381526020019081526020015f20600501819055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60095f8381526020019081526020015f206009015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8190505f61124484611534565b90505f61128882602001518360400151846060015160095f8a81526020019081526020015f206004015460095f8b81526020019081526020015f2060050154611d89565b90505f61129e8360400151846060015184611e1b565b9050857fd29ed6119709d0a8bca374240d1e20458a6c20ca2bb6ba99f70cb7ab9c3468af60095f8981526020019081526020015f206004015460095f8a81526020019081526020015f206005015485856040516112fe9493929190612fe6565b60405180910390a28373ffffffffffffffffffffffffffffffffffffffff1663fea609d260095f8981526020019081526020015f2060030154836040518363ffffffff1660e01b8152600401611355929190613029565b5f604051808303815f87803b15801561136c575f5ffd5b505af115801561137e573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff16629c7dc960095f8981526020019081526020015f20600301545f6040518363ffffffff1660e01b81526004016113d0929190612897565b5f604051808303815f87803b1580156113e7575f5ffd5b505af11580156113f9573d5f5f3e3d5ffd5b505050505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60095f8a81526020019081526020015f206003015481526020019081526020015f205f6101000a81548160ff0219169083151502179055505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663c00066d833865f0151866114c59190613050565b6040518363ffffffff1660e01b81526004016114e2929190613091565b6020604051808303815f875af11580156114fe573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115229190612eeb565b50505050505050611531611cf9565b50565b61153c611f07565b5f60095f8481526020019081526020015f206003015490505f60095f8581526020019081526020015f206009015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f5f5f5f8473ffffffffffffffffffffffffffffffffffffffff166373004ca0876040518263ffffffff1660e01b81526004016115c89190612028565b5f60405180830381865afa1580156115e2573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061160a91906130b8565b505050955095509550955050505f604051806080016040528086815260200185815260200184815260200183815250905080975050505050505050919050565b611652611d02565b61165b5f611e3f565b565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116ce611d02565b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b73430000000000000000000000000000000000000281565b6006602052805f5260405f205f915090505481565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b611770611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663fafce39e308585856040518563ffffffff1660e01b81526004016117c394939291906131ec565b6020604051808303815f875af11580156117df573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118039190612eeb565b50505050565b60038181548110611818575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61184c611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16630951888f3084846040518463ffffffff1660e01b815260040161189d9392919061322f565b6020604051808303815f875af11580156118b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190612eeb565b505050565b5f5f5f5f5f60605f5f600190505b6004548111611bce578873ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561197a57505f60095f8381526020019081526020015f2060050154145b15611bbb575f60095f8381526020019081526020015f20604051806101000160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820154815260200160058201548152602001600682016040518060600160405290815f8201548152602001600182018054611a9790612b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac390612b5d565b8015611b0e5780601f10611ae557610100808354040283529160200191611b0e565b820191905f5260205f20905b815481529060010190602001808311611af157829003601f168201915b505050505081526020016002820154815250508152602001600982015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050805f01518160400151826060015183608001518460a001518560c00151602001518660c001516040015198509850985098509850985098505050611c0a565b8080611bc690612ae9565b9150506118f0565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c01906132d4565b60405180910390fd5b919395979092949650565b611c1d611d02565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c8d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611c849190612426565b60405180910390fd5b611c9681611e3f565b50565b600260015403611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd59061333c565b60405180910390fd5b6002600181905550565b5f5f823b90505f8114915050919050565b60018081905550565b611d0a611f00565b73ffffffffffffffffffffffffffffffffffffffff16611d2861169f565b73ffffffffffffffffffffffffffffffffffffffff1614611d8757611d4b611f00565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d7e9190612426565b60405180910390fd5b565b5f818310611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc3906133ca565b60405180910390fd5b5f8486611dd99190613415565b90505f8484611de89190613445565b90505f8882611df79190613050565b90505f838211611e075781611e09565b835b90508094505050505095945050505050565b5f8282611e289190613050565b84611e339190613445565b93508390509392505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b60405180608001604052805f81526020015f81526020015f81526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f6582611f3c565b9050919050565b611f7581611f5b565b8114611f7f575f5ffd5b50565b5f81359050611f9081611f6c565b92915050565b5f819050919050565b611fa881611f96565b8114611fb2575f5ffd5b50565b5f81359050611fc381611f9f565b92915050565b5f5f5f60608486031215611fe057611fdf611f34565b5b5f611fed86828701611f82565b9350506020611ffe86828701611f82565b925050604061200f86828701611fb5565b9150509250925092565b61202281611f96565b82525050565b5f60208201905061203b5f830184612019565b92915050565b5f6020828403121561205657612055611f34565b5b5f61206384828501611f82565b91505092915050565b5f6020828403121561208157612080611f34565b5b5f61208e84828501611fb5565b91505092915050565b6120a081611f5b565b82525050565b6120af81611f96565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6120f7826120b5565b61210181856120bf565b93506121118185602086016120cf565b61211a816120dd565b840191505092915050565b5f606083015f83015161213a5f8601826120a6565b506020830151848203602086015261215282826120ed565b915050604083015161216760408601826120a6565b508091505092915050565b5f610100820190506121865f83018b612019565b612193602083018a612097565b6121a06040830189612097565b6121ad6060830188612019565b6121ba6080830187612019565b6121c760a0830186612019565b81810360c08301526121d98185612125565b90506121e860e0830184612097565b9998505050505050505050565b5f819050919050565b5f61221861221361220e84611f3c565b6121f5565b611f3c565b9050919050565b5f612229826121fe565b9050919050565b5f61223a8261221f565b9050919050565b61224a81612230565b82525050565b5f6020820190506122635f830184612241565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600281106122a7576122a6612269565b5b50565b5f8190506122b782612296565b919050565b5f6122c6826122aa565b9050919050565b6122d6816122bc565b82525050565b5f6080820190506122ef5f830187612019565b6122fc6020830186612019565b6123096040830185612019565b61231660608301846122cd565b95945050505050565b5f8115159050919050565b6123338161231f565b811461233d575f5ffd5b50565b5f8135905061234e8161232a565b92915050565b5f5f6040838503121561236a57612369611f34565b5b5f61237785828601611f82565b925050602061238885828601612340565b9150509250929050565b61239b8161231f565b82525050565b5f6020820190506123b45f830184612392565b92915050565b608082015f8201516123ce5f8501826120a6565b5060208201516123e160208501826120a6565b5060408201516123f460408501826120a6565b50606082015161240760608501826120a6565b50505050565b5f6080820190506124205f8301846123ba565b92915050565b5f6020820190506124395f830184612097565b92915050565b5f6124498261221f565b9050919050565b6124598161243f565b82525050565b5f6020820190506124725f830184612450565b92915050565b5f5f6040838503121561248e5761248d611f34565b5b5f61249b85828601611f82565b92505060206124ac85828601611fb5565b9150509250929050565b5f5f5f606084860312156124cd576124cc611f34565b5b5f6124da86828701611f82565b93505060206124eb86828701611fb5565b92505060406124fc86828701611fb5565b9150509250925092565b5f82825260208201905092915050565b5f612520826120b5565b61252a8185612506565b935061253a8185602086016120cf565b612543816120dd565b840191505092915050565b5f60e0820190506125615f83018a612019565b61256e6020830189612097565b61257b6040830188612019565b6125886060830187612019565b6125956080830186612019565b81810360a08301526125a78185612516565b90506125b660c0830184612019565b98975050505050505050565b7f47616d65206973207061757365640000000000000000000000000000000000005f82015250565b5f6125f6600e83612506565b9150612601826125c2565b602082019050919050565b5f6020820190508181035f830152612623816125ea565b9050919050565b7f4e465420636f6e7472616374206e6f7420617574686f72697a656400000000005f82015250565b5f61265e601b83612506565b91506126698261262a565b602082019050919050565b5f6020820190508181035f83015261268b81612652565b9050919050565b5f815190506126a081611f6c565b92915050565b5f602082840312156126bb576126ba611f34565b5b5f6126c884828501612692565b91505092915050565b7f4e6f7420746865206f776e6572206f6620746865204e465400000000000000005f82015250565b5f612705601883612506565b9150612710826126d1565b602082019050919050565b5f6020820190508181035f830152612732816126f9565b9050919050565b7f48756e7420616c726561647920737461727465640000000000000000000000005f82015250565b5f61276d601483612506565b915061277882612739565b602082019050919050565b5f6020820190508181035f83015261279a81612761565b9050919050565b7f4f6e6c792065787465726e616c6c79206f776e6564206163636f756e747320635f8201527f616e2063616c6c20746869732066756e6374696f6e0000000000000000000000602082015250565b5f6127fb603583612506565b9150612806826127a1565b604082019050919050565b5f6020820190508181035f830152612828816127ef565b9050919050565b7f4e465420697320616c726561647920696e20612068756e7400000000000000005f82015250565b5f612863601883612506565b915061286e8261282f565b602082019050919050565b5f6020820190508181035f83015261289081612857565b9050919050565b5f6040820190506128aa5f830185612019565b6128b76020830184612392565b9392505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128f8826120dd565b810181811067ffffffffffffffff82111715612917576129166128c2565b5b80604052505050565b5f612929611f2b565b905061293582826128ef565b919050565b5f5ffd5b5f8151905061294c81611f9f565b92915050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115612974576129736128c2565b5b61297d826120dd565b9050602081019050919050565b5f61299c6129978461295a565b612920565b9050828152602081018484840111156129b8576129b7612956565b5b6129c38482856120cf565b509392505050565b5f82601f8301126129df576129de612952565b5b81516129ef84826020860161298a565b91505092915050565b5f60608284031215612a0d57612a0c6128be565b5b612a176060612920565b90505f612a268482850161293e565b5f83015250602082015167ffffffffffffffff811115612a4957612a4861293a565b5b612a55848285016129cb565b6020830152506040612a698482850161293e565b60408301525092915050565b5f60208284031215612a8a57612a89611f34565b5b5f82015167ffffffffffffffff811115612aa757612aa6611f38565b5b612ab3848285016129f8565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612af382611f96565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b2557612b24612abc565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612b7457607f821691505b602082108103612b8757612b86612b30565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612be97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612bae565b612bf38683612bae565b95508019841693508086168417925050509392505050565b5f612c25612c20612c1b84611f96565b6121f5565b611f96565b9050919050565b5f819050919050565b612c3e83612c0b565b612c52612c4a82612c2c565b848454612bba565b825550505050565b5f5f905090565b612c69612c5a565b612c74818484612c35565b505050565b5b81811015612c9757612c8c5f82612c61565b600181019050612c7a565b5050565b601f821115612cdc57612cad81612b8d565b612cb684612b9f565b81016020851015612cc5578190505b612cd9612cd185612b9f565b830182612c79565b50505b505050565b5f82821c905092915050565b5f612cfc5f1984600802612ce1565b1980831691505092915050565b5f612d148383612ced565b9150826002028217905092915050565b612d2d826120b5565b67ffffffffffffffff811115612d4657612d456128c2565b5b612d508254612b5d565b612d5b828285612c9b565b5f60209050601f831160018114612d8c575f8415612d7a578287015190505b612d848582612d09565b865550612deb565b601f198416612d9a86612b8d565b5f5b82811015612dc157848901518255600182019150602085019450602081019050612d9c565b86831015612dde5784890151612dda601f891682612ced565b8355505b6001600288020188555050505b505050505050565b5f608082019050612e065f830187612019565b612e136020830186612097565b612e206040830185612097565b8181036060830152612e328184612516565b905095945050505050565b60028110612e49575f5ffd5b50565b5f81519050612e5a81612e3d565b92915050565b5f5f5f5f60808587031215612e7857612e77611f34565b5b5f612e858782880161293e565b9450506020612e968782880161293e565b9350506040612ea78782880161293e565b9250506060612eb887828801612e4c565b91505092959194509250565b5f604082019050612ed75f830185612097565b612ee46020830184612097565b9392505050565b5f60208284031215612f0057612eff611f34565b5b5f612f0d8482850161293e565b91505092915050565b7f4e6f74207468652068756e746572206f6620746869732068756e7400000000005f82015250565b5f612f4a601b83612506565b9150612f5582612f16565b602082019050919050565b5f6020820190508181035f830152612f7781612f3e565b9050919050565b7f48756e7420616c726561647920656e64656400000000000000000000000000005f82015250565b5f612fb2601283612506565b9150612fbd82612f7e565b602082019050919050565b5f6020820190508181035f830152612fdf81612fa6565b9050919050565b5f608082019050612ff95f830187612019565b6130066020830186612019565b6130136040830185612019565b6130206060830184612019565b95945050505050565b5f60408201905061303c5f830185612019565b6130496020830184612019565b9392505050565b5f61305a82611f96565b915061306583611f96565b925082820261307381611f96565b9150828204841483151761308a57613089612abc565b5b5092915050565b5f6040820190506130a45f830185612097565b6130b16020830184612019565b9392505050565b5f5f5f5f5f5f5f5f5f6101208a8c0312156130d6576130d5611f34565b5b5f8a015167ffffffffffffffff8111156130f3576130f2611f38565b5b6130ff8c828d016129cb565b99505060208a015167ffffffffffffffff8111156131205761311f611f38565b5b61312c8c828d016129cb565b985050604061313d8c828d0161293e565b975050606061314e8c828d0161293e565b965050608061315f8c828d0161293e565b95505060a06131708c828d0161293e565b94505060c06131818c828d0161293e565b93505060e08a015167ffffffffffffffff8111156131a2576131a1611f38565b5b6131ae8c828d016129cb565b9250506101008a015167ffffffffffffffff8111156131d0576131cf611f38565b5b6131dc8c828d016129cb565b9150509295985092959850929598565b5f6080820190506131ff5f830187612097565b61320c6020830186612097565b6132196040830185612019565b6132266060830184612019565b95945050505050565b5f6060820190506132425f830186612097565b61324f6020830185612097565b61325c6040830184612019565b949350505050565b7f4e6f206163746976652068756e7420666f756e6420666f7220746869732075735f8201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b5f6132be602283612506565b91506132c982613264565b604082019050919050565b5f6020820190508181035f8301526132eb816132b2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613326601f83612506565b9150613331826132f2565b602082019050919050565b5f6020820190508181035f8301526133538161331a565b9050919050565b7f53746172742074696d65206d757374206265206265666f726520656e642074695f8201527f6d65000000000000000000000000000000000000000000000000000000000000602082015250565b5f6133b4602283612506565b91506133bf8261335a565b604082019050919050565b5f6020820190508181035f8301526133e1816133a8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61341f82611f96565b915061342a83611f96565b92508261343a576134396133e8565b5b828204905092915050565b5f61344f82611f96565b915061345a83611f96565b925082820390508181111561347257613471612abc565b5b9291505056fea26469706673582212204838346044f83b8cfc872767eac7391523e3e21d561d25fd08a6daaf43f80bcc64736f6c634300081c0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101a7575f3560e01c806369f5b93c116100f7578063986ed78511610095578063b9e0db351161006f578063b9e0db3514610479578063bcd2bf25146104a9578063e00c543f146104c5578063f2fde38b146104fb576101a7565b8063986ed785146103fd5780639ce8a6611461042d578063a1c327251461045d576101a7565b80638aaa8f24116100d15780638aaa8f24146103755780638da5cb5b146103a557806392528021146103c357806397d75776146103df576101a7565b806369f5b93c1461031d578063715018a61461034d57806377d7847114610357576101a7565b806347a279a611610164578063588a81431161013e578063588a8143146102bd5780635c975abb146102d9578063645dd1fa146102f75780636897678614610301576101a7565b806347a279a614610274578063491ae34814610292578063499831f2146102b3576101a7565b806309250e4e146101ab57806310cb8e66146101db57806315f3598b1461020b578063305243d91461024257806331c2273b1461024c5780633eb947da1461026a575b5f5ffd5b6101c560048036038101906101c09190611fc9565b610517565b6040516101d29190612028565b60405180910390f35b6101f560048036038101906101f09190612041565b610c5d565b6040516102029190612028565b60405180910390f35b6102256004803603810190610220919061206c565b610c72565b604051610239989796959493929190612172565b60405180910390f35b61024a610dc0565b005b610254610de4565b6040516102619190612250565b60405180910390f35b610272610e09565b005b61027c610e8d565b6040516102899190612028565b60405180910390f35b61029a610e93565b6040516102aa94939291906122dc565b60405180910390f35b6102bb610f31565b005b6102d760048036038101906102d29190612354565b610f56565b005b6102e1610fb6565b6040516102ee91906123a1565b60405180910390f35b6102ff610fc9565b005b61031b6004803603810190610316919061206c565b611063565b005b6103376004803603810190610332919061206c565b611534565b604051610344919061240d565b60405180910390f35b61035561164a565b005b61035f61165d565b60405161036c9190612426565b60405180910390f35b61038f600480360381019061038a9190612041565b611682565b60405161039c91906123a1565b60405180910390f35b6103ad61169f565b6040516103ba9190612426565b60405180910390f35b6103dd60048036038101906103d89190612041565b6116c6565b005b6103e7611711565b6040516103f4919061245f565b60405180910390f35b61041760048036038101906104129190612041565b611729565b6040516104249190612028565b60405180910390f35b61044760048036038101906104429190612478565b61173e565b60405161045491906123a1565b60405180910390f35b610477600480360381019061047291906124b6565b611768565b005b610493600480360381019061048e919061206c565b611809565b6040516104a09190612426565b60405180910390f35b6104c360048036038101906104be9190612478565b611844565b005b6104df60048036038101906104da9190612041565b6118e2565b6040516104f2979695949392919061254e565b60405180910390f35b61051560048036038101906105109190612041565b611c15565b005b5f610520611c99565b600a60149054906101000a900460ff1615610570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105679061260c565b60405180910390fd5b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f090612674565b60405180910390fd5b5f8390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b815260040161064d9190612028565b602060405180830381865afa158015610668573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068c91906126a6565b73ffffffffffffffffffffffffffffffffffffffff16146106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d99061271b565b60405180910390fd5b5f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414610761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075890612783565b60405180910390fd5b61076a33611ce8565b6107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a090612811565b60405180910390fd5b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205f9054906101000a900460ff1615610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083990612879565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16629c7dc98460016040518363ffffffff1660e01b815260040161087d929190612897565b5f604051808303815f87803b158015610894575f5ffd5b505af11580156108a6573d5f5f3e3d5ffd5b505050505f8590505f8173ffffffffffffffffffffffffffffffffffffffff1663910946146040518163ffffffff1660e01b81526004015f60405180830381865afa1580156108f7573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061091f9190612a75565b905060045f81548092919061093390612ae9565b91905055505f60405180610100016040528060045481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018781526020014281526020015f81526020018381526020018873ffffffffffffffffffffffffffffffffffffffff1681525090508060095f60045481526020019081526020015f205f820151815f01556020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015f820151815f01556020820151816001019081610aa59190612d24565b5060408201518160020155505060e0820151816009015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505060045460065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550858773ffffffffffffffffffffffffffffffffffffffff166004547f6c5bdef5a63e7ccddb6dbcdc1d7315f4919f7ce1d203190005f64b78205c062b8460800151338d8860200151604051610c3d9493929190612df3565b60405180910390a4600454945050505050610c56611cf9565b9392505050565b6005602052805f5260405f205f915090505481565b6009602052805f5260405f205f91509050805f015490806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806003015490806004015490806005015490806006016040518060600160405290815f8201548152602001600182018054610d0c90612b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3890612b5d565b8015610d835780601f10610d5a57610100808354040283529160200191610d83565b820191905f5260205f20905b815481529060010190602001808311610d6657829003601f168201915b5050505050815260200160028201548152505090806009015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905088565b610dc8611d02565b5f600a60146101000a81548160ff021916908315150217905550565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e11611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663908c8502306040518263ffffffff1660e01b8152600401610e5e9190612426565b5f604051808303815f87803b158015610e75575f5ffd5b505af1158015610e87573d5f5f3e3d5ffd5b50505050565b60045481565b5f5f5f5f73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663dde798a4306040518263ffffffff1660e01b8152600401610ee49190612426565b608060405180830381865afa158015610eff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f239190612e60565b935093509350935090919293565b610f39611d02565b6001600a60146101000a81548160ff021916908315150217905550565b610f5e611d02565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b600a60149054906101000a900460ff1681565b610fd1611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30336040518363ffffffff1660e01b8152600401611020929190612ec4565b6020604051808303815f875af115801561103c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110609190612eeb565b50565b61106b611c99565b3373ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461110c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110390612f60565b60405180910390fd5b5f60095f8381526020019081526020015f206005015414611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612fc8565b60405180910390fd5b4260095f8381526020019081526020015f20600501819055505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60095f8381526020019081526020015f206009015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8190505f61124484611534565b90505f61128882602001518360400151846060015160095f8a81526020019081526020015f206004015460095f8b81526020019081526020015f2060050154611d89565b90505f61129e8360400151846060015184611e1b565b9050857fd29ed6119709d0a8bca374240d1e20458a6c20ca2bb6ba99f70cb7ab9c3468af60095f8981526020019081526020015f206004015460095f8a81526020019081526020015f206005015485856040516112fe9493929190612fe6565b60405180910390a28373ffffffffffffffffffffffffffffffffffffffff1663fea609d260095f8981526020019081526020015f2060030154836040518363ffffffff1660e01b8152600401611355929190613029565b5f604051808303815f87803b15801561136c575f5ffd5b505af115801561137e573d5f5f3e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff16629c7dc960095f8981526020019081526020015f20600301545f6040518363ffffffff1660e01b81526004016113d0929190612897565b5f604051808303815f87803b1580156113e7575f5ffd5b505af11580156113f9573d5f5f3e3d5ffd5b505050505f60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60095f8a81526020019081526020015f206003015481526020019081526020015f205f6101000a81548160ff0219169083151502179055505f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663c00066d833865f0151866114c59190613050565b6040518363ffffffff1660e01b81526004016114e2929190613091565b6020604051808303815f875af11580156114fe573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115229190612eeb565b50505050505050611531611cf9565b50565b61153c611f07565b5f60095f8481526020019081526020015f206003015490505f60095f8581526020019081526020015f206009015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f5f5f5f8473ffffffffffffffffffffffffffffffffffffffff166373004ca0876040518263ffffffff1660e01b81526004016115c89190612028565b5f60405180830381865afa1580156115e2573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061160a91906130b8565b505050955095509550955050505f604051806080016040528086815260200185815260200184815260200183815250905080975050505050505050919050565b611652611d02565b61165b5f611e3f565b565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116ce611d02565b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b73430000000000000000000000000000000000000281565b6006602052805f5260405f205f915090505481565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b611770611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663fafce39e308585856040518563ffffffff1660e01b81526004016117c394939291906131ec565b6020604051808303815f875af11580156117df573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118039190612eeb565b50505050565b60038181548110611818575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61184c611d02565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16630951888f3084846040518463ffffffff1660e01b815260040161189d9392919061322f565b6020604051808303815f875af11580156118b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190612eeb565b505050565b5f5f5f5f5f60605f5f600190505b6004548111611bce578873ffffffffffffffffffffffffffffffffffffffff1660095f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561197a57505f60095f8381526020019081526020015f2060050154145b15611bbb575f60095f8381526020019081526020015f20604051806101000160405290815f8201548152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820154815260200160058201548152602001600682016040518060600160405290815f8201548152602001600182018054611a9790612b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac390612b5d565b8015611b0e5780601f10611ae557610100808354040283529160200191611b0e565b820191905f5260205f20905b815481529060010190602001808311611af157829003601f168201915b505050505081526020016002820154815250508152602001600982015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050805f01518160400151826060015183608001518460a001518560c00151602001518660c001516040015198509850985098509850985098505050611c0a565b8080611bc690612ae9565b9150506118f0565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c01906132d4565b60405180910390fd5b919395979092949650565b611c1d611d02565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c8d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611c849190612426565b60405180910390fd5b611c9681611e3f565b50565b600260015403611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd59061333c565b60405180910390fd5b6002600181905550565b5f5f823b90505f8114915050919050565b60018081905550565b611d0a611f00565b73ffffffffffffffffffffffffffffffffffffffff16611d2861169f565b73ffffffffffffffffffffffffffffffffffffffff1614611d8757611d4b611f00565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d7e9190612426565b60405180910390fd5b565b5f818310611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc3906133ca565b60405180910390fd5b5f8486611dd99190613415565b90505f8484611de89190613445565b90505f8882611df79190613050565b90505f838211611e075781611e09565b835b90508094505050505095945050505050565b5f8282611e289190613050565b84611e339190613445565b93508390509392505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b60405180608001604052805f81526020015f81526020015f81526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f6582611f3c565b9050919050565b611f7581611f5b565b8114611f7f575f5ffd5b50565b5f81359050611f9081611f6c565b92915050565b5f819050919050565b611fa881611f96565b8114611fb2575f5ffd5b50565b5f81359050611fc381611f9f565b92915050565b5f5f5f60608486031215611fe057611fdf611f34565b5b5f611fed86828701611f82565b9350506020611ffe86828701611f82565b925050604061200f86828701611fb5565b9150509250925092565b61202281611f96565b82525050565b5f60208201905061203b5f830184612019565b92915050565b5f6020828403121561205657612055611f34565b5b5f61206384828501611f82565b91505092915050565b5f6020828403121561208157612080611f34565b5b5f61208e84828501611fb5565b91505092915050565b6120a081611f5b565b82525050565b6120af81611f96565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6120f7826120b5565b61210181856120bf565b93506121118185602086016120cf565b61211a816120dd565b840191505092915050565b5f606083015f83015161213a5f8601826120a6565b506020830151848203602086015261215282826120ed565b915050604083015161216760408601826120a6565b508091505092915050565b5f610100820190506121865f83018b612019565b612193602083018a612097565b6121a06040830189612097565b6121ad6060830188612019565b6121ba6080830187612019565b6121c760a0830186612019565b81810360c08301526121d98185612125565b90506121e860e0830184612097565b9998505050505050505050565b5f819050919050565b5f61221861221361220e84611f3c565b6121f5565b611f3c565b9050919050565b5f612229826121fe565b9050919050565b5f61223a8261221f565b9050919050565b61224a81612230565b82525050565b5f6020820190506122635f830184612241565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600281106122a7576122a6612269565b5b50565b5f8190506122b782612296565b919050565b5f6122c6826122aa565b9050919050565b6122d6816122bc565b82525050565b5f6080820190506122ef5f830187612019565b6122fc6020830186612019565b6123096040830185612019565b61231660608301846122cd565b95945050505050565b5f8115159050919050565b6123338161231f565b811461233d575f5ffd5b50565b5f8135905061234e8161232a565b92915050565b5f5f6040838503121561236a57612369611f34565b5b5f61237785828601611f82565b925050602061238885828601612340565b9150509250929050565b61239b8161231f565b82525050565b5f6020820190506123b45f830184612392565b92915050565b608082015f8201516123ce5f8501826120a6565b5060208201516123e160208501826120a6565b5060408201516123f460408501826120a6565b50606082015161240760608501826120a6565b50505050565b5f6080820190506124205f8301846123ba565b92915050565b5f6020820190506124395f830184612097565b92915050565b5f6124498261221f565b9050919050565b6124598161243f565b82525050565b5f6020820190506124725f830184612450565b92915050565b5f5f6040838503121561248e5761248d611f34565b5b5f61249b85828601611f82565b92505060206124ac85828601611fb5565b9150509250929050565b5f5f5f606084860312156124cd576124cc611f34565b5b5f6124da86828701611f82565b93505060206124eb86828701611fb5565b92505060406124fc86828701611fb5565b9150509250925092565b5f82825260208201905092915050565b5f612520826120b5565b61252a8185612506565b935061253a8185602086016120cf565b612543816120dd565b840191505092915050565b5f60e0820190506125615f83018a612019565b61256e6020830189612097565b61257b6040830188612019565b6125886060830187612019565b6125956080830186612019565b81810360a08301526125a78185612516565b90506125b660c0830184612019565b98975050505050505050565b7f47616d65206973207061757365640000000000000000000000000000000000005f82015250565b5f6125f6600e83612506565b9150612601826125c2565b602082019050919050565b5f6020820190508181035f830152612623816125ea565b9050919050565b7f4e465420636f6e7472616374206e6f7420617574686f72697a656400000000005f82015250565b5f61265e601b83612506565b91506126698261262a565b602082019050919050565b5f6020820190508181035f83015261268b81612652565b9050919050565b5f815190506126a081611f6c565b92915050565b5f602082840312156126bb576126ba611f34565b5b5f6126c884828501612692565b91505092915050565b7f4e6f7420746865206f776e6572206f6620746865204e465400000000000000005f82015250565b5f612705601883612506565b9150612710826126d1565b602082019050919050565b5f6020820190508181035f830152612732816126f9565b9050919050565b7f48756e7420616c726561647920737461727465640000000000000000000000005f82015250565b5f61276d601483612506565b915061277882612739565b602082019050919050565b5f6020820190508181035f83015261279a81612761565b9050919050565b7f4f6e6c792065787465726e616c6c79206f776e6564206163636f756e747320635f8201527f616e2063616c6c20746869732066756e6374696f6e0000000000000000000000602082015250565b5f6127fb603583612506565b9150612806826127a1565b604082019050919050565b5f6020820190508181035f830152612828816127ef565b9050919050565b7f4e465420697320616c726561647920696e20612068756e7400000000000000005f82015250565b5f612863601883612506565b915061286e8261282f565b602082019050919050565b5f6020820190508181035f83015261289081612857565b9050919050565b5f6040820190506128aa5f830185612019565b6128b76020830184612392565b9392505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128f8826120dd565b810181811067ffffffffffffffff82111715612917576129166128c2565b5b80604052505050565b5f612929611f2b565b905061293582826128ef565b919050565b5f5ffd5b5f8151905061294c81611f9f565b92915050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115612974576129736128c2565b5b61297d826120dd565b9050602081019050919050565b5f61299c6129978461295a565b612920565b9050828152602081018484840111156129b8576129b7612956565b5b6129c38482856120cf565b509392505050565b5f82601f8301126129df576129de612952565b5b81516129ef84826020860161298a565b91505092915050565b5f60608284031215612a0d57612a0c6128be565b5b612a176060612920565b90505f612a268482850161293e565b5f83015250602082015167ffffffffffffffff811115612a4957612a4861293a565b5b612a55848285016129cb565b6020830152506040612a698482850161293e565b60408301525092915050565b5f60208284031215612a8a57612a89611f34565b5b5f82015167ffffffffffffffff811115612aa757612aa6611f38565b5b612ab3848285016129f8565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612af382611f96565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b2557612b24612abc565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612b7457607f821691505b602082108103612b8757612b86612b30565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612be97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612bae565b612bf38683612bae565b95508019841693508086168417925050509392505050565b5f612c25612c20612c1b84611f96565b6121f5565b611f96565b9050919050565b5f819050919050565b612c3e83612c0b565b612c52612c4a82612c2c565b848454612bba565b825550505050565b5f5f905090565b612c69612c5a565b612c74818484612c35565b505050565b5b81811015612c9757612c8c5f82612c61565b600181019050612c7a565b5050565b601f821115612cdc57612cad81612b8d565b612cb684612b9f565b81016020851015612cc5578190505b612cd9612cd185612b9f565b830182612c79565b50505b505050565b5f82821c905092915050565b5f612cfc5f1984600802612ce1565b1980831691505092915050565b5f612d148383612ced565b9150826002028217905092915050565b612d2d826120b5565b67ffffffffffffffff811115612d4657612d456128c2565b5b612d508254612b5d565b612d5b828285612c9b565b5f60209050601f831160018114612d8c575f8415612d7a578287015190505b612d848582612d09565b865550612deb565b601f198416612d9a86612b8d565b5f5b82811015612dc157848901518255600182019150602085019450602081019050612d9c565b86831015612dde5784890151612dda601f891682612ced565b8355505b6001600288020188555050505b505050505050565b5f608082019050612e065f830187612019565b612e136020830186612097565b612e206040830185612097565b8181036060830152612e328184612516565b905095945050505050565b60028110612e49575f5ffd5b50565b5f81519050612e5a81612e3d565b92915050565b5f5f5f5f60808587031215612e7857612e77611f34565b5b5f612e858782880161293e565b9450506020612e968782880161293e565b9350506040612ea78782880161293e565b9250506060612eb887828801612e4c565b91505092959194509250565b5f604082019050612ed75f830185612097565b612ee46020830184612097565b9392505050565b5f60208284031215612f0057612eff611f34565b5b5f612f0d8482850161293e565b91505092915050565b7f4e6f74207468652068756e746572206f6620746869732068756e7400000000005f82015250565b5f612f4a601b83612506565b9150612f5582612f16565b602082019050919050565b5f6020820190508181035f830152612f7781612f3e565b9050919050565b7f48756e7420616c726561647920656e64656400000000000000000000000000005f82015250565b5f612fb2601283612506565b9150612fbd82612f7e565b602082019050919050565b5f6020820190508181035f830152612fdf81612fa6565b9050919050565b5f608082019050612ff95f830187612019565b6130066020830186612019565b6130136040830185612019565b6130206060830184612019565b95945050505050565b5f60408201905061303c5f830185612019565b6130496020830184612019565b9392505050565b5f61305a82611f96565b915061306583611f96565b925082820261307381611f96565b9150828204841483151761308a57613089612abc565b5b5092915050565b5f6040820190506130a45f830185612097565b6130b16020830184612019565b9392505050565b5f5f5f5f5f5f5f5f5f6101208a8c0312156130d6576130d5611f34565b5b5f8a015167ffffffffffffffff8111156130f3576130f2611f38565b5b6130ff8c828d016129cb565b99505060208a015167ffffffffffffffff8111156131205761311f611f38565b5b61312c8c828d016129cb565b985050604061313d8c828d0161293e565b975050606061314e8c828d0161293e565b965050608061315f8c828d0161293e565b95505060a06131708c828d0161293e565b94505060c06131818c828d0161293e565b93505060e08a015167ffffffffffffffff8111156131a2576131a1611f38565b5b6131ae8c828d016129cb565b9250506101008a015167ffffffffffffffff8111156131d0576131cf611f38565b5b6131dc8c828d016129cb565b9150509295985092959850929598565b5f6080820190506131ff5f830187612097565b61320c6020830186612097565b6132196040830185612019565b6132266060830184612019565b95945050505050565b5f6060820190506132425f830186612097565b61324f6020830185612097565b61325c6040830184612019565b949350505050565b7f4e6f206163746976652068756e7420666f756e6420666f7220746869732075735f8201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b5f6132be602283612506565b91506132c982613264565b604082019050919050565b5f6020820190508181035f8301526132eb816132b2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613326601f83612506565b9150613331826132f2565b602082019050919050565b5f6020820190508181035f8301526133538161331a565b9050919050565b7f53746172742074696d65206d757374206265206265666f726520656e642074695f8201527f6d65000000000000000000000000000000000000000000000000000000000000602082015250565b5f6133b4602283612506565b91506133bf8261335a565b604082019050919050565b5f6020820190508181035f8301526133e1816133a8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61341f82611f96565b915061342a83611f96565b92508261343a576134396133e8565b5b828204905092915050565b5f61344f82611f96565b915061345a83611f96565b925082820390508181111561347257613471612abc565b5b9291505056fea26469706673582212204838346044f83b8cfc872767eac7391523e3e21d561d25fd08a6daaf43f80bcc64736f6c634300081c0033
Deployed Bytecode Sourcemap
36086:9768:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42407:1732;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36801:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37042:37;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;38912:75;;;:::i;:::-;;36182:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38695:129;;;:::i;:::-;;36764:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38412:277;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38832:72;;;:::i;:::-;;39957:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37546:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37712:105;;;:::i;:::-;;44147:1704;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40317:762;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9357:103;;;:::i;:::-;;37505:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36911:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8682:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36632:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36857:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36972:61;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38102:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36731:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37823:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38995:954;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;9615:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42407:1732;42544:7;31589:21;:19;:21::i;:::-;42573:6:::1;;;;;;;;;;;42572:7;42564:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;42631:22;:35;42654:11;42631:35;;;;;;;;;;;;;;;;;;;;;;;;;42609:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;42734:19;42772:11;42734:50;;42827:10;42805:32;;:3;:11;;;42817:5;42805:18;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;;42797:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42917:1;42887:14;:26;42902:10;42887:26;;;;;;;;;;;;;;;;:31;42879:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42978:17;42984:10;42978:5;:17::i;:::-;42956:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;43098:9;:22;43108:11;43098:22;;;;;;;;;;;;;;;:29;43121:5;43098:29;;;;;;;;;;;;;;;;;;;;;43097:30;43089:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43169:3;:19;;;43189:5;43196:4;43169:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43214;43266:9;43214:62;;43287:39;43329:15;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43287:71;;43371:9;;:11;;;;;;;;;:::i;:::-;;;;;;43395:19;43417:276;;;;;;;;43441:9;;43417:276;;;;43473:10;43417:276;;;;;;43508:9;43417:276;;;;;;43540:5;43417:276;;;;43571:15;43417:276;;;;43610:1;43417:276;;;;43635:7;43417:276;;;;43670:11;43417:276;;;;::::0;43395:298:::1;;43725:7;43706:5;:16;43712:9;;43706:16;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43770:9;;43743:12;:24;43756:10;43743:24;;;;;;;;;;;;;;;:36;;;;43819:15;43790:14;:26;43805:10;43790:26;;;;;;;;;;;;;;;:44;;;;43879:4;43847:9;:22;43857:11;43847:22;;;;;;;;;;;;;;;:29;43870:5;43847:29;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;44010:5;43984:11;43901:201;;43928:9;;43901:201;43952:7;:17;;;44030:10;44055:9;44079:7;:12;;;43901:201;;;;;;;;;:::i;:::-;;;;;;;;44122:9;;44115:16;;;;;;31633:20:::0;:18;:20::i;:::-;42407:1732;;;;;:::o;36801:49::-;;;;;;;;;;;;;;;;;:::o;37042:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38912:75::-;8568:13;:11;:13::i;:::-;38974:5:::1;38965:6;;:14;;;;;;;;;;;;;;;;;;38912:75::o:0;36182:34::-;;;;;;;;;;;;;:::o;38695:129::-;8568:13;:11;:13::i;:::-;36679:42:::1;38766:35;;;38810:4;38766:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38695:129::o:0;36764:28::-;;;;:::o;38412:277::-;38501:20;38536;38571:19;38605:7;36679:42;38647:19;;;38675:4;38647:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38640:41;;;;;;;;38412:277;;;;:::o;38832:72::-;8568:13;:11;:13::i;:::-;38892:4:::1;38883:6;;:13;;;;;;;;;;;;;;;;;;38832:72::o:0;39957:179::-;8568:13;:11;:13::i;:::-;40118:10:::1;40080:22;:35;40103:11;40080:35;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;39957:179:::0;;:::o;37546:18::-;;;;;;;;;;;;;:::o;37712:105::-;8568:13;:11;:13::i;:::-;36679:42:::1;37765:17;;;37791:4;37798:10;37765:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37712:105::o:0;44147:1704::-;31589:21;:19;:21::i;:::-;44257:10:::1;44233:34;;:5;:13;44239:6;44233:13;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;44211:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44370:1;44345:5;:13;44351:6;44345:13;;;;;;;;;;;:21;;;:26;44337:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44431:15;44407:5;:13;44413:6;44407:13;;;;;;;;;;;:21;;:39;;;;44486:1;44457:14;:26;44472:10;44457:26;;;;;;;;;;;;;;;:30;;;;44525:1;44498:12;:24;44511:10;44498:24;;;;;;;;;;;;;;;:28;;;;44539:20;44562:5;:13;44568:6;44562:13;;;;;;;;;;;:25;;;;;;;;;;;;44539:48;;44600:19;44638:12;44600:51;;44664:30;44697:22;44712:6;44697:14;:22::i;:::-;44664:55;;44732:27;44762:228;44802:11;:23;;;44840:11;:22;;;44877:11;:28;;;44920:5;:13;44926:6;44920:13;;;;;;;;;;;:23;;;44958:5;:13;44964:6;44958:13;;;;;;;;;;;:21;;;44762:25;:228::i;:::-;44732:258;;45003:25;45031:156;45077:11;:22;;;45114:11;:28;;;45157:19;45031:31;:156::i;:::-;45003:184;;45235:6;45213:179;45256:5;:13;45262:6;45256:13;;;;;;;;;;;:23;;;45294:5;:13;45300:6;45294:13;;;;;;;;;;;:21;;;45330:19;45364:17;45213:179;;;;;;;;;:::i;:::-;;;;;;;;45405:3;:20;;;45426:5;:13;45432:6;45426:13;;;;;;;;;;;:20;;;45448:17;45405:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45479:3;:19;;;45499:5;:13;45505:6;45499:13;;;;;;;;;;;:20;;;45521:5;45479:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45588:5;45540:9;:23;45550:12;45540:23;;;;;;;;;;;;;;;:45;45564:5;:13;45570:6;45564:13;;;;;;;;;;;:20;;;45540:45;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45606:33;45673:19;;;;;;;;;;;45606:97;;45716:16;:36;;;45767:10;45814:11;:18;;;45792:19;:40;;;;:::i;:::-;45716:127;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44200:1651;;;;;;31633:20:::0;:18;:20::i;:::-;44147:1704;:::o;40317:762::-;40405:18;;:::i;:::-;40441:21;40465:5;:13;40471:6;40465:13;;;;;;;;;;;:20;;;40441:44;;40496:19;40534:5;:13;40540:6;40534:13;;;;;;;;;;;:25;;;;;;;;;;;;40496:64;;40616:14;40645:19;40679:18;40712:24;40783:3;:18;;;40802:13;40783:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40571:245;;;;;;;;;;;;;40829:30;40862:178;;;;;;;;40897:6;40862:178;;;;40931:11;40862:178;;;;40969:10;40862:178;;;;41012:16;40862:178;;;40829:211;;41060:11;41053:18;;;;;;;;;40317:762;;;:::o;9357:103::-;8568:13;:11;:13::i;:::-;9422:30:::1;9449:1;9422:18;:30::i;:::-;9357:103::o:0;37505:34::-;;;;;;;;;;;;;:::o;36911:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;8682:87::-;8728:7;8755:6;;;;;;;;;;;8748:13;;8682:87;:::o;40144:165::-;8568:13;:11;:13::i;:::-;40281:20:::1;40259:19;;:42;;;;;;;;;;;;;;;;;;40144:165:::0;:::o;36632:90::-;36679:42;36632:90;:::o;36857:47::-;;;;;;;;;;;;;;;;;:::o;36972:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38102:304::-;8568:13;:11;:13::i;:::-;36679:42:::1;38257:14;;;38294:4;38314:14;38343:10;38368:19;38257:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38102:304:::0;;;:::o;36731:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37823:272::-;8568:13;:11;:13::i;:::-;36679:42:::1;37960:28;;;38011:4;38031:14;38060:16;37960:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37823:272:::0;;:::o;38995:954::-;39108:14;39137:16;39168:14;39197:17;39229:15;39259:25;39299:21;39353:9;39365:1;39353:13;;39348:537;39373:9;;39368:1;:14;39348:537;;39427:11;39408:30;;:5;:8;39414:1;39408:8;;;;;;;;;;;:15;;;;;;;;;;;;:30;;;:55;;;;;39462:1;39442:5;:8;39448:1;39442:8;;;;;;;;;;;:16;;;:21;39408:55;39404:470;;;39484:22;39509:5;:8;39515:1;39509:8;;;;;;;;;;;39484:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39566:10;:13;;;39602:10;:19;;;39644:10;:17;;;39684:10;:20;;;39727:10;:18;;;39768:10;:18;;;:23;;;39814:10;:18;;;:25;;;39536:322;;;;;;;;;;;;;;;;;;39404:470;39384:3;;;;;:::i;:::-;;;;39348:537;;;;39897:44;;;;;;;;;;:::i;:::-;;;;;;;;38995:954;;;;;;;;;;:::o;9615:220::-;8568:13;:11;:13::i;:::-;9720:1:::1;9700:22;;:8;:22;;::::0;9696:93:::1;;9774:1;9746:31;;;;;;;;;;;:::i;:::-;;;;;;;;9696:93;9799:28;9818:8;9799:18;:28::i;:::-;9615:220:::0;:::o;31669:293::-;31071:1;31803:7;;:19;31795:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31071:1;31936:7;:18;;;;31669:293::o;42205:194::-;42261:4;42278:12;42345:8;42333:21;42325:29;;42390:1;42382:4;:9;42375:16;;;42205:194;;;:::o;31970:213::-;31027:1;32153:7;:22;;;;31970:213::o;8847:166::-;8918:12;:10;:12::i;:::-;8907:23;;:7;:5;:7::i;:::-;:23;;;8903:103;;8981:12;:10;:12::i;:::-;8954:40;;;;;;;;;;;:::i;:::-;;;;;;;;8903:103;8847:166::o;41132:729::-;41345:7;41385;41373:9;:19;41365:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41444:26;41486:16;41473:10;:29;;;;:::i;:::-;41444:58;;41513:16;41543:9;41533:7;:19;;;;:::i;:::-;41513:40;;41564:26;41605:11;41594:8;:22;;;;:::i;:::-;41564:53;;41677:26;41727:18;41706;:39;:107;;41795:18;41706:107;;;41761:18;41706:107;41677:136;;41834:18;41826:27;;;;;;41132:729;;;;;;;:::o;41916:281::-;42088:7;42143:16;42122:18;:37;;;;:::i;:::-;42108:51;;;;;:::i;:::-;;;42178:10;42170:19;;41916:281;;;;;:::o;9995:191::-;10069:16;10088:6;;;;;;;;;;;10069:25;;10114:8;10105:6;;:17;;;;;;;;;;;;;;;;;;10169:8;10138:40;;10159:8;10138:40;;;;;;;;;;;;10058:128;9995:191;:::o;6691:98::-;6744:7;6771:10;6764:17;;6691:98;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:619::-;1274:6;1282;1290;1339:2;1327:9;1318:7;1314:23;1310:32;1307:119;;;1345:79;;:::i;:::-;1307:119;1465:1;1490:53;1535:7;1526:6;1515:9;1511:22;1490:53;:::i;:::-;1480:63;;1436:117;1592:2;1618:53;1663:7;1654:6;1643:9;1639:22;1618:53;:::i;:::-;1608:63;;1563:118;1720:2;1746:53;1791:7;1782:6;1771:9;1767:22;1746:53;:::i;:::-;1736:63;;1691:118;1197:619;;;;;:::o;1822:118::-;1909:24;1927:5;1909:24;:::i;:::-;1904:3;1897:37;1822:118;;:::o;1946:222::-;2039:4;2077:2;2066:9;2062:18;2054:26;;2090:71;2158:1;2147:9;2143:17;2134:6;2090:71;:::i;:::-;1946:222;;;;:::o;2174:329::-;2233:6;2282:2;2270:9;2261:7;2257:23;2253:32;2250:119;;;2288:79;;:::i;:::-;2250:119;2408:1;2433:53;2478:7;2469:6;2458:9;2454:22;2433:53;:::i;:::-;2423:63;;2379:117;2174:329;;;;:::o;2509:::-;2568:6;2617:2;2605:9;2596:7;2592:23;2588:32;2585:119;;;2623:79;;:::i;:::-;2585:119;2743:1;2768:53;2813:7;2804:6;2793:9;2789:22;2768:53;:::i;:::-;2758:63;;2714:117;2509:329;;;;:::o;2844:118::-;2931:24;2949:5;2931:24;:::i;:::-;2926:3;2919:37;2844:118;;:::o;2968:108::-;3045:24;3063:5;3045:24;:::i;:::-;3040:3;3033:37;2968:108;;:::o;3082:99::-;3134:6;3168:5;3162:12;3152:22;;3082:99;;;:::o;3187:159::-;3261:11;3295:6;3290:3;3283:19;3335:4;3330:3;3326:14;3311:29;;3187:159;;;;:::o;3352:139::-;3441:6;3436:3;3431;3425:23;3482:1;3473:6;3468:3;3464:16;3457:27;3352:139;;;:::o;3497:102::-;3538:6;3589:2;3585:7;3580:2;3573:5;3569:14;3565:28;3555:38;;3497:102;;;:::o;3605:357::-;3683:3;3711:39;3744:5;3711:39;:::i;:::-;3766:61;3820:6;3815:3;3766:61;:::i;:::-;3759:68;;3836:65;3894:6;3889:3;3882:4;3875:5;3871:16;3836:65;:::i;:::-;3926:29;3948:6;3926:29;:::i;:::-;3921:3;3917:39;3910:46;;3687:275;3605:357;;;;:::o;4042:780::-;4161:3;4197:4;4192:3;4188:14;4282:4;4275:5;4271:16;4265:23;4301:63;4358:4;4353:3;4349:14;4335:12;4301:63;:::i;:::-;4212:162;4456:4;4449:5;4445:16;4439:23;4509:3;4503:4;4499:14;4492:4;4487:3;4483:14;4476:38;4535:73;4603:4;4589:12;4535:73;:::i;:::-;4527:81;;4384:235;4703:4;4696:5;4692:16;4686:23;4722:63;4779:4;4774:3;4770:14;4756:12;4722:63;:::i;:::-;4629:166;4812:4;4805:11;;4166:656;4042:780;;;;:::o;4828:1148::-;5167:4;5205:3;5194:9;5190:19;5182:27;;5219:71;5287:1;5276:9;5272:17;5263:6;5219:71;:::i;:::-;5300:72;5368:2;5357:9;5353:18;5344:6;5300:72;:::i;:::-;5382;5450:2;5439:9;5435:18;5426:6;5382:72;:::i;:::-;5464;5532:2;5521:9;5517:18;5508:6;5464:72;:::i;:::-;5546:73;5614:3;5603:9;5599:19;5590:6;5546:73;:::i;:::-;5629;5697:3;5686:9;5682:19;5673:6;5629:73;:::i;:::-;5750:9;5744:4;5740:20;5734:3;5723:9;5719:19;5712:49;5778:108;5881:4;5872:6;5778:108;:::i;:::-;5770:116;;5896:73;5964:3;5953:9;5949:19;5940:6;5896:73;:::i;:::-;4828:1148;;;;;;;;;;;:::o;5982:60::-;6010:3;6031:5;6024:12;;5982:60;;;:::o;6048:142::-;6098:9;6131:53;6149:34;6158:24;6176:5;6158:24;:::i;:::-;6149:34;:::i;:::-;6131:53;:::i;:::-;6118:66;;6048:142;;;:::o;6196:126::-;6246:9;6279:37;6310:5;6279:37;:::i;:::-;6266:50;;6196:126;;;:::o;6328:150::-;6402:9;6435:37;6466:5;6435:37;:::i;:::-;6422:50;;6328:150;;;:::o;6484:179::-;6595:61;6650:5;6595:61;:::i;:::-;6590:3;6583:74;6484:179;;:::o;6669:270::-;6786:4;6824:2;6813:9;6809:18;6801:26;;6837:95;6929:1;6918:9;6914:17;6905:6;6837:95;:::i;:::-;6669:270;;;;:::o;6945:180::-;6993:77;6990:1;6983:88;7090:4;7087:1;7080:15;7114:4;7111:1;7104:15;7131:117;7216:1;7209:5;7206:12;7196:46;;7222:18;;:::i;:::-;7196:46;7131:117;:::o;7254:135::-;7303:7;7332:5;7321:16;;7338:45;7377:5;7338:45;:::i;:::-;7254:135;;;:::o;7395:::-;7455:9;7488:36;7518:5;7488:36;:::i;:::-;7475:49;;7395:135;;;:::o;7536:151::-;7633:47;7674:5;7633:47;:::i;:::-;7628:3;7621:60;7536:151;;:::o;7693:573::-;7880:4;7918:3;7907:9;7903:19;7895:27;;7932:71;8000:1;7989:9;7985:17;7976:6;7932:71;:::i;:::-;8013:72;8081:2;8070:9;8066:18;8057:6;8013:72;:::i;:::-;8095;8163:2;8152:9;8148:18;8139:6;8095:72;:::i;:::-;8177:82;8255:2;8244:9;8240:18;8231:6;8177:82;:::i;:::-;7693:573;;;;;;;:::o;8272:90::-;8306:7;8349:5;8342:13;8335:21;8324:32;;8272:90;;;:::o;8368:116::-;8438:21;8453:5;8438:21;:::i;:::-;8431:5;8428:32;8418:60;;8474:1;8471;8464:12;8418:60;8368:116;:::o;8490:133::-;8533:5;8571:6;8558:20;8549:29;;8587:30;8611:5;8587:30;:::i;:::-;8490:133;;;;:::o;8629:468::-;8694:6;8702;8751:2;8739:9;8730:7;8726:23;8722:32;8719:119;;;8757:79;;:::i;:::-;8719:119;8877:1;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8848:117;9004:2;9030:50;9072:7;9063:6;9052:9;9048:22;9030:50;:::i;:::-;9020:60;;8975:115;8629:468;;;;;:::o;9103:109::-;9184:21;9199:5;9184:21;:::i;:::-;9179:3;9172:34;9103:109;;:::o;9218:210::-;9305:4;9343:2;9332:9;9328:18;9320:26;;9356:65;9418:1;9407:9;9403:17;9394:6;9356:65;:::i;:::-;9218:210;;;;:::o;9516:890::-;9671:4;9666:3;9662:14;9760:4;9753:5;9749:16;9743:23;9779:63;9836:4;9831:3;9827:14;9813:12;9779:63;:::i;:::-;9686:166;9941:4;9934:5;9930:16;9924:23;9960:63;10017:4;10012:3;10008:14;9994:12;9960:63;:::i;:::-;9862:171;10121:4;10114:5;10110:16;10104:23;10140:63;10197:4;10192:3;10188:14;10174:12;10140:63;:::i;:::-;10043:170;10307:4;10300:5;10296:16;10290:23;10326:63;10383:4;10378:3;10374:14;10360:12;10326:63;:::i;:::-;10223:176;9640:766;9516:890;;:::o;10412:339::-;10563:4;10601:3;10590:9;10586:19;10578:27;;10615:129;10741:1;10730:9;10726:17;10717:6;10615:129;:::i;:::-;10412:339;;;;:::o;10757:222::-;10850:4;10888:2;10877:9;10873:18;10865:26;;10901:71;10969:1;10958:9;10954:17;10945:6;10901:71;:::i;:::-;10757:222;;;;:::o;10985:141::-;11050:9;11083:37;11114:5;11083:37;:::i;:::-;11070:50;;10985:141;;;:::o;11132:161::-;11234:52;11280:5;11234:52;:::i;:::-;11229:3;11222:65;11132:161;;:::o;11299:252::-;11407:4;11445:2;11434:9;11430:18;11422:26;;11458:86;11541:1;11530:9;11526:17;11517:6;11458:86;:::i;:::-;11299:252;;;;:::o;11557:474::-;11625:6;11633;11682:2;11670:9;11661:7;11657:23;11653:32;11650:119;;;11688:79;;:::i;:::-;11650:119;11808:1;11833:53;11878:7;11869:6;11858:9;11854:22;11833:53;:::i;:::-;11823:63;;11779:117;11935:2;11961:53;12006:7;11997:6;11986:9;11982:22;11961:53;:::i;:::-;11951:63;;11906:118;11557:474;;;;;:::o;12037:619::-;12114:6;12122;12130;12179:2;12167:9;12158:7;12154:23;12150:32;12147:119;;;12185:79;;:::i;:::-;12147:119;12305:1;12330:53;12375:7;12366:6;12355:9;12351:22;12330:53;:::i;:::-;12320:63;;12276:117;12432:2;12458:53;12503:7;12494:6;12483:9;12479:22;12458:53;:::i;:::-;12448:63;;12403:118;12560:2;12586:53;12631:7;12622:6;12611:9;12607:22;12586:53;:::i;:::-;12576:63;;12531:118;12037:619;;;;;:::o;12662:169::-;12746:11;12780:6;12775:3;12768:19;12820:4;12815:3;12811:14;12796:29;;12662:169;;;;:::o;12837:377::-;12925:3;12953:39;12986:5;12953:39;:::i;:::-;13008:71;13072:6;13067:3;13008:71;:::i;:::-;13001:78;;13088:65;13146:6;13141:3;13134:4;13127:5;13123:16;13088:65;:::i;:::-;13178:29;13200:6;13178:29;:::i;:::-;13173:3;13169:39;13162:46;;12929:285;12837:377;;;;:::o;13220:977::-;13501:4;13539:3;13528:9;13524:19;13516:27;;13553:71;13621:1;13610:9;13606:17;13597:6;13553:71;:::i;:::-;13634:72;13702:2;13691:9;13687:18;13678:6;13634:72;:::i;:::-;13716;13784:2;13773:9;13769:18;13760:6;13716:72;:::i;:::-;13798;13866:2;13855:9;13851:18;13842:6;13798:72;:::i;:::-;13880:73;13948:3;13937:9;13933:19;13924:6;13880:73;:::i;:::-;14001:9;13995:4;13991:20;13985:3;13974:9;13970:19;13963:49;14029:78;14102:4;14093:6;14029:78;:::i;:::-;14021:86;;14117:73;14185:3;14174:9;14170:19;14161:6;14117:73;:::i;:::-;13220:977;;;;;;;;;;:::o;14203:164::-;14343:16;14339:1;14331:6;14327:14;14320:40;14203:164;:::o;14373:366::-;14515:3;14536:67;14600:2;14595:3;14536:67;:::i;:::-;14529:74;;14612:93;14701:3;14612:93;:::i;:::-;14730:2;14725:3;14721:12;14714:19;;14373:366;;;:::o;14745:419::-;14911:4;14949:2;14938:9;14934:18;14926:26;;14998:9;14992:4;14988:20;14984:1;14973:9;14969:17;14962:47;15026:131;15152:4;15026:131;:::i;:::-;15018:139;;14745:419;;;:::o;15170:177::-;15310:29;15306:1;15298:6;15294:14;15287:53;15170:177;:::o;15353:366::-;15495:3;15516:67;15580:2;15575:3;15516:67;:::i;:::-;15509:74;;15592:93;15681:3;15592:93;:::i;:::-;15710:2;15705:3;15701:12;15694:19;;15353:366;;;:::o;15725:419::-;15891:4;15929:2;15918:9;15914:18;15906:26;;15978:9;15972:4;15968:20;15964:1;15953:9;15949:17;15942:47;16006:131;16132:4;16006:131;:::i;:::-;15998:139;;15725:419;;;:::o;16150:143::-;16207:5;16238:6;16232:13;16223:22;;16254:33;16281:5;16254:33;:::i;:::-;16150:143;;;;:::o;16299:351::-;16369:6;16418:2;16406:9;16397:7;16393:23;16389:32;16386:119;;;16424:79;;:::i;:::-;16386:119;16544:1;16569:64;16625:7;16616:6;16605:9;16601:22;16569:64;:::i;:::-;16559:74;;16515:128;16299:351;;;;:::o;16656:174::-;16796:26;16792:1;16784:6;16780:14;16773:50;16656:174;:::o;16836:366::-;16978:3;16999:67;17063:2;17058:3;16999:67;:::i;:::-;16992:74;;17075:93;17164:3;17075:93;:::i;:::-;17193:2;17188:3;17184:12;17177:19;;16836:366;;;:::o;17208:419::-;17374:4;17412:2;17401:9;17397:18;17389:26;;17461:9;17455:4;17451:20;17447:1;17436:9;17432:17;17425:47;17489:131;17615:4;17489:131;:::i;:::-;17481:139;;17208:419;;;:::o;17633:170::-;17773:22;17769:1;17761:6;17757:14;17750:46;17633:170;:::o;17809:366::-;17951:3;17972:67;18036:2;18031:3;17972:67;:::i;:::-;17965:74;;18048:93;18137:3;18048:93;:::i;:::-;18166:2;18161:3;18157:12;18150:19;;17809:366;;;:::o;18181:419::-;18347:4;18385:2;18374:9;18370:18;18362:26;;18434:9;18428:4;18424:20;18420:1;18409:9;18405:17;18398:47;18462:131;18588:4;18462:131;:::i;:::-;18454:139;;18181:419;;;:::o;18606:240::-;18746:34;18742:1;18734:6;18730:14;18723:58;18815:23;18810:2;18802:6;18798:15;18791:48;18606:240;:::o;18852:366::-;18994:3;19015:67;19079:2;19074:3;19015:67;:::i;:::-;19008:74;;19091:93;19180:3;19091:93;:::i;:::-;19209:2;19204:3;19200:12;19193:19;;18852:366;;;:::o;19224:419::-;19390:4;19428:2;19417:9;19413:18;19405:26;;19477:9;19471:4;19467:20;19463:1;19452:9;19448:17;19441:47;19505:131;19631:4;19505:131;:::i;:::-;19497:139;;19224:419;;;:::o;19649:174::-;19789:26;19785:1;19777:6;19773:14;19766:50;19649:174;:::o;19829:366::-;19971:3;19992:67;20056:2;20051:3;19992:67;:::i;:::-;19985:74;;20068:93;20157:3;20068:93;:::i;:::-;20186:2;20181:3;20177:12;20170:19;;19829:366;;;:::o;20201:419::-;20367:4;20405:2;20394:9;20390:18;20382:26;;20454:9;20448:4;20444:20;20440:1;20429:9;20425:17;20418:47;20482:131;20608:4;20482:131;:::i;:::-;20474:139;;20201:419;;;:::o;20626:320::-;20741:4;20779:2;20768:9;20764:18;20756:26;;20792:71;20860:1;20849:9;20845:17;20836:6;20792:71;:::i;:::-;20873:66;20935:2;20924:9;20920:18;20911:6;20873:66;:::i;:::-;20626:320;;;;;:::o;20952:117::-;21061:1;21058;21051:12;21075:180;21123:77;21120:1;21113:88;21220:4;21217:1;21210:15;21244:4;21241:1;21234:15;21261:281;21344:27;21366:4;21344:27;:::i;:::-;21336:6;21332:40;21474:6;21462:10;21459:22;21438:18;21426:10;21423:34;21420:62;21417:88;;;21485:18;;:::i;:::-;21417:88;21525:10;21521:2;21514:22;21304:238;21261:281;;:::o;21548:129::-;21582:6;21609:20;;:::i;:::-;21599:30;;21638:33;21666:4;21658:6;21638:33;:::i;:::-;21548:129;;;:::o;21683:117::-;21792:1;21789;21782:12;21806:143;21863:5;21894:6;21888:13;21879:22;;21910:33;21937:5;21910:33;:::i;:::-;21806:143;;;;:::o;21955:117::-;22064:1;22061;22054:12;22078:117;22187:1;22184;22177:12;22201:308;22263:4;22353:18;22345:6;22342:30;22339:56;;;22375:18;;:::i;:::-;22339:56;22413:29;22435:6;22413:29;:::i;:::-;22405:37;;22497:4;22491;22487:15;22479:23;;22201:308;;;:::o;22515:434::-;22604:5;22629:66;22645:49;22687:6;22645:49;:::i;:::-;22629:66;:::i;:::-;22620:75;;22718:6;22711:5;22704:21;22756:4;22749:5;22745:16;22794:3;22785:6;22780:3;22776:16;22773:25;22770:112;;;22801:79;;:::i;:::-;22770:112;22891:52;22936:6;22931:3;22926;22891:52;:::i;:::-;22610:339;22515:434;;;;;:::o;22969:355::-;23036:5;23085:3;23078:4;23070:6;23066:17;23062:27;23052:122;;23093:79;;:::i;:::-;23052:122;23203:6;23197:13;23228:90;23314:3;23306:6;23299:4;23291:6;23287:17;23228:90;:::i;:::-;23219:99;;23042:282;22969:355;;;;:::o;23369:942::-;23454:5;23498:4;23486:9;23481:3;23477:19;23473:30;23470:117;;;23506:79;;:::i;:::-;23470:117;23605:21;23621:4;23605:21;:::i;:::-;23596:30;;23683:1;23723:60;23779:3;23770:6;23759:9;23755:22;23723:60;:::i;:::-;23716:4;23709:5;23705:16;23698:86;23636:159;23875:2;23864:9;23860:18;23854:25;23906:18;23898:6;23895:30;23892:117;;;23928:79;;:::i;:::-;23892:117;24048:70;24114:3;24105:6;24094:9;24090:22;24048:70;:::i;:::-;24041:4;24034:5;24030:16;24023:96;23805:325;24191:2;24232:60;24288:3;24279:6;24268:9;24264:22;24232:60;:::i;:::-;24225:4;24218:5;24214:16;24207:86;24140:164;23369:942;;;;:::o;24317:554::-;24412:6;24461:2;24449:9;24440:7;24436:23;24432:32;24429:119;;;24467:79;;:::i;:::-;24429:119;24608:1;24597:9;24593:17;24587:24;24638:18;24630:6;24627:30;24624:117;;;24660:79;;:::i;:::-;24624:117;24765:89;24846:7;24837:6;24826:9;24822:22;24765:89;:::i;:::-;24755:99;;24558:306;24317:554;;;;:::o;24877:180::-;24925:77;24922:1;24915:88;25022:4;25019:1;25012:15;25046:4;25043:1;25036:15;25063:233;25102:3;25125:24;25143:5;25125:24;:::i;:::-;25116:33;;25171:66;25164:5;25161:77;25158:103;;25241:18;;:::i;:::-;25158:103;25288:1;25281:5;25277:13;25270:20;;25063:233;;;:::o;25302:180::-;25350:77;25347:1;25340:88;25447:4;25444:1;25437:15;25471:4;25468:1;25461:15;25488:320;25532:6;25569:1;25563:4;25559:12;25549:22;;25616:1;25610:4;25606:12;25637:18;25627:81;;25693:4;25685:6;25681:17;25671:27;;25627:81;25755:2;25747:6;25744:14;25724:18;25721:38;25718:84;;25774:18;;:::i;:::-;25718:84;25539:269;25488:320;;;:::o;25814:141::-;25863:4;25886:3;25878:11;;25909:3;25906:1;25899:14;25943:4;25940:1;25930:18;25922:26;;25814:141;;;:::o;25961:93::-;25998:6;26045:2;26040;26033:5;26029:14;26025:23;26015:33;;25961:93;;;:::o;26060:107::-;26104:8;26154:5;26148:4;26144:16;26123:37;;26060:107;;;;:::o;26173:393::-;26242:6;26292:1;26280:10;26276:18;26315:97;26345:66;26334:9;26315:97;:::i;:::-;26433:39;26463:8;26452:9;26433:39;:::i;:::-;26421:51;;26505:4;26501:9;26494:5;26490:21;26481:30;;26554:4;26544:8;26540:19;26533:5;26530:30;26520:40;;26249:317;;26173:393;;;;;:::o;26572:142::-;26622:9;26655:53;26673:34;26682:24;26700:5;26682:24;:::i;:::-;26673:34;:::i;:::-;26655:53;:::i;:::-;26642:66;;26572:142;;;:::o;26720:75::-;26763:3;26784:5;26777:12;;26720:75;;;:::o;26801:269::-;26911:39;26942:7;26911:39;:::i;:::-;26972:91;27021:41;27045:16;27021:41;:::i;:::-;27013:6;27006:4;27000:11;26972:91;:::i;:::-;26966:4;26959:105;26877:193;26801:269;;;:::o;27076:73::-;27121:3;27142:1;27135:8;;27076:73;:::o;27155:189::-;27232:32;;:::i;:::-;27273:65;27331:6;27323;27317:4;27273:65;:::i;:::-;27208:136;27155:189;;:::o;27350:186::-;27410:120;27427:3;27420:5;27417:14;27410:120;;;27481:39;27518:1;27511:5;27481:39;:::i;:::-;27454:1;27447:5;27443:13;27434:22;;27410:120;;;27350:186;;:::o;27542:543::-;27643:2;27638:3;27635:11;27632:446;;;27677:38;27709:5;27677:38;:::i;:::-;27761:29;27779:10;27761:29;:::i;:::-;27751:8;27747:44;27944:2;27932:10;27929:18;27926:49;;;27965:8;27950:23;;27926:49;27988:80;28044:22;28062:3;28044:22;:::i;:::-;28034:8;28030:37;28017:11;27988:80;:::i;:::-;27647:431;;27632:446;27542:543;;;:::o;28091:117::-;28145:8;28195:5;28189:4;28185:16;28164:37;;28091:117;;;;:::o;28214:169::-;28258:6;28291:51;28339:1;28335:6;28327:5;28324:1;28320:13;28291:51;:::i;:::-;28287:56;28372:4;28366;28362:15;28352:25;;28265:118;28214:169;;;;:::o;28388:295::-;28464:4;28610:29;28635:3;28629:4;28610:29;:::i;:::-;28602:37;;28672:3;28669:1;28665:11;28659:4;28656:21;28648:29;;28388:295;;;;:::o;28688:1395::-;28805:37;28838:3;28805:37;:::i;:::-;28907:18;28899:6;28896:30;28893:56;;;28929:18;;:::i;:::-;28893:56;28973:38;29005:4;28999:11;28973:38;:::i;:::-;29058:67;29118:6;29110;29104:4;29058:67;:::i;:::-;29152:1;29176:4;29163:17;;29208:2;29200:6;29197:14;29225:1;29220:618;;;;29882:1;29899:6;29896:77;;;29948:9;29943:3;29939:19;29933:26;29924:35;;29896:77;29999:67;30059:6;30052:5;29999:67;:::i;:::-;29993:4;29986:81;29855:222;29190:887;;29220:618;29272:4;29268:9;29260:6;29256:22;29306:37;29338:4;29306:37;:::i;:::-;29365:1;29379:208;29393:7;29390:1;29387:14;29379:208;;;29472:9;29467:3;29463:19;29457:26;29449:6;29442:42;29523:1;29515:6;29511:14;29501:24;;29570:2;29559:9;29555:18;29542:31;;29416:4;29413:1;29409:12;29404:17;;29379:208;;;29615:6;29606:7;29603:19;29600:179;;;29673:9;29668:3;29664:19;29658:26;29716:48;29758:4;29750:6;29746:17;29735:9;29716:48;:::i;:::-;29708:6;29701:64;29623:156;29600:179;29825:1;29821;29813:6;29809:14;29805:22;29799:4;29792:36;29227:611;;;29190:887;;28780:1303;;;28688:1395;;:::o;30089:644::-;30286:4;30324:3;30313:9;30309:19;30301:27;;30338:71;30406:1;30395:9;30391:17;30382:6;30338:71;:::i;:::-;30419:72;30487:2;30476:9;30472:18;30463:6;30419:72;:::i;:::-;30501;30569:2;30558:9;30554:18;30545:6;30501:72;:::i;:::-;30620:9;30614:4;30610:20;30605:2;30594:9;30590:18;30583:48;30648:78;30721:4;30712:6;30648:78;:::i;:::-;30640:86;;30089:644;;;;;;;:::o;30739:111::-;30824:1;30817:5;30814:12;30804:40;;30840:1;30837;30830:12;30804:40;30739:111;:::o;30856:167::-;30925:5;30956:6;30950:13;30941:22;;30972:45;31011:5;30972:45;:::i;:::-;30856:167;;;;:::o;31029:844::-;31138:6;31146;31154;31162;31211:3;31199:9;31190:7;31186:23;31182:33;31179:120;;;31218:79;;:::i;:::-;31179:120;31338:1;31363:64;31419:7;31410:6;31399:9;31395:22;31363:64;:::i;:::-;31353:74;;31309:128;31476:2;31502:64;31558:7;31549:6;31538:9;31534:22;31502:64;:::i;:::-;31492:74;;31447:129;31615:2;31641:64;31697:7;31688:6;31677:9;31673:22;31641:64;:::i;:::-;31631:74;;31586:129;31754:2;31780:76;31848:7;31839:6;31828:9;31824:22;31780:76;:::i;:::-;31770:86;;31725:141;31029:844;;;;;;;:::o;31879:332::-;32000:4;32038:2;32027:9;32023:18;32015:26;;32051:71;32119:1;32108:9;32104:17;32095:6;32051:71;:::i;:::-;32132:72;32200:2;32189:9;32185:18;32176:6;32132:72;:::i;:::-;31879:332;;;;;:::o;32217:351::-;32287:6;32336:2;32324:9;32315:7;32311:23;32307:32;32304:119;;;32342:79;;:::i;:::-;32304:119;32462:1;32487:64;32543:7;32534:6;32523:9;32519:22;32487:64;:::i;:::-;32477:74;;32433:128;32217:351;;;;:::o;32574:177::-;32714:29;32710:1;32702:6;32698:14;32691:53;32574:177;:::o;32757:366::-;32899:3;32920:67;32984:2;32979:3;32920:67;:::i;:::-;32913:74;;32996:93;33085:3;32996:93;:::i;:::-;33114:2;33109:3;33105:12;33098:19;;32757:366;;;:::o;33129:419::-;33295:4;33333:2;33322:9;33318:18;33310:26;;33382:9;33376:4;33372:20;33368:1;33357:9;33353:17;33346:47;33410:131;33536:4;33410:131;:::i;:::-;33402:139;;33129:419;;;:::o;33554:168::-;33694:20;33690:1;33682:6;33678:14;33671:44;33554:168;:::o;33728:366::-;33870:3;33891:67;33955:2;33950:3;33891:67;:::i;:::-;33884:74;;33967:93;34056:3;33967:93;:::i;:::-;34085:2;34080:3;34076:12;34069:19;;33728:366;;;:::o;34100:419::-;34266:4;34304:2;34293:9;34289:18;34281:26;;34353:9;34347:4;34343:20;34339:1;34328:9;34324:17;34317:47;34381:131;34507:4;34381:131;:::i;:::-;34373:139;;34100:419;;;:::o;34525:553::-;34702:4;34740:3;34729:9;34725:19;34717:27;;34754:71;34822:1;34811:9;34807:17;34798:6;34754:71;:::i;:::-;34835:72;34903:2;34892:9;34888:18;34879:6;34835:72;:::i;:::-;34917;34985:2;34974:9;34970:18;34961:6;34917:72;:::i;:::-;34999;35067:2;35056:9;35052:18;35043:6;34999:72;:::i;:::-;34525:553;;;;;;;:::o;35084:332::-;35205:4;35243:2;35232:9;35228:18;35220:26;;35256:71;35324:1;35313:9;35309:17;35300:6;35256:71;:::i;:::-;35337:72;35405:2;35394:9;35390:18;35381:6;35337:72;:::i;:::-;35084:332;;;;;:::o;35422:410::-;35462:7;35485:20;35503:1;35485:20;:::i;:::-;35480:25;;35519:20;35537:1;35519:20;:::i;:::-;35514:25;;35574:1;35571;35567:9;35596:30;35614:11;35596:30;:::i;:::-;35585:41;;35775:1;35766:7;35762:15;35759:1;35756:22;35736:1;35729:9;35709:83;35686:139;;35805:18;;:::i;:::-;35686:139;35470:362;35422:410;;;;:::o;35838:332::-;35959:4;35997:2;35986:9;35982:18;35974:26;;36010:71;36078:1;36067:9;36063:17;36054:6;36010:71;:::i;:::-;36091:72;36159:2;36148:9;36144:18;36135:6;36091:72;:::i;:::-;35838:332;;;;;:::o;36176:2297::-;36358:6;36366;36374;36382;36390;36398;36406;36414;36422;36471:3;36459:9;36450:7;36446:23;36442:33;36439:120;;;36478:79;;:::i;:::-;36439:120;36619:1;36608:9;36604:17;36598:24;36649:18;36641:6;36638:30;36635:117;;;36671:79;;:::i;:::-;36635:117;36776:74;36842:7;36833:6;36822:9;36818:22;36776:74;:::i;:::-;36766:84;;36569:291;36920:2;36909:9;36905:18;36899:25;36951:18;36943:6;36940:30;36937:117;;;36973:79;;:::i;:::-;36937:117;37078:74;37144:7;37135:6;37124:9;37120:22;37078:74;:::i;:::-;37068:84;;36870:292;37201:2;37227:64;37283:7;37274:6;37263:9;37259:22;37227:64;:::i;:::-;37217:74;;37172:129;37340:2;37366:64;37422:7;37413:6;37402:9;37398:22;37366:64;:::i;:::-;37356:74;;37311:129;37479:3;37506:64;37562:7;37553:6;37542:9;37538:22;37506:64;:::i;:::-;37496:74;;37450:130;37619:3;37646:64;37702:7;37693:6;37682:9;37678:22;37646:64;:::i;:::-;37636:74;;37590:130;37759:3;37786:64;37842:7;37833:6;37822:9;37818:22;37786:64;:::i;:::-;37776:74;;37730:130;37920:3;37909:9;37905:19;37899:26;37952:18;37944:6;37941:30;37938:117;;;37974:79;;:::i;:::-;37938:117;38079:74;38145:7;38136:6;38125:9;38121:22;38079:74;:::i;:::-;38069:84;;37870:293;38223:3;38212:9;38208:19;38202:26;38255:18;38247:6;38244:30;38241:117;;;38277:79;;:::i;:::-;38241:117;38382:74;38448:7;38439:6;38428:9;38424:22;38382:74;:::i;:::-;38372:84;;38173:293;36176:2297;;;;;;;;;;;:::o;38479:553::-;38656:4;38694:3;38683:9;38679:19;38671:27;;38708:71;38776:1;38765:9;38761:17;38752:6;38708:71;:::i;:::-;38789:72;38857:2;38846:9;38842:18;38833:6;38789:72;:::i;:::-;38871;38939:2;38928:9;38924:18;38915:6;38871:72;:::i;:::-;38953;39021:2;39010:9;39006:18;38997:6;38953:72;:::i;:::-;38479:553;;;;;;;:::o;39038:442::-;39187:4;39225:2;39214:9;39210:18;39202:26;;39238:71;39306:1;39295:9;39291:17;39282:6;39238:71;:::i;:::-;39319:72;39387:2;39376:9;39372:18;39363:6;39319:72;:::i;:::-;39401;39469:2;39458:9;39454:18;39445:6;39401:72;:::i;:::-;39038:442;;;;;;:::o;39486:221::-;39626:34;39622:1;39614:6;39610:14;39603:58;39695:4;39690:2;39682:6;39678:15;39671:29;39486:221;:::o;39713:366::-;39855:3;39876:67;39940:2;39935:3;39876:67;:::i;:::-;39869:74;;39952:93;40041:3;39952:93;:::i;:::-;40070:2;40065:3;40061:12;40054:19;;39713:366;;;:::o;40085:419::-;40251:4;40289:2;40278:9;40274:18;40266:26;;40338:9;40332:4;40328:20;40324:1;40313:9;40309:17;40302:47;40366:131;40492:4;40366:131;:::i;:::-;40358:139;;40085:419;;;:::o;40510:181::-;40650:33;40646:1;40638:6;40634:14;40627:57;40510:181;:::o;40697:366::-;40839:3;40860:67;40924:2;40919:3;40860:67;:::i;:::-;40853:74;;40936:93;41025:3;40936:93;:::i;:::-;41054:2;41049:3;41045:12;41038:19;;40697:366;;;:::o;41069:419::-;41235:4;41273:2;41262:9;41258:18;41250:26;;41322:9;41316:4;41312:20;41308:1;41297:9;41293:17;41286:47;41350:131;41476:4;41350:131;:::i;:::-;41342:139;;41069:419;;;:::o;41494:221::-;41634:34;41630:1;41622:6;41618:14;41611:58;41703:4;41698:2;41690:6;41686:15;41679:29;41494:221;:::o;41721:366::-;41863:3;41884:67;41948:2;41943:3;41884:67;:::i;:::-;41877:74;;41960:93;42049:3;41960:93;:::i;:::-;42078:2;42073:3;42069:12;42062:19;;41721:366;;;:::o;42093:419::-;42259:4;42297:2;42286:9;42282:18;42274:26;;42346:9;42340:4;42336:20;42332:1;42321:9;42317:17;42310:47;42374:131;42500:4;42374:131;:::i;:::-;42366:139;;42093:419;;;:::o;42518:180::-;42566:77;42563:1;42556:88;42663:4;42660:1;42653:15;42687:4;42684:1;42677:15;42704:185;42744:1;42761:20;42779:1;42761:20;:::i;:::-;42756:25;;42795:20;42813:1;42795:20;:::i;:::-;42790:25;;42834:1;42824:35;;42839:18;;:::i;:::-;42824:35;42881:1;42878;42874:9;42869:14;;42704:185;;;;:::o;42895:194::-;42935:4;42955:20;42973:1;42955:20;:::i;:::-;42950:25;;42989:20;43007:1;42989:20;:::i;:::-;42984:25;;43033:1;43030;43026:9;43018:17;;43057:1;43051:4;43048:11;43045:37;;;43062:18;;:::i;:::-;43045:37;42895:194;;;;:::o
Swarm Source
ipfs://4838346044f83b8cfc872767eac7391523e3e21d561d25fd08a6daaf43f80bcc
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.