Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 183 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 20654593 | 137 days ago | IN | 0 ETH | 0.00004104 | ||||
Withdraw | 12977328 | 1257 days ago | IN | 0 ETH | 0.00369482 | ||||
Withdraw | 12977101 | 1258 days ago | IN | 0 ETH | 0.00360238 | ||||
Withdraw | 12974836 | 1258 days ago | IN | 0 ETH | 0.00522652 | ||||
Withdraw | 12956324 | 1261 days ago | IN | 0 ETH | 0.00140658 | ||||
Harvest | 12952096 | 1261 days ago | IN | 0 ETH | 0.00252312 | ||||
Withdraw | 12881030 | 1273 days ago | IN | 0 ETH | 0.00055258 | ||||
Activate | 12753021 | 1293 days ago | IN | 0 ETH | 0.00124974 | ||||
Activate | 12606959 | 1315 days ago | IN | 0 ETH | 0.00187537 | ||||
Activate | 12391044 | 1349 days ago | IN | 0 ETH | 0.00681882 | ||||
Activate | 12351705 | 1355 days ago | IN | 0 ETH | 0.00369392 | ||||
Activate | 12313284 | 1361 days ago | IN | 0 ETH | 0.00459245 | ||||
Activate | 12307784 | 1362 days ago | IN | 0 ETH | 0.00462403 | ||||
Activate | 12172897 | 1382 days ago | IN | 0 ETH | 0.0109447 | ||||
Withdraw | 12130104 | 1389 days ago | IN | 0 ETH | 0.00882805 | ||||
Withdraw | 12125147 | 1390 days ago | IN | 0 ETH | 0.00514037 | ||||
Activate | 12125135 | 1390 days ago | IN | 0 ETH | 0.01187545 | ||||
Withdraw | 12124247 | 1390 days ago | IN | 0 ETH | 0.00462221 | ||||
Activate | 12118789 | 1391 days ago | IN | 0 ETH | 0.01059476 | ||||
Withdraw | 12118764 | 1391 days ago | IN | 0 ETH | 0.00272749 | ||||
Withdraw | 12118764 | 1391 days ago | IN | 0 ETH | 0.00609108 | ||||
Withdraw | 12109690 | 1392 days ago | IN | 0 ETH | 0.00784218 | ||||
Harvest And With... | 12106334 | 1393 days ago | IN | 0 ETH | 0.01195833 | ||||
Harvest | 12106254 | 1393 days ago | IN | 0 ETH | 0.01208753 | ||||
Harvest | 12106223 | 1393 days ago | IN | 0 ETH | 0.00861474 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SpaceFarm
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-07 */ pragma solidity 0.6.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @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 Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @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, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @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. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ 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 of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @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._indexes[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 read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 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 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[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._indexes[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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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(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(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(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(uint256(_at(set._inner, index))); } // 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 on 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 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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } interface IMigratorChef { // Perform LP token migration from legacy UniswapV2 to Testa. // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. // Return the new LP token address. // // XXX Migrator must have allowance access to UniswapV2 LP tokens. // Testa must mint EXACTLY the same amount of Testa LP tokens or // else something bad will happen. Traditional UniswapV2 does not // do that so be careful! function migrate(IERC20 token) external returns (IERC20); } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier * available, which can be aplied 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. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once Testa is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract SpaceFarm is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. mapping (uint256 => uint256) pendingTesta; mapping (uint256 => uint256) rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of Testa // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accTestaPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accTestaPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 jETHToken; // Address of LP token contract. IUniswapV2Pair uniswap; uint112 startLiquidity; uint256 allocPoint; // How many allocation points assigned to this pool. Testa to distribute per block. uint256 lastRewardBlock; // Last block number that Testa distribution occurs. uint256 accTestaPerShare; // Accumulated Testa per share, times 1e18. See below. uint256 debtIndexKey; uint256 startBlock; uint256 initStartBlock; } // The Testa TOKEN! address public testa; address public jTesta; // Testa tokens created per block. uint256 public testaPerBlock; uint256 public jTestaAmount; // Bonus muliplier for early testa makers. uint256 public constant BONUS_MULTIPLIER = 10; // The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; uint256 public activeReward = 10; int public progressive = 0; int public maxProgressive; int public minProgressive; uint256 public numberOfBlock; uint112 public startLiquidity; uint112 public currentLiquidity; AggregatorV3Interface public priceFeed; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor( address _testa, address _jTesta, address _priceFeed, int _minProgressive, int _maxProgressive, uint256 activateAtBlock, uint256 _testaPerBlock, uint256 _jTestaAmount ) public { testa = _testa; jTesta = _jTesta; priceFeed = AggregatorV3Interface(_priceFeed); minProgressive = _minProgressive; maxProgressive = _maxProgressive; numberOfBlock = activateAtBlock; testaPerBlock = _testaPerBlock; jTestaAmount = _jTestaAmount; } /// @dev Require that the caller must be an EOA account to avoid flash loans. modifier onlyEOA() { require(msg.sender == tx.origin, "Not EOA"); _; } modifier validPool(uint256 _pid) { require(_pid < poolInfo.length); _; } function setjTestaAmount(uint256 _jTestaAmount) public onlyOwner { jTestaAmount = _jTestaAmount; } function setTestaPerBlock(uint256 _testaPerBlock) public onlyOwner{ testaPerBlock = _testaPerBlock; } function setProgressive(int _maxProgressive, int _minProgressive) public onlyOwner{ maxProgressive = _maxProgressive; minProgressive = _minProgressive; } function setNumberOfBlock(uint256 _numberOfBlock) public onlyOwner{ numberOfBlock = _numberOfBlock; } function setActiveReward(uint256 _activeReward) public onlyOwner{ activeReward = _activeReward; } function harvestAndWithdraw(uint256 _pid, uint256 _amount) public nonReentrant validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 jETHSupply = pool.jETHToken.balanceOf(address(this)); require(getCountDown(_pid) <= numberOfBlock); require((progressive == maxProgressive) && (jETHSupply != 0), "Must have jETHSupply and reach maxProgressive to harvest"); require(user.amount >= _amount, "No jETHToken cannot withdraw"); updatePool(_pid); uint256 testaAmount = pendingTesta( _pid, msg.sender); if(_amount > 0) { user.amount = user.amount.sub(_amount); user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); user.pendingTesta[pool.debtIndexKey] = 0; pool.jETHToken.safeTransfer(address(msg.sender), _amount); safeTestaTransfer(msg.sender, testaAmount); } emit Withdraw(msg.sender, _pid, _amount); } function harvest(uint256 _pid) public nonReentrant validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 lpSupply = pool.jETHToken.balanceOf(address(this)); require(getCountDown(_pid) <= numberOfBlock); require((progressive == maxProgressive) && (lpSupply != 0), "Must have jETHSupply and reach maxProgressive to harvest"); require(user.amount > 0, "No jETHToken cannot withdraw"); updatePool(_pid); uint256 testaAmount = pendingTesta( _pid, msg.sender); user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); user.pendingTesta[pool.debtIndexKey] = 0; safeTestaTransfer(msg.sender, testaAmount); } function firstActivate(uint256 _pid) public onlyEOA nonReentrant validPool(_pid) { require(IERC20(jTesta).balanceOf(msg.sender) >= jTestaAmount, "Insufficient jTesta amount"); currentLiquidity = getLiquidity(_pid); PoolInfo storage pool = poolInfo[_pid]; require(pool.initStartBlock == pool.startBlock); require(block.number >= pool.initStartBlock, "Cannot activate until the specific block time arrive"); pool.startBlock = getLatestBlock(); pool.startLiquidity = currentLiquidity; // send Testa to user who press activate button safeTestaTransfer(msg.sender, getTestaReward(_pid)); } function activate(uint256 _pid) public onlyEOA nonReentrant validPool(_pid) { require(IERC20(jTesta).balanceOf(msg.sender) >= jTestaAmount, "Insufficient jTesta amount"); currentLiquidity = getLiquidity(_pid); PoolInfo storage pool = poolInfo[_pid]; require(pool.initStartBlock != pool.startBlock); require(getCountDown(_pid) >= numberOfBlock, "Cannot activate until specific amount of blocks pass"); if(currentLiquidity > pool.startLiquidity){ progressive++; }else{ progressive--; } if(progressive <= minProgressive){ progressive = minProgressive; clearPool(_pid); }else if(progressive >= maxProgressive){ progressive = maxProgressive; } pool.startBlock = getLatestBlock(); pool.startLiquidity = currentLiquidity; // send Testa to user who press activate button safeTestaTransfer(msg.sender, getTestaReward(_pid)); } function getTestaPoolBalance() public view returns (uint256){ return IERC20(testa).balanceOf(address(this)); } function getProgressive() public view returns (int){ return progressive; } function getLatestBlock() public view returns (uint256) { return block.number; } function getCountDown(uint256 _pid) public view returns (uint256){ require(getLatestBlock() > getStartedBlock(_pid)); return getLatestBlock().sub(getStartedBlock(_pid)); } function getStartedBlock(uint256 _pid) public view returns (uint256){ PoolInfo storage pool = poolInfo[_pid]; return pool.startBlock; } function getLiquidity(uint256 _pid) public view returns (uint112){ PoolInfo storage pool = poolInfo[_pid]; ( , uint112 _reserve1, ) = pool.uniswap.getReserves(); return _reserve1; } function getLatestPrice() public view returns (int) { ( uint80 roundID, int price, uint startedAt, uint timeStamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); // If the round is not complete yet, timestamp is 0 require(timeStamp > 0, "Round not complete"); return price; } function getTestaReward(uint256 _pid) public view returns (uint256){ PoolInfo storage pool = poolInfo[_pid]; (uint112 _reserve0, uint112 _reserve1, ) = pool.uniswap.getReserves(); uint256 reserve = uint256(_reserve0).mul(1e18).div(uint256(_reserve1)); uint256 ethPerDollar = uint256(getLatestPrice()).mul(1e10); // 1e8 uint256 testaPerDollar = ethPerDollar.mul(1e18).div(reserve); uint256 _activeReward = activeReward.mul(1e18); uint256 testaAmount = _activeReward.mul(1e18).div(testaPerDollar); return testaAmount; } function poolLength() external view returns (uint256) { return poolInfo.length; } function checkPoolDuplicate(IERC20 jETHToken) internal { uint256 length = poolInfo.length; for(uint256 pid = 0; pid < length; ++pid) { require(poolInfo[pid].jETHToken != jETHToken, "add: existing pool?"); } } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 startBlock, uint256 _allocPoint, address _lpToken, address _jETHToken, bool _withUpdate) public onlyOwner { checkPoolDuplicate(IERC20(_jETHToken)); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); IUniswapV2Pair uniswap = IUniswapV2Pair(_lpToken); ( , uint112 _reserve1, ) = uniswap.getReserves(); poolInfo.push(PoolInfo({ jETHToken: IERC20(_jETHToken), allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accTestaPerShare: 0, debtIndexKey: 0, uniswap: uniswap, startLiquidity: _reserve1, startBlock: startBlock, initStartBlock: startBlock })); } // Update the given pool's Testa allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner validPool(_pid) { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } // Set the migrator contract. Can only be called by the owner. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { return _to.sub(_from); } function clearPool(uint256 _pid) internal validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; pool.accTestaPerShare = 0; pool.lastRewardBlock = block.number; pool.debtIndexKey++; } // View function to see pending Testa on frontend. function pendingTesta(uint256 _pid, address _user) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accTestaPerShare = pool.accTestaPerShare; uint256 jETHSupply = pool.jETHToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && jETHSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 testaReward = multiplier.mul(testaPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accTestaPerShare = accTestaPerShare.add(testaReward.mul(1e18).div(jETHSupply)); } uint256 rewardDebt = user.rewardDebt[pool.debtIndexKey]; return user.amount.mul(accTestaPerShare).div(1e18).sub(rewardDebt).add(user.pendingTesta[pool.debtIndexKey]); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 jETHSupply = pool.jETHToken.balanceOf(address(this)); if (jETHSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 testaReward = multiplier.mul(testaPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accTestaPerShare = pool.accTestaPerShare.add(testaReward.mul(1e18).div(jETHSupply)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to TestaFarm for Testa allocation. function deposit(uint256 _pid, uint256 _amount) public validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { user.pendingTesta[pool.debtIndexKey] = pendingTesta(_pid, msg.sender); } if(_amount > 0) { pool.jETHToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from TestaFarm. function withdraw(uint256 _pid, uint256 _amount) public validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "No jETHToken cannot withdraw"); updatePool(_pid); if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.jETHToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt[pool.debtIndexKey] = user.amount.mul(pool.accTestaPerShare).div(1e18); user.pendingTesta[pool.debtIndexKey] = 0; emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 _amount = user.amount; user.amount = 0; user.rewardDebt[pool.debtIndexKey] = 0; pool.jETHToken.safeTransfer(address(msg.sender), _amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); } // Safe testa transfer function, just in case if rounding error causes pool to not have enough Testa. function safeTestaTransfer(address _to, uint256 _amount) internal { uint256 testaBal = IERC20(testa).balanceOf(address(this)); if (_amount > testaBal) { testa.call(abi.encodeWithSignature("transfer(address,uint256)", _to, testaBal)); } else { testa.call(abi.encodeWithSignature("transfer(address,uint256)", _to, _amount)); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_testa","type":"address"},{"internalType":"address","name":"_jTesta","type":"address"},{"internalType":"address","name":"_priceFeed","type":"address"},{"internalType":"int256","name":"_minProgressive","type":"int256"},{"internalType":"int256","name":"_maxProgressive","type":"int256"},{"internalType":"uint256","name":"activateAtBlock","type":"uint256"},{"internalType":"uint256","name":"_testaPerBlock","type":"uint256"},{"internalType":"uint256","name":"_jTestaAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_jETHToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentLiquidity","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"firstActivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getCountDown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getLiquidity","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProgressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getStartedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTestaPoolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getTestaReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"harvestAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jTesta","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jTestaAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxProgressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minProgressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTesta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"jETHToken","type":"address"},{"internalType":"contract IUniswapV2Pair","name":"uniswap","type":"address"},{"internalType":"uint112","name":"startLiquidity","type":"uint112"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accTestaPerShare","type":"uint256"},{"internalType":"uint256","name":"debtIndexKey","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"initStartBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"progressive","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_activeReward","type":"uint256"}],"name":"setActiveReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfBlock","type":"uint256"}],"name":"setNumberOfBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_maxProgressive","type":"int256"},{"internalType":"int256","name":"_minProgressive","type":"int256"}],"name":"setProgressive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_testaPerBlock","type":"uint256"}],"name":"setTestaPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_jTestaAmount","type":"uint256"}],"name":"setjTestaAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLiquidity","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testaPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600955600a80556000600b553480156200001f57600080fd5b5060405162004d0038038062004d0083398181016040526101008110156200004657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000af6200024860201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555087600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600d8190555083600c8190555082600e819055508160048190555080600581905550505050505050505062000250565b600033905090565b614aa080620002606000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80638aa2855011610167578063b827f556116100ce578063e2bbb15811610087578063e2bbb15814610b2f578063f07637fe14610b67578063f2fde38b14610b9b578063f8f0975a14610bdf578063f978cfc214610c0d578063fb8fc8d414610c3b576102a0565b8063b827f556146109c5578063c17a1013146109fd578063cb99b8d314610a31578063d48330d814610ab5578063d48c14d514610ad3578063ddc6326214610b01576102a0565b8063947c345711610120578063947c3457146108bd578063951583c3146108db578063965a89531461092d57806396e3369b1461094b578063b260c42a14610979578063b7f51898146109a7576102a0565b80638aa285501461075d5780638b27bace1461077b5780638da5cb5b146107bd5780638dbb1e3a146107f15780638e15f4731461083d57806393f1a40b1461085b576102a0565b806361d6f78a1161020b578063741bef1a116101c4578063741bef1a146106255780637cd07e471461065957806384d4127f1461068d57806384dcaf7c146106cf57806385ecc89b146106ed57806386fadfa21461071b576102a0565b806361d6f78a1461057357806362c3654514610591578063630b5ba1146105af57806364482f79146105b9578063715018a6146105fd578063731af93714610607576102a0565b8063370b1cdd1161025d578063370b1cdd14610417578063441a3e701461047957806346caf2ae146104b157806351eb05a6146104df5780635312ea8e1461050d5780635e446ab71461053b576102a0565b8063081e3eda146102a55780631526fe27146102c357806317caf6f1146103795780631ce6fbb71461039757806323cf3118146103b557806325901421146103f9575b600080fd5b6102ad610c69565b6040518082815260200191505060405180910390f35b6102ef600480360360208110156102d957600080fd5b8101908080359060200190929190505050610c76565b604051808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001886dffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b610381610d2b565b6040518082815260200191505060405180910390f35b61039f610d31565b6040518082815260200191505060405180910390f35b6103f7600480360360208110156103cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d37565b005b610401610e43565b6040518082815260200191505060405180910390f35b6104636004803603604081101561042d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e49565b6040518082815260200191505060405180910390f35b6104af6004803603604081101561048f57600080fd5b8101908080359060200190929190803590602001909291905050506110db565b005b6104b9611322565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b61050b600480360360208110156104f557600080fd5b8101908080359060200190929190505050611342565b005b6105396004803603602081101561052357600080fd5b8101908080359060200190929190505050611519565b005b6105716004803603604081101561055157600080fd5b810190808035906020019092919080359060200190929190505050611679565b005b61057b611753565b6040518082815260200191505060405180910390f35b61059961175b565b6040518082815260200191505060405180910390f35b6105b7611765565b005b6105fb600480360360608110156105cf57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611792565b005b6106056118ef565b005b61060f611a75565b6040518082815260200191505060405180910390f35b61062d611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610661611aa1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b9600480360360208110156106a357600080fd5b8101908080359060200190929190505050611ac7565b6040518082815260200191505060405180910390f35b6106d7611af4565b6040518082815260200191505060405180910390f35b6107196004803603602081101561070357600080fd5b8101908080359060200190929190505050611afa565b005b6107476004803603602081101561073157600080fd5b8101908080359060200190929190505050611bcc565b6040518082815260200191505060405180910390f35b610765611c12565b6040518082815260200191505060405180910390f35b6107a76004803603602081101561079157600080fd5b8101908080359060200190929190505050611c17565b6040518082815260200191505060405180910390f35b6107c5611dff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108276004803603604081101561080757600080fd5b810190808035906020019092919080359060200190929190505050611e28565b6040518082815260200191505060405180910390f35b610845611e45565b6040518082815260200191505060405180910390f35b6108a76004803603604081101561087157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa4565b6040518082815260200191505060405180910390f35b6108c5611fcf565b6040518082815260200191505060405180910390f35b610907600480360360208110156108f157600080fd5b8101908080359060200190929190505050611fd5565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109356120be565b6040518082815260200191505060405180910390f35b6109536120c4565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a56004803603602081101561098f57600080fd5b81019080803590602001909291905050506120e4565b005b6109af612574565b6040518082815260200191505060405180910390f35b6109fb600480360360408110156109db57600080fd5b81019080803590602001909291908035906020019092919050505061263f565b005b610a05612a79565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ab3600480360360a0811015610a4757600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612a9f565b005b610abd612e08565b6040518082815260200191505060405180910390f35b610aff60048036036020811015610ae957600080fd5b8101908080359060200190929190505050612e0e565b005b610b2d60048036036020811015610b1757600080fd5b8101908080359060200190929190505050612ee0565b005b610b6560048036036040811015610b4557600080fd5b810190808035906020019092919080359060200190929190505050613252565b005b610b6f613437565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bdd60048036036020811015610bb157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061345d565b005b610c0b60048036036020811015610bf557600080fd5b8101908080359060200190929190505050613668565b005b610c3960048036036020811015610c2357600080fd5b810190808035906020019092919050505061373a565b005b610c6760048036036020811015610c5157600080fd5b810190808035906020019092919050505061380c565b005b6000600780549050905090565b60078181548110610c8357fe5b90600052602060002090600902016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a90046dffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154905089565b60095481565b600e5481565b610d3f613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b60008060078481548110610e5957fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260050154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f5357600080fd5b505afa158015610f67573d6000803e3d6000fd5b505050506040513d6020811015610f7d57600080fd5b81019080805190602001909291905050509050836004015443118015610fa4575060008114155b15611042576000610fb9856004015443611e28565b90506000610ffc600954610fee8860030154610fe060045487613bd890919063ffffffff16565b613bd890919063ffffffff16565b613c5e90919063ffffffff16565b905061103d61102e84611020670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b85613ca890919063ffffffff16565b935050505b6000836002016000866006015481526020019081526020016000205490506110ce84600101600087600601548152602001908152602001600020546110c0836110b2670de0b6b3a76400006110a4898b60000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b613d3090919063ffffffff16565b613ca890919063ffffffff16565b9550505050505092915050565b8160078054905081106110ed57600080fd5b6000600784815481106110fc57fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905083816000015410156111da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f206a455448546f6b656e2063616e6e6f742077697468647261770000000081525060200191505060405180910390fd5b6111e385611342565b600084111561125b57611203848260000154613d3090919063ffffffff16565b816000018190555061125a33858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d7a9092919063ffffffff16565b5b611290670de0b6b3a764000061128284600501548460000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b816002016000846006015481526020019081526020016000208190555060008160010160008460060154815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b600f600e9054906101000a90046dffffffffffffffffffffffffffff1681565b80600780549050811061135457600080fd5b60006007838154811061136357fe5b90600052602060002090600902019050806004015443116113845750611515565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561141157600080fd5b505afa158015611425573d6000803e3d6000fd5b505050506040513d602081101561143b57600080fd5b810190808051906020019092919050505090506000811415611467574382600401819055505050611515565b6000611477836004015443611e28565b905060006114ba6009546114ac866003015461149e60045487613bd890919063ffffffff16565b613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90506114ff6114ec846114de670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b8560050154613ca890919063ffffffff16565b8460050181905550438460040181905550505050505b5050565b80600780549050811061152b57600080fd5b60006007838154811061153a57fe5b9060005260206000209060090201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826002016000856006015481526020019081526020016000208190555061161f33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d7a9092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059584600001546040518082815260200191505060405180910390a35050505050565b611681613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600c8190555080600d819055505050565b600043905090565b6000600b54905090565b6000600780549050905060005b8181101561178e5761178381611342565b806001019050611772565b5050565b61179a613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461185a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b82600780549050811061186c57600080fd5b811561187b5761187a611765565b5b6118c0836118b26007878154811061188f57fe5b906000526020600020906009020160030154600954613d3090919063ffffffff16565b613ca890919063ffffffff16565b60098190555082600785815481106118d457fe5b90600052602060002090600902016003018190555050505050565b6118f7613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060078381548110611ad757fe5b906000526020600020906009020190508060070154915050919050565b60055481565b611b02613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a8190555050565b6000611bd782611ac7565b611bdf611753565b11611be957600080fd5b611c0b611bf583611ac7565b611bfd611753565b613d3090919063ffffffff16565b9050919050565b600a81565b60008060078381548110611c2757fe5b906000526020600020906009020190506000808260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d6060811015611cce57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505050915091506000611d47826dffffffffffffffffffffffffffff16611d39670de0b6b3a7640000866dffffffffffffffffffffffffffff16613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90506000611d6a6402540be400611d5c611e45565b613bd890919063ffffffff16565b90506000611d9b83611d8d670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90506000611dbc670de0b6b3a7640000600a54613bd890919063ffffffff16565b90506000611ded83611ddf670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90508098505050505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e3d8383613d3090919063ffffffff16565b905092915050565b600080600080600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611eb657600080fd5b505afa158015611eca573d6000803e3d6000fd5b505050506040513d60a0811015611ee057600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509450945094509450945060008211611f99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f526f756e64206e6f7420636f6d706c657465000000000000000000000000000081525060200191505060405180910390fd5b839550505050505090565b6008602052816000526040600020602052806000526040600020600091509150508060000154905081565b600a5481565b60008060078381548110611fe557fe5b9060005260206000209060090201905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d606081101561208b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050509150508092505050919050565b60045481565b600f60009054906101000a90046dffffffffffffffffffffffffffff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612185576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018060008282540192505081905550600060015490508160078054905081106121ae57600080fd5b600554600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561223a57600080fd5b505afa15801561224e573d6000803e3d6000fd5b505050506040513d602081101561226457600080fd5b810190808051906020019092919050505010156122e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e73756666696369656e74206a546573746120616d6f756e7400000000000081525060200191505060405180910390fd5b6122f283611fd5565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555060006007848154811061233557fe5b9060005260206000209060090201905080600701548160080154141561235a57600080fd5b600e5461236685611bcc565b10156123bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180614a376034913960400191505060405180910390fd5b8060020160009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16600f600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16111561243657600b6000815480929190600101919050555061244a565b600b60008154809291906001900391905055505b600d54600b541361246c57600d54600b8190555061246784613e1c565b612482565b600c54600b541261248157600c54600b819055505b5b61248a611753565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506124f7336124f286611c17565b613e79565b50506001548114612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125ff57600080fd5b505afa158015612613573d6000803e3d6000fd5b505050506040513d602081101561262957600080fd5b8101908080519060200190929190505050905090565b600180600082825401925050819055506000600154905082600780549050811061266857600080fd5b60006007858154811061267757fe5b9060005260206000209060090201905060006008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276857600080fd5b505afa15801561277c573d6000803e3d6000fd5b505050506040513d602081101561279257600080fd5b81019080805190602001909291905050509050600e546127b188611bcc565b11156127bc57600080fd5b600c54600b541480156127d0575060008114155b612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061495a6038913960400191505060405180910390fd5b858260000154101561289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f206a455448546f6b656e2063616e6e6f742077697468647261770000000081525060200191505060405180910390fd5b6128a887611342565b60006128b48833610e49565b905060008711156129a9576128d6878460000154613d3090919063ffffffff16565b8360000181905550612913670de0b6b3a764000061290586600501548660000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b83600201600086600601548152602001908152602001600020819055506000836001016000866006015481526020019081526020016000208190555061299e33888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d7a9092919063ffffffff16565b6129a83382613e79565b5b873373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568896040518082815260200191505060405180910390a350505050506001548114612a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612aa7613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612b7082614258565b8015612b7f57612b7e611765565b5b6000854311612b8e5785612b90565b435b9050612ba785600954613ca890919063ffffffff16565b600981905550600084905060008173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612bfa57600080fd5b505afa158015612c0e573d6000803e3d6000fd5b505050506040513d6060811015612c2457600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505091505060076040518061012001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836dffffffffffffffffffffffffffff16815260200189815260200185815260200160008152602001600081526020018a81526020018a815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015550505050505050505050565b600d5481565b612e16613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ed6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060048190555050565b6001806000828254019250508190555060006001549050816007805490508110612f0957600080fd5b600060078481548110612f1857fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561300957600080fd5b505afa15801561301d573d6000803e3d6000fd5b505050506040513d602081101561303357600080fd5b81019080805190602001909291905050509050600e5461305287611bcc565b111561305d57600080fd5b600c54600b54148015613071575060008114155b6130c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061495a6038913960400191505060405180910390fd5b6000826000015411613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f206a455448546f6b656e2063616e6e6f742077697468647261770000000081525060200191505060405180910390fd5b61314986611342565b60006131558733610e49565b905061318c670de0b6b3a764000061317e86600501548660000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b8360020160008660060154815260200190815260200160002081905550600083600101600086600601548152602001908152602001600020819055506131d23382613e79565b5050505050600154811461324e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b81600780549050811061326457600080fd5b60006007848154811061327357fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506132e085611342565b600081600001541115613315576132f78533610e49565b81600101600084600601548152602001908152602001600020819055505b600084111561338f5761336f3330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661435d909392919063ffffffff16565b613386848260000154613ca890919063ffffffff16565b81600001819055505b6133c4670de0b6b3a76400006133b684600501548460000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b8160020160008460060154815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a35050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613465613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613525576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149346026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613670613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b613742613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060058190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146138ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018060008282540192505081905550600060015490508160078054905081106138d657600080fd5b600554600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561396257600080fd5b505afa158015613976573d6000803e3d6000fd5b505050506040513d602081101561398c57600080fd5b81019080805190602001909291905050501015613a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e73756666696369656e74206a546573746120616d6f756e7400000000000081525060200191505060405180910390fd5b613a1a83611fd5565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550600060078481548110613a5d57fe5b906000526020600020906009020190508060070154816008015414613a8157600080fd5b8060080154431015613ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806149926034913960400191505060405180910390fd5b613ae6611753565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550613b5333613b4e86611c17565b613e79565b50506001548114613bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b600033905090565b600080831415613beb5760009050613c58565b6000828402905082848281613bfc57fe5b0414613c53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149ec6021913960400191505060405180910390fd5b809150505b92915050565b6000613ca083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061441e565b905092915050565b600080828401905083811015613d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613d7283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506144e4565b905092915050565b613e178363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506145a4565b505050565b806007805490508110613e2e57600080fd5b600060078381548110613e3d57fe5b90600052602060002090600902019050600081600501819055504381600401819055508060060160008154809291906001019190505550505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613f0457600080fd5b505afa158015613f18573d6000803e3d6000fd5b505050506040513d6020811015613f2e57600080fd5b81019080805190602001909291905050509050808211156140d057600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168382604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614061578051825260208201915060208101905060208303925061403e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146140c3576040519150601f19603f3d011682016040523d82523d6000602084013e6140c8565b606091505b505050614253565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106141e857805182526020820191506020810190506020830392506141c5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461424a576040519150601f19603f3d011682016040523d82523d6000602084013e61424f565b606091505b5050505b505050565b6000600780549050905060005b81811015614358578273ffffffffffffffffffffffffffffffffffffffff166007828154811061429157fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561434d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6164643a206578697374696e6720706f6f6c3f0000000000000000000000000081525060200191505060405180910390fd5b806001019050614265565b505050565b614418846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506145a4565b50505050565b600080831182906144ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561448f578082015181840152602081019050614474565b50505050905090810190601f1680156144bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816144d657fe5b049050809150509392505050565b6000838311158290614591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561455657808201518184015260208101905061453b565b50505050905090810190601f1680156145835780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060614606826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146939092919063ffffffff16565b905060008151111561468e5780806020019051602081101561462757600080fd5b810190808051906020019092919050505061468d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a0d602a913960400191505060405180910390fd5b5b505050565b60606146a284846000856146ab565b90509392505050565b606082471015614706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149c66026913960400191505060405180910390fd5b61470f85614854565b614781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106147d157805182526020820191506020810190506020830392506147ae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614833576040519150601f19603f3d011682016040523d82523d6000602084013e614838565b606091505b5091509150614848828286614867565b92505050949350505050565b600080823b905060008111915050919050565b606083156148775782905061492c565b60008351111561488a5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148f15780820151818401526020810190506148d6565b50505050905090810190601f16801561491e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d7573742068617665206a455448537570706c7920616e64207265616368206d617850726f677265737369766520746f206861727665737443616e6e6f7420616374697661746520756e74696c2074686520737065636966696320626c6f636b2074696d6520617272697665416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656443616e6e6f7420616374697661746520756e74696c20737065636966696320616d6f756e74206f6620626c6f636b732070617373a2646970667358221220580b406442e3f0424c4c331438fbafa685a43b1275172ebcaf75210f483846bf64736f6c634300060c00330000000000000000000000001da65b1868e2d36d06d7a44dbd2be98e49e1f7f9000000000000000000000000ec7b95ba343224a9ed1eee230912055dcd7081ca0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000042c96f40959140000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c80638aa2855011610167578063b827f556116100ce578063e2bbb15811610087578063e2bbb15814610b2f578063f07637fe14610b67578063f2fde38b14610b9b578063f8f0975a14610bdf578063f978cfc214610c0d578063fb8fc8d414610c3b576102a0565b8063b827f556146109c5578063c17a1013146109fd578063cb99b8d314610a31578063d48330d814610ab5578063d48c14d514610ad3578063ddc6326214610b01576102a0565b8063947c345711610120578063947c3457146108bd578063951583c3146108db578063965a89531461092d57806396e3369b1461094b578063b260c42a14610979578063b7f51898146109a7576102a0565b80638aa285501461075d5780638b27bace1461077b5780638da5cb5b146107bd5780638dbb1e3a146107f15780638e15f4731461083d57806393f1a40b1461085b576102a0565b806361d6f78a1161020b578063741bef1a116101c4578063741bef1a146106255780637cd07e471461065957806384d4127f1461068d57806384dcaf7c146106cf57806385ecc89b146106ed57806386fadfa21461071b576102a0565b806361d6f78a1461057357806362c3654514610591578063630b5ba1146105af57806364482f79146105b9578063715018a6146105fd578063731af93714610607576102a0565b8063370b1cdd1161025d578063370b1cdd14610417578063441a3e701461047957806346caf2ae146104b157806351eb05a6146104df5780635312ea8e1461050d5780635e446ab71461053b576102a0565b8063081e3eda146102a55780631526fe27146102c357806317caf6f1146103795780631ce6fbb71461039757806323cf3118146103b557806325901421146103f9575b600080fd5b6102ad610c69565b6040518082815260200191505060405180910390f35b6102ef600480360360208110156102d957600080fd5b8101908080359060200190929190505050610c76565b604051808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001886dffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b610381610d2b565b6040518082815260200191505060405180910390f35b61039f610d31565b6040518082815260200191505060405180910390f35b6103f7600480360360208110156103cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d37565b005b610401610e43565b6040518082815260200191505060405180910390f35b6104636004803603604081101561042d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e49565b6040518082815260200191505060405180910390f35b6104af6004803603604081101561048f57600080fd5b8101908080359060200190929190803590602001909291905050506110db565b005b6104b9611322565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b61050b600480360360208110156104f557600080fd5b8101908080359060200190929190505050611342565b005b6105396004803603602081101561052357600080fd5b8101908080359060200190929190505050611519565b005b6105716004803603604081101561055157600080fd5b810190808035906020019092919080359060200190929190505050611679565b005b61057b611753565b6040518082815260200191505060405180910390f35b61059961175b565b6040518082815260200191505060405180910390f35b6105b7611765565b005b6105fb600480360360608110156105cf57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611792565b005b6106056118ef565b005b61060f611a75565b6040518082815260200191505060405180910390f35b61062d611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610661611aa1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106b9600480360360208110156106a357600080fd5b8101908080359060200190929190505050611ac7565b6040518082815260200191505060405180910390f35b6106d7611af4565b6040518082815260200191505060405180910390f35b6107196004803603602081101561070357600080fd5b8101908080359060200190929190505050611afa565b005b6107476004803603602081101561073157600080fd5b8101908080359060200190929190505050611bcc565b6040518082815260200191505060405180910390f35b610765611c12565b6040518082815260200191505060405180910390f35b6107a76004803603602081101561079157600080fd5b8101908080359060200190929190505050611c17565b6040518082815260200191505060405180910390f35b6107c5611dff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108276004803603604081101561080757600080fd5b810190808035906020019092919080359060200190929190505050611e28565b6040518082815260200191505060405180910390f35b610845611e45565b6040518082815260200191505060405180910390f35b6108a76004803603604081101561087157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa4565b6040518082815260200191505060405180910390f35b6108c5611fcf565b6040518082815260200191505060405180910390f35b610907600480360360208110156108f157600080fd5b8101908080359060200190929190505050611fd5565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109356120be565b6040518082815260200191505060405180910390f35b6109536120c4565b60405180826dffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a56004803603602081101561098f57600080fd5b81019080803590602001909291905050506120e4565b005b6109af612574565b6040518082815260200191505060405180910390f35b6109fb600480360360408110156109db57600080fd5b81019080803590602001909291908035906020019092919050505061263f565b005b610a05612a79565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ab3600480360360a0811015610a4757600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612a9f565b005b610abd612e08565b6040518082815260200191505060405180910390f35b610aff60048036036020811015610ae957600080fd5b8101908080359060200190929190505050612e0e565b005b610b2d60048036036020811015610b1757600080fd5b8101908080359060200190929190505050612ee0565b005b610b6560048036036040811015610b4557600080fd5b810190808035906020019092919080359060200190929190505050613252565b005b610b6f613437565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bdd60048036036020811015610bb157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061345d565b005b610c0b60048036036020811015610bf557600080fd5b8101908080359060200190929190505050613668565b005b610c3960048036036020811015610c2357600080fd5b810190808035906020019092919050505061373a565b005b610c6760048036036020811015610c5157600080fd5b810190808035906020019092919050505061380c565b005b6000600780549050905090565b60078181548110610c8357fe5b90600052602060002090600902016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a90046dffffffffffffffffffffffffffff16908060030154908060040154908060050154908060060154908060070154908060080154905089565b60095481565b600e5481565b610d3f613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b60008060078481548110610e5957fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260050154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f5357600080fd5b505afa158015610f67573d6000803e3d6000fd5b505050506040513d6020811015610f7d57600080fd5b81019080805190602001909291905050509050836004015443118015610fa4575060008114155b15611042576000610fb9856004015443611e28565b90506000610ffc600954610fee8860030154610fe060045487613bd890919063ffffffff16565b613bd890919063ffffffff16565b613c5e90919063ffffffff16565b905061103d61102e84611020670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b85613ca890919063ffffffff16565b935050505b6000836002016000866006015481526020019081526020016000205490506110ce84600101600087600601548152602001908152602001600020546110c0836110b2670de0b6b3a76400006110a4898b60000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b613d3090919063ffffffff16565b613ca890919063ffffffff16565b9550505050505092915050565b8160078054905081106110ed57600080fd5b6000600784815481106110fc57fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905083816000015410156111da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f206a455448546f6b656e2063616e6e6f742077697468647261770000000081525060200191505060405180910390fd5b6111e385611342565b600084111561125b57611203848260000154613d3090919063ffffffff16565b816000018190555061125a33858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d7a9092919063ffffffff16565b5b611290670de0b6b3a764000061128284600501548460000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b816002016000846006015481526020019081526020016000208190555060008160010160008460060154815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b600f600e9054906101000a90046dffffffffffffffffffffffffffff1681565b80600780549050811061135457600080fd5b60006007838154811061136357fe5b90600052602060002090600902019050806004015443116113845750611515565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561141157600080fd5b505afa158015611425573d6000803e3d6000fd5b505050506040513d602081101561143b57600080fd5b810190808051906020019092919050505090506000811415611467574382600401819055505050611515565b6000611477836004015443611e28565b905060006114ba6009546114ac866003015461149e60045487613bd890919063ffffffff16565b613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90506114ff6114ec846114de670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b8560050154613ca890919063ffffffff16565b8460050181905550438460040181905550505050505b5050565b80600780549050811061152b57600080fd5b60006007838154811061153a57fe5b9060005260206000209060090201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826002016000856006015481526020019081526020016000208190555061161f33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d7a9092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059584600001546040518082815260200191505060405180910390a35050505050565b611681613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600c8190555080600d819055505050565b600043905090565b6000600b54905090565b6000600780549050905060005b8181101561178e5761178381611342565b806001019050611772565b5050565b61179a613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461185a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b82600780549050811061186c57600080fd5b811561187b5761187a611765565b5b6118c0836118b26007878154811061188f57fe5b906000526020600020906009020160030154600954613d3090919063ffffffff16565b613ca890919063ffffffff16565b60098190555082600785815481106118d457fe5b90600052602060002090600902016003018190555050505050565b6118f7613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060078381548110611ad757fe5b906000526020600020906009020190508060070154915050919050565b60055481565b611b02613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a8190555050565b6000611bd782611ac7565b611bdf611753565b11611be957600080fd5b611c0b611bf583611ac7565b611bfd611753565b613d3090919063ffffffff16565b9050919050565b600a81565b60008060078381548110611c2757fe5b906000526020600020906009020190506000808260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d6060811015611cce57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505050915091506000611d47826dffffffffffffffffffffffffffff16611d39670de0b6b3a7640000866dffffffffffffffffffffffffffff16613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90506000611d6a6402540be400611d5c611e45565b613bd890919063ffffffff16565b90506000611d9b83611d8d670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90506000611dbc670de0b6b3a7640000600a54613bd890919063ffffffff16565b90506000611ded83611ddf670de0b6b3a764000085613bd890919063ffffffff16565b613c5e90919063ffffffff16565b90508098505050505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e3d8383613d3090919063ffffffff16565b905092915050565b600080600080600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611eb657600080fd5b505afa158015611eca573d6000803e3d6000fd5b505050506040513d60a0811015611ee057600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509450945094509450945060008211611f99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f526f756e64206e6f7420636f6d706c657465000000000000000000000000000081525060200191505060405180910390fd5b839550505050505090565b6008602052816000526040600020602052806000526040600020600091509150508060000154905081565b600a5481565b60008060078381548110611fe557fe5b9060005260206000209060090201905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d606081101561208b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050509150508092505050919050565b60045481565b600f60009054906101000a90046dffffffffffffffffffffffffffff1681565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612185576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018060008282540192505081905550600060015490508160078054905081106121ae57600080fd5b600554600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561223a57600080fd5b505afa15801561224e573d6000803e3d6000fd5b505050506040513d602081101561226457600080fd5b810190808051906020019092919050505010156122e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e73756666696369656e74206a546573746120616d6f756e7400000000000081525060200191505060405180910390fd5b6122f283611fd5565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555060006007848154811061233557fe5b9060005260206000209060090201905080600701548160080154141561235a57600080fd5b600e5461236685611bcc565b10156123bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180614a376034913960400191505060405180910390fd5b8060020160009054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16600f600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16111561243657600b6000815480929190600101919050555061244a565b600b60008154809291906001900391905055505b600d54600b541361246c57600d54600b8190555061246784613e1c565b612482565b600c54600b541261248157600c54600b819055505b5b61248a611753565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506124f7336124f286611c17565b613e79565b50506001548114612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125ff57600080fd5b505afa158015612613573d6000803e3d6000fd5b505050506040513d602081101561262957600080fd5b8101908080519060200190929190505050905090565b600180600082825401925050819055506000600154905082600780549050811061266857600080fd5b60006007858154811061267757fe5b9060005260206000209060090201905060006008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276857600080fd5b505afa15801561277c573d6000803e3d6000fd5b505050506040513d602081101561279257600080fd5b81019080805190602001909291905050509050600e546127b188611bcc565b11156127bc57600080fd5b600c54600b541480156127d0575060008114155b612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061495a6038913960400191505060405180910390fd5b858260000154101561289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f206a455448546f6b656e2063616e6e6f742077697468647261770000000081525060200191505060405180910390fd5b6128a887611342565b60006128b48833610e49565b905060008711156129a9576128d6878460000154613d3090919063ffffffff16565b8360000181905550612913670de0b6b3a764000061290586600501548660000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b83600201600086600601548152602001908152602001600020819055506000836001016000866006015481526020019081526020016000208190555061299e33888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d7a9092919063ffffffff16565b6129a83382613e79565b5b873373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568896040518082815260200191505060405180910390a350505050506001548114612a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612aa7613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612b7082614258565b8015612b7f57612b7e611765565b5b6000854311612b8e5785612b90565b435b9050612ba785600954613ca890919063ffffffff16565b600981905550600084905060008173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612bfa57600080fd5b505afa158015612c0e573d6000803e3d6000fd5b505050506040513d6060811015612c2457600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505091505060076040518061012001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836dffffffffffffffffffffffffffff16815260200189815260200185815260200160008152602001600081526020018a81526020018a815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015550505050505050505050565b600d5481565b612e16613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ed6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060048190555050565b6001806000828254019250508190555060006001549050816007805490508110612f0957600080fd5b600060078481548110612f1857fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561300957600080fd5b505afa15801561301d573d6000803e3d6000fd5b505050506040513d602081101561303357600080fd5b81019080805190602001909291905050509050600e5461305287611bcc565b111561305d57600080fd5b600c54600b54148015613071575060008114155b6130c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061495a6038913960400191505060405180910390fd5b6000826000015411613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f206a455448546f6b656e2063616e6e6f742077697468647261770000000081525060200191505060405180910390fd5b61314986611342565b60006131558733610e49565b905061318c670de0b6b3a764000061317e86600501548660000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b8360020160008660060154815260200190815260200160002081905550600083600101600086600601548152602001908152602001600020819055506131d23382613e79565b5050505050600154811461324e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b81600780549050811061326457600080fd5b60006007848154811061327357fe5b9060005260206000209060090201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506132e085611342565b600081600001541115613315576132f78533610e49565b81600101600084600601548152602001908152602001600020819055505b600084111561338f5761336f3330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661435d909392919063ffffffff16565b613386848260000154613ca890919063ffffffff16565b81600001819055505b6133c4670de0b6b3a76400006133b684600501548460000154613bd890919063ffffffff16565b613c5e90919063ffffffff16565b8160020160008460060154815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a35050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b613465613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613525576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149346026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613670613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e8190555050565b613742613bd0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060058190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146138ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260078152602001807f4e6f7420454f410000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018060008282540192505081905550600060015490508160078054905081106138d657600080fd5b600554600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561396257600080fd5b505afa158015613976573d6000803e3d6000fd5b505050506040513d602081101561398c57600080fd5b81019080805190602001909291905050501015613a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e73756666696369656e74206a546573746120616d6f756e7400000000000081525060200191505060405180910390fd5b613a1a83611fd5565b600f600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550600060078481548110613a5d57fe5b906000526020600020906009020190508060070154816008015414613a8157600080fd5b8060080154431015613ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806149926034913960400191505060405180910390fd5b613ae6611753565b8160070181905550600f600e9054906101000a90046dffffffffffffffffffffffffffff168160020160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550613b5333613b4e86611c17565b613e79565b50506001548114613bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b600033905090565b600080831415613beb5760009050613c58565b6000828402905082848281613bfc57fe5b0414613c53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149ec6021913960400191505060405180910390fd5b809150505b92915050565b6000613ca083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061441e565b905092915050565b600080828401905083811015613d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613d7283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506144e4565b905092915050565b613e178363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506145a4565b505050565b806007805490508110613e2e57600080fd5b600060078381548110613e3d57fe5b90600052602060002090600902019050600081600501819055504381600401819055508060060160008154809291906001019190505550505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613f0457600080fd5b505afa158015613f18573d6000803e3d6000fd5b505050506040513d6020811015613f2e57600080fd5b81019080805190602001909291905050509050808211156140d057600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168382604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614061578051825260208201915060208101905060208303925061403e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146140c3576040519150601f19603f3d011682016040523d82523d6000602084013e6140c8565b606091505b505050614253565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106141e857805182526020820191506020810190506020830392506141c5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461424a576040519150601f19603f3d011682016040523d82523d6000602084013e61424f565b606091505b5050505b505050565b6000600780549050905060005b81811015614358578273ffffffffffffffffffffffffffffffffffffffff166007828154811061429157fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561434d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6164643a206578697374696e6720706f6f6c3f0000000000000000000000000081525060200191505060405180910390fd5b806001019050614265565b505050565b614418846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506145a4565b50505050565b600080831182906144ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561448f578082015181840152602081019050614474565b50505050905090810190601f1680156144bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816144d657fe5b049050809150509392505050565b6000838311158290614591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561455657808201518184015260208101905061453b565b50505050905090810190601f1680156145835780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060614606826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146939092919063ffffffff16565b905060008151111561468e5780806020019051602081101561462757600080fd5b810190808051906020019092919050505061468d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a0d602a913960400191505060405180910390fd5b5b505050565b60606146a284846000856146ab565b90509392505050565b606082471015614706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149c66026913960400191505060405180910390fd5b61470f85614854565b614781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106147d157805182526020820191506020810190506020830392506147ae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614833576040519150601f19603f3d011682016040523d82523d6000602084013e614838565b606091505b5091509150614848828286614867565b92505050949350505050565b600080823b905060008111915050919050565b606083156148775782905061492c565b60008351111561488a5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148f15780820151818401526020810190506148d6565b50505050905090810190601f16801561491e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d7573742068617665206a455448537570706c7920616e64207265616368206d617850726f677265737369766520746f206861727665737443616e6e6f7420616374697661746520756e74696c2074686520737065636966696320626c6f636b2074696d6520617272697665416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656443616e6e6f7420616374697661746520756e74696c20737065636966696320616d6f756e74206f6620626c6f636b732070617373a2646970667358221220580b406442e3f0424c4c331438fbafa685a43b1275172ebcaf75210f483846bf64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001da65b1868e2d36d06d7a44dbd2be98e49e1f7f9000000000000000000000000ec7b95ba343224a9ed1eee230912055dcd7081ca0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000042c96f40959140000
-----Decoded View---------------
Arg [0] : _testa (address): 0x1da65B1868e2d36d06d7A44DBD2Be98e49E1f7f9
Arg [1] : _jTesta (address): 0xEc7B95ba343224A9ED1EEe230912055DcD7081CA
Arg [2] : _priceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [3] : _minProgressive (int256): -3
Arg [4] : _maxProgressive (int256): 3
Arg [5] : activateAtBlock (uint256): 5000
Arg [6] : _testaPerBlock (uint256): 100000000000000000
Arg [7] : _jTestaAmount (uint256): 77000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000001da65b1868e2d36d06d7a44dbd2be98e49e1f7f9
Arg [1] : 000000000000000000000000ec7b95ba343224a9ed1eee230912055dcd7081ca
Arg [2] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [3] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [6] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [7] : 0000000000000000000000000000000000000000000000042c96f40959140000
Deployed Bytecode Sourcemap
36362:17015:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46406:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38426:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38669:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38846:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48361:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38782:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48963:877;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51704:662;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38917:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50179:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52437:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40383:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44692:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44592:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49923:180;;;:::i;:::-;;47965:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30131:148;;;:::i;:::-;;38749:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38955:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38361:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45000:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38129:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40690:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44798:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38211:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45799:595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29489:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48539:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45391:400;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38508:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38710:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45170:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38094:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38881:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43400:1048;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44456:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40809:1084;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37999:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46931:937;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38814:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40260:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41901:809;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50962:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38026:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30434:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40567:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40140:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42722:670;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46406:95;46451:7;46478:8;:15;;;;46471:22;;46406:95;:::o;38426:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38669:34::-;;;;:::o;38846:28::-;;;;:::o;48361:102::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48446:9:::1;48435:8;;:20;;;;;;;;;;;;;;;;;;48361:102:::0;:::o;38782:25::-;;;;:::o;48963:877::-;49035:7;49055:21;49079:8;49088:4;49079:14;;;;;;;;;;;;;;;;;;49055:38;;49104:21;49128:8;:14;49137:4;49128:14;;;;;;;;;;;:21;49143:5;49128:21;;;;;;;;;;;;;;;49104:45;;49160:24;49187:4;:21;;;49160:48;;49219:18;49240:4;:14;;;;;;;;;;;;:24;;;49273:4;49240:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49219:60;;49309:4;:20;;;49294:12;:35;:54;;;;;49347:1;49333:10;:15;;49294:54;49290:358;;;49365:18;49386:49;49400:4;:20;;;49422:12;49386:13;:49::i;:::-;49365:70;;49450:19;49472:71;49527:15;;49472:50;49506:4;:15;;;49472:29;49487:13;;49472:10;:14;;:29;;;;:::i;:::-;:33;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;49450:93;;49577:59;49598:37;49624:10;49598:21;49614:4;49598:11;:15;;:21;;;;:::i;:::-;:25;;:37;;;;:::i;:::-;49577:16;:20;;:59;;;;:::i;:::-;49558:78;;49290:358;;;49658:18;49679:4;:15;;:34;49695:4;:17;;;49679:34;;;;;;;;;;;;49658:55;;49731:101;49795:4;:17;;:36;49813:4;:17;;;49795:36;;;;;;;;;;;;49731:59;49779:10;49731:43;49769:4;49731:33;49747:16;49731:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:59;;;;:::i;:::-;:63;;:101;;;;:::i;:::-;49724:108;;;;;;;48963:877;;;;:::o;51704:662::-;51770:4;40096:8;:15;;;;40089:4;:22;40081:31;;;;;;51787:21:::1;51811:8;51820:4;51811:14;;;;;;;;;;;;;;;;;;51787:38;;51836:21;51860:8;:14;51869:4;51860:14;;;;;;;;;;;:26;51875:10;51860:26;;;;;;;;;;;;;;;51836:50;;51920:7;51905:4;:11;;;:22;;51897:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;51971:16;51982:4;51971:10;:16::i;:::-;52021:1;52011:7;:11;52008:153;;;52053:24;52069:7;52053:4;:11;;;:15;;:24;;;;:::i;:::-;52039:4;:11;;:38;;;;52092:57;52128:10;52141:7;52092:4;:14;;;;;;;;;;;;:27;;;;:57;;;;;:::i;:::-;52008:153;52208:48;52251:4;52208:38;52224:4;:21;;;52208:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;52171:4;:15;;:34;52187:4;:17;;;52171:34;;;;;;;;;;;:85;;;;52306:1;52267:4;:17;;:36;52285:4;:17;;;52267:36;;;;;;;;;;;:40;;;;52344:4;52332:10;52323:35;;;52350:7;52323:35;;;;;;;;;;;;;;;;;;40123:1;;51704:662:::0;;;:::o;38917:31::-;;;;;;;;;;;;;:::o;50179:714::-;50230:4;40096:8;:15;;;;40089:4;:22;40081:31;;;;;;50247:21:::1;50271:8;50280:4;50271:14;;;;;;;;;;;;;;;;;;50247:38;;50316:4;:20;;;50300:12;:36;50296:75;;50353:7;;;50296:75;50381:18;50402:4;:14;;;;;;;;;;;;:24;;;50435:4;50402:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;50381:60;;50470:1;50456:10;:15;50452:104;;;50511:12;50488:4;:20;;:35;;;;50538:7;;;;50452:104;50566:18;50587:49;50601:4;:20;;;50623:12;50587:13;:49::i;:::-;50566:70;;50647:19;50669:71;50724:15;;50669:50;50703:4;:15;;;50669:29;50684:13;;50669:10;:14;;:29;;;;:::i;:::-;:33;;:50;;;;:::i;:::-;:54;;:71;;;;:::i;:::-;50647:93;;50775:64;50801:37;50827:10;50801:21;50817:4;50801:11;:15;;:21;;;;:::i;:::-;:25;;:37;;;;:::i;:::-;50775:4;:21;;;:25;;:64;;;;:::i;:::-;50751:4;:21;;:88;;;;50873:12;50850:4;:20;;:35;;;;40123:1;;;;;50179:714:::0;;:::o;52437:429::-;52495:4;40096:8;:15;;;;40089:4;:22;40081:31;;;;;;52512:21:::1;52536:8;52545:4;52536:14;;;;;;;;;;;;;;;;;;52512:38;;52561:21;52585:8;:14;52594:4;52585:14;;;;;;;;;;;:26;52600:10;52585:26;;;;;;;;;;;;;;;52561:50;;52622:15;52640:4;:11;;;52622:29;;52676:1;52662:4;:11;;:15;;;;52725:1;52688:4;:15;;:34;52704:4;:17;;;52688:34;;;;;;;;;;;:38;;;;52737:57;52773:10;52786:7;52737:4;:14;;;;;;;;;;;;:27;;;;:57;;;;;:::i;:::-;52840:4;52828:10;52810:48;;;52846:4;:11;;;52810:48;;;;;;;;;;;;;;;;;;40123:1;;;52437:429:::0;;:::o;40383:176::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40493:15:::1;40476:14;:32;;;;40536:15;40519:14;:32;;;;40383:176:::0;;:::o;44692:94::-;44739:7;44766:12;44759:19;;44692:94;:::o;44592:88::-;44639:3;44661:11;;44654:18;;44592:88;:::o;49923:180::-;49968:14;49985:8;:15;;;;49968:32;;50016:11;50011:85;50039:6;50033:3;:12;50011:85;;;50069:15;50080:3;50069:10;:15::i;:::-;50047:5;;;;;50011:85;;;;49923:180;:::o;47965:320::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48058:4:::1;40096:8;:15;;;;40089:4;:22;40081:31;;;::::0;::::1;;48079:11:::2;48075:61;;;48107:17;:15;:17::i;:::-;48075:61;48164:63;48215:11;48164:46;48184:8;48193:4;48184:14;;;;;;;;;;;;;;;;;;:25;;;48164:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;48146:15;:81;;;;48266:11;48238:8;48247:4;48238:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;29771:1:::1;47965:320:::0;;;:::o;30131:148::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30238:1:::1;30201:40;;30222:6;::::0;::::1;;;;;;;;30201:40;;;;;;;;;;;;30269:1;30252:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;30131:148::o:0;38749:26::-;;;;:::o;38955:38::-;;;;;;;;;;;;;:::o;38361:29::-;;;;;;;;;;;;;:::o;45000:158::-;45060:7;45079:21;45103:8;45112:4;45103:14;;;;;;;;;;;;;;;;;;45079:38;;45135:4;:15;;;45128:22;;;45000:158;;;:::o;38129:27::-;;;;:::o;40690:111::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40780:13:::1;40765:12;:28;;;;40690:111:::0;:::o;44798:194::-;44855:7;44901:21;44917:4;44901:15;:21::i;:::-;44882:16;:14;:16::i;:::-;:40;44874:49;;;;;;44941:43;44962:21;44978:4;44962:15;:21::i;:::-;44941:16;:14;:16::i;:::-;:20;;:43;;;;:::i;:::-;44934:50;;44798:194;;;:::o;38211:45::-;38254:2;38211:45;:::o;45799:595::-;45858:7;45878:21;45902:8;45911:4;45902:14;;;;;;;;;;;;;;;;;;45878:38;;45928:17;45947;45970:4;:12;;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45927:69;;;;;46007:15;46025:52;46066:9;46058:18;;46025:28;46048:4;46033:9;46025:18;;:22;;:28;;;;:::i;:::-;:32;;:52;;;;:::i;:::-;46007:70;;46088:20;46111:35;46141:4;46119:16;:14;:16::i;:::-;46111:29;;:35;;;;:::i;:::-;46088:58;;46164:22;46189:35;46216:7;46189:22;46206:4;46189:12;:16;;:22;;;;:::i;:::-;:26;;:35;;;;:::i;:::-;46164:60;;46235:21;46259:22;46276:4;46259:12;;:16;;:22;;;;:::i;:::-;46235:46;;46292:19;46314:43;46342:14;46314:23;46332:4;46314:13;:17;;:23;;;;:::i;:::-;:27;;:43;;;;:::i;:::-;46292:65;;46375:11;46368:18;;;;;;;;;;45799:595;;;:::o;29489:79::-;29527:7;29554:6;;;;;;;;;;;29547:13;;29489:79;:::o;48539:121::-;48611:7;48638:14;48646:5;48638:3;:7;;:14;;;;:::i;:::-;48631:21;;48539:121;;;;:::o;45391:400::-;45438:3;45469:14;45499:9;45523:14;45552;45581:22;45617:9;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45454:190;;;;;;;;;;45736:1;45724:9;:13;45716:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45778:5;45771:12;;;;;;;45391:400;:::o;38508:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38710:32::-;;;;:::o;45170:213::-;45227:7;45246:21;45270:8;45279:4;45270:14;;;;;;;;;;;;;;;;;;45246:38;;45299:17;45322:4;:12;;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45295:53;;;;45366:9;45359:16;;;;45170:213;;;:::o;38094:28::-;;;;:::o;38881:29::-;;;;;;;;;;;;;:::o;43400:1048::-;39988:9;39974:23;;:10;:23;;;39966:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35915:1:::1;35898:13:::0;::::1;:18;;;;;;;;;;;35927:20;35950:13;;35927:36;;43470:4:::2;40096:8;:15;;;;40089:4;:22;40081:31;;;::::0;::::2;;43535:12:::3;;43502:6;;;;;;;;;;;43495:24;;;43520:10;43495:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;:52;;43487:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;43608:18;43621:4;43608:12;:18::i;:::-;43589:16;;:37;;;;;;;;;;;;;;;;;;43637:21;43661:8;43670:4;43661:14;;;;;;;;;;;;;;;;;;43637:38;;43717:4;:15;;;43694:4;:19;;;:38;;43686:47;;;::::0;::::3;;43774:13;;43752:18;43765:4;43752:12;:18::i;:::-;:35;;43744:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43887:4;:19;;;;;;;;;;;;43868:38;;:16;;;;;;;;;;;:38;;;43865:126;;;43922:11;;:13;;;;;;;;;;;;;43865:126;;;43966:11;;:13;;;;;;;;;;;;;;43865:126;44033:14;;44018:11;;:29;44015:211;;44077:14;;44063:11;:28;;;;44106:15;44116:4;44106:9;:15::i;:::-;44015:211;;;44156:14;;44141:11;;:29;44138:88;;44200:14;;44186:11;:28;;;;44138:88;44015:211;44254:16;:14;:16::i;:::-;44236:4;:15;;:34;;;;44305:16;;;;;;;;;;;44283:4;:19;;;:38;;;;;;;;;;;;;;;;;;44389:51;44407:10;44419:20;44434:4;44419:14;:20::i;:::-;44389:17;:51::i;:::-;40123:1;35974::::2;36010:13:::1;;35994:12;:29;35986:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40020:1;43400:1048:::0;:::o;44456:124::-;44508:7;44541:5;;;;;;;;;;;44534:23;;;44566:4;44534:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44527:45;;44456:124;:::o;40809:1084::-;35915:1;35898:13;;:18;;;;;;;;;;;35927:20;35950:13;;35927:36;;40898:4:::1;40096:8;:15;;;;40089:4;:22;40081:31;;;::::0;::::1;;40915:21:::2;40939:8;40948:4;40939:14;;;;;;;;;;;;;;;;;;40915:38;;40964:21;40988:8;:14;40997:4;40988:14;;;;;;;;;;;:26;41003:10;40988:26;;;;;;;;;;;;;;;40964:50;;41025:18;41046:4;:14;;;;;;;;;;;;:24;;;41079:4;41046:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;41025:60;;41128:13;;41106:18;41119:4;41106:12;:18::i;:::-;:35;;41098:44;;;::::0;::::2;;41177:14;;41162:11;;:29;41161:52;;;;;41211:1;41197:10;:15;;41161:52;41153:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41308:7;41293:4;:11;;;:22;;41285:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;41359:16;41370:4;41359:10;:16::i;:::-;41396:19;41418:31;41432:4;41438:10;41418:12;:31::i;:::-;41396:53;;41483:1;41473:7;:11;41470:365;;;41515:24;41531:7;41515:4;:11;;;:15;;:24;;;;:::i;:::-;41501:4;:11;;:38;;;;41591:48;41634:4;41591:38;41607:4;:21;;;41591:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;41554:4;:15;;:34;41570:4;:17;;;41554:34;;;;;;;;;;;:85;;;;41693:1;41654:4;:17;;:36;41672:4;:17;;;41654:36;;;;;;;;;;;:40;;;;41709:57;41745:10;41758:7;41709:4;:14;;;;;;;;;;;;:27;;;;:57;;;;;:::i;:::-;41781:42;41799:10;41811:11;41781:17;:42::i;:::-;41470:365;41871:4;41859:10;41850:35;;;41877:7;41850:35;;;;;;;;;;;;;;;;;;40123:1;;;;35974::::1;36010:13:::0;;35994:12;:29;35986:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40809:1084;;;:::o;37999:20::-;;;;;;;;;;;;;:::o;46931:937::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47069:38:::1;47095:10;47069:18;:38::i;:::-;47122:11;47118:61;;;47150:17;:15;:17::i;:::-;47118:61;47189:23;47230:10;47215:12;:25;:53;;47258:10;47215:53;;;47243:12;47215:53;47189:79;;47297:32;47317:11;47297:15;;:19;;:32;;;;:::i;:::-;47279:15;:50;;;;47340:22;47380:8;47340:49;;47404:17;47427:7;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47400:48;;;;47470:8;47484:363;;;;;;;;47526:10;47484:363;;;;;;47710:7;47484:363;;;;;;47748:9;47484:363;;;;;;47564:11;47484:363;;;;47607:15;47484:363;;;;47655:1;47484:363;;;;47685:1;47484:363;;;;47784:10;47484:363;;;;47825:10;47484:363;;::::0;47470:378:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29771:1;;;46931:937:::0;;;;;:::o;38814:25::-;;;;:::o;40260:115::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40353:14:::1;40337:13;:30;;;;40260:115:::0;:::o;41901:809::-;35915:1;35898:13;;:18;;;;;;;;;;;35927:20;35950:13;;35927:36;;41962:4:::1;40096:8;:15;;;;40089:4;:22;40081:31;;;::::0;::::1;;41979:21:::2;42003:8;42012:4;42003:14;;;;;;;;;;;;;;;;;;41979:38;;42028:21;42052:8;:14;42061:4;42052:14;;;;;;;;;;;:26;42067:10;42052:26;;;;;;;;;;;;;;;42028:50;;42089:16;42108:4;:14;;;;;;;;;;;;:24;;;42141:4;42108:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;42089:58;;42190:13;;42168:18;42181:4;42168:12;:18::i;:::-;:35;;42160:44;;;::::0;::::2;;42239:14;;42224:11;;:29;42223:50;;;;;42271:1;42259:8;:13;;42223:50;42215:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42367:1;42353:4;:11;;;:15;42345:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;42412:16;42423:4;42412:10;:16::i;:::-;42449:19;42471:31;42485:4;42491:10;42471:12;:31::i;:::-;42449:53;;42550:48;42593:4;42550:38;42566:4;:21;;;42550:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;42513:4;:15;;:34;42529:4;:17;;;42513:34;;;;;;;;;;;:85;;;;42648:1;42609:4;:17;;:36;42627:4;:17;;;42609:36;;;;;;;;;;;:40;;;;42660:42;42678:10;42690:11;42660:17;:42::i;:::-;40123:1;;;;35974::::1;36010:13:::0;;35994:12;:29;35986:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41901:809;;:::o;50962:691::-;51027:4;40096:8;:15;;;;40089:4;:22;40081:31;;;;;;51044:21:::1;51068:8;51077:4;51068:14;;;;;;;;;;;;;;;;;;51044:38;;51093:21;51117:8;:14;51126:4;51117:14;;;;;;;;;;;:26;51132:10;51117:26;;;;;;;;;;;;;;;51093:50;;51154:16;51165:4;51154:10;:16::i;:::-;51201:1;51187:4;:11;;;:15;51183:115;;;51256:30;51269:4;51275:10;51256:12;:30::i;:::-;51217:4;:17;;:36;51235:4;:17;;;51217:36;;;;;;;;;;;:69;;;;51183:115;51331:1;51321:7;:11;51318:172;;;51349:76;51389:10;51410:4;51417:7;51349:4;:14;;;;;;;;;;;;:31;;;;:76;;;;;;:::i;:::-;51454:24;51470:7;51454:4;:11;;;:15;;:24;;;;:::i;:::-;51440:4;:11;;:38;;;;51318:172;51547:48;51590:4;51547:38;51563:4;:21;;;51547:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;51510:4;:15;;:34;51526:4;:17;;;51510:34;;;;;;;;;;;:85;;;;51631:4;51619:10;51611:34;;;51637:7;51611:34;;;;;;;;;;;;;;;;;;40123:1;;50962:691:::0;;;:::o;38026:21::-;;;;;;;;;;;;;:::o;30434:244::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30543:1:::1;30523:22;;:8;:22;;;;30515:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30633:8;30604:38;;30625:6;::::0;::::1;;;;;;;;30604:38;;;;;;;;;;;;30662:8;30653:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;30434:244:::0;:::o;40567:115::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40660:14:::1;40644:13;:30;;;;40567:115:::0;:::o;40140:112::-;29711:12;:10;:12::i;:::-;29701:22;;:6;;;;;;;;;;:22;;;29693:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40231:13:::1;40216:12;:28;;;;40140:112:::0;:::o;42722:670::-;39988:9;39974:23;;:10;:23;;;39966:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35915:1:::1;35898:13:::0;::::1;:18;;;;;;;;;;;35927:20;35950:13;;35927:36;;42797:4:::2;40096:8;:15;;;;40089:4;:22;40081:31;;;::::0;::::2;;42862:12:::3;;42829:6;;;;;;;;;;;42822:24;;;42847:10;42822:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;:52;;42814:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;42935:18;42948:4;42935:12;:18::i;:::-;42916:16;;:37;;;;;;;;;;;;;;;;;;42964:21;42988:8;42997:4;42988:14;;;;;;;;;;;;;;;;;;42964:38;;43044:4;:15;;;43021:4;:19;;;:38;43013:47;;;::::0;::::3;;43095:4;:19;;;43079:12;:35;;43071:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43200:16;:14;:16::i;:::-;43182:4;:15;;:34;;;;43249:16;;;;;;;;;;;43227:4;:19;;;:38;;;;;;;;;;;;;;;;;;43333:51;43351:10;43363:20;43378:4;43363:14;:20::i;:::-;43333:17;:51::i;:::-;40123:1;35974::::2;36010:13:::1;;35994:12;:29;35986:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40020:1;42722:670:::0;:::o;28127:106::-;28180:15;28215:10;28208:17;;28127:106;:::o;4936:471::-;4994:7;5244:1;5239;:6;5235:47;;;5269:1;5262:8;;;;5235:47;5294:9;5310:1;5306;:5;5294:17;;5339:1;5334;5330;:5;;;;;;:10;5322:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:1;5391:8;;;4936:471;;;;;:::o;5883:132::-;5941:7;5968:39;5972:1;5975;5968:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5961:46;;5883:132;;;;:::o;3582:181::-;3640:7;3660:9;3676:1;3672;:5;3660:17;;3701:1;3696;:6;;3688:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3754:1;3747:8;;;3582:181;;;;:::o;4046:136::-;4104:7;4131:43;4135:1;4138;4131:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4124:50;;4046:136;;;;:::o;16541:177::-;16624:86;16644:5;16674:23;;;16699:2;16703:5;16651:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16624:19;:86::i;:::-;16541:177;;;:::o;48672:227::-;48724:4;40096:8;:15;;;;40089:4;:22;40081:31;;;;;;48741:21:::1;48765:8;48774:4;48765:14;;;;;;;;;;;;;;;;;;48741:38;;48814:1;48790:4;:21;;:25;;;;48849:12;48826:4;:20;;:35;;;;48872:4;:17;;;:19;;;;;;;;;;;;;40123:1;48672:227:::0;;:::o;52981:393::-;53058:16;53084:5;;;;;;;;;;;53077:23;;;53109:4;53077:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53058:57;;53140:8;53130:7;:18;53126:241;;;53165:5;;;;;;;;;;;:10;;53229:3;53234:8;53176:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53165:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53126:241;;;53277:5;;;;;;;;;;;:10;;53341:3;53346:7;53288:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53277:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53126:241;52981:393;;;:::o;46509:253::-;46575:14;46592:8;:15;;;;46575:32;;46622:11;46618:137;46645:6;46639:3;:12;46618:137;;;46710:9;46683:36;;:8;46692:3;46683:13;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;:36;;;;46675:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46653:5;;;;;46618:137;;;;46509:253;;:::o;16726:205::-;16827:96;16847:5;16877:27;;;16906:4;16912:2;16916:5;16854:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16827:19;:96::i;:::-;16726:205;;;;:::o;6511:278::-;6597:7;6629:1;6625;:5;6632:12;6617:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6656:9;6672:1;6668;:5;;;;;;6656:17;;6780:1;6773:8;;;6511:278;;;;;:::o;4485:192::-;4571:7;4604:1;4599;:6;;4607:12;4591:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4631:9;4647:1;4643;:5;4631:17;;4668:1;4661:8;;;4485:192;;;;;:::o;18846:761::-;19270:23;19296:69;19324:4;19296:69;;;;;;;;;;;;;;;;;19304:5;19296:27;;;;:69;;;;;:::i;:::-;19270:95;;19400:1;19380:10;:17;:21;19376:224;;;19522:10;19511:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19503:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19376:224;18846:761;;;:::o;11641:195::-;11744:12;11776:52;11798:6;11806:4;11812:1;11815:12;11776:21;:52::i;:::-;11769:59;;11641:195;;;;;:::o;12693:530::-;12820:12;12878:5;12853:21;:30;;12845:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12945:18;12956:6;12945:10;:18::i;:::-;12937:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13071:12;13085:23;13112:6;:11;;13132:5;13140:4;13112:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13070:75;;;;13163:52;13181:7;13190:10;13202:12;13163:17;:52::i;:::-;13156:59;;;;12693:530;;;;;;:::o;8723:422::-;8783:4;8991:12;9102:7;9090:20;9082:28;;9136:1;9129:4;:8;9122:15;;;8723:422;;;:::o;15233:742::-;15348:12;15377:7;15373:595;;;15408:10;15401:17;;;;15373:595;15542:1;15522:10;:17;:21;15518:439;;;15785:10;15779:17;15846:15;15833:10;15829:2;15825:19;15818:44;15733:148;15928:12;15921:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15233:742;;;;;;:::o
Swarm Source
ipfs://580b406442e3f0424c4c331438fbafa685a43b1275172ebcaf75210f483846bf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.057151 | 56.3739 | $3.22 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.