More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 537 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 21174247 | 156 days ago | IN | 0.05017246 ETH | 0.00537428 | ||||
Deposit | 21174235 | 156 days ago | IN | 0.14675446 ETH | 0.0050885 | ||||
Deposit | 21174203 | 156 days ago | IN | 0.03300094 ETH | 0.0084135 | ||||
Deposit | 21174052 | 156 days ago | IN | 0 ETH | 0.00853112 | ||||
Deposit | 21173887 | 156 days ago | IN | 0 ETH | 0.00368814 | ||||
Deposit | 21173859 | 156 days ago | IN | 0 ETH | 0.00420767 | ||||
Deposit | 21173855 | 156 days ago | IN | 0 ETH | 0.00406327 | ||||
Deposit | 21173796 | 156 days ago | IN | 0 ETH | 0.00478746 | ||||
Deposit | 21173392 | 156 days ago | IN | 0.147529 ETH | 0.00680682 | ||||
Deposit | 21173316 | 156 days ago | IN | 0.08 ETH | 0.00224617 | ||||
Deposit | 21173308 | 156 days ago | IN | 0.09 ETH | 0.00208416 | ||||
Deposit | 21173201 | 156 days ago | IN | 0.05371903 ETH | 0.0032762 | ||||
Deposit | 21172800 | 157 days ago | IN | 0.5 ETH | 0.00499607 | ||||
Deposit | 21172699 | 157 days ago | IN | 0 ETH | 0.00429333 | ||||
Deposit | 21172694 | 157 days ago | IN | 0 ETH | 0.00446357 | ||||
Deposit | 21172367 | 157 days ago | IN | 0 ETH | 0.00383383 | ||||
Deposit | 21172235 | 157 days ago | IN | 0.5 ETH | 0.0021961 | ||||
Deposit | 21172134 | 157 days ago | IN | 0 ETH | 0.00300493 | ||||
Deposit | 21172126 | 157 days ago | IN | 0 ETH | 0.00061212 | ||||
Deposit | 21171945 | 157 days ago | IN | 0 ETH | 0.00343639 | ||||
Deposit | 21171912 | 157 days ago | IN | 0 ETH | 0.00425062 | ||||
Deposit | 21171901 | 157 days ago | IN | 0 ETH | 0.00268961 | ||||
Deposit | 21171782 | 157 days ago | IN | 0 ETH | 0.00452246 | ||||
Deposit | 21171757 | 157 days ago | IN | 0.41 ETH | 0.00790537 | ||||
Deposit | 21171369 | 157 days ago | IN | 0 ETH | 0.00346751 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 21174247 | 156 days ago | 0.05017246 ETH | ||||
Transfer | 21174235 | 156 days ago | 0.14675446 ETH | ||||
Transfer | 21174203 | 156 days ago | 0.03300094 ETH | ||||
Transfer | 21173392 | 156 days ago | 0.147529 ETH | ||||
Transfer | 21173316 | 156 days ago | 0.08 ETH | ||||
Transfer | 21173308 | 156 days ago | 0.09 ETH | ||||
Transfer | 21173201 | 156 days ago | 0.05371903 ETH | ||||
Transfer | 21172800 | 157 days ago | 0.5 ETH | ||||
Transfer | 21172235 | 157 days ago | 0.5 ETH | ||||
Transfer | 21171757 | 157 days ago | 0.41 ETH | ||||
Transfer | 21171204 | 157 days ago | 0.09200062 ETH | ||||
Transfer | 21170728 | 157 days ago | 0.04012856 ETH | ||||
Transfer | 21170630 | 157 days ago | 0.96 ETH | ||||
Transfer | 21170494 | 157 days ago | 0.02508623 ETH | ||||
Transfer | 21170443 | 157 days ago | 0.32 ETH | ||||
Transfer | 21170052 | 157 days ago | 2.95 ETH | ||||
Transfer | 21170043 | 157 days ago | 0.17999686 ETH | ||||
Transfer | 21169732 | 157 days ago | 0.6 ETH | ||||
Transfer | 21169717 | 157 days ago | 1.49263091 ETH | ||||
Transfer | 21169598 | 157 days ago | 0.08 ETH | ||||
Transfer | 21169567 | 157 days ago | 0.4 ETH | ||||
Transfer | 21166870 | 157 days ago | 0.02508623 ETH | ||||
Transfer | 21166854 | 157 days ago | 0.02508623 ETH | ||||
Transfer | 21166775 | 157 days ago | 0.03 ETH | ||||
Transfer | 21166504 | 157 days ago | 0.43 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Presale
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-09 */ // SPDX-License-Identifier: MIT // 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/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/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: @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/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: Presale.sol pragma solidity ^0.8.9; contract Presale is Pausable, Ownable, ReentrancyGuard { using EnumerableSet for EnumerableSet.AddressSet; using SafeERC20 for IERC20Metadata; uint256 public constant PERCENTAGE_DENOMINATOR = 10000; uint256 public constant TOTAL_MAX_ALLOCATION = 1500000000 * 10 ** 18; uint256 public ethUSD; uint256 public ogRoundTokenLimited; uint256 public publicRoundTokenLimited; uint256 public pricePerToken; uint8 public tokenDecimals; uint8 public nativeDecimals; uint256 public ogRoundStartedAt; uint256 public publicRoundStartedAt; uint256 public ogRoundDuration; uint256 public publicRoundDuration; bool public isOGRound; bool public isPublicRound; mapping(address => bool) public ogWhitelist; mapping(address => uint256) public ogWhitelistTokenlimited; EnumerableSet.AddressSet allBuyerList; /// wallet history who purchased and requested tokens. mapping(address => uint256) public tokensRequested; mapping(address => bool) public isBonusRequested; mapping(address => uint256) public bonusRequested; IERC20Metadata public token; IERC20Metadata public usdc; IERC20Metadata public usdt; uint256 public totalTokensRequested; uint256 public presaleExpireTime; uint256 public bonusPercent; uint256 public fundsRaised; mapping(string => address) public referrersWithRefCodes; // refCode => referrer; mapping(address => mapping(address => bool)) public hasReferred; // referrer => referee => bool mapping(address => bool) public isReferrer; // referrer => bool; mapping(address => bool) public isUsedRefCode; // referee => bool; mapping(address => uint256) public refereeCount; // referrer => referee count mapping(string => uint256) public numOfReferee; // referrer ref code => referee count; mapping(string => uint256) public refereeAmount; // referrer => referred amount; address public fundingWallet; constructor( address _usdc, address _usdt, address _fundingWallet ) Ownable(msg.sender){ pricePerToken = 800; // 0.0008 USD usdc = IERC20Metadata(_usdc); usdt = IERC20Metadata(_usdt); bonusPercent = 500; ogRoundDuration = 3600; // 1 hour publicRoundDuration = 169200; // 47 hours isOGRound = false; isPublicRound = false; tokenDecimals = 18; nativeDecimals = usdc.decimals(); ethUSD = 3680 * 10 ** 6; // 3680 USD publicRoundTokenLimited = 12500000 * 10 ** tokenDecimals; fundingWallet = _fundingWallet; } /// @notice pause the presale function pause() public onlyOwner { _pause(); } /// @notice unpause the presale function unpause() public onlyOwner { _unpause(); } /// @notice get the presale data /// @return the price, hard limit, duration and hold limit function data() external view returns (uint256, uint256) { return (pricePerToken, publicRoundTokenLimited); } function setStartOGRound() external onlyOwner { isOGRound = true; ogRoundStartedAt = block.timestamp; isPublicRound = false; } function setStartPublicRound() external onlyOwner { isPublicRound = true; publicRoundStartedAt = block.timestamp; isOGRound = false; } function endOGRound() public onlyOwner { if (isOGRound) { isOGRound = false; } } function endPublicRound() public onlyOwner { if (isPublicRound) { isPublicRound = false; } } function setOGRoundDuration(uint256 _duration) external onlyOwner { ogRoundDuration = _duration; } function setPublicRoundDuration(uint256 _duration) external onlyOwner { publicRoundDuration = _duration; } function setOGRoundTokenLimited( address[] memory _whitelisted, uint256[] memory _ogRoundTokenLimited ) external onlyOwner { for (uint256 i = 0; i < _whitelisted.length; ++i) { if (ogWhitelist[_whitelisted[i]] == true) { ogWhitelistTokenlimited[_whitelisted[i]] = _ogRoundTokenLimited[i]; } } } function setOGRoundSingleTokenLimited( address[] memory _whitelisted, uint256 _ogRoundTokenLimited ) external onlyOwner { for (uint256 i = 0; i < _whitelisted.length; ++i) { if (ogWhitelist[_whitelisted[i]] == true) { ogWhitelistTokenlimited[_whitelisted[i]] = _ogRoundTokenLimited; } } } function setPublicRoundTokenLimited(uint256 _publicRoundTokenLimited) external onlyOwner { publicRoundTokenLimited = _publicRoundTokenLimited; } function setPresaleToken(address _token) external onlyOwner { require(_token != address(0), "Token shouldn't be zero"); token = IERC20Metadata(_token); tokenDecimals = token.decimals(); } function setUSDCToken(address _usdc) external onlyOwner { require(_usdc != address(0), "USDC shouldn't be zero"); usdc = IERC20Metadata(_usdc); nativeDecimals = usdc.decimals(); } function setUSDTToken(address _usdt) external onlyOwner { require(_usdt != address(0), "USDT shouldn't be zero"); usdt = IERC20Metadata(_usdt); nativeDecimals = usdt.decimals(); } function setFundingWallet(address _fundingWallet) external onlyOwner { require(_fundingWallet != address(0), "Funding Wallet shouldn't be zero"); fundingWallet = _fundingWallet; } function setBonusPercent(uint256 _rate) external onlyOwner { require(_rate >= 100 && _rate < PERCENTAGE_DENOMINATOR, "Rate should be less than 100%"); bonusPercent = _rate; } /// @notice set the price of the token /// @param _pricePerToken the price per token function setPrice(uint256 _pricePerToken) external onlyOwner { pricePerToken = _pricePerToken; } function setETHUSDPrice(uint256 _ethUSD) external onlyOwner { ethUSD = _ethUSD * 10 * nativeDecimals; } /// @notice withdraw tokens stored in the contract function withdrawTokens(address _token, address _to, uint256 _amount) external onlyOwner { IERC20Metadata(_token).safeTransfer(_to, _amount); } /// @notice withdraw usdc stored in the contract function withdrawUSDC(address _to) external onlyOwner { usdc.safeTransfer(_to, usdc.balanceOf(address(this))); } function withdrawUSDT(address _to) external onlyOwner { usdt.safeTransfer(_to, usdt.balanceOf(address(this))); } function registerToOGWhitelist(address[] memory _accounts) external onlyOwner { for (uint256 i = 0; i < _accounts.length; ++i) { ogWhitelist[_accounts[i]] = true; } } function removeFromOGWhitelist(address[] memory _accounts) external onlyOwner { for (uint256 i = 0; i < _accounts.length; ++i) { ogWhitelist[_accounts[i]] = false; } } function _isEligibleTokens(address _account, uint256 _value, uint256 _tokenLimit) internal view returns (bool) { return tokensRequested[_account] + _value <= _tokenLimit; } function _isValidReferralCode(string memory _refCode) internal view returns (bool) { if (bytes(_refCode).length < 5) return false; if (referrersWithRefCodes[_refCode] == address(0)) return false; return true; } function _isOGRound() internal view returns (bool) { return isOGRound && ((ogRoundStartedAt + ogRoundDuration) >= block.timestamp) && (block.timestamp >= ogRoundStartedAt); } function _isPublicRound() internal view returns (bool) { return isPublicRound && ((publicRoundStartedAt + publicRoundDuration) >= block.timestamp) && (block.timestamp >= publicRoundStartedAt); } receive() external payable {} fallback() external {} function withdrawETH(address _to) external onlyOwner { (bool success, ) = payable(_to).call{value: address(this).balance}(""); if (!success) { revert("Transfer Failed"); } } function _createRefCode(address _referrer, string memory _refCode) internal returns (bool) { require(bytes(_refCode).length >= 5, "Invalid Referral Code"); require(!isReferrer[_referrer] && referrersWithRefCodes[_refCode] == address(0), "You created referral code already"); referrersWithRefCodes[_refCode] = _referrer; isReferrer[_referrer] = true; return true; } function deposit( uint256 _amount, address _referrer, string memory _refCode, uint256 _chain ) external payable nonReentrant whenNotPaused { require(_amount > 0, "Not acceptable to require 0 token!"); uint256 tokens = (((_amount * 10 ** tokenDecimals) * 10 ** nativeDecimals) / pricePerToken) / (10 ** nativeDecimals); require(totalTokensRequested + tokens <= TOTAL_MAX_ALLOCATION, "More than overall presale allocation!"); if (_referrer != address(0) && !isReferrer[_referrer]) { _createRefCode(_referrer, _refCode); } require(referrersWithRefCodes[_refCode] != msg.sender, "You are using your own referral code!"); if (_isOGRound()) { require(ogWhitelist[msg.sender], "You have no permission for OG Round!"); _depositUSDC(msg.sender, _amount, _refCode, ogWhitelistTokenlimited[msg.sender], _chain); } else if (_isPublicRound()) { _depositUSDC(msg.sender, _amount, _refCode, publicRoundTokenLimited, _chain); } else { revert("Presale is not allowed!"); } if(totalTokensRequested >= TOTAL_MAX_ALLOCATION) { endOGRound(); endPublicRound(); } } function _depositUSDC( address _account, uint256 _usdcAmount, string memory _refCode, uint256 _tokenLimit, uint256 _chain ) internal returns (bool) { uint256 tokens = (((_usdcAmount * 10 ** tokenDecimals) * 10 ** nativeDecimals) / pricePerToken) / (10 ** nativeDecimals); uint256 bonusAmount = (tokens * bonusPercent) / PERCENTAGE_DENOMINATOR; uint256 ethAmount = (_usdcAmount * 10 ** tokenDecimals) / ethUSD; if (!_isValidReferralCode(_refCode)) { bonusAmount = 0; } if (!_isEligibleTokens(_account, tokens, _tokenLimit)) { revert("Account limit exceeded!"); } if (tokens == 0) { revert("Insufficient token out value"); } // based on which chain, USDC = 1, USDT = 2, ETH = 3 if (_chain == 1) { usdc.safeTransferFrom(_account, fundingWallet, _usdcAmount); } else if (_chain == 2) { usdt.safeTransferFrom(_account, fundingWallet, _usdcAmount); } else if (_chain == 3) { require(msg.value == ethAmount, "Incorrect ETH amount sent"); (bool success, ) = payable(fundingWallet).call{value: msg.value}(""); require(success, "ETH transfer failed"); } else { revert("Invalid chain identifier"); } tokensRequested[_account] += tokens; totalTokensRequested += tokens; if (_isValidReferralCode(_refCode)) { address referrer = referrersWithRefCodes[_refCode]; if (referrer != address(0)) { isBonusRequested[_account] = true; bonusRequested[_account] += bonusAmount; isBonusRequested[referrer] = true; bonusRequested[referrer] += bonusAmount; isUsedRefCode[_account] = true; refereeAmount[_refCode] += _usdcAmount; if (!hasReferred[referrer][_account]) { refereeCount[referrer] += 1; numOfReferee[_refCode] += 1; hasReferred[referrer][_account] = true; } } } if (!allBuyerList.contains(msg.sender)) { allBuyerList.add(msg.sender); } fundsRaised += _usdcAmount; return true; } /* * view functions */ function getUSDCForTokens(uint256 _tokensAmount) external view returns (uint256) { return (pricePerToken * _tokensAmount) / (10 ** tokenDecimals); } function getBalanceOfUSDC(address _wallet) external view returns (uint256) { return usdc.balanceOf(_wallet); } function getTokensRequestedOfWallet(address _account) external view returns (uint256) { return tokensRequested[_account]; } function getBonusRequested(address _account) external view returns (uint256) { return bonusRequested[_account]; } function getPricePerToken() external view returns (uint256) { return pricePerToken; } function getOGRoundTokenLimited(address _account) external view returns (uint256) { return ogWhitelistTokenlimited[_account]; } function getPublicRoundTokenLimited() external view returns (uint256) { return publicRoundTokenLimited; } function getOGRoundStartedAt() external view returns (uint256) { return ogRoundStartedAt; } function getPublicRoundStartedAt() external view returns (uint256) { return publicRoundStartedAt; } function getOGRoundDuration() external view returns (uint256) { return ogRoundDuration; } function getPublicRoundDuration() external view returns (uint256) { return publicRoundDuration; } function getReferreeCount(address _referrer) external view returns (uint256) { return refereeCount[_referrer]; } function getReferralInfo(string memory _refCode) external view returns (uint256 numOfReferees, uint256 totalRefereeAmount) { return (numOfReferee[_refCode], refereeAmount[_refCode]/(10**nativeDecimals)); } function getBuyers() external view returns (address[] memory) { return allBuyerList.values(); } function getBuyerLength() external view returns (uint256) { return allBuyerList.length(); } function isTokenBuyer(address _account) external view returns (bool) { return tokensRequested[_account] > 0; } function isOGWhitelisted(address _account) external view returns (bool) { return ogWhitelist[_account]; } function checkOGRound() external view returns (bool) { return _isOGRound(); } function checkPublicRound() external view returns (bool) { return _isPublicRound(); } function addUsersWithReferralCodes( address[] memory _users, string[] memory _refCodes ) external onlyOwner { require(_users.length == _refCodes.length, "Arrays must have the same length"); for (uint256 i = 0; i < _users.length; ++i) { require(bytes(_refCodes[i]).length >= 5, "Invalid Referral Code"); require(!isReferrer[_users[i]], "Referrer already exists"); require(referrersWithRefCodes[_refCodes[i]] == address(0), "Referral code already used"); referrersWithRefCodes[_refCodes[i]] = _users[i]; isReferrer[_users[i]] = true; } } function updateOldRecords( address[] memory users, uint256[] memory tokensRequestedList, uint256[] memory _bonusRequestedList, uint256[] memory refereeCountList, uint256 fundsAmount ) external onlyOwner { require(users.length == tokensRequestedList.length, "Arrays must have the same length"); require(users.length == _bonusRequestedList.length, "Arrays must have the same length"); require(users.length == refereeCountList.length, "Arrays must have the same length"); for (uint256 i = 0; i < users.length; i++) { address user = users[i]; uint256 tokenRequested = tokensRequestedList[i]; uint256 _bonusRequested = _bonusRequestedList[i]; uint256 _refereeCount = refereeCountList[i]; totalTokensRequested += tokenRequested; tokensRequested[user] = tokenRequested; isBonusRequested[user] = true; bonusRequested[user] = _bonusRequested; refereeCount[user] = _refereeCount; if (!allBuyerList.contains(user)) { allBuyerList.add(user); } } fundsRaised = fundsAmount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_fundingWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"PERCENTAGE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_MAX_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"string[]","name":"_refCodes","type":"string[]"}],"name":"addUsersWithReferralCodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bonusRequested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkOGRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkPublicRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"data","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"string","name":"_refCode","type":"string"},{"internalType":"uint256","name":"_chain","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endOGRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPublicRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundsRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getBalanceOfUSDC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getBonusRequested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOGRoundDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOGRoundStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getOGRoundTokenLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicRoundDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicRoundStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicRoundTokenLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_refCode","type":"string"}],"name":"getReferralInfo","outputs":[{"internalType":"uint256","name":"numOfReferees","type":"uint256"},{"internalType":"uint256","name":"totalRefereeAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"getReferreeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getTokensRequestedOfWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokensAmount","type":"uint256"}],"name":"getUSDCForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"hasReferred","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBonusRequested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOGRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOGWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isTokenBuyer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUsedRefCode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"numOfReferee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogRoundDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogRoundStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogRoundTokenLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogWhitelistTokenlimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleExpireTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicRoundDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicRoundStartedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicRoundTokenLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"refereeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"refereeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"referrersWithRefCodes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"registerToOGWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"removeFromOGWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setBonusPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethUSD","type":"uint256"}],"name":"setETHUSDPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundingWallet","type":"address"}],"name":"setFundingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setOGRoundDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelisted","type":"address[]"},{"internalType":"uint256","name":"_ogRoundTokenLimited","type":"uint256"}],"name":"setOGRoundSingleTokenLimited","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelisted","type":"address[]"},{"internalType":"uint256[]","name":"_ogRoundTokenLimited","type":"uint256[]"}],"name":"setOGRoundTokenLimited","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setPresaleToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pricePerToken","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setPublicRoundDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicRoundTokenLimited","type":"uint256"}],"name":"setPublicRoundTokenLimited","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartOGRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartPublicRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_usdc","type":"address"}],"name":"setUSDCToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_usdt","type":"address"}],"name":"setUSDTToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensRequested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensRequested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"tokensRequestedList","type":"uint256[]"},{"internalType":"uint256[]","name":"_bonusRequestedList","type":"uint256[]"},{"internalType":"uint256[]","name":"refereeCountList","type":"uint256[]"},{"internalType":"uint256","name":"fundsAmount","type":"uint256"}],"name":"updateOldRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561000f575f80fd5b506040516138b13803806138b183398101604081905261002e91610202565b5f805460ff19169055338061005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161018f565b5060018055610320600555601480546001600160a01b038086166001600160a01b0319928316811790935560158054918616919092161790556101f4601855610e10600955620294f0600a55600b805461ffff191690556006805460ff191660121790556040805163313ce56760e01b8152905163313ce567916004818101926020929091908290030181865afa158015610102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101269190610242565b6006805460ff9283166101000261ff00198216811790925563db58580060025561015792918216911617600a610362565b6101649062bebc20610370565b600455602180546001600160a01b0319166001600160a01b0392909216919091179055506103879050565b5f80546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b80516001600160a01b03811681146101fd575f80fd5b919050565b5f805f60608486031215610214575f80fd5b61021d846101e7565b925061022b602085016101e7565b9150610239604085016101e7565b90509250925092565b5f60208284031215610252575f80fd5b815160ff81168114610262575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156102b85780850481111561029c5761029c610269565b60018416156102aa57908102905b60019390931c928002610281565b935093915050565b5f826102ce5750600161035c565b816102da57505f61035c565b81600181146102f057600281146102fa57610316565b600191505061035c565b60ff84111561030b5761030b610269565b50506001821b61035c565b5060208310610133831016604e8410600b8410161715610339575081810a61035c565b6103455f19848461027d565b805f190482111561035857610358610269565b0290505b92915050565b5f61026260ff8416836102c0565b808202811582820484141761035c5761035c610269565b61351d806103945f395ff3fe6080604052600436106104ad575f3560e01c8063768ea56a1161026a578063b95eb38f1161014e578063d40d47b6116100c0578063ef8ff0ba11610084578063ef8ff0ba14610e9f578063f2fde38b14610ebe578063f4b2afc514610edd578063f64bfaba14610f0b578063f8a1d07f14610f2c578063fc0c546a14610f4b576104b4565b8063d40d47b614610ddb578063d42d0b1714610df0578063d5e3fa3c14610e27578063d64d696814610e52578063e4cf9e1614610e80576104b4565b8063c052525911610112578063c052525914610d15578063c12063af14610d49578063c2f6362a14610d68578063c8c325df14610d7c578063ca1e973814610d90578063d29e6c1a14610da4576104b4565b8063b95eb38f14610c57578063bbd1c9ec14610c6b578063bc48dcab14610c8a578063bd2a01d714610cca578063becf3add14610d00576104b4565b80639819d24e116101e7578063abf08304116101ab578063abf0830414610b8c578063ac48bd5a14610bc0578063af1366bb14610bd5578063b26a5eff14610c0e578063b3cd425414610c23578063b874487c14610c38576104b4565b80639819d24e14610af157806398ffe22714610b10578063a1170b4714610b46578063a72c3e5f14610b65578063aa3193d814610b79576104b4565b80638456cb591161022e5780638456cb5914610a555780638da5cb5b14610a695780638eee1e2114610a8a57806391b7f5ed14610abe57806396fe058214610add576104b4565b8063768ea56a146109da57806377b80467146109f85780637b1b1de614610a0c5780637de2b67d14610a2157806381e3c75d14610a40576104b4565b80634ad6eb2e116103915780636066d9541161030e57806366e226bd116102d257806366e226bd14610923578063690d83201461094257806369d87ab1146109615780636fdcbef414610980578063715018a61461099e57806373d4a13a146109b2576104b4565b80636066d9541461088d57806361eeaf25146108ac57806362bd689c146108c157806362c13c51146108e05780636681b9fd1461090e576104b4565b806359db80f81161035557806359db80f8146107fb5780635befb7251461081a5780635c975abb146108395780635cf138041461084f5780635e35359e1461086e576104b4565b80634ad6eb2e1461074b5780634df3cce4146107795780634fc720d514610798578063556214c6146107b7578063564ac655146107d0576104b4565b80632f48ab7d1161042a5780633b97e856116103ee5780633b97e856146106845780633c4b40b8146106af5780633e413bee146106ce5780633f4ba83a146106ed57806344f38baa14610701578063472be74a14610720576104b4565b80632f48ab7d146105f057806331cc5f6c1461062757806334b134041461064657806336de807e1461065b5780633aac69811461066f576104b4565b80631358272111610471578063135827211461056b578063194a33661461057f57806321724e851461059457806324e7c218146105a8578063256e15fe146105dc576104b4565b806305e97d2c146104c1578063080420be146104ff5780630d9c8e6d146105235780630def6882146105385780630f5a9d011461054c576104b4565b366104b457005b3480156104bf575f80fd5b005b3480156104cc575f80fd5b506104ec6104db366004612d56565b600d6020525f908152604090205481565b6040519081526020015b60405180910390f35b34801561050a575f80fd5b50610513610f6a565b60405190151581526020016104f6565b34801561052e575f80fd5b506104ec60035481565b348015610543575f80fd5b506004546104ec565b348015610557575f80fd5b506104bf610566366004612d56565b610f78565b348015610576575f80fd5b506007546104ec565b34801561058a575f80fd5b506104ec60075481565b34801561059f575f80fd5b506104bf61106c565b3480156105b3575f80fd5b506104ec6105c2366004612d56565b6001600160a01b03165f908152601e602052604090205490565b3480156105e7575f80fd5b506104bf611088565b3480156105fb575f80fd5b5060155461060f906001600160a01b031681565b6040516001600160a01b0390911681526020016104f6565b348015610632575f80fd5b506104bf610641366004612d56565b6110a5565b348015610651575f80fd5b506104ec600a5481565b348015610666575f80fd5b506008546104ec565b34801561067a575f80fd5b506104ec60095481565b34801561068f575f80fd5b5060065461069d9060ff1681565b60405160ff90911681526020016104f6565b3480156106ba575f80fd5b5060215461060f906001600160a01b031681565b3480156106d9575f80fd5b5060145461060f906001600160a01b031681565b3480156106f8575f80fd5b506104bf611133565b34801561070c575f80fd5b506104bf61071b366004612ea1565b611145565b34801561072b575f80fd5b506104ec61073a366004612d56565b601e6020525f908152604090205481565b348015610756575f80fd5b50610513610765366004612d56565b601d6020525f908152604090205460ff1681565b348015610784575f80fd5b506104bf610793366004612d56565b611204565b3480156107a3575f80fd5b506104bf6107b2366004612f04565b6112f4565b3480156107c2575f80fd5b50600b546105139060ff1681565b3480156107db575f80fd5b506104ec6107ea366004612d56565b60106020525f908152604090205481565b348015610806575f80fd5b506104bf610815366004612d56565b61135a565b348015610825575f80fd5b506104ec6b04d8c55aefb8c05b5c00000081565b348015610844575f80fd5b505f5460ff16610513565b34801561085a575f80fd5b506104bf610869366004612f3d565b6113e5565b348015610879575f80fd5b506104bf610888366004612f7e565b611486565b348015610898575f80fd5b506104ec6108a7366004612fb8565b6114a2565b3480156108b7575f80fd5b506104ec60175481565b3480156108cc575f80fd5b506104bf6108db366004612fb8565b6114d3565b3480156108eb575f80fd5b506105136108fa366004612d56565b60116020525f908152604090205460ff1681565b348015610919575f80fd5b506104ec60195481565b34801561092e575f80fd5b506104bf61093d366004612d56565b61153e565b34801561094d575f80fd5b506104bf61095c366004612d56565b6115ec565b34801561096c575f80fd5b506104bf61097b366004612fb8565b611685565b34801561098b575f80fd5b50600b5461051390610100900460ff1681565b3480156109a9575f80fd5b506104bf6116b3565b3480156109bd575f80fd5b506005546004545b604080519283526020830191909152016104f6565b3480156109e5575f80fd5b5060065461069d90610100900460ff1681565b348015610a03575f80fd5b506009546104ec565b348015610a17575f80fd5b506104ec60055481565b348015610a2c575f80fd5b506104bf610a3b366004612fb8565b6116c4565b348015610a4b575f80fd5b506104ec60045481565b348015610a60575f80fd5b506104bf6116d1565b348015610a74575f80fd5b505f5461010090046001600160a01b031661060f565b348015610a95575f80fd5b506104ec610aa4366004612d56565b6001600160a01b03165f9081526010602052604090205490565b348015610ac9575f80fd5b506104bf610ad8366004612fb8565b6116e1565b348015610ae8575f80fd5b506104ec6116ee565b348015610afc575f80fd5b506104bf610b0b366004612d56565b6116f9565b348015610b1b575f80fd5b50610513610b2a366004612d56565b6001600160a01b03165f90815260106020526040902054151590565b348015610b51575f80fd5b506104bf610b60366004612fcf565b611779565b348015610b70575f80fd5b50600a546104ec565b6104bf610b873660046130f6565b6118f2565b348015610b97575f80fd5b506104ec610ba6366004612d56565b6001600160a01b03165f9081526012602052604090205490565b348015610bcb575f80fd5b506104ec60025481565b348015610be0575f80fd5b50610513610bef366004613150565b601b60209081525f928352604080842090915290825290205460ff1681565b348015610c19575f80fd5b506104ec60085481565b348015610c2e575f80fd5b506104ec61271081565b348015610c43575f80fd5b506109c5610c52366004613181565b611c42565b348015610c62575f80fd5b506104bf611cad565b348015610c76575f80fd5b506104bf610c85366004612fb8565b611ccc565b348015610c95575f80fd5b5061060f610ca4366004613181565b8051602081830181018051601a825292820191909301209152546001600160a01b031681565b348015610cd5575f80fd5b506104ec610ce4366004613181565b8051602081830181018051828252928201919093012091525481565b348015610d0b575f80fd5b506104ec60185481565b348015610d20575f80fd5b506104ec610d2f366004612d56565b6001600160a01b03165f908152600d602052604090205490565b348015610d54575f80fd5b506104bf610d63366004612fb8565b611cd9565b348015610d73575f80fd5b50610513611ce6565b348015610d87575f80fd5b506104bf611cef565b348015610d9b575f80fd5b506005546104ec565b348015610daf575f80fd5b50610513610dbe366004612d56565b6001600160a01b03165f908152600c602052604090205460ff1690565b348015610de6575f80fd5b506104ec60165481565b348015610dfb575f80fd5b506104ec610e0a366004613181565b8051602081830181018051601f8252928201919093012091525481565b348015610e32575f80fd5b506104ec610e41366004612d56565b60126020525f908152604090205481565b348015610e5d575f80fd5b50610513610e6c366004612d56565b601c6020525f908152604090205460ff1681565b348015610e8b575f80fd5b506104ec610e9a366004612d56565b611d14565b348015610eaa575f80fd5b506104bf610eb93660046131b2565b611d80565b348015610ec9575f80fd5b506104bf610ed8366004612d56565b611ffc565b348015610ee8575f80fd5b50610513610ef7366004612d56565b600c6020525f908152604090205460ff1681565b348015610f16575f80fd5b50610f1f612036565b6040516104f6919061328d565b348015610f37575f80fd5b506104bf610f46366004612f04565b612042565b348015610f56575f80fd5b5060135461060f906001600160a01b031681565b5f610f736120a5565b905090565b610f806120d9565b6001600160a01b038116610fd45760405162461bcd60e51b8152602060048201526016602482015275555344432073686f756c646e2774206265207a65726f60501b60448201526064015b60405180910390fd5b601480546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa15801561102b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104f91906132d8565b600660016101000a81548160ff021916908360ff16021790555050565b6110746120d9565b600b80544260075561ffff19166001179055565b6110906120d9565b600b80544260085561ffff1916610100179055565b6110ad6120d9565b6014546040516370a0823160e01b81523060048201526111309183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d91906132f8565b6014546001600160a01b0316919061210b565b50565b61113b6120d9565b61114361216a565b565b61114d6120d9565b5f5b82518110156111ff57600c5f84838151811061116d5761116d61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff1615156001036111f7578181815181106111ae576111ae61330f565b6020026020010151600d5f8584815181106111cb576111cb61330f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20819055505b60010161114f565b505050565b61120c6120d9565b6001600160a01b0381166112625760405162461bcd60e51b815260206004820152601760248201527f546f6b656e2073686f756c646e2774206265207a65726f0000000000000000006044820152606401610fcb565b601380546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156112b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112dd91906132d8565b6006805460ff191660ff9290921691909117905550565b6112fc6120d9565b5f5b8151811015611356575f600c5f84848151811061131d5761131d61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016112fe565b5050565b6113626120d9565b6015546040516370a0823160e01b81523060048201526111309183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156113ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d291906132f8565b6015546001600160a01b0316919061210b565b6113ed6120d9565b5f5b82518110156111ff57600c5f84838151811061140d5761140d61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff16151560010361147e5781600d5f8584815181106114525761145261330f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20819055505b6001016113ef565b61148e6120d9565b6111ff6001600160a01b038416838361210b565b6006545f906114b59060ff16600a61341a565b826005546114c39190613428565b6114cd919061343f565b92915050565b6114db6120d9565b606481101580156114ed575061271081105b6115395760405162461bcd60e51b815260206004820152601d60248201527f526174652073686f756c64206265206c657373207468616e20313030250000006044820152606401610fcb565b601855565b6115466120d9565b6001600160a01b0381166115955760405162461bcd60e51b8152602060048201526016602482015275555344542073686f756c646e2774206265207a65726f60501b6044820152606401610fcb565b601580546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa15801561102b573d5f803e3d5ffd5b6115f46120d9565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f811461163d576040519150601f19603f3d011682016040523d82523d5f602084013e611642565b606091505b50509050806113565760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610fcb565b61168d6120d9565b600654610100900460ff166116a382600a613428565b6116ad9190613428565b60025550565b6116bb6120d9565b6111435f6121bb565b6116cc6120d9565b600a55565b6116d96120d9565b611143612213565b6116e96120d9565b600555565b5f610f73600e61224f565b6117016120d9565b6001600160a01b0381166117575760405162461bcd60e51b815260206004820181905260248201527f46756e64696e672057616c6c65742073686f756c646e2774206265207a65726f6044820152606401610fcb565b602180546001600160a01b0319166001600160a01b0392909216919091179055565b6117816120d9565b83518551146117a25760405162461bcd60e51b8152600401610fcb9061345e565b82518551146117c35760405162461bcd60e51b8152600401610fcb9061345e565b81518551146117e45760405162461bcd60e51b8152600401610fcb9061345e565b5f5b85518110156118e8575f8682815181106118025761180261330f565b602002602001015190505f86838151811061181f5761181f61330f565b602002602001015190505f86848151811061183c5761183c61330f565b602002602001015190505f8685815181106118595761185961330f565b602002602001015190508260165f8282546118749190613493565b90915550506001600160a01b0384165f90815260106020908152604080832086905560118252808320805460ff1916600117905560128252808320859055601e90915290208190556118c7600e85612258565b6118d8576118d6600e8561227c565b505b5050600190920191506117e69050565b5060195550505050565b6118fa612290565b6119026122e9565b5f841161195c5760405162461bcd60e51b815260206004820152602260248201527f4e6f742061636365707461626c6520746f2072657175697265203020746f6b656044820152616e2160f01b6064820152608401610fcb565b6006545f9061197490610100900460ff16600a61341a565b60055460065461198d90610100900460ff16600a61341a565b60065461199e9060ff16600a61341a565b6119a89089613428565b6119b29190613428565b6119bc919061343f565b6119c6919061343f565b90506b04d8c55aefb8c05b5c000000816016546119e39190613493565b1115611a3f5760405162461bcd60e51b815260206004820152602560248201527f4d6f7265207468616e206f766572616c6c2070726573616c6520616c6c6f636160448201526474696f6e2160d81b6064820152608401610fcb565b6001600160a01b03841615801590611a6f57506001600160a01b0384165f908152601c602052604090205460ff16155b15611a8057611a7e848461232e565b505b336001600160a01b0316601a84604051611a9a91906134bd565b908152604051908190036020019020546001600160a01b031603611b0e5760405162461bcd60e51b815260206004820152602560248201527f596f7520617265207573696e6720796f7572206f776e20726566657272616c20604482015264636f64652160d81b6064820152608401610fcb565b611b166120a5565b15611ba957335f908152600c602052604090205460ff16611b855760405162461bcd60e51b8152602060048201526024808201527f596f752068617665206e6f207065726d697373696f6e20666f72204f4720526f604482015263756e642160e01b6064820152608401610fcb565b335f818152600d6020526040902054611ba391908790869086612488565b50611c0d565b611bb16129e5565b15611bc557611ba333868560045486612488565b60405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973206e6f7420616c6c6f776564210000000000000000006044820152606401610fcb565b6b04d8c55aefb8c05b5c00000060165410611c3257611c2a611cad565b611c32611cef565b50611c3c60018055565b50505050565b5f80601f83604051611c5491906134bd565b90815260405190819003602001902054600654611c7b9060ff61010090910416600a61341a565b602085604051611c8b91906134bd565b908152602001604051809103902054611ca4919061343f565b91509150915091565b611cb56120d9565b600b5460ff161561114357600b805460ff19169055565b611cd46120d9565b600455565b611ce16120d9565b600955565b5f610f736129e5565b611cf76120d9565b600b54610100900460ff161561114357600b805461ff0019169055565b6014546040516370a0823160e01b81526001600160a01b0383811660048301525f9216906370a0823190602401602060405180830381865afa158015611d5c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114cd91906132f8565b611d886120d9565b8051825114611da95760405162461bcd60e51b8152600401610fcb9061345e565b5f5b82518110156111ff576005828281518110611dc857611dc861330f565b6020026020010151511015611e175760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420526566657272616c20436f646560581b6044820152606401610fcb565b601c5f848381518110611e2c57611e2c61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff1615611e9f5760405162461bcd60e51b815260206004820152601760248201527f526566657272657220616c7265616479206578697374730000000000000000006044820152606401610fcb565b5f6001600160a01b0316601a838381518110611ebd57611ebd61330f565b6020026020010151604051611ed291906134bd565b908152604051908190036020019020546001600160a01b031614611f385760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c20636f646520616c726561647920757365640000000000006044820152606401610fcb565b828181518110611f4a57611f4a61330f565b6020026020010151601a838381518110611f6657611f6661330f565b6020026020010151604051611f7b91906134bd565b90815260200160405180910390205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001601c5f858481518110611fc357611fc361330f565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611dab565b6120046120d9565b6001600160a01b03811661202d57604051631e4fbdf760e01b81525f6004820152602401610fcb565b611130816121bb565b6060610f73600e612a1e565b61204a6120d9565b5f5b8151811015611356576001600c5f84848151811061206c5761206c61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff191691151591909117905560010161204c565b600b545f9060ff1680156120c85750426009546007546120c59190613493565b10155b8015610f7357505060075442101590565b5f546001600160a01b036101009091041633146111435760405163118cdaa760e01b8152336004820152602401610fcb565b6040516001600160a01b038381166024830152604482018390526111ff91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612a2a565b612172612a8b565b5f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f80546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b61221b6122e9565b5f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861219e3390565b5f6114cd825490565b6001600160a01b0381165f90815260018301602052604081205415155b9392505050565b5f612275836001600160a01b038416612ad3565b6002600154036122e25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610fcb565b6002600155565b5f5460ff16156111435760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610fcb565b5f6005825110156123795760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420526566657272616c20436f646560581b6044820152606401610fcb565b6001600160a01b0383165f908152601c602052604090205460ff161580156123d157505f6001600160a01b0316601a836040516123b691906134bd565b908152604051908190036020019020546001600160a01b0316145b6124275760405162461bcd60e51b815260206004820152602160248201527f596f75206372656174656420726566657272616c20636f646520616c726561646044820152607960f81b6064820152608401610fcb565b82601a8360405161243891906134bd565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b03948516179055949091165f908152601c90915292909220805460ff1916600190811790915592915050565b6006545f9081906124a290610100900460ff16600a61341a565b6005546006546124bb90610100900460ff16600a61341a565b6006546124cc9060ff16600a61341a565b6124d6908a613428565b6124e09190613428565b6124ea919061343f565b6124f4919061343f565b90505f612710601854836125089190613428565b612512919061343f565b6002546006549192505f9161252b9060ff16600a61341a565b612535908a613428565b61253f919061343f565b905061254a87612b1f565b612552575f91505b61255d898488612b78565b6125a95760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206c696d6974206578636565646564210000000000000000006044820152606401610fcb565b825f036125f85760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420746f6b656e206f75742076616c7565000000006044820152606401610fcb565b846001036126245760215460145461261f916001600160a01b03918216918c91168b612ba7565b612786565b8460020361264b5760215460155461261f916001600160a01b03918216918c91168b612ba7565b8460030361273e578034146126a25760405162461bcd60e51b815260206004820152601960248201527f496e636f72726563742045544820616d6f756e742073656e74000000000000006044820152606401610fcb565b6021546040515f916001600160a01b03169034908381818185875af1925050503d805f81146126ec576040519150601f19603f3d011682016040523d82523d5f602084013e6126f1565b606091505b50509050806127385760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610fcb565b50612786565b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636861696e206964656e74696669657200000000000000006044820152606401610fcb565b6001600160a01b0389165f90815260106020526040812080548592906127ad908490613493565b925050819055508260165f8282546127c59190613493565b909155506127d4905087612b1f565b156129a4575f601a886040516127ea91906134bd565b908152604051908190036020019020546001600160a01b0316905080156129a2576001600160a01b038a165f908152601160209081526040808320805460ff19166001179055601290915281208054859290612847908490613493565b90915550506001600160a01b0381165f908152601160209081526040808320805460ff19166001179055601290915281208054859290612888908490613493565b90915550506001600160a01b038a165f908152601d6020908152604091829020805460ff1916600117905590518a91906128c3908b906134bd565b90815260200160405180910390205f8282546128df9190613493565b90915550506001600160a01b038082165f908152601b60209081526040808320938e168352929052205460ff166129a2576001600160a01b0381165f908152601e60205260408120805460019290612938908490613493565b925050819055506001601f8960405161295191906134bd565b90815260200160405180910390205f82825461296d9190613493565b90915550506001600160a01b038082165f908152601b60209081526040808320938e16835292905220805460ff191660011790555b505b6129af600e33612258565b6129c0576129be600e3361227c565b505b8760195f8282546129d19190613493565b9091555060019a9950505050505050505050565b600b545f90610100900460ff168015612a0d575042600a54600854612a0a9190613493565b10155b8015610f7357505060085442101590565b60605f61227583612be0565b5f612a3e6001600160a01b03841683612c39565b905080515f14158015612a62575080806020019051810190612a6091906134c8565b155b156111ff57604051635274afe760e01b81526001600160a01b0384166004820152602401610fcb565b5f5460ff166111435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610fcb565b5f818152600183016020526040812054612b1857508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556114cd565b505f6114cd565b5f600582511015612b3157505f919050565b5f6001600160a01b0316601a83604051612b4b91906134bd565b908152604051908190036020019020546001600160a01b031603612b7057505f919050565b506001919050565b6001600160a01b0383165f908152601060205260408120548290612b9d908590613493565b1115949350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611c3c9186918216906323b872dd90608401612138565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612c2d57602002820191905f5260205f20905b815481526020019060010190808311612c19575b50505050509050919050565b606061227583835f845f80856001600160a01b03168486604051612c5d91906134bd565b5f6040518083038185875af1925050503d805f8114612c97576040519150601f19603f3d011682016040523d82523d5f602084013e612c9c565b606091505b5091509150612cac868383612cb6565b9695505050505050565b606082612ccb57612cc682612d12565b612275565b8151158015612ce257506001600160a01b0384163b155b15612d0b57604051639996b31560e01b81526001600160a01b0385166004820152602401610fcb565b5080612275565b805115612d225780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114612d51575f80fd5b919050565b5f60208284031215612d66575f80fd5b61227582612d3b565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612dab57612dab612d6f565b604052919050565b5f6001600160401b03821115612dcb57612dcb612d6f565b5060051b60200190565b5f82601f830112612de4575f80fd5b8135612df7612df282612db3565b612d83565b8082825260208201915060208360051b860101925085831115612e18575f80fd5b602085015b83811015612e3c57612e2e81612d3b565b835260209283019201612e1d565b5095945050505050565b5f82601f830112612e55575f80fd5b8135612e63612df282612db3565b8082825260208201915060208360051b860101925085831115612e84575f80fd5b602085015b83811015612e3c578035835260209283019201612e89565b5f8060408385031215612eb2575f80fd5b82356001600160401b03811115612ec7575f80fd5b612ed385828601612dd5565b92505060208301356001600160401b03811115612eee575f80fd5b612efa85828601612e46565b9150509250929050565b5f60208284031215612f14575f80fd5b81356001600160401b03811115612f29575f80fd5b612f3584828501612dd5565b949350505050565b5f8060408385031215612f4e575f80fd5b82356001600160401b03811115612f63575f80fd5b612f6f85828601612dd5565b95602094909401359450505050565b5f805f60608486031215612f90575f80fd5b612f9984612d3b565b9250612fa760208501612d3b565b929592945050506040919091013590565b5f60208284031215612fc8575f80fd5b5035919050565b5f805f805f60a08688031215612fe3575f80fd5b85356001600160401b03811115612ff8575f80fd5b61300488828901612dd5565b95505060208601356001600160401b0381111561301f575f80fd5b61302b88828901612e46565b94505060408601356001600160401b03811115613046575f80fd5b61305288828901612e46565b93505060608601356001600160401b0381111561306d575f80fd5b61307988828901612e46565b95989497509295608001359392505050565b5f82601f83011261309a575f80fd5b81356001600160401b038111156130b3576130b3612d6f565b6130c6601f8201601f1916602001612d83565b8181528460208386010111156130da575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215613109575f80fd5b8435935061311960208601612d3b565b925060408501356001600160401b03811115613133575f80fd5b61313f8782880161308b565b949793965093946060013593505050565b5f8060408385031215613161575f80fd5b61316a83612d3b565b915061317860208401612d3b565b90509250929050565b5f60208284031215613191575f80fd5b81356001600160401b038111156131a6575f80fd5b612f358482850161308b565b5f80604083850312156131c3575f80fd5b82356001600160401b038111156131d8575f80fd5b6131e485828601612dd5565b92505060208301356001600160401b038111156131ff575f80fd5b8301601f8101851361320f575f80fd5b803561321d612df282612db3565b8082825260208201915060208360051b85010192508783111561323e575f80fd5b602084015b8381101561327e5780356001600160401b03811115613260575f80fd5b61326f8a60208389010161308b565b84525060209283019201613243565b50809450505050509250929050565b602080825282518282018190525f918401906040840190835b818110156132cd5783516001600160a01b03168352602093840193909201916001016132a6565b509095945050505050565b5f602082840312156132e8575f80fd5b815160ff81168114612275575f80fd5b5f60208284031215613308575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156133725780850481111561335657613356613323565b600184161561336457908102905b60019390931c92800261333b565b935093915050565b5f82613388575060016114cd565b8161339457505f6114cd565b81600181146133aa57600281146133b4576133d0565b60019150506114cd565b60ff8411156133c5576133c5613323565b50506001821b6114cd565b5060208310610133831016604e8410600b84101617156133f3575081810a6114cd565b6133ff5f198484613337565b805f190482111561341257613412613323565b029392505050565b5f61227560ff84168361337a565b80820281158282048414176114cd576114cd613323565b5f8261345957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f417272617973206d7573742068617665207468652073616d65206c656e677468604082015260600190565b808201808211156114cd576114cd613323565b5f81518060208401855e5f93019283525090919050565b5f61227582846134a6565b5f602082840312156134d8575f80fd5b81518015158114612275575f80fdfea26469706673582212200c7fd0577e0f0f0e1363a31ff9b7557a9ce093e8f703977507f4d6aa55eaa9a964736f6c634300081a0033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000001b66e82b3b7e99120f7889dd1998fc2883d8d7f4
Deployed Bytecode
0x6080604052600436106104ad575f3560e01c8063768ea56a1161026a578063b95eb38f1161014e578063d40d47b6116100c0578063ef8ff0ba11610084578063ef8ff0ba14610e9f578063f2fde38b14610ebe578063f4b2afc514610edd578063f64bfaba14610f0b578063f8a1d07f14610f2c578063fc0c546a14610f4b576104b4565b8063d40d47b614610ddb578063d42d0b1714610df0578063d5e3fa3c14610e27578063d64d696814610e52578063e4cf9e1614610e80576104b4565b8063c052525911610112578063c052525914610d15578063c12063af14610d49578063c2f6362a14610d68578063c8c325df14610d7c578063ca1e973814610d90578063d29e6c1a14610da4576104b4565b8063b95eb38f14610c57578063bbd1c9ec14610c6b578063bc48dcab14610c8a578063bd2a01d714610cca578063becf3add14610d00576104b4565b80639819d24e116101e7578063abf08304116101ab578063abf0830414610b8c578063ac48bd5a14610bc0578063af1366bb14610bd5578063b26a5eff14610c0e578063b3cd425414610c23578063b874487c14610c38576104b4565b80639819d24e14610af157806398ffe22714610b10578063a1170b4714610b46578063a72c3e5f14610b65578063aa3193d814610b79576104b4565b80638456cb591161022e5780638456cb5914610a555780638da5cb5b14610a695780638eee1e2114610a8a57806391b7f5ed14610abe57806396fe058214610add576104b4565b8063768ea56a146109da57806377b80467146109f85780637b1b1de614610a0c5780637de2b67d14610a2157806381e3c75d14610a40576104b4565b80634ad6eb2e116103915780636066d9541161030e57806366e226bd116102d257806366e226bd14610923578063690d83201461094257806369d87ab1146109615780636fdcbef414610980578063715018a61461099e57806373d4a13a146109b2576104b4565b80636066d9541461088d57806361eeaf25146108ac57806362bd689c146108c157806362c13c51146108e05780636681b9fd1461090e576104b4565b806359db80f81161035557806359db80f8146107fb5780635befb7251461081a5780635c975abb146108395780635cf138041461084f5780635e35359e1461086e576104b4565b80634ad6eb2e1461074b5780634df3cce4146107795780634fc720d514610798578063556214c6146107b7578063564ac655146107d0576104b4565b80632f48ab7d1161042a5780633b97e856116103ee5780633b97e856146106845780633c4b40b8146106af5780633e413bee146106ce5780633f4ba83a146106ed57806344f38baa14610701578063472be74a14610720576104b4565b80632f48ab7d146105f057806331cc5f6c1461062757806334b134041461064657806336de807e1461065b5780633aac69811461066f576104b4565b80631358272111610471578063135827211461056b578063194a33661461057f57806321724e851461059457806324e7c218146105a8578063256e15fe146105dc576104b4565b806305e97d2c146104c1578063080420be146104ff5780630d9c8e6d146105235780630def6882146105385780630f5a9d011461054c576104b4565b366104b457005b3480156104bf575f80fd5b005b3480156104cc575f80fd5b506104ec6104db366004612d56565b600d6020525f908152604090205481565b6040519081526020015b60405180910390f35b34801561050a575f80fd5b50610513610f6a565b60405190151581526020016104f6565b34801561052e575f80fd5b506104ec60035481565b348015610543575f80fd5b506004546104ec565b348015610557575f80fd5b506104bf610566366004612d56565b610f78565b348015610576575f80fd5b506007546104ec565b34801561058a575f80fd5b506104ec60075481565b34801561059f575f80fd5b506104bf61106c565b3480156105b3575f80fd5b506104ec6105c2366004612d56565b6001600160a01b03165f908152601e602052604090205490565b3480156105e7575f80fd5b506104bf611088565b3480156105fb575f80fd5b5060155461060f906001600160a01b031681565b6040516001600160a01b0390911681526020016104f6565b348015610632575f80fd5b506104bf610641366004612d56565b6110a5565b348015610651575f80fd5b506104ec600a5481565b348015610666575f80fd5b506008546104ec565b34801561067a575f80fd5b506104ec60095481565b34801561068f575f80fd5b5060065461069d9060ff1681565b60405160ff90911681526020016104f6565b3480156106ba575f80fd5b5060215461060f906001600160a01b031681565b3480156106d9575f80fd5b5060145461060f906001600160a01b031681565b3480156106f8575f80fd5b506104bf611133565b34801561070c575f80fd5b506104bf61071b366004612ea1565b611145565b34801561072b575f80fd5b506104ec61073a366004612d56565b601e6020525f908152604090205481565b348015610756575f80fd5b50610513610765366004612d56565b601d6020525f908152604090205460ff1681565b348015610784575f80fd5b506104bf610793366004612d56565b611204565b3480156107a3575f80fd5b506104bf6107b2366004612f04565b6112f4565b3480156107c2575f80fd5b50600b546105139060ff1681565b3480156107db575f80fd5b506104ec6107ea366004612d56565b60106020525f908152604090205481565b348015610806575f80fd5b506104bf610815366004612d56565b61135a565b348015610825575f80fd5b506104ec6b04d8c55aefb8c05b5c00000081565b348015610844575f80fd5b505f5460ff16610513565b34801561085a575f80fd5b506104bf610869366004612f3d565b6113e5565b348015610879575f80fd5b506104bf610888366004612f7e565b611486565b348015610898575f80fd5b506104ec6108a7366004612fb8565b6114a2565b3480156108b7575f80fd5b506104ec60175481565b3480156108cc575f80fd5b506104bf6108db366004612fb8565b6114d3565b3480156108eb575f80fd5b506105136108fa366004612d56565b60116020525f908152604090205460ff1681565b348015610919575f80fd5b506104ec60195481565b34801561092e575f80fd5b506104bf61093d366004612d56565b61153e565b34801561094d575f80fd5b506104bf61095c366004612d56565b6115ec565b34801561096c575f80fd5b506104bf61097b366004612fb8565b611685565b34801561098b575f80fd5b50600b5461051390610100900460ff1681565b3480156109a9575f80fd5b506104bf6116b3565b3480156109bd575f80fd5b506005546004545b604080519283526020830191909152016104f6565b3480156109e5575f80fd5b5060065461069d90610100900460ff1681565b348015610a03575f80fd5b506009546104ec565b348015610a17575f80fd5b506104ec60055481565b348015610a2c575f80fd5b506104bf610a3b366004612fb8565b6116c4565b348015610a4b575f80fd5b506104ec60045481565b348015610a60575f80fd5b506104bf6116d1565b348015610a74575f80fd5b505f5461010090046001600160a01b031661060f565b348015610a95575f80fd5b506104ec610aa4366004612d56565b6001600160a01b03165f9081526010602052604090205490565b348015610ac9575f80fd5b506104bf610ad8366004612fb8565b6116e1565b348015610ae8575f80fd5b506104ec6116ee565b348015610afc575f80fd5b506104bf610b0b366004612d56565b6116f9565b348015610b1b575f80fd5b50610513610b2a366004612d56565b6001600160a01b03165f90815260106020526040902054151590565b348015610b51575f80fd5b506104bf610b60366004612fcf565b611779565b348015610b70575f80fd5b50600a546104ec565b6104bf610b873660046130f6565b6118f2565b348015610b97575f80fd5b506104ec610ba6366004612d56565b6001600160a01b03165f9081526012602052604090205490565b348015610bcb575f80fd5b506104ec60025481565b348015610be0575f80fd5b50610513610bef366004613150565b601b60209081525f928352604080842090915290825290205460ff1681565b348015610c19575f80fd5b506104ec60085481565b348015610c2e575f80fd5b506104ec61271081565b348015610c43575f80fd5b506109c5610c52366004613181565b611c42565b348015610c62575f80fd5b506104bf611cad565b348015610c76575f80fd5b506104bf610c85366004612fb8565b611ccc565b348015610c95575f80fd5b5061060f610ca4366004613181565b8051602081830181018051601a825292820191909301209152546001600160a01b031681565b348015610cd5575f80fd5b506104ec610ce4366004613181565b8051602081830181018051828252928201919093012091525481565b348015610d0b575f80fd5b506104ec60185481565b348015610d20575f80fd5b506104ec610d2f366004612d56565b6001600160a01b03165f908152600d602052604090205490565b348015610d54575f80fd5b506104bf610d63366004612fb8565b611cd9565b348015610d73575f80fd5b50610513611ce6565b348015610d87575f80fd5b506104bf611cef565b348015610d9b575f80fd5b506005546104ec565b348015610daf575f80fd5b50610513610dbe366004612d56565b6001600160a01b03165f908152600c602052604090205460ff1690565b348015610de6575f80fd5b506104ec60165481565b348015610dfb575f80fd5b506104ec610e0a366004613181565b8051602081830181018051601f8252928201919093012091525481565b348015610e32575f80fd5b506104ec610e41366004612d56565b60126020525f908152604090205481565b348015610e5d575f80fd5b50610513610e6c366004612d56565b601c6020525f908152604090205460ff1681565b348015610e8b575f80fd5b506104ec610e9a366004612d56565b611d14565b348015610eaa575f80fd5b506104bf610eb93660046131b2565b611d80565b348015610ec9575f80fd5b506104bf610ed8366004612d56565b611ffc565b348015610ee8575f80fd5b50610513610ef7366004612d56565b600c6020525f908152604090205460ff1681565b348015610f16575f80fd5b50610f1f612036565b6040516104f6919061328d565b348015610f37575f80fd5b506104bf610f46366004612f04565b612042565b348015610f56575f80fd5b5060135461060f906001600160a01b031681565b5f610f736120a5565b905090565b610f806120d9565b6001600160a01b038116610fd45760405162461bcd60e51b8152602060048201526016602482015275555344432073686f756c646e2774206265207a65726f60501b60448201526064015b60405180910390fd5b601480546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa15801561102b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104f91906132d8565b600660016101000a81548160ff021916908360ff16021790555050565b6110746120d9565b600b80544260075561ffff19166001179055565b6110906120d9565b600b80544260085561ffff1916610100179055565b6110ad6120d9565b6014546040516370a0823160e01b81523060048201526111309183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d91906132f8565b6014546001600160a01b0316919061210b565b50565b61113b6120d9565b61114361216a565b565b61114d6120d9565b5f5b82518110156111ff57600c5f84838151811061116d5761116d61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff1615156001036111f7578181815181106111ae576111ae61330f565b6020026020010151600d5f8584815181106111cb576111cb61330f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20819055505b60010161114f565b505050565b61120c6120d9565b6001600160a01b0381166112625760405162461bcd60e51b815260206004820152601760248201527f546f6b656e2073686f756c646e2774206265207a65726f0000000000000000006044820152606401610fcb565b601380546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156112b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112dd91906132d8565b6006805460ff191660ff9290921691909117905550565b6112fc6120d9565b5f5b8151811015611356575f600c5f84848151811061131d5761131d61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016112fe565b5050565b6113626120d9565b6015546040516370a0823160e01b81523060048201526111309183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156113ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d291906132f8565b6015546001600160a01b0316919061210b565b6113ed6120d9565b5f5b82518110156111ff57600c5f84838151811061140d5761140d61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff16151560010361147e5781600d5f8584815181106114525761145261330f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20819055505b6001016113ef565b61148e6120d9565b6111ff6001600160a01b038416838361210b565b6006545f906114b59060ff16600a61341a565b826005546114c39190613428565b6114cd919061343f565b92915050565b6114db6120d9565b606481101580156114ed575061271081105b6115395760405162461bcd60e51b815260206004820152601d60248201527f526174652073686f756c64206265206c657373207468616e20313030250000006044820152606401610fcb565b601855565b6115466120d9565b6001600160a01b0381166115955760405162461bcd60e51b8152602060048201526016602482015275555344542073686f756c646e2774206265207a65726f60501b6044820152606401610fcb565b601580546001600160a01b0319166001600160a01b0383169081179091556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa15801561102b573d5f803e3d5ffd5b6115f46120d9565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f811461163d576040519150601f19603f3d011682016040523d82523d5f602084013e611642565b606091505b50509050806113565760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610fcb565b61168d6120d9565b600654610100900460ff166116a382600a613428565b6116ad9190613428565b60025550565b6116bb6120d9565b6111435f6121bb565b6116cc6120d9565b600a55565b6116d96120d9565b611143612213565b6116e96120d9565b600555565b5f610f73600e61224f565b6117016120d9565b6001600160a01b0381166117575760405162461bcd60e51b815260206004820181905260248201527f46756e64696e672057616c6c65742073686f756c646e2774206265207a65726f6044820152606401610fcb565b602180546001600160a01b0319166001600160a01b0392909216919091179055565b6117816120d9565b83518551146117a25760405162461bcd60e51b8152600401610fcb9061345e565b82518551146117c35760405162461bcd60e51b8152600401610fcb9061345e565b81518551146117e45760405162461bcd60e51b8152600401610fcb9061345e565b5f5b85518110156118e8575f8682815181106118025761180261330f565b602002602001015190505f86838151811061181f5761181f61330f565b602002602001015190505f86848151811061183c5761183c61330f565b602002602001015190505f8685815181106118595761185961330f565b602002602001015190508260165f8282546118749190613493565b90915550506001600160a01b0384165f90815260106020908152604080832086905560118252808320805460ff1916600117905560128252808320859055601e90915290208190556118c7600e85612258565b6118d8576118d6600e8561227c565b505b5050600190920191506117e69050565b5060195550505050565b6118fa612290565b6119026122e9565b5f841161195c5760405162461bcd60e51b815260206004820152602260248201527f4e6f742061636365707461626c6520746f2072657175697265203020746f6b656044820152616e2160f01b6064820152608401610fcb565b6006545f9061197490610100900460ff16600a61341a565b60055460065461198d90610100900460ff16600a61341a565b60065461199e9060ff16600a61341a565b6119a89089613428565b6119b29190613428565b6119bc919061343f565b6119c6919061343f565b90506b04d8c55aefb8c05b5c000000816016546119e39190613493565b1115611a3f5760405162461bcd60e51b815260206004820152602560248201527f4d6f7265207468616e206f766572616c6c2070726573616c6520616c6c6f636160448201526474696f6e2160d81b6064820152608401610fcb565b6001600160a01b03841615801590611a6f57506001600160a01b0384165f908152601c602052604090205460ff16155b15611a8057611a7e848461232e565b505b336001600160a01b0316601a84604051611a9a91906134bd565b908152604051908190036020019020546001600160a01b031603611b0e5760405162461bcd60e51b815260206004820152602560248201527f596f7520617265207573696e6720796f7572206f776e20726566657272616c20604482015264636f64652160d81b6064820152608401610fcb565b611b166120a5565b15611ba957335f908152600c602052604090205460ff16611b855760405162461bcd60e51b8152602060048201526024808201527f596f752068617665206e6f207065726d697373696f6e20666f72204f4720526f604482015263756e642160e01b6064820152608401610fcb565b335f818152600d6020526040902054611ba391908790869086612488565b50611c0d565b611bb16129e5565b15611bc557611ba333868560045486612488565b60405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973206e6f7420616c6c6f776564210000000000000000006044820152606401610fcb565b6b04d8c55aefb8c05b5c00000060165410611c3257611c2a611cad565b611c32611cef565b50611c3c60018055565b50505050565b5f80601f83604051611c5491906134bd565b90815260405190819003602001902054600654611c7b9060ff61010090910416600a61341a565b602085604051611c8b91906134bd565b908152602001604051809103902054611ca4919061343f565b91509150915091565b611cb56120d9565b600b5460ff161561114357600b805460ff19169055565b611cd46120d9565b600455565b611ce16120d9565b600955565b5f610f736129e5565b611cf76120d9565b600b54610100900460ff161561114357600b805461ff0019169055565b6014546040516370a0823160e01b81526001600160a01b0383811660048301525f9216906370a0823190602401602060405180830381865afa158015611d5c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114cd91906132f8565b611d886120d9565b8051825114611da95760405162461bcd60e51b8152600401610fcb9061345e565b5f5b82518110156111ff576005828281518110611dc857611dc861330f565b6020026020010151511015611e175760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420526566657272616c20436f646560581b6044820152606401610fcb565b601c5f848381518110611e2c57611e2c61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff1615611e9f5760405162461bcd60e51b815260206004820152601760248201527f526566657272657220616c7265616479206578697374730000000000000000006044820152606401610fcb565b5f6001600160a01b0316601a838381518110611ebd57611ebd61330f565b6020026020010151604051611ed291906134bd565b908152604051908190036020019020546001600160a01b031614611f385760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c20636f646520616c726561647920757365640000000000006044820152606401610fcb565b828181518110611f4a57611f4a61330f565b6020026020010151601a838381518110611f6657611f6661330f565b6020026020010151604051611f7b91906134bd565b90815260200160405180910390205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001601c5f858481518110611fc357611fc361330f565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611dab565b6120046120d9565b6001600160a01b03811661202d57604051631e4fbdf760e01b81525f6004820152602401610fcb565b611130816121bb565b6060610f73600e612a1e565b61204a6120d9565b5f5b8151811015611356576001600c5f84848151811061206c5761206c61330f565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff191691151591909117905560010161204c565b600b545f9060ff1680156120c85750426009546007546120c59190613493565b10155b8015610f7357505060075442101590565b5f546001600160a01b036101009091041633146111435760405163118cdaa760e01b8152336004820152602401610fcb565b6040516001600160a01b038381166024830152604482018390526111ff91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612a2a565b612172612a8b565b5f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f80546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b61221b6122e9565b5f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861219e3390565b5f6114cd825490565b6001600160a01b0381165f90815260018301602052604081205415155b9392505050565b5f612275836001600160a01b038416612ad3565b6002600154036122e25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610fcb565b6002600155565b5f5460ff16156111435760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610fcb565b5f6005825110156123795760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420526566657272616c20436f646560581b6044820152606401610fcb565b6001600160a01b0383165f908152601c602052604090205460ff161580156123d157505f6001600160a01b0316601a836040516123b691906134bd565b908152604051908190036020019020546001600160a01b0316145b6124275760405162461bcd60e51b815260206004820152602160248201527f596f75206372656174656420726566657272616c20636f646520616c726561646044820152607960f81b6064820152608401610fcb565b82601a8360405161243891906134bd565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b03948516179055949091165f908152601c90915292909220805460ff1916600190811790915592915050565b6006545f9081906124a290610100900460ff16600a61341a565b6005546006546124bb90610100900460ff16600a61341a565b6006546124cc9060ff16600a61341a565b6124d6908a613428565b6124e09190613428565b6124ea919061343f565b6124f4919061343f565b90505f612710601854836125089190613428565b612512919061343f565b6002546006549192505f9161252b9060ff16600a61341a565b612535908a613428565b61253f919061343f565b905061254a87612b1f565b612552575f91505b61255d898488612b78565b6125a95760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206c696d6974206578636565646564210000000000000000006044820152606401610fcb565b825f036125f85760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420746f6b656e206f75742076616c7565000000006044820152606401610fcb565b846001036126245760215460145461261f916001600160a01b03918216918c91168b612ba7565b612786565b8460020361264b5760215460155461261f916001600160a01b03918216918c91168b612ba7565b8460030361273e578034146126a25760405162461bcd60e51b815260206004820152601960248201527f496e636f72726563742045544820616d6f756e742073656e74000000000000006044820152606401610fcb565b6021546040515f916001600160a01b03169034908381818185875af1925050503d805f81146126ec576040519150601f19603f3d011682016040523d82523d5f602084013e6126f1565b606091505b50509050806127385760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610fcb565b50612786565b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636861696e206964656e74696669657200000000000000006044820152606401610fcb565b6001600160a01b0389165f90815260106020526040812080548592906127ad908490613493565b925050819055508260165f8282546127c59190613493565b909155506127d4905087612b1f565b156129a4575f601a886040516127ea91906134bd565b908152604051908190036020019020546001600160a01b0316905080156129a2576001600160a01b038a165f908152601160209081526040808320805460ff19166001179055601290915281208054859290612847908490613493565b90915550506001600160a01b0381165f908152601160209081526040808320805460ff19166001179055601290915281208054859290612888908490613493565b90915550506001600160a01b038a165f908152601d6020908152604091829020805460ff1916600117905590518a91906128c3908b906134bd565b90815260200160405180910390205f8282546128df9190613493565b90915550506001600160a01b038082165f908152601b60209081526040808320938e168352929052205460ff166129a2576001600160a01b0381165f908152601e60205260408120805460019290612938908490613493565b925050819055506001601f8960405161295191906134bd565b90815260200160405180910390205f82825461296d9190613493565b90915550506001600160a01b038082165f908152601b60209081526040808320938e16835292905220805460ff191660011790555b505b6129af600e33612258565b6129c0576129be600e3361227c565b505b8760195f8282546129d19190613493565b9091555060019a9950505050505050505050565b600b545f90610100900460ff168015612a0d575042600a54600854612a0a9190613493565b10155b8015610f7357505060085442101590565b60605f61227583612be0565b5f612a3e6001600160a01b03841683612c39565b905080515f14158015612a62575080806020019051810190612a6091906134c8565b155b156111ff57604051635274afe760e01b81526001600160a01b0384166004820152602401610fcb565b5f5460ff166111435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610fcb565b5f818152600183016020526040812054612b1857508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556114cd565b505f6114cd565b5f600582511015612b3157505f919050565b5f6001600160a01b0316601a83604051612b4b91906134bd565b908152604051908190036020019020546001600160a01b031603612b7057505f919050565b506001919050565b6001600160a01b0383165f908152601060205260408120548290612b9d908590613493565b1115949350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611c3c9186918216906323b872dd90608401612138565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612c2d57602002820191905f5260205f20905b815481526020019060010190808311612c19575b50505050509050919050565b606061227583835f845f80856001600160a01b03168486604051612c5d91906134bd565b5f6040518083038185875af1925050503d805f8114612c97576040519150601f19603f3d011682016040523d82523d5f602084013e612c9c565b606091505b5091509150612cac868383612cb6565b9695505050505050565b606082612ccb57612cc682612d12565b612275565b8151158015612ce257506001600160a01b0384163b155b15612d0b57604051639996b31560e01b81526001600160a01b0385166004820152602401610fcb565b5080612275565b805115612d225780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114612d51575f80fd5b919050565b5f60208284031215612d66575f80fd5b61227582612d3b565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612dab57612dab612d6f565b604052919050565b5f6001600160401b03821115612dcb57612dcb612d6f565b5060051b60200190565b5f82601f830112612de4575f80fd5b8135612df7612df282612db3565b612d83565b8082825260208201915060208360051b860101925085831115612e18575f80fd5b602085015b83811015612e3c57612e2e81612d3b565b835260209283019201612e1d565b5095945050505050565b5f82601f830112612e55575f80fd5b8135612e63612df282612db3565b8082825260208201915060208360051b860101925085831115612e84575f80fd5b602085015b83811015612e3c578035835260209283019201612e89565b5f8060408385031215612eb2575f80fd5b82356001600160401b03811115612ec7575f80fd5b612ed385828601612dd5565b92505060208301356001600160401b03811115612eee575f80fd5b612efa85828601612e46565b9150509250929050565b5f60208284031215612f14575f80fd5b81356001600160401b03811115612f29575f80fd5b612f3584828501612dd5565b949350505050565b5f8060408385031215612f4e575f80fd5b82356001600160401b03811115612f63575f80fd5b612f6f85828601612dd5565b95602094909401359450505050565b5f805f60608486031215612f90575f80fd5b612f9984612d3b565b9250612fa760208501612d3b565b929592945050506040919091013590565b5f60208284031215612fc8575f80fd5b5035919050565b5f805f805f60a08688031215612fe3575f80fd5b85356001600160401b03811115612ff8575f80fd5b61300488828901612dd5565b95505060208601356001600160401b0381111561301f575f80fd5b61302b88828901612e46565b94505060408601356001600160401b03811115613046575f80fd5b61305288828901612e46565b93505060608601356001600160401b0381111561306d575f80fd5b61307988828901612e46565b95989497509295608001359392505050565b5f82601f83011261309a575f80fd5b81356001600160401b038111156130b3576130b3612d6f565b6130c6601f8201601f1916602001612d83565b8181528460208386010111156130da575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215613109575f80fd5b8435935061311960208601612d3b565b925060408501356001600160401b03811115613133575f80fd5b61313f8782880161308b565b949793965093946060013593505050565b5f8060408385031215613161575f80fd5b61316a83612d3b565b915061317860208401612d3b565b90509250929050565b5f60208284031215613191575f80fd5b81356001600160401b038111156131a6575f80fd5b612f358482850161308b565b5f80604083850312156131c3575f80fd5b82356001600160401b038111156131d8575f80fd5b6131e485828601612dd5565b92505060208301356001600160401b038111156131ff575f80fd5b8301601f8101851361320f575f80fd5b803561321d612df282612db3565b8082825260208201915060208360051b85010192508783111561323e575f80fd5b602084015b8381101561327e5780356001600160401b03811115613260575f80fd5b61326f8a60208389010161308b565b84525060209283019201613243565b50809450505050509250929050565b602080825282518282018190525f918401906040840190835b818110156132cd5783516001600160a01b03168352602093840193909201916001016132a6565b509095945050505050565b5f602082840312156132e8575f80fd5b815160ff81168114612275575f80fd5b5f60208284031215613308575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156133725780850481111561335657613356613323565b600184161561336457908102905b60019390931c92800261333b565b935093915050565b5f82613388575060016114cd565b8161339457505f6114cd565b81600181146133aa57600281146133b4576133d0565b60019150506114cd565b60ff8411156133c5576133c5613323565b50506001821b6114cd565b5060208310610133831016604e8410600b84101617156133f3575081810a6114cd565b6133ff5f198484613337565b805f190482111561341257613412613323565b029392505050565b5f61227560ff84168361337a565b80820281158282048414176114cd576114cd613323565b5f8261345957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f417272617973206d7573742068617665207468652073616d65206c656e677468604082015260600190565b808201808211156114cd576114cd613323565b5f81518060208401855e5f93019283525090919050565b5f61227582846134a6565b5f602082840312156134d8575f80fd5b81518015158114612275575f80fdfea26469706673582212200c7fd0577e0f0f0e1363a31ff9b7557a9ce093e8f703977507f4d6aa55eaa9a964736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000001b66e82b3b7e99120f7889dd1998fc2883d8d7f4
-----Decoded View---------------
Arg [0] : _usdc (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [1] : _usdt (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [2] : _fundingWallet (address): 0x1B66e82B3b7E99120F7889dD1998fC2883d8d7f4
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [1] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [2] : 0000000000000000000000001b66e82b3b7e99120f7889dd1998fc2883d8d7f4
Deployed Bytecode Sourcemap
43348:17108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44138:58;;;;;;;;;;-1:-1:-1;44138:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;44138:58:0;;;;;;;;58343:91;;;;;;;;;;;;;:::i;:::-;;;730:14:1;;723:22;705:41;;693:2;678:18;58343:91:0;565:187:1;43674:34:0;;;;;;;;;;;;;;;;56902:119;;;;;;;;;;-1:-1:-1;56990:23:0;;56902:119;;48519:211;;;;;;;;;;-1:-1:-1;48519:211:0;;;;;:::i;:::-;;:::i;57029:105::-;;;;;;;;;;-1:-1:-1;57110:16:0;;57029:105;;43866:31;;;;;;;;;;;;;;;;46502:158;;;;;;;;;;;;;:::i;57493:126::-;;;;;;;;;;-1:-1:-1;57493:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;57588:23:0;57561:7;57588:23;;;:12;:23;;;;;;;57493:126;46668:166;;;;;;;;;;;;;:::i;44543:26::-;;;;;;;;;;-1:-1:-1;44543:26:0;;;;-1:-1:-1;;;;;44543:26:0;;;;;;-1:-1:-1;;;;;943:32:1;;;925:51;;913:2;898:18;44543:26:0;757:225:1;49985:126:0;;;;;;;;;;-1:-1:-1;49985:126:0;;;;;:::i;:::-;;:::i;43985:34::-;;;;;;;;;;;;;;;;57142:113;;;;;;;;;;-1:-1:-1;57227:20:0;;57142:113;;43948:30;;;;;;;;;;;;;;;;43797:26;;;;;;;;;;-1:-1:-1;43797:26:0;;;;;;;;;;;1159:4:1;1147:17;;;1129:36;;1117:2;1102:18;43797:26:0;987:184:1;45334:28:0;;;;;;;;;;-1:-1:-1;45334:28:0;;;;-1:-1:-1;;;;;45334:28:0;;;44510:26;;;;;;;;;;-1:-1:-1;44510:26:0;;;;-1:-1:-1;;;;;44510:26:0;;;46196:65;;;;;;;;;;;;;:::i;47350:383::-;;;;;;;;;;-1:-1:-1;47350:383:0;;;;;:::i;:::-;;:::i;45067:47::-;;;;;;;;;;-1:-1:-1;45067:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;44993:45;;;;;;;;;;-1:-1:-1;44993:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48292:219;;;;;;;;;;-1:-1:-1;48292:219:0;;;;;:::i;:::-;;:::i;50463:203::-;;;;;;;;;;-1:-1:-1;50463:203:0;;;;;:::i;:::-;;:::i;44028:21::-;;;;;;;;;;-1:-1:-1;44028:21:0;;;;;;;;44306:50;;;;;;;;;;-1:-1:-1;44306:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;50119:126;;;;;;;;;;-1:-1:-1;50119:126:0;;;;;:::i;:::-;;:::i;43569:68::-;;;;;;;;;;;;43616:21;43569:68;;19717:86;;;;;;;;;;-1:-1:-1;19764:4:0;19788:7;;;19717:86;;47741:377;;;;;;;;;;-1:-1:-1;47741:377:0;;;;;:::i;:::-;;:::i;49766:157::-;;;;;;;;;;-1:-1:-1;49766:157:0;;;;;:::i;:::-;;:::i;56064:162::-;;;;;;;;;;-1:-1:-1;56064:162:0;;;;;:::i;:::-;;:::i;44622:32::-;;;;;;;;;;;;;;;;49167:197;;;;;;;;;;-1:-1:-1;49167:197:0;;;;;:::i;:::-;;:::i;44363:48::-;;;;;;;;;;-1:-1:-1;44363:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44697:26;;;;;;;;;;;;;;;;48738:211;;;;;;;;;;-1:-1:-1;48738:211:0;;;;;:::i;:::-;;:::i;51597:218::-;;;;;;;;;;-1:-1:-1;51597:218:0;;;;;:::i;:::-;;:::i;49585:117::-;;;;;;;;;;-1:-1:-1;49585:117:0;;;;;:::i;:::-;;:::i;44056:25::-;;;;;;;;;;-1:-1:-1;44056:25:0;;;;;;;;;;;26284:103;;;;;;;;;;;;;:::i;46371:123::-;;;;;;;;;;-1:-1:-1;46447:13:0;;46462:23;;46371:123;;;;5591:25:1;;;5647:2;5632:18;;5625:34;;;;5564:18;46371:123:0;5417:248:1;43830:27:0;;;;;;;;;;-1:-1:-1;43830:27:0;;;;;;;;;;;57263:103;;;;;;;;;;-1:-1:-1;57343:15:0;;57263:103;;43762:28;;;;;;;;;;;;;;;;47222:120;;;;;;;;;;-1:-1:-1;47222:120:0;;;;;:::i;:::-;;:::i;43715:38::-;;;;;;;;;;;;;;;;46090:61;;;;;;;;;;;;;:::i;25609:87::-;;;;;;;;;;-1:-1:-1;25655:7:0;25682:6;;;;-1:-1:-1;;;;;25682:6:0;25609:87;;56366:137;;;;;;;;;;-1:-1:-1;56366:137:0;;;;;:::i;:::-;-1:-1:-1;;;;;56470:25:0;56443:7;56470:25;;;:15;:25;;;;;;;56366:137;49467:110;;;;;;;;;;-1:-1:-1;49467:110:0;;;;;:::i;:::-;;:::i;57971:105::-;;;;;;;;;;;;;:::i;48957:202::-;;;;;;;;;;-1:-1:-1;48957:202:0;;;;;:::i;:::-;;:::i;58084:124::-;;;;;;;;;;-1:-1:-1;58084:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;58171:25:0;58147:4;58171:25;;;:15;:25;;;;;;:29;;;58084:124;59216:1237;;;;;;;;;;-1:-1:-1;59216:1237:0;;;;;:::i;:::-;;:::i;57374:111::-;;;;;;;;;;-1:-1:-1;57458:19:0;;57374:111;;52245:1307;;;;;;:::i;:::-;;:::i;56511:127::-;;;;;;;;;;-1:-1:-1;56511:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;56606:24:0;56579:7;56606:24;;;:14;:24;;;;;;;56511:127;43644:21;;;;;;;;;;;;;;;;44818:63;;;;;;;;;;-1:-1:-1;44818:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;43904:35;;;;;;;;;;;;;;;;43508:54;;;;;;;;;;;;43557:5;43508:54;;57627:219;;;;;;;;;;-1:-1:-1;57627:219:0;;;;;:::i;:::-;;:::i;46842:116::-;;;;;;;;;;;;;:::i;48126:158::-;;;;;;;;;;-1:-1:-1;48126:158:0;;;;;:::i;:::-;;:::i;44732:55::-;;;;;;;;;;-1:-1:-1;44732:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44732:55:0;;;45242:47;;;;;;;;;;-1:-1:-1;45242:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44663:27;;;;;;;;;;;;;;;;56753:141;;;;;;;;;;-1:-1:-1;56753:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;56853:33:0;56826:7;56853:33;;;:23;:33;;;;;;;56753:141;47102:112;;;;;;;;;;-1:-1:-1;47102:112:0;;;;;:::i;:::-;;:::i;58442:99::-;;;;;;;;;;;;;:::i;46966:128::-;;;;;;;;;;;;;:::i;56646:99::-;;;;;;;;;;-1:-1:-1;56724:13:0;;56646:99;;58216:119;;;;;;;;;;-1:-1:-1;58216:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;58306:21:0;58282:4;58306:21;;;:11;:21;;;;;;;;;58216:119;44578:35;;;;;;;;;;;;;;;;45150:46;;;;;;;;;;-1:-1:-1;45150:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44418:49;;;;;;;;;;-1:-1:-1;44418:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;44921:42;;;;;;;;;;-1:-1:-1;44921:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56234:124;;;;;;;;;;-1:-1:-1;56234:124:0;;;;;:::i;:::-;;:::i;58549:659::-;;;;;;;;;;-1:-1:-1;58549:659:0;;;;;:::i;:::-;;:::i;26542:220::-;;;;;;;;;;-1:-1:-1;26542:220:0;;;;;:::i;:::-;;:::i;44088:43::-;;;;;;;;;;-1:-1:-1;44088:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;57854:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50253:202::-;;;;;;;;;;-1:-1:-1;50253:202:0;;;;;:::i;:::-;;:::i;44476:27::-;;;;;;;;;;-1:-1:-1;44476:27:0;;;;-1:-1:-1;;;;;44476:27:0;;;58343:91;58390:4;58414:12;:10;:12::i;:::-;58407:19;;58343:91;:::o;48519:211::-;25495:13;:11;:13::i;:::-;-1:-1:-1;;;;;48594:19:0;::::1;48586:54;;;::::0;-1:-1:-1;;;48586:54:0;;10801:2:1;48586:54:0::1;::::0;::::1;10783:21:1::0;10840:2;10820:18;;;10813:30;-1:-1:-1;;;10859:18:1;;;10852:52;10921:18;;48586:54:0::1;;;;;;;;;48651:4;:28:::0;;-1:-1:-1;;;;;;48651:28:0::1;-1:-1:-1::0;;;;;48651:28:0;::::1;::::0;;::::1;::::0;;;48707:15:::1;::::0;;-1:-1:-1;;;48707:15:0;;;;:13:::1;::::0;:15:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;48651:28;48707:15:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48690:14;;:32;;;;;;;;;;;;;;;;;;48519:211:::0;:::o;46502:158::-;25495:13;:11;:13::i;:::-;46559:9:::1;:16:::0;;46605:15:::1;46586:16;:34:::0;-1:-1:-1;;46631:21:0;46571:4:::1;46631:21:::0;;;46502:158::o;46668:166::-;25495:13;:11;:13::i;:::-;46729::::1;:20:::0;;46783:15:::1;46760:20;:38:::0;-1:-1:-1;;46809:17:0;46729:20:::1;46809:17:::0;;;46668:166::o;49985:126::-;25495:13;:11;:13::i;:::-;50073:4:::1;::::0;:29:::1;::::0;-1:-1:-1;;;50073:29:0;;50096:4:::1;50073:29;::::0;::::1;925:51:1::0;50050:53:0::1;::::0;50068:3;;-1:-1:-1;;;;;50073:4:0;;::::1;::::0;:14:::1;::::0;898:18:1;;50073:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50050:4;::::0;-1:-1:-1;;;;;50050:4:0::1;::::0;:53;:17:::1;:53::i;:::-;49985:126:::0;:::o;46196:65::-;25495:13;:11;:13::i;:::-;46243:10:::1;:8;:10::i;:::-;46196:65::o:0;47350:383::-;25495:13;:11;:13::i;:::-;47512:9:::1;47507:219;47531:12;:19;47527:1;:23;47507:219;;;47576:11;:28;47588:12;47601:1;47588:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;47576:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;47576:28:0;;::::1;;:36;;:28:::0;:36;47572:143:::1;;47676:20;47697:1;47676:23;;;;;;;;:::i;:::-;;;;;;;47633;:40;47657:12;47670:1;47657:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;47633:40:0::1;-1:-1:-1::0;;;;;47633:40:0::1;;;;;;;;;;;;:66;;;;47572:143;47552:3;;47507:219;;;;47350:383:::0;;:::o;48292:219::-;25495:13;:11;:13::i;:::-;-1:-1:-1;;;;;48371:20:0;::::1;48363:56;;;::::0;-1:-1:-1;;;48363:56:0;;11751:2:1;48363:56:0::1;::::0;::::1;11733:21:1::0;11790:2;11770:18;;;11763:30;11829:25;11809:18;;;11802:53;11872:18;;48363:56:0::1;11549:347:1::0;48363:56:0::1;48430:5;:30:::0;;-1:-1:-1;;;;;;48430:30:0::1;-1:-1:-1::0;;;;;48430:30:0;::::1;::::0;;::::1;::::0;;;48487:16:::1;::::0;;-1:-1:-1;;;48487:16:0;;;;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;48430:30;48487:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48471:13;:32:::0;;-1:-1:-1;;48471:32:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;48292:219:0:o;50463:203::-;25495:13;:11;:13::i;:::-;50557:9:::1;50552:107;50576:9;:16;50572:1;:20;50552:107;;;50642:5;50614:11;:25;50626:9;50636:1;50626:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50614:25:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50614:25:0;:33;;-1:-1:-1;;50614:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;50594:3:0::1;50552:107;;;;50463:203:::0;:::o;50119:126::-;25495:13;:11;:13::i;:::-;50207:4:::1;::::0;:29:::1;::::0;-1:-1:-1;;;50207:29:0;;50230:4:::1;50207:29;::::0;::::1;925:51:1::0;50184:53:0::1;::::0;50202:3;;-1:-1:-1;;;;;50207:4:0;;::::1;::::0;:14:::1;::::0;898:18:1;;50207:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50184:4;::::0;-1:-1:-1;;;;;50184:4:0::1;::::0;:53;:17:::1;:53::i;47741:377::-:0;25495:13;:11;:13::i;:::-;47900:9:::1;47895:216;47919:12;:19;47915:1;:23;47895:216;;;47964:11;:28;47976:12;47989:1;47976:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;47964:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;47964:28:0;;::::1;;:36;;:28:::0;:36;47960:140:::1;;48064:20;48021:23;:40;48045:12;48058:1;48045:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;48021:40:0::1;-1:-1:-1::0;;;;;48021:40:0::1;;;;;;;;;;;;:63;;;;47960:140;47940:3;;47895:216;;49766:157:::0;25495:13;:11;:13::i;:::-;49866:49:::1;-1:-1:-1::0;;;;;49866:35:0;::::1;49902:3:::0;49907:7;49866:35:::1;:49::i;56064:162::-:0;56204:13;;56136:7;;56198:19;;56204:13;;56198:2;:19;:::i;:::-;56180:13;56164;;:29;;;;:::i;:::-;56163:55;;;;:::i;:::-;56156:62;56064:162;-1:-1:-1;;56064:162:0:o;49167:197::-;25495:13;:11;:13::i;:::-;49254:3:::1;49245:5;:12;;:46;;;;;43557:5;49261;:30;49245:46;49237:88;;;::::0;-1:-1:-1;;;49237:88:0;;14062:2:1;49237:88:0::1;::::0;::::1;14044:21:1::0;14101:2;14081:18;;;14074:30;14140:31;14120:18;;;14113:59;14189:18;;49237:88:0::1;13860:353:1::0;49237:88:0::1;49336:12;:20:::0;49167:197::o;48738:211::-;25495:13;:11;:13::i;:::-;-1:-1:-1;;;;;48813:19:0;::::1;48805:54;;;::::0;-1:-1:-1;;;48805:54:0;;14420:2:1;48805:54:0::1;::::0;::::1;14402:21:1::0;14459:2;14439:18;;;14432:30;-1:-1:-1;;;14478:18:1;;;14471:52;14540:18;;48805:54:0::1;14218:346:1::0;48805:54:0::1;48870:4;:28:::0;;-1:-1:-1;;;;;;48870:28:0::1;-1:-1:-1::0;;;;;48870:28:0;::::1;::::0;;::::1;::::0;;;48926:15:::1;::::0;;-1:-1:-1;;;48926:15:0;;;;:13:::1;::::0;:15:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;48870:28;48926:15:::1;;;;;;;;;::::0;::::1;;;;51597:218:::0;25495:13;:11;:13::i;:::-;51662:12:::1;51688:3;-1:-1:-1::0;;;;;51680:17:0::1;51705:21;51680:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51661:70;;;51747:7;51742:66;;51771:25;::::0;-1:-1:-1;;;51771:25:0;;14981:2:1;51771:25:0::1;::::0;::::1;14963:21:1::0;15020:2;15000:18;;;14993:30;-1:-1:-1;;;15039:18:1;;;15032:45;15094:18;;51771:25:0::1;14779:339:1::0;49585:117:0;25495:13;:11;:13::i;:::-;49680:14:::1;::::0;::::1;::::0;::::1;;;49665:12;:7:::0;49675:2:::1;49665:12;:::i;:::-;:29;;;;:::i;:::-;49656:6;:38:::0;-1:-1:-1;49585:117:0:o;26284:103::-;25495:13;:11;:13::i;:::-;26349:30:::1;26376:1;26349:18;:30::i;47222:120::-:0;25495:13;:11;:13::i;:::-;47303:19:::1;:31:::0;47222:120::o;46090:61::-;25495:13;:11;:13::i;:::-;46135:8:::1;:6;:8::i;49467:110::-:0;25495:13;:11;:13::i;:::-;49539::::1;:30:::0;49467:110::o;57971:105::-;58020:7;58047:21;:12;:19;:21::i;48957:202::-;25495:13;:11;:13::i;:::-;-1:-1:-1;;;;;49045:28:0;::::1;49037:73;;;::::0;-1:-1:-1;;;49037:73:0;;15325:2:1;49037:73:0::1;::::0;::::1;15307:21:1::0;;;15344:18;;;15337:30;15403:34;15383:18;;;15376:62;15455:18;;49037:73:0::1;15123:356:1::0;49037:73:0::1;49121:13;:30:::0;;-1:-1:-1;;;;;;49121:30:0::1;-1:-1:-1::0;;;;;49121:30:0;;;::::1;::::0;;;::::1;::::0;;48957:202::o;59216:1237::-;25495:13;:11;:13::i;:::-;59504:19:::1;:26;59488:5;:12;:42;59480:87;;;;-1:-1:-1::0;;;59480:87:0::1;;;;;;;:::i;:::-;59602:19;:26;59586:5;:12;:42;59578:87;;;;-1:-1:-1::0;;;59578:87:0::1;;;;;;;:::i;:::-;59700:16;:23;59684:5;:12;:39;59676:84;;;;-1:-1:-1::0;;;59676:84:0::1;;;;;;;:::i;:::-;59778:9;59773:635;59797:5;:12;59793:1;:16;59773:635;;;59831:12;59846:5;59852:1;59846:8;;;;;;;;:::i;:::-;;;;;;;59831:23;;59869:22;59894:19;59914:1;59894:22;;;;;;;;:::i;:::-;;;;;;;59869:47;;59931:23;59957:19;59977:1;59957:22;;;;;;;;:::i;:::-;;;;;;;59931:48;;59994:21;60018:16;60035:1;60018:19;;;;;;;;:::i;:::-;;;;;;;59994:43;;60078:14;60054:20;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;60107:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;:38;;;60160:16:::1;:22:::0;;;;;:29;;-1:-1:-1;;60160:29:0::1;60185:4;60160:29;::::0;;60204:14:::1;:20:::0;;;;;:38;;;60257:12:::1;:18:::0;;;;;:34;;;60311:27:::1;:12;60123:4:::0;60311:21:::1;:27::i;:::-;60306:91;;60359:22;:12;60376:4:::0;60359:16:::1;:22::i;:::-;;60306:91;-1:-1:-1::0;;59811:3:0::1;::::0;;::::1;::::0;-1:-1:-1;59773:635:0::1;::::0;-1:-1:-1;59773:635:0::1;;-1:-1:-1::0;60420:11:0::1;:25:::0;-1:-1:-1;;;;59216:1237:0:o;52245:1307::-;23044:21;:19;:21::i;:::-;19322:19:::1;:17;:19::i;:::-;52454:1:::2;52444:7;:11;52436:58;;;::::0;-1:-1:-1;;;52436:58:0;;16177:2:1;52436:58:0::2;::::0;::::2;16159:21:1::0;16216:2;16196:18;;;16189:30;16255:34;16235:18;;;16228:62;-1:-1:-1;;;16306:18:1;;;16299:32;16348:19;;52436:58:0::2;15975:398:1::0;52436:58:0::2;52608:14;::::0;52507::::2;::::0;52602:20:::2;::::0;52608:14:::2;::::0;::::2;;;52602:2;:20;:::i;:::-;52584:13;::::0;52566:14:::2;::::0;52560:20:::2;::::0;52566:14:::2;::::0;::::2;;;52560:2;:20;:::i;:::-;52543:13;::::0;52537:19:::2;::::0;52543:13:::2;;52537:2;:19;:::i;:::-;52527:29;::::0;:7;:29:::2;:::i;:::-;52526:54;;;;:::i;:::-;52525:72;;;;:::i;:::-;52524:99;;;;:::i;:::-;52507:116;;43616:21;52675:6;52652:20;;:29;;;;:::i;:::-;:53;;52644:103;;;::::0;-1:-1:-1;;;52644:103:0;;16580:2:1;52644:103:0::2;::::0;::::2;16562:21:1::0;16619:2;16599:18;;;16592:30;16658:34;16638:18;;;16631:62;-1:-1:-1;;;16709:18:1;;;16702:35;16754:19;;52644:103:0::2;16378:401:1::0;52644:103:0::2;-1:-1:-1::0;;;;;52764:23:0;::::2;::::0;;::::2;::::0;:49:::2;;-1:-1:-1::0;;;;;;52792:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;::::2;;52791:22;52764:49;52760:117;;;52830:35;52845:9;52856:8;52830:14;:35::i;:::-;;52760:117;52932:10;-1:-1:-1::0;;;;;52897:45:0::2;:21;52919:8;52897:31;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;52897:31:0::2;:45:::0;52889:95:::2;;;::::0;-1:-1:-1;;;52889:95:0;;17400:2:1;52889:95:0::2;::::0;::::2;17382:21:1::0;17439:2;17419:18;;;17412:30;17478:34;17458:18;;;17451:62;-1:-1:-1;;;17529:18:1;;;17522:35;17574:19;;52889:95:0::2;17198:401:1::0;52889:95:0::2;53001:12;:10;:12::i;:::-;52997:417;;;53050:10;53038:23;::::0;;;:11:::2;:23;::::0;;;;;::::2;;53030:72;;;::::0;-1:-1:-1;;;53030:72:0;;17806:2:1;53030:72:0::2;::::0;::::2;17788:21:1::0;17845:2;17825:18;;;17818:30;17884:34;17864:18;;;17857:62;-1:-1:-1;;;17935:18:1;;;17928:34;17979:19;;53030:72:0::2;17604:400:1::0;53030:72:0::2;53130:10;53161:35;::::0;;;:23:::2;:35;::::0;;;;;53117:88:::2;::::0;53130:10;53142:7;;53151:8;;53198:6;53117:12:::2;:88::i;:::-;;52997:417;;;53227:16;:14;:16::i;:::-;53223:191;;;53260:76;53273:10;53285:7;53294:8;53304:23;;53329:6;53260:12;:76::i;53223:191::-;53369:33;::::0;-1:-1:-1;;;53369:33:0;;18211:2:1;53369:33:0::2;::::0;::::2;18193:21:1::0;18250:2;18230:18;;;18223:30;18289:25;18269:18;;;18262:53;18332:18;;53369:33:0::2;18009:347:1::0;53223:191:0::2;43616:21;53429:20;;:44;53426:119;;53490:12;:10;:12::i;:::-;53517:16;:14;:16::i;:::-;52425:1127;23088:20:::0;22482:1;23608:22;;23425:213;23088:20;52245:1307;;;;:::o;57627:219::-;57699:21;57722:26;57769:12;57782:8;57769:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;57822:14;;57818:18;;57822:14;;;;;;57818:2;:18;:::i;:::-;57793:13;57807:8;57793:23;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;;;;:::i;:::-;57761:77;;;;57627:219;;;:::o;46842:116::-;25495:13;:11;:13::i;:::-;46896:9:::1;::::0;::::1;;46892:59;;;46922:9;:17:::0;;-1:-1:-1;;46922:17:0::1;::::0;;46842:116::o;48126:158::-;25495:13;:11;:13::i;:::-;48226:23:::1;:50:::0;48126:158::o;47102:112::-;25495:13;:11;:13::i;:::-;47179:15:::1;:27:::0;47102:112::o;58442:99::-;58493:4;58517:16;:14;:16::i;46966:128::-;25495:13;:11;:13::i;:::-;47024::::1;::::0;::::1;::::0;::::1;;;47020:67;;;47054:13;:21:::0;;-1:-1:-1;;47054:21:0::1;::::0;;46966:128::o;56234:124::-;56327:4;;:23;;-1:-1:-1;;;56327:23:0;;-1:-1:-1;;;;;943:32:1;;;56327:23:0;;;925:51:1;56300:7:0;;56327:4;;:14;;898:18:1;;56327:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58549:659::-;25495:13;:11;:13::i;:::-;58716:9:::1;:16;58699:6;:13;:33;58691:78;;;;-1:-1:-1::0;;;58691:78:0::1;;;;;;;:::i;:::-;58787:9;58782:419;58806:6;:13;58802:1;:17;58782:419;;;58879:1;58855:9;58865:1;58855:12;;;;;;;;:::i;:::-;;;;;;;58849:26;:31;;58841:65;;;::::0;-1:-1:-1;;;58841:65:0;;18563:2:1;58841:65:0::1;::::0;::::1;18545:21:1::0;18602:2;18582:18;;;18575:30;-1:-1:-1;;;18621:18:1;;;18614:51;18682:18;;58841:65:0::1;18361:345:1::0;58841:65:0::1;58930:10;:21;58941:6;58948:1;58941:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;58930:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;58930:21:0;;::::1;;58929:22;58921:58;;;::::0;-1:-1:-1;;;58921:58:0;;18913:2:1;58921:58:0::1;::::0;::::1;18895:21:1::0;18952:2;18932:18;;;18925:30;18991:25;18971:18;;;18964:53;19034:18;;58921:58:0::1;18711:347:1::0;58921:58:0::1;59049:1;-1:-1:-1::0;;;;;59002:49:0::1;:21;59024:9;59034:1;59024:12;;;;;;;;:::i;:::-;;;;;;;59002:35;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;59002:35:0::1;:49;58994:88;;;::::0;-1:-1:-1;;;58994:88:0;;19265:2:1;58994:88:0::1;::::0;::::1;19247:21:1::0;19304:2;19284:18;;;19277:30;19343:28;19323:18;;;19316:56;19389:18;;58994:88:0::1;19063:350:1::0;58994:88:0::1;59137:6;59144:1;59137:9;;;;;;;;:::i;:::-;;;;;;;59099:21;59121:9;59131:1;59121:12;;;;;;;;:::i;:::-;;;;;;;59099:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;-1:-1:-1::0;;;;;59099:47:0::1;;;;;-1:-1:-1::0;;;;;59099:47:0::1;;;;;;59185:4;59161:10;:21;59172:6;59179:1;59172:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;59161:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;59161:21:0;:28;;-1:-1:-1;;59161:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;58821:3:0::1;58782:419;;26542:220:::0;25495:13;:11;:13::i;:::-;-1:-1:-1;;;;;26627:22:0;::::1;26623:93;;26673:31;::::0;-1:-1:-1;;;26673:31:0;;26701:1:::1;26673:31;::::0;::::1;925:51:1::0;898:18;;26673:31:0::1;757:225:1::0;26623:93:0::1;26726:28;26745:8;26726:18;:28::i;57854:109::-:0;57898:16;57934:21;:12;:19;:21::i;50253:202::-;25495:13;:11;:13::i;:::-;50347:9:::1;50342:106;50366:9;:16;50362:1;:20;50342:106;;;50432:4;50404:11;:25;50416:9;50426:1;50416:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50404:25:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50404:25:0;:32;;-1:-1:-1;;50404:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;50384:3:0::1;50342:106;;51118:188:::0;51187:9;;51163:4;;51187:9;;:70;;;;;51241:15;51221;;51202:16;;:34;;;;:::i;:::-;51201:55;;51187:70;:111;;;;-1:-1:-1;;51281:16:0;;51262:15;:35;;;51118:188::o;25774:166::-;25655:7;25682:6;-1:-1:-1;;;;;25682:6:0;;;;;17803:10;25834:23;25830:103;;25881:40;;-1:-1:-1;;;25881:40:0;;17803:10;25881:40;;;925:51:1;898:18;;25881:40:0;757:225:1;38731:162:0;38841:43;;-1:-1:-1;;;;;19610:32:1;;;38841:43:0;;;19592:51:1;19659:18;;;19652:34;;;38814:71:0;;38834:5;;38856:14;;;;;19565:18:1;;38841:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38841:43:0;;;;;;;;;;;38814:19;:71::i;20572:120::-;19581:16;:14;:16::i;:::-;20641:5:::1;20631:15:::0;;-1:-1:-1;;20631:15:0::1;::::0;;20662:22:::1;17803:10:::0;20671:12:::1;20662:22;::::0;-1:-1:-1;;;;;943:32:1;;;925:51;;913:2;898:18;20662:22:0::1;;;;;;;20572:120::o:0;26922:191::-;26996:16;27015:6;;-1:-1:-1;;;;;27032:17:0;;;27015:6;27032:17;;;-1:-1:-1;;;;;;27032:17:0;;;;;27065:40;;27015:6;;;;;;;27032:17;;27015:6;;27065:40;;;26985:128;26922:191;:::o;20313:118::-;19322:19;:17;:19::i;:::-;20373:7:::1;:14:::0;;-1:-1:-1;;20373:14:0::1;20383:4;20373:14;::::0;;20403:20:::1;20410:12;17803:10:::0;;17723:98;13060:117;13123:7;13150:19;13158:3;8360:18;;8277:109;12807:167;-1:-1:-1;;;;;12941:23:0;;12887:4;8157:21;;;:14;;;:21;;;;;;:26;;12911:55;12904:62;12807:167;-1:-1:-1;;;12807:167:0:o;12235:152::-;12305:4;12329:50;12334:3;-1:-1:-1;;;;;12354:23:0;;12329:4;:50::i;23124:293::-;22526:1;23258:7;;:19;23250:63;;;;-1:-1:-1;;;23250:63:0;;19899:2:1;23250:63:0;;;19881:21:1;19938:2;19918:18;;;19911:30;19977:33;19957:18;;;19950:61;20028:18;;23250:63:0;19697:355:1;23250:63:0;22526:1;23391:7;:18;23124:293::o;19876:108::-;19764:4;19788:7;;;19946:9;19938:38;;;;-1:-1:-1;;;19938:38:0;;20259:2:1;19938:38:0;;;20241:21:1;20298:2;20278:18;;;20271:30;-1:-1:-1;;;20317:18:1;;;20310:46;20373:18;;19938:38:0;20057:340:1;51823:414:0;51908:4;51959:1;51939:8;51933:22;:27;;51925:61;;;;-1:-1:-1;;;51925:61:0;;18563:2:1;51925:61:0;;;18545:21:1;18602:2;18582:18;;;18575:30;-1:-1:-1;;;18621:18:1;;;18614:51;18682:18;;51925:61:0;18361:345:1;51925:61:0;-1:-1:-1;;;;;52006:21:0;;;;;;:10;:21;;;;;;;;52005:22;:71;;;;;52074:1;-1:-1:-1;;;;;52031:45:0;:21;52053:8;52031:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;52031:31:0;:45;52005:71;51997:117;;;;-1:-1:-1;;;51997:117:0;;20604:2:1;51997:117:0;;;20586:21:1;20643:2;20623:18;;;20616:30;20682:34;20662:18;;;20655:62;-1:-1:-1;;;20733:18:1;;;20726:31;20774:19;;51997:117:0;20402:397:1;51997:117:0;52159:9;52125:21;52147:8;52125:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:43;;-1:-1:-1;;;;;;52125:43:0;-1:-1:-1;;;;;52125:43:0;;;;;;52179:21;;;;-1:-1:-1;52179:21:0;;;:10;:21;;;;;;;:28;;-1:-1:-1;;52179:28:0;-1:-1:-1;52179:28:0;;;;;;-1:-1:-1;51823:414:0;-1:-1:-1;;51823:414:0:o;53560:2454::-;53876:14;;53752:4;;;;53870:20;;53876:14;;;;;53870:2;:20;:::i;:::-;53852:13;;53834:14;;53828:20;;53834:14;;;;;53828:2;:20;:::i;:::-;53811:13;;53805:19;;53811:13;;53805:2;:19;:::i;:::-;53791:33;;:11;:33;:::i;:::-;53790:58;;;;:::i;:::-;53789:76;;;;:::i;:::-;53788:103;;;;:::i;:::-;53771:120;;53904:19;43557:5;53936:12;;53927:6;:21;;;;:::i;:::-;53926:48;;;;:::i;:::-;54045:6;;54028:13;;53904:70;;-1:-1:-1;53987:17:0;;54022:19;;54028:13;;54022:2;:19;:::i;:::-;54008:33;;:11;:33;:::i;:::-;54007:44;;;;:::i;:::-;53987:64;;54077:30;54098:8;54077:20;:30::i;:::-;54072:79;;54138:1;54124:15;;54072:79;54168:48;54186:8;54196:6;54204:11;54168:17;:48::i;:::-;54163:115;;54233:33;;-1:-1:-1;;;54233:33:0;;21006:2:1;54233:33:0;;;20988:21:1;21045:2;21025:18;;;21018:30;21084:25;21064:18;;;21057:53;21127:18;;54233:33:0;20804:347:1;54163:115:0;54294:6;54304:1;54294:11;54290:82;;54322:38;;-1:-1:-1;;;54322:38:0;;21358:2:1;54322:38:0;;;21340:21:1;21397:2;21377:18;;;21370:30;21436;21416:18;;;21409:58;21484:18;;54322:38:0;21156:352:1;54290:82:0;54450:6;54460:1;54450:11;54446:526;;54510:13;;54478:4;;:59;;-1:-1:-1;;;;;54478:4:0;;;;54500:8;;54510:13;54525:11;54478:21;:59::i;:::-;54446:526;;;54559:6;54569:1;54559:11;54555:417;;54619:13;;54587:4;;:59;;-1:-1:-1;;;;;54587:4:0;;;;54609:8;;54619:13;54634:11;54587:21;:59::i;54555:417::-;54668:6;54678:1;54668:11;54664:308;;54717:9;54704;:22;54696:60;;;;-1:-1:-1;;;54696:60:0;;21715:2:1;54696:60:0;;;21697:21:1;21754:2;21734:18;;;21727:30;21793:27;21773:18;;;21766:55;21838:18;;54696:60:0;21513:349:1;54696:60:0;54798:13;;54790:49;;54772:12;;-1:-1:-1;;;;;54798:13:0;;54825:9;;54772:12;54790:49;54772:12;54790:49;54825:9;54798:13;54790:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54771:68;;;54862:7;54854:39;;;;-1:-1:-1;;;54854:39:0;;22069:2:1;54854:39:0;;;22051:21:1;22108:2;22088:18;;;22081:30;-1:-1:-1;;;22127:18:1;;;22120:49;22186:18;;54854:39:0;21867:343:1;54854:39:0;54681:224;54664:308;;;54926:34;;-1:-1:-1;;;54926:34:0;;22417:2:1;54926:34:0;;;22399:21:1;22456:2;22436:18;;;22429:30;22495:26;22475:18;;;22468:54;22539:18;;54926:34:0;22215:348:1;54664:308:0;-1:-1:-1;;;;;54996:25:0;;;;;;:15;:25;;;;;:35;;55025:6;;54996:25;:35;;55025:6;;54996:35;:::i;:::-;;;;;;;;55066:6;55042:20;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;55089:30:0;;-1:-1:-1;55110:8:0;55089:20;:30::i;:::-;55085:752;;;55136:16;55155:21;55177:8;55155:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;55155:31:0;;-1:-1:-1;55205:22:0;;55201:625;;-1:-1:-1;;;;;55248:26:0;;;;;;:16;:26;;;;;;;;:33;;-1:-1:-1;;55248:33:0;55277:4;55248:33;;;55300:14;:24;;;;;:39;;55328:11;;55248:26;55300:39;;55328:11;;55300:39;:::i;:::-;;;;-1:-1:-1;;;;;;;55360:26:0;;;;;;:16;:26;;;;;;;;:33;;-1:-1:-1;;55360:33:0;55389:4;55360:33;;;55412:14;:24;;;;;:39;;55440:11;;55360:26;55412:39;;55440:11;;55412:39;:::i;:::-;;;;-1:-1:-1;;;;;;;55472:23:0;;;;;;:13;:23;;;;;;;;;:30;;-1:-1:-1;;55472:30:0;55498:4;55472:30;;;55521:23;;55548:11;;55472:23;55521;;55535:8;;55521:23;:::i;:::-;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;55597:21:0;;;;;;;:11;:21;;;;;;;;:31;;;;;;;;;;;;55592:219;;-1:-1:-1;;;;;55653:22:0;;;;;;:12;:22;;;;;:27;;55679:1;;55653:22;:27;;55679:1;;55653:27;:::i;:::-;;;;;;;;55729:1;55703:12;55716:8;55703:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;55753:21:0;;;;;;;:11;:21;;;;;;;;:31;;;;;;;;;:38;;-1:-1:-1;;55753:38:0;55787:4;55753:38;;;55592:219;55121:716;55085:752;55854:33;:12;55876:10;55854:21;:33::i;:::-;55849:95;;55904:28;:12;55921:10;55904:16;:28::i;:::-;;55849:95;55971:11;55956;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;56002:4:0;;53560:2454;-1:-1:-1;;;;;;;;;;53560:2454:0:o;51314:208::-;51387:13;;51363:4;;51387:13;;;;;:82;;;;;51453:15;51429:19;;51406:20;;:42;;;;:::i;:::-;51405:63;;51387:82;:127;;;;-1:-1:-1;;51493:20:0;;51474:15;:39;;;51314:208::o;14239:310::-;14302:16;14331:22;14356:19;14364:3;14356:7;:19::i;41542:638::-;41966:23;41992:33;-1:-1:-1;;;;;41992:27:0;;42020:4;41992:27;:33::i;:::-;41966:59;;42040:10;:17;42061:1;42040:22;;:57;;;;;42078:10;42067:30;;;;;;;;;;;;:::i;:::-;42066:31;42040:57;42036:137;;;42121:40;;-1:-1:-1;;;42121:40:0;;-1:-1:-1;;;;;943:32:1;;42121:40:0;;;925:51:1;898:18;;42121:40:0;757:225:1;20061:108:0;19764:4;19788:7;;;20120:41;;;;-1:-1:-1;;;20120:41:0;;23052:2:1;20120:41:0;;;23034:21:1;23091:2;23071:18;;;23064:30;-1:-1:-1;;;23110:18:1;;;23103:50;23170:18;;20120:41:0;22850:344:1;5982:416:0;6045:4;8157:21;;;:14;;;:21;;;;;;6062:329;;-1:-1:-1;6105:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;6290:18;;6266:21;;;:14;;;:21;;;;;;:42;;;;6323:11;;6062:329;-1:-1:-1;6374:5:0;6367:12;;50868:242;50945:4;50991:1;50972:8;50966:22;:26;50962:44;;;-1:-1:-1;51001:5:0;;50868:242;-1:-1:-1;50868:242:0:o;50962:44::-;51064:1;-1:-1:-1;;;;;51021:45:0;:21;51043:8;51021:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;51021:31:0;:45;51017:63;;-1:-1:-1;51075:5:0;;50868:242;-1:-1:-1;50868:242:0:o;51017:63::-;-1:-1:-1;51098:4:0;;50868:242;-1:-1:-1;50868:242:0:o;50674:186::-;-1:-1:-1;;;;;50803:25:0;;50779:4;50803:25;;;:15;:25;;;;;;50841:11;;50803:34;;50831:6;;50803:34;:::i;:::-;:49;;;50674:186;-1:-1:-1;;;;50674:186:0:o;39138:190::-;39266:53;;-1:-1:-1;;;;;23419:32:1;;;39266:53:0;;;23401:51:1;23488:32;;;23468:18;;;23461:60;23537:18;;;23530:34;;;39239:81:0;;39259:5;;39281:18;;;;;23374::1;;39266:53:0;23199:371:1;9410:111:0;9466:16;9502:3;:11;;9495:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9410:111;;;:::o;33857:153::-;33932:12;33964:38;33986:6;33994:4;34000:1;33932:12;34590;34604:23;34631:6;-1:-1:-1;;;;;34631:11:0;34650:5;34657:4;34631:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34589:73;;;;34680:55;34707:6;34715:7;34724:10;34680:26;:55::i;:::-;34673:62;34345:398;-1:-1:-1;;;;;;34345:398:0:o;35821:597::-;35969:12;35999:7;35994:417;;36023:19;36031:10;36023:7;:19::i;:::-;35994:417;;;36251:17;;:22;:49;;;;-1:-1:-1;;;;;;36277:18:0;;;:23;36251:49;36247:121;;;36328:24;;-1:-1:-1;;;36328:24:0;;-1:-1:-1;;;;;943:32:1;;36328:24:0;;;925:51:1;898:18;;36328:24:0;757:225:1;36247:121:0;-1:-1:-1;36389:10:0;36382:17;;36971:528;37104:17;;:21;37100:392;;37336:10;37330:17;37393:15;37380:10;37376:2;37372:19;37365:44;37100:392;37463:17;;-1:-1:-1;;;37463:17:0;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;1384:127::-;1445:10;1440:3;1436:20;1433:1;1426:31;1476:4;1473:1;1466:15;1500:4;1497:1;1490:15;1516:275;1587:2;1581:9;1652:2;1633:13;;-1:-1:-1;;1629:27:1;1617:40;;-1:-1:-1;;;;;1672:34:1;;1708:22;;;1669:62;1666:88;;;1734:18;;:::i;:::-;1770:2;1763:22;1516:275;;-1:-1:-1;1516:275:1:o;1796:183::-;1856:4;-1:-1:-1;;;;;1881:6:1;1878:30;1875:56;;;1911:18;;:::i;:::-;-1:-1:-1;1956:1:1;1952:14;1968:4;1948:25;;1796:183::o;1984:675::-;2038:5;2091:3;2084:4;2076:6;2072:17;2068:27;2058:55;;2109:1;2106;2099:12;2058:55;2149:6;2136:20;2176:64;2192:47;2232:6;2192:47;:::i;:::-;2176:64;:::i;:::-;2264:3;2288:6;2283:3;2276:19;2320:4;2315:3;2311:14;2304:21;;2381:4;2371:6;2368:1;2364:14;2356:6;2352:27;2348:38;2334:52;;2409:3;2401:6;2398:15;2395:35;;;2426:1;2423;2416:12;2395:35;2462:4;2454:6;2450:17;2476:152;2492:6;2487:3;2484:15;2476:152;;;2560:23;2579:3;2560:23;:::i;:::-;2548:36;;2613:4;2604:14;;;;2509;2476:152;;;-1:-1:-1;2646:7:1;1984:675;-1:-1:-1;;;;;1984:675:1:o;2664:723::-;2718:5;2771:3;2764:4;2756:6;2752:17;2748:27;2738:55;;2789:1;2786;2779:12;2738:55;2829:6;2816:20;2856:64;2872:47;2912:6;2872:47;:::i;2856:64::-;2944:3;2968:6;2963:3;2956:19;3000:4;2995:3;2991:14;2984:21;;3061:4;3051:6;3048:1;3044:14;3036:6;3032:27;3028:38;3014:52;;3089:3;3081:6;3078:15;3075:35;;;3106:1;3103;3096:12;3075:35;3142:4;3134:6;3130:17;3156:200;3172:6;3167:3;3164:15;3156:200;;;3264:17;;3294:18;;3341:4;3332:14;;;;3189;3156:200;;3392:590;3510:6;3518;3571:2;3559:9;3550:7;3546:23;3542:32;3539:52;;;3587:1;3584;3577:12;3539:52;3627:9;3614:23;-1:-1:-1;;;;;3652:6:1;3649:30;3646:50;;;3692:1;3689;3682:12;3646:50;3715:61;3768:7;3759:6;3748:9;3744:22;3715:61;:::i;:::-;3705:71;;;3829:2;3818:9;3814:18;3801:32;-1:-1:-1;;;;;3848:8:1;3845:32;3842:52;;;3890:1;3887;3880:12;3842:52;3913:63;3968:7;3957:8;3946:9;3942:24;3913:63;:::i;:::-;3903:73;;;3392:590;;;;;:::o;3987:348::-;4071:6;4124:2;4112:9;4103:7;4099:23;4095:32;4092:52;;;4140:1;4137;4130:12;4092:52;4180:9;4167:23;-1:-1:-1;;;;;4205:6:1;4202:30;4199:50;;;4245:1;4242;4235:12;4199:50;4268:61;4321:7;4312:6;4301:9;4297:22;4268:61;:::i;:::-;4258:71;3987:348;-1:-1:-1;;;;3987:348:1:o;4340:462::-;4433:6;4441;4494:2;4482:9;4473:7;4469:23;4465:32;4462:52;;;4510:1;4507;4500:12;4462:52;4550:9;4537:23;-1:-1:-1;;;;;4575:6:1;4572:30;4569:50;;;4615:1;4612;4605:12;4569:50;4638:61;4691:7;4682:6;4671:9;4667:22;4638:61;:::i;:::-;4628:71;4768:2;4753:18;;;;4740:32;;-1:-1:-1;;;;4340:462:1:o;4807:374::-;4884:6;4892;4900;4953:2;4941:9;4932:7;4928:23;4924:32;4921:52;;;4969:1;4966;4959:12;4921:52;4992:29;5011:9;4992:29;:::i;:::-;4982:39;;5040:38;5074:2;5063:9;5059:18;5040:38;:::i;:::-;4807:374;;5030:48;;-1:-1:-1;;;5147:2:1;5132:18;;;;5119:32;;4807:374::o;5186:226::-;5245:6;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;-1:-1:-1;5359:23:1;;5186:226;-1:-1:-1;5186:226:1:o;5670:1190::-;5865:6;5873;5881;5889;5897;5950:3;5938:9;5929:7;5925:23;5921:33;5918:53;;;5967:1;5964;5957:12;5918:53;6007:9;5994:23;-1:-1:-1;;;;;6032:6:1;6029:30;6026:50;;;6072:1;6069;6062:12;6026:50;6095:61;6148:7;6139:6;6128:9;6124:22;6095:61;:::i;:::-;6085:71;;;6209:2;6198:9;6194:18;6181:32;-1:-1:-1;;;;;6228:8:1;6225:32;6222:52;;;6270:1;6267;6260:12;6222:52;6293:63;6348:7;6337:8;6326:9;6322:24;6293:63;:::i;:::-;6283:73;;;6409:2;6398:9;6394:18;6381:32;-1:-1:-1;;;;;6428:8:1;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6493:63;6548:7;6537:8;6526:9;6522:24;6493:63;:::i;:::-;6483:73;;;6609:2;6598:9;6594:18;6581:32;-1:-1:-1;;;;;6628:8:1;6625:32;6622:52;;;6670:1;6667;6660:12;6622:52;6693:63;6748:7;6737:8;6726:9;6722:24;6693:63;:::i;:::-;5670:1190;;;;-1:-1:-1;5670:1190:1;;6825:3;6810:19;6797:33;;5670:1190;-1:-1:-1;;;5670:1190:1:o;6865:559::-;6908:5;6961:3;6954:4;6946:6;6942:17;6938:27;6928:55;;6979:1;6976;6969:12;6928:55;7019:6;7006:20;-1:-1:-1;;;;;7041:6:1;7038:30;7035:56;;;7071:18;;:::i;:::-;7115:59;7162:2;7139:17;;-1:-1:-1;;7135:31:1;7168:4;7131:42;7115:59;:::i;:::-;7199:6;7190:7;7183:23;7253:3;7246:4;7237:6;7229;7225:19;7221:30;7218:39;7215:59;;;7270:1;7267;7260:12;7215:59;7335:6;7328:4;7320:6;7316:17;7309:4;7300:7;7296:18;7283:59;7391:1;7362:20;;;7384:4;7358:31;7351:42;;;;7366:7;6865:559;-1:-1:-1;;;6865:559:1:o;7429:631::-;7525:6;7533;7541;7549;7602:3;7590:9;7581:7;7577:23;7573:33;7570:53;;;7619:1;7616;7609:12;7570:53;7664:23;;;-1:-1:-1;7730:38:1;7764:2;7749:18;;7730:38;:::i;:::-;7720:48;;7819:2;7808:9;7804:18;7791:32;-1:-1:-1;;;;;7838:6:1;7835:30;7832:50;;;7878:1;7875;7868:12;7832:50;7901;7943:7;7934:6;7923:9;7919:22;7901:50;:::i;:::-;7429:631;;;;-1:-1:-1;7891:60:1;;8024:2;8009:18;7996:32;;-1:-1:-1;;;7429:631:1:o;8065:260::-;8133:6;8141;8194:2;8182:9;8173:7;8169:23;8165:32;8162:52;;;8210:1;8207;8200:12;8162:52;8233:29;8252:9;8233:29;:::i;:::-;8223:39;;8281:38;8315:2;8304:9;8300:18;8281:38;:::i;:::-;8271:48;;8065:260;;;;;:::o;8330:322::-;8399:6;8452:2;8440:9;8431:7;8427:23;8423:32;8420:52;;;8468:1;8465;8458:12;8420:52;8508:9;8495:23;-1:-1:-1;;;;;8533:6:1;8530:30;8527:50;;;8573:1;8570;8563:12;8527:50;8596;8638:7;8629:6;8618:9;8614:22;8596:50;:::i;8657:1295::-;8785:6;8793;8846:2;8834:9;8825:7;8821:23;8817:32;8814:52;;;8862:1;8859;8852:12;8814:52;8902:9;8889:23;-1:-1:-1;;;;;8927:6:1;8924:30;8921:50;;;8967:1;8964;8957:12;8921:50;8990:61;9043:7;9034:6;9023:9;9019:22;8990:61;:::i;:::-;8980:71;;;9104:2;9093:9;9089:18;9076:32;-1:-1:-1;;;;;9123:8:1;9120:32;9117:52;;;9165:1;9162;9155:12;9117:52;9188:24;;9243:4;9235:13;;9231:27;-1:-1:-1;9221:55:1;;9272:1;9269;9262:12;9221:55;9312:2;9299:16;9335:64;9351:47;9391:6;9351:47;:::i;9335:64::-;9421:3;9445:6;9440:3;9433:19;9477:2;9472:3;9468:12;9461:19;;9532:2;9522:6;9519:1;9515:14;9511:2;9507:23;9503:32;9489:46;;9558:7;9550:6;9547:19;9544:39;;;9579:1;9576;9569:12;9544:39;9611:2;9607;9603:11;9623:299;9639:6;9634:3;9631:15;9623:299;;;9725:3;9712:17;-1:-1:-1;;;;;9748:11:1;9745:35;9742:55;;;9793:1;9790;9783:12;9742:55;9822:57;9871:7;9866:2;9852:11;9848:2;9844:20;9840:29;9822:57;:::i;:::-;9810:70;;-1:-1:-1;9909:2:1;9900:12;;;;9656;9623:299;;;9627:3;9941:5;9931:15;;;;;;8657:1295;;;;;:::o;9957:637::-;10147:2;10159:21;;;10229:13;;10132:18;;;10251:22;;;10099:4;;10330:15;;;10304:2;10289:18;;;10099:4;10373:195;10387:6;10384:1;10381:13;10373:195;;;10452:13;;-1:-1:-1;;;;;10448:39:1;10436:52;;10517:2;10543:15;;;;10508:12;;;;10484:1;10402:9;10373:195;;;-1:-1:-1;10585:3:1;;9957:637;-1:-1:-1;;;;;9957:637:1:o;10950:273::-;11018:6;11071:2;11059:9;11050:7;11046:23;11042:32;11039:52;;;11087:1;11084;11077:12;11039:52;11119:9;11113:16;11169:4;11162:5;11158:16;11151:5;11148:27;11138:55;;11189:1;11186;11179:12;11228:184;11298:6;11351:2;11339:9;11330:7;11326:23;11322:32;11319:52;;;11367:1;11364;11357:12;11319:52;-1:-1:-1;11390:16:1;;11228:184;-1:-1:-1;11228:184:1:o;11417:127::-;11478:10;11473:3;11469:20;11466:1;11459:31;11509:4;11506:1;11499:15;11533:4;11530:1;11523:15;11901:127;11962:10;11957:3;11953:20;11950:1;11943:31;11993:4;11990:1;11983:15;12017:4;12014:1;12007:15;12033:375;12121:1;12139:5;12153:249;12174:1;12164:8;12161:15;12153:249;;;12224:4;12219:3;12215:14;12209:4;12206:24;12203:50;;;12233:18;;:::i;:::-;12283:1;12273:8;12269:16;12266:49;;;12297:16;;;;12266:49;12380:1;12376:16;;;;;12336:15;;12153:249;;;12033:375;;;;;;:::o;12413:902::-;12462:5;12492:8;12482:80;;-1:-1:-1;12533:1:1;12547:5;;12482:80;12581:4;12571:76;;-1:-1:-1;12618:1:1;12632:5;;12571:76;12663:4;12681:1;12676:59;;;;12749:1;12744:174;;;;12656:262;;12676:59;12706:1;12697:10;;12720:5;;;12744:174;12781:3;12771:8;12768:17;12765:43;;;12788:18;;:::i;:::-;-1:-1:-1;;12844:1:1;12830:16;;12903:5;;12656:262;;13002:2;12992:8;12989:16;12983:3;12977:4;12974:13;12970:36;12964:2;12954:8;12951:16;12946:2;12940:4;12937:12;12933:35;12930:77;12927:203;;;-1:-1:-1;13039:19:1;;;13115:5;;12927:203;13162:42;-1:-1:-1;;13187:8:1;13181:4;13162:42;:::i;:::-;13240:6;13236:1;13232:6;13228:19;13219:7;13216:32;13213:58;;;13251:18;;:::i;:::-;13289:20;;12413:902;-1:-1:-1;;;12413:902:1:o;13320:140::-;13378:5;13407:47;13448:4;13438:8;13434:19;13428:4;13407:47;:::i;13465:168::-;13538:9;;;13569;;13586:15;;;13580:22;;13566:37;13556:71;;13607:18;;:::i;13638:217::-;13678:1;13704;13694:132;;13748:10;13743:3;13739:20;13736:1;13729:31;13783:4;13780:1;13773:15;13811:4;13808:1;13801:15;13694:132;-1:-1:-1;13840:9:1;;13638:217::o;15484:356::-;15686:2;15668:21;;;15705:18;;;15698:30;15764:34;15759:2;15744:18;;15737:62;15831:2;15816:18;;15484:356::o;15845:125::-;15910:9;;;15931:10;;;15928:36;;;15944:18;;:::i;16784:212::-;16826:3;16864:5;16858:12;16908:6;16901:4;16894:5;16890:16;16885:3;16879:36;16970:1;16934:16;;16959:13;;;-1:-1:-1;16934:16:1;;16784:212;-1:-1:-1;16784:212:1:o;17001:192::-;17132:3;17157:30;17183:3;17175:6;17157:30;:::i;22568:277::-;22635:6;22688:2;22676:9;22667:7;22663:23;22659:32;22656:52;;;22704:1;22701;22694:12;22656:52;22736:9;22730:16;22789:5;22782:13;22775:21;22768:5;22765:32;22755:60;;22811:1;22808;22801:12
Swarm Source
ipfs://0c7fd0577e0f0f0e1363a31ff9b7557a9ce093e8f703977507f4d6aa55eaa9a9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.