More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 394 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 12020452 | 1374 days ago | IN | 0 ETH | 0.0070876 | ||||
Set Strategy Con... | 11993492 | 1378 days ago | IN | 0 ETH | 0.00627084 | ||||
Withdraw | 11164021 | 1506 days ago | IN | 0 ETH | 0.0013287 | ||||
Deposit | 11163995 | 1506 days ago | IN | 0 ETH | 0.00182977 | ||||
Emergency Withdr... | 11154231 | 1507 days ago | IN | 0 ETH | 0.00095116 | ||||
Deposit | 11144484 | 1509 days ago | IN | 0 ETH | 0.0015335 | ||||
Withdraw | 11144484 | 1509 days ago | IN | 0 ETH | 0.00158268 | ||||
Deposit | 11144346 | 1509 days ago | IN | 0 ETH | 0.00348528 | ||||
Withdraw | 11143944 | 1509 days ago | IN | 0 ETH | 0.00281016 | ||||
Withdraw | 11142379 | 1509 days ago | IN | 0 ETH | 0.00257423 | ||||
Deposit | 11142314 | 1509 days ago | IN | 0 ETH | 0.00161733 | ||||
Withdraw | 11142298 | 1509 days ago | IN | 0 ETH | 0.00167561 | ||||
Deposit | 11142291 | 1509 days ago | IN | 0 ETH | 0.00277951 | ||||
Deposit | 11140730 | 1509 days ago | IN | 0 ETH | 0.00094716 | ||||
Withdraw | 11140710 | 1509 days ago | IN | 0 ETH | 0.00119783 | ||||
Withdraw | 11140706 | 1509 days ago | IN | 0 ETH | 0.00231062 | ||||
Deposit | 11139395 | 1510 days ago | IN | 0 ETH | 0.00257087 | ||||
Deposit | 11139256 | 1510 days ago | IN | 0 ETH | 0.00269189 | ||||
Withdraw | 11139237 | 1510 days ago | IN | 0 ETH | 0.00786642 | ||||
Withdraw | 11138385 | 1510 days ago | IN | 0 ETH | 0.00471414 | ||||
Withdraw | 11138259 | 1510 days ago | IN | 0 ETH | 0.00167818 | ||||
Withdraw | 11137665 | 1510 days ago | IN | 0 ETH | 0.00472366 | ||||
Withdraw | 11137521 | 1510 days ago | IN | 0 ETH | 0.0038416 | ||||
Withdraw | 11137402 | 1510 days ago | IN | 0 ETH | 0.0030306 | ||||
Deposit | 11137304 | 1510 days ago | IN | 0 ETH | 0.00116338 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
upcoreVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-17 */ /** *Submitted for verification at Etherscan.io on 2020-10-17 */ pragma solidity 0.6.12; // SPDX-License-Identifier: MIT /** * @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) { // Solidity only automatically asserts when dividing by 0 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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); } } /** * @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 ERC20;` 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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)); } } /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } 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; } uint256[50] private __gap; } /** * @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 OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { 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; } uint256[49] private __gap; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface INBUNIERC20 { /** * @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); event Log(string log); } library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logByte(byte p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(byte)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // upcore Vault distributes fees equally amongst staked pools // Have fun reading it. Hopefully it's bug-free. God bless. contract upcoreVault is OwnableUpgradeSafe { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of upcores // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accupcorePerShare) - user.rewardDebt // // Whenever a user deposits or withdraws tokens to a pool. Here's what happens: // 1. The pool's `accupcorePerShare` (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 token; // Address of token contract. uint256 allocPoint; // How many allocation points assigned to this pool. upcores to distribute per block. uint256 accupcorePerShare; // Accumulated upcores per share, times 1e12. See below. bool withdrawable; // Is this pool withdrawable? mapping(address => mapping(address => uint256)) allowance; } // The upcore TOKEN! INBUNIERC20 public upcore; // Dev address. address public devaddr; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes 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; //// pending rewards awaiting anyone to massUpdate uint256 public pendingRewards; uint256 public contractStartBlock; uint256 public epochCalculationStartBlock; uint256 public cumulativeRewardsSinceStart; uint256 public rewardsInThisEpoch; uint public epoch; // Returns fees generated since start of this contract function averageFeesPerBlockSinceStart() external view returns (uint averagePerBlock) { averagePerBlock = cumulativeRewardsSinceStart.add(rewardsInThisEpoch).div(block.number.sub(contractStartBlock)); } // Returns averge fees in this epoch function averageFeesPerBlockEpoch() external view returns (uint256 averagePerBlock) { averagePerBlock = rewardsInThisEpoch.div(block.number.sub(epochCalculationStartBlock)); } // For easy graphing historical epoch rewards mapping(uint => uint256) public epochRewards; //Starts a new calculation epoch // Because averge since start will not be accurate function startNewEpoch() public { require(epochCalculationStartBlock + 50000 < block.number, "New epoch not ready yet"); // About a week epochRewards[epoch] = rewardsInThisEpoch; cumulativeRewardsSinceStart = cumulativeRewardsSinceStart.add(rewardsInThisEpoch); rewardsInThisEpoch = 0; epochCalculationStartBlock = block.number; ++epoch; } 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 ); event Approval(address indexed owner, address indexed spender, uint256 _pid, uint256 value); function initialize( INBUNIERC20 _upcore, address _devaddr, address superAdmin ) public initializer { OwnableUpgradeSafe.__Ownable_init(); DEV_FEE = 1000; upcore = _upcore; devaddr = _devaddr; contractStartBlock = block.number; _superAdmin = superAdmin; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new token pool. Can only be called by the owner. // Note contract owner is meant to be a governance contract allowing upcore governance consensus function add( uint256 _allocPoint, IERC20 _token, bool _withUpdate, bool _withdrawable ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { require(poolInfo[pid].token != _token,"Error pool already added"); } totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ token: _token, allocPoint: _allocPoint, accupcorePerShare: 0, withdrawable : _withdrawable }) ); } // Update the given pool's upcores allocation point. Can only be called by the owner. // Note contract owner is meant to be a governance contract allowing upcore governance consensus function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Update the given pool's ability to withdraw tokens // Note contract owner is meant to be a governance contract allowing upcore governance consensus function setPoolWithdrawable( uint256 _pid, bool _withdrawable ) public onlyOwner { poolInfo[_pid].withdrawable = _withdrawable; } // Sets the dev fee for this contract // defaults at 7.24% // Note contract owner is meant to be a governance contract allowing upcore governance consensus uint16 DEV_FEE; function setDevFee(uint16 _DEV_FEE) public onlyOwner { require(_DEV_FEE <= 1000, 'Dev fee clamped at 10%'); DEV_FEE = _DEV_FEE; } uint256 pending_DEV_rewards; // View function to see pending upcores on frontend. function pendingupcore(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accupcorePerShare = pool.accupcorePerShare; return user.amount.mul(accupcorePerShare).div(1e12).sub(user.rewardDebt); } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { console.log("Mass Updating Pools"); uint256 length = poolInfo.length; uint allRewards; for (uint256 pid = 0; pid < length; ++pid) { allRewards = allRewards.add(updatePool(pid)); } pendingRewards = pendingRewards.sub(allRewards); } // ---- // Function that adds pending rewards, called by the upcore token. // ---- uint256 private upcoreBalance; function addPendingRewards(uint256 _) public { uint256 newRewards = upcore.balanceOf(address(this)).sub(upcoreBalance); if(newRewards > 0) { upcoreBalance = upcore.balanceOf(address(this)); // If there is no change the balance didn't change pendingRewards = pendingRewards.add(newRewards); rewardsInThisEpoch = rewardsInThisEpoch.add(newRewards); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal returns (uint256 upcoreRewardWhole) { PoolInfo storage pool = poolInfo[_pid]; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (tokenSupply == 0) { // avoids division by 0 errors return 0; } upcoreRewardWhole = pendingRewards // Multiplies pending rewards by allocation point of this pool and then total allocation .mul(pool.allocPoint) // getting the percent of total pending rewards this pool should get .div(totalAllocPoint); // we can do this because pools are only mass updated uint256 upcoreRewardFee = upcoreRewardWhole.mul(DEV_FEE).div(10000); uint256 upcoreRewardToDistribute = upcoreRewardWhole.sub(upcoreRewardFee); pending_DEV_rewards = pending_DEV_rewards.add(upcoreRewardFee); pool.accupcorePerShare = pool.accupcorePerShare.add( upcoreRewardToDistribute.mul(1e12).div(tokenSupply) ); } // Deposit tokens to upcoreVault for upcore allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, pool, user, msg.sender); //Transfer in the amounts from user // save gas if(_amount > 0) { pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accupcorePerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Test coverage // [x] Does user get the deposited amounts? // [x] Does user that its deposited for update correcty? // [x] Does the depositor get their tokens decreased function depositFor(address depositFor, uint256 _pid, uint256 _amount) public { // requires no allowances PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][depositFor]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, pool, user, depositFor); // Update the balances of person that amount is being deposited for if(_amount > 0) { pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); // This is depositedFor address } user.rewardDebt = user.amount.mul(pool.accupcorePerShare).div(1e12); /// This is deposited for address emit Deposit(depositFor, _pid, _amount); } // Test coverage // [x] Does allowance update correctly? function setAllowanceForPoolToken(address spender, uint256 _pid, uint256 value) public { PoolInfo storage pool = poolInfo[_pid]; pool.allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender, _pid, value); } // Test coverage // [x] Does allowance decrease? // [x] Do oyu need allowance // [x] Withdraws to correct address function withdrawFrom(address owner, uint256 _pid, uint256 _amount) public{ PoolInfo storage pool = poolInfo[_pid]; require(pool.allowance[owner][msg.sender] >= _amount, "withdraw: insufficient allowance"); pool.allowance[owner][msg.sender] = pool.allowance[owner][msg.sender].sub(_amount); _withdraw(_pid, _amount, owner, msg.sender); } // Withdraw tokens from upcoreVault. function withdraw(uint256 _pid, uint256 _amount) public { _withdraw(_pid, _amount, msg.sender, msg.sender); } // Low level withdraw function function _withdraw(uint256 _pid, uint256 _amount, address from, address to) internal { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][from]; require(user.amount >= _amount, "withdraw: not good"); massUpdatePools(); updateAndPayOutPending(_pid, pool, user, from); // Update balances of from this is not withdrawal but claiming upcore farmed if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.token.safeTransfer(address(to), _amount); } user.rewardDebt = user.amount.mul(pool.accupcorePerShare).div(1e12); emit Withdraw(to, _pid, _amount); } function claim(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][msg.sender]; massUpdatePools(); updateAndPayOutPending(_pid, pool, user, msg.sender); } function updateAndPayOutPending(uint256 _pid, PoolInfo storage pool, UserInfo storage user, address from) internal { if(user.amount == 0) return; uint256 pending = user .amount .mul(pool.accupcorePerShare) .div(1e12) .sub(user.rewardDebt); if(pending > 0) { safeupcoreTransfer(from, pending); } } // function that lets owner/governance contract // approve allowance for any token inside this contract // This means all future UNI like airdrops are covered // And at the same time allows us to give allowance to strategy contracts. // Upcoming cYFI etc vaults strategy contracts will se this function to manage and farm yield on value locked function setStrategyContractOrDistributionContractAllowance(address tokenAddress, uint256 _amount, address contractAddress) public onlySuperAdmin { require(isContract(contractAddress), "Recipent is not a smart contract, BAD"); require(block.number > contractStartBlock.add(95_000), "Governance setup grace period not over"); // about 2weeks IERC20(tokenAddress).approve(contractAddress, _amount); } function isContract(address addr) public returns (bool) { uint size; assembly { size := extcodesize(addr) } return size > 0; } // Withdraw without caring about rewards. EMERGENCY ONLY. // !Caution this will remove all your pending rewards! function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][msg.sender]; pool.token.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; // No mass update dont update pending rewards } // Safe upcore transfer function, just in case if rounding error causes pool to not have enough upcores. function safeupcoreTransfer(address _to, uint256 _amount) internal { if(_amount == 0) return; uint256 upcoreBal = upcore.balanceOf(address(this)); if (_amount > upcoreBal) { console.log("transfering out for to person:", _amount); console.log("Balance of this address is :", upcoreBal); upcore.transfer(_to, upcoreBal); upcoreBalance = upcore.balanceOf(address(this)); } else { upcore.transfer(_to, _amount); upcoreBalance = upcore.balanceOf(address(this)); } if(pending_DEV_rewards > 0) { uint256 devSend = pending_DEV_rewards; // Avoid recursive loop pending_DEV_rewards = 0; safeupcoreTransfer(devaddr, devSend); } } // Update dev address by the previous dev. // Note onlyOwner functions are meant for the governance contract // allowing upcore governance token holders to do this functions. function setDevFeeReciever(address _devaddr) public onlyOwner { devaddr = _devaddr; } address private _superAdmin; event SuperAdminTransfered(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the current super admin */ function superAdmin() public view returns (address) { return _superAdmin; } /** * @dev Throws if called by any account other than the superAdmin */ modifier onlySuperAdmin() { require(_superAdmin == _msgSender(), "Super admin : caller is not super admin."); _; } // Assisns super admint to address 0, making it unreachable forever function burnSuperAdmin() public virtual onlySuperAdmin { emit SuperAdminTransfered(_superAdmin, address(0)); _superAdmin = address(0); } // Super admin can transfer its powers to another address function newSuperAdmin(address newOwner) public virtual onlySuperAdmin { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit SuperAdminTransfered(_superAdmin, newOwner); _superAdmin = newOwner; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SuperAdminTransfered","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":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_","type":"uint256"}],"name":"addPendingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"averageFeesPerBlockEpoch","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"averageFeesPerBlockSinceStart","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeRewardsSinceStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"depositFor","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochCalculationStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract INBUNIERC20","name":"_upcore","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"address","name":"superAdmin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"newSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingupcore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"accupcorePerShare","type":"uint256"},{"internalType":"bool","name":"withdrawable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsInThisEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setAllowanceForPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_DEV_FEE","type":"uint16"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"setDevFeeReciever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"setPoolWithdrawable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setStrategyContractOrDistributionContractAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startNewEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"upcore","outputs":[{"internalType":"contract INBUNIERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061456b806100206000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806364482f791161013b578063c4014588116100b8578063e18cb4fe1161007c578063e18cb4fe146109ef578063e2bbb15814610a21578063eded3fda14610a59578063f2fde38b14610a77578063f5e421b714610abb57610248565b8063c401458814610871578063c507aeaa146108df578063c8ffb87314610945578063d49e77cd14610963578063dbe0901f1461099757610248565b806393f1a40b116100ff57806393f1a40b146106ee5780639dbc2d9014610757578063a676860a14610775578063b45f8fbf146107b9578063c0c53b8b146107ed57610248565b806364482f7914610644578063715018a6146106885780638da5cb5b14610692578063900cf0cf146106c6578063934eaa50146106e457610248565b8063423d6fa0116101c95780635207cc0d1161018d5780635207cc0d146105965780635312ea8e146105d05780635d577c18146105fe578063608c8d3a1461061c578063630b5ba11461063a57610248565b8063423d6fa014610478578063441a3e70146104a657806349c5468d146104de5780634cf5fbf5146104fc5780634dc47d341461055457610248565b806329575f6a1161021057806329575f6a146103705780632d6754e5146103a4578063379607f5146103e85780633a0967cd146104165780633aab0a621461046e57610248565b806303dec0091461024d578063081e3eda1461026b5780631526fe271461028957806316279055146102f857806317caf6f114610352575b600080fd5b610255610b1d565b6040518082815260200191505060405180910390f35b610273610b4d565b6040518082815260200191505060405180910390f35b6102b56004803603602081101561029f57600080fd5b8101908080359060200190929190505050610b5a565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b61033a6004803603602081101561030e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bc4565b60405180821515815260200191505060405180910390f35b61035a610bd7565b6040518082815260200191505060405180910390f35b610378610bdd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e6600480360360208110156103ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c07565b005b610414600480360360208110156103fe57600080fd5b8101908080359060200190929190505050610d15565b005b61046c6004803603606081101561042c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610e08565b005b610476611040565b005b6104a46004803603602081101561048e57600080fd5b8101908080359060200190929190505050611115565b005b6104dc600480360360408110156104bc57600080fd5b8101908080359060200190929190803590602001909291905050506112ff565b005b6104e661130f565b6040518082815260200191505060405180910390f35b6105526004803603606081101561051257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611315565b005b6105806004803603602081101561056a57600080fd5b81019080803590602001909291905050506114a6565b6040518082815260200191505060405180910390f35b6105ce600480360360408110156105ac57600080fd5b81019080803590602001909291908035151590602001909291905050506114be565b005b6105fc600480360360208110156105e657600080fd5b81019080803590602001909291905050506115c2565b005b61060661175b565b6040518082815260200191505060405180910390f35b610624611761565b6040518082815260200191505060405180910390f35b610642611767565b005b6106866004803603606081101561065a57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611807565b005b610690611953565b005b61069a611ade565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ce611b08565b6040518082815260200191505060405180910390f35b6106ec611b0e565b005b61073a6004803603604081101561070457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c7c565b604051808381526020018281526020019250505060405180910390f35b61075f611cad565b6040518082815260200191505060405180910390f35b6107b76004803603602081101561078b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf1565b005b6107c1611ee4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61086f6004803603606081101561080357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f0a565b005b6108dd6004803603606081101561088757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120fc565b005b610943600480360360808110156108f557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050612328565b005b61094d612606565b6040518082815260200191505060405180910390f35b61096b61260c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109ed600480360360608110156109ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612632565b005b610a1f60048036036020811015610a0557600080fd5b81019080803561ffff169060200190929190505050612747565b005b610a5760048036036040811015610a3757600080fd5b8101908080359060200190929190803590602001909291905050506128ad565b005b610a61612a3d565b6040518082815260200191505060405180910390f35b610ab960048036036020811015610a8d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a43565b005b610b0760048036036040811015610ad157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c53565b6040518082815260200191505060405180910390f35b6000610b48610b37609e5443612d1f90919063ffffffff16565b60a054612d6990919063ffffffff16565b905090565b6000609980549050905090565b60998181548110610b6757fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b600080823b905060008111915050919050565b609b5481565b600060a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c0f612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060998281548110610d2457fe5b906000526020600020906005020190508060030160009054906101000a900460ff16610d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144c06026913960400191505060405180910390fd5b6000609a600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610df7611767565b610e0383838333612dbb565b505050565b600060998381548110610e1757fe5b90600052602060002090600502019050818160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f77697468647261773a20696e73756666696369656e7420616c6c6f77616e636581525060200191505060405180910390fd5b610fac828260040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d1f90919063ffffffff16565b8160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061103a83838633612e35565b50505050565b4361c350609e5401106110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772065706f6368206e6f742072656164792079657400000000000000000081525060200191505060405180910390fd5b60a05460a2600060a1548152602001908152602001600020819055506110ee60a054609f546130a690919063ffffffff16565b609f81905550600060a08190555043609e8190555060a16000815460010191905081905550565b60006111ef60a554609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111a657600080fd5b505afa1580156111ba573d6000803e3d6000fd5b505050506040513d60208110156111d057600080fd5b8101908080519060200190929190505050612d1f90919063ffffffff16565b905060008111156112fb57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b810190808051906020019092919050505060a5819055506112d981609c546130a690919063ffffffff16565b609c819055506112f48160a0546130a690919063ffffffff16565b60a0819055505b5050565b61130b82823333612e35565b5050565b609d5481565b60006099838154811061132457fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611390611767565b61139c84838388612dbb565b6000831115611416576113f63330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e909392919063ffffffff16565b61140d8382600001546130a690919063ffffffff16565b81600001819055505b61144864e8d4a5100061143a846002015484600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b8160010181905550838573ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a35050505050565b60a26020528060005260406000206000915090505481565b6114c6612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806099838154811061159657fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055505050565b6000609982815481106115d157fe5b906000526020600020906005020190508060030160009054906101000a900460ff16611648576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144c06026913960400191505060405180910390fd5b6000609a600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506116ef3382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132759092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b609e5481565b60a05481565b6117a56040518060400160405280601381526020017f4d617373205570646174696e6720506f6f6c7300000000000000000000000000815250613317565b60006099805490509050600080600090505b828110156117e7576117da6117cb82613415565b836130a690919063ffffffff16565b91508060010190506117b7565b506117fd81609c54612d1f90919063ffffffff16565b609c819055505050565b61180f612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156118e0576118df611767565b5b61192582611917609986815481106118f457fe5b906000526020600020906005020160010154609b54612d1f90919063ffffffff16565b6130a690919063ffffffff16565b609b81905550816099848154811061193957fe5b906000526020600020906005020160010181905550505050565b61195b612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60a15481565b611b16612db3565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806144496028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a3600060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b609a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000611cec611cc7609d5443612d1f90919063ffffffff16565b611cde60a054609f546130a690919063ffffffff16565b612d6990919063ffffffff16565b905090565b611cf9612db3565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806144496028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143fe6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a38060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900460ff1680611f295750611f28613605565b5b80611f3f575060008054906101000a900460ff16155b611f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611fe4576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b611fec61361c565b6103e860a360006101000a81548161ffff021916908361ffff16021790555083609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043609d819055508160a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156120f65760008060016101000a81548160ff0219169083151502179055505b50505050565b612104612db3565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806144496028913960400191505060405180910390fd5b6121b281610bc4565b612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806144246025913960400191505060405180910390fd5b61221f62017318609d546130a690919063ffffffff16565b4311612276576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144e66026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b505050506040513d602081101561231157600080fd5b810190808051906020019092919050505050505050565b612330612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b811561240157612400611767565b5b6000609980549050905060005b81811015612501578473ffffffffffffffffffffffffffffffffffffffff166099828154811061243a57fe5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4572726f7220706f6f6c20616c7265616479206164646564000000000000000081525060200191505060405180910390fd5b80600101905061240e565b5061251785609b546130a690919063ffffffff16565b609b81905550609960405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200160008152602001841515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505050505050565b609f5481565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006099838154811061264157fe5b90600052602060002090600502019050818160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a78585604051808381526020018281526020019250505060405180910390a350505050565b61274f612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e88161ffff16111561288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4465762066656520636c616d706564206174203130250000000000000000000081525060200191505060405180910390fd5b8060a360006101000a81548161ffff021916908361ffff16021790555050565b6000609983815481106128bc57fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612928611767565b61293484838333612dbb565b60008311156129ae5761298e3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e909392919063ffffffff16565b6129a58382600001546130a690919063ffffffff16565b81600001819055505b6129e064e8d4a510006129d2846002015484600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b609c5481565b612a4b612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143fe6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060998481548110612c6357fe5b906000526020600020906005020190506000609a600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600201549050612d148260010154612d0664e8d4a51000612cf88587600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b612d1f90919063ffffffff16565b935050505092915050565b6000612d6183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061372a565b905092915050565b6000612dab83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506137ea565b905092915050565b600033905090565b600082600001541415612dcd57612e2f565b6000612e178360010154612e0964e8d4a51000612dfb886002015488600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b612d1f90919063ffffffff16565b90506000811115612e2d57612e2c82826138b0565b5b505b50505050565b600060998581548110612e4457fe5b906000526020600020906005020190508060030160009054906101000a900460ff16612ebb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144c06026913960400191505060405180910390fd5b6000609a600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508481600001541015612f89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b612f91611767565b612f9d86838387612dbb565b600085111561301557612fbd858260000154612d1f90919063ffffffff16565b816000018190555061301483868460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132759092919063ffffffff16565b5b61304764e8d4a51000613039846002015484600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b8160010181905550858373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568876040518082815260200191505060405180910390a3505050505050565b600080828401905083811015613124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6131e9846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613d92565b50505050565b600080831415613202576000905061326f565b600082840290508284828161321357fe5b041461326a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144716021913960400191505060405180910390fd5b809150505b92915050565b6133128363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613d92565b505050565b613412816040516024018080602001828103825283818151815260200191508051906020019080838360005b8381101561335e578082015181840152602081019050613343565b50505050905090810190601f16801561338b5780820380516001836020036101000a031916815260200191505b50925050506040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613fdd565b50565b6000806099838154811061342557fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134c257600080fd5b505afa1580156134d6573d6000803e3d6000fd5b505050506040513d60208110156134ec57600080fd5b81019080805190602001909291905050509050600081141561351357600092505050613600565b613540609b546135328460010154609c546131ef90919063ffffffff16565b612d6990919063ffffffff16565b9250600061357f61271061357160a360009054906101000a900461ffff1661ffff16876131ef90919063ffffffff16565b612d6990919063ffffffff16565b905060006135968286612d1f90919063ffffffff16565b90506135ad8260a4546130a690919063ffffffff16565b60a4819055506135f36135e0846135d264e8d4a51000856131ef90919063ffffffff16565b612d6990919063ffffffff16565b85600201546130a690919063ffffffff16565b8460020181905550505050505b919050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff168061363b575061363a613605565b5b80613651575060008054906101000a900460ff16155b6136a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156136f6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6136fe614006565b613706614104565b80156137275760008060016101000a81548160ff0219169083151502179055505b50565b60008383111582906137d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561379c578082015181840152602081019050613781565b50505050905090810190601f1680156137c95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561385b578082015181840152602081019050613840565b50505050905090810190601f1680156138885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816138a257fe5b049050809150509392505050565b60008114156138be57613d8e565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561394957600080fd5b505afa15801561395d573d6000803e3d6000fd5b505050506040513d602081101561397357600080fd5b8101908080519060200190929190505050905080821115613baa576139cd6040518060400160405280601e81526020017f7472616e73666572696e67206f757420666f7220746f20706572736f6e3a0000815250836142ab565b613a0c6040518060400160405280601c81526020017f42616c616e6365206f6620746869732061646472657373206973203a00000000815250826142ab565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a9f57600080fd5b505af1158015613ab3573d6000803e3d6000fd5b505050506040513d6020811015613ac957600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613b6457600080fd5b505afa158015613b78573d6000803e3d6000fd5b505050506040513d6020811015613b8e57600080fd5b810190808051906020019092919050505060a581905550613d44565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c3d57600080fd5b505af1158015613c51573d6000803e3d6000fd5b505050506040513d6020811015613c6757600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613d0257600080fd5b505afa158015613d16573d6000803e3d6000fd5b505050506040513d6020811015613d2c57600080fd5b810190808051906020019092919050505060a5819055505b600060a4541115613d8c57600060a4549050600060a481905550613d8a609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826138b0565b505b505b5050565b613db18273ffffffffffffffffffffffffffffffffffffffff166143b2565b613e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613e725780518252602082019150602081019050602083039250613e4f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ed4576040519150601f19603f3d011682016040523d82523d6000602084013e613ed9565b606091505b509150915081613f51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613fd757808060200190516020811015613f7057600080fd5b8101908080519060200190929190505050613fd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061450c602a913960400191505060405180910390fd5b5b50505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600060019054906101000a900460ff16806140255750614024613605565b5b8061403b575060008054906101000a900460ff16155b614090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156140e0576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156141015760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806141235750614122613605565b5b80614139575060008054906101000a900460ff16155b61418e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156141de576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b60006141e8612db3565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156142a85760008060016101000a81548160ff0219169083151502179055505b50565b6143ae82826040516024018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156142f95780820151818401526020810190506142de565b50505050905090810190601f1680156143265780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613fdd565b5050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156143f457506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c2042414453757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122046a359ebc04752352ee8195f7c94d4badce58f6c424e953f25f4c4f96853688f64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c806364482f791161013b578063c4014588116100b8578063e18cb4fe1161007c578063e18cb4fe146109ef578063e2bbb15814610a21578063eded3fda14610a59578063f2fde38b14610a77578063f5e421b714610abb57610248565b8063c401458814610871578063c507aeaa146108df578063c8ffb87314610945578063d49e77cd14610963578063dbe0901f1461099757610248565b806393f1a40b116100ff57806393f1a40b146106ee5780639dbc2d9014610757578063a676860a14610775578063b45f8fbf146107b9578063c0c53b8b146107ed57610248565b806364482f7914610644578063715018a6146106885780638da5cb5b14610692578063900cf0cf146106c6578063934eaa50146106e457610248565b8063423d6fa0116101c95780635207cc0d1161018d5780635207cc0d146105965780635312ea8e146105d05780635d577c18146105fe578063608c8d3a1461061c578063630b5ba11461063a57610248565b8063423d6fa014610478578063441a3e70146104a657806349c5468d146104de5780634cf5fbf5146104fc5780634dc47d341461055457610248565b806329575f6a1161021057806329575f6a146103705780632d6754e5146103a4578063379607f5146103e85780633a0967cd146104165780633aab0a621461046e57610248565b806303dec0091461024d578063081e3eda1461026b5780631526fe271461028957806316279055146102f857806317caf6f114610352575b600080fd5b610255610b1d565b6040518082815260200191505060405180910390f35b610273610b4d565b6040518082815260200191505060405180910390f35b6102b56004803603602081101561029f57600080fd5b8101908080359060200190929190505050610b5a565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b61033a6004803603602081101561030e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bc4565b60405180821515815260200191505060405180910390f35b61035a610bd7565b6040518082815260200191505060405180910390f35b610378610bdd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e6600480360360208110156103ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c07565b005b610414600480360360208110156103fe57600080fd5b8101908080359060200190929190505050610d15565b005b61046c6004803603606081101561042c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610e08565b005b610476611040565b005b6104a46004803603602081101561048e57600080fd5b8101908080359060200190929190505050611115565b005b6104dc600480360360408110156104bc57600080fd5b8101908080359060200190929190803590602001909291905050506112ff565b005b6104e661130f565b6040518082815260200191505060405180910390f35b6105526004803603606081101561051257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611315565b005b6105806004803603602081101561056a57600080fd5b81019080803590602001909291905050506114a6565b6040518082815260200191505060405180910390f35b6105ce600480360360408110156105ac57600080fd5b81019080803590602001909291908035151590602001909291905050506114be565b005b6105fc600480360360208110156105e657600080fd5b81019080803590602001909291905050506115c2565b005b61060661175b565b6040518082815260200191505060405180910390f35b610624611761565b6040518082815260200191505060405180910390f35b610642611767565b005b6106866004803603606081101561065a57600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611807565b005b610690611953565b005b61069a611ade565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ce611b08565b6040518082815260200191505060405180910390f35b6106ec611b0e565b005b61073a6004803603604081101561070457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c7c565b604051808381526020018281526020019250505060405180910390f35b61075f611cad565b6040518082815260200191505060405180910390f35b6107b76004803603602081101561078b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf1565b005b6107c1611ee4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61086f6004803603606081101561080357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f0a565b005b6108dd6004803603606081101561088757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120fc565b005b610943600480360360808110156108f557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050612328565b005b61094d612606565b6040518082815260200191505060405180910390f35b61096b61260c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109ed600480360360608110156109ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612632565b005b610a1f60048036036020811015610a0557600080fd5b81019080803561ffff169060200190929190505050612747565b005b610a5760048036036040811015610a3757600080fd5b8101908080359060200190929190803590602001909291905050506128ad565b005b610a61612a3d565b6040518082815260200191505060405180910390f35b610ab960048036036020811015610a8d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a43565b005b610b0760048036036040811015610ad157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c53565b6040518082815260200191505060405180910390f35b6000610b48610b37609e5443612d1f90919063ffffffff16565b60a054612d6990919063ffffffff16565b905090565b6000609980549050905090565b60998181548110610b6757fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b600080823b905060008111915050919050565b609b5481565b600060a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c0f612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060998281548110610d2457fe5b906000526020600020906005020190508060030160009054906101000a900460ff16610d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144c06026913960400191505060405180910390fd5b6000609a600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610df7611767565b610e0383838333612dbb565b505050565b600060998381548110610e1757fe5b90600052602060002090600502019050818160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f77697468647261773a20696e73756666696369656e7420616c6c6f77616e636581525060200191505060405180910390fd5b610fac828260040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d1f90919063ffffffff16565b8160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061103a83838633612e35565b50505050565b4361c350609e5401106110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772065706f6368206e6f742072656164792079657400000000000000000081525060200191505060405180910390fd5b60a05460a2600060a1548152602001908152602001600020819055506110ee60a054609f546130a690919063ffffffff16565b609f81905550600060a08190555043609e8190555060a16000815460010191905081905550565b60006111ef60a554609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111a657600080fd5b505afa1580156111ba573d6000803e3d6000fd5b505050506040513d60208110156111d057600080fd5b8101908080519060200190929190505050612d1f90919063ffffffff16565b905060008111156112fb57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b810190808051906020019092919050505060a5819055506112d981609c546130a690919063ffffffff16565b609c819055506112f48160a0546130a690919063ffffffff16565b60a0819055505b5050565b61130b82823333612e35565b5050565b609d5481565b60006099838154811061132457fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611390611767565b61139c84838388612dbb565b6000831115611416576113f63330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e909392919063ffffffff16565b61140d8382600001546130a690919063ffffffff16565b81600001819055505b61144864e8d4a5100061143a846002015484600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b8160010181905550838573ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a35050505050565b60a26020528060005260406000206000915090505481565b6114c6612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806099838154811061159657fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055505050565b6000609982815481106115d157fe5b906000526020600020906005020190508060030160009054906101000a900460ff16611648576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144c06026913960400191505060405180910390fd5b6000609a600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506116ef3382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132759092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b609e5481565b60a05481565b6117a56040518060400160405280601381526020017f4d617373205570646174696e6720506f6f6c7300000000000000000000000000815250613317565b60006099805490509050600080600090505b828110156117e7576117da6117cb82613415565b836130a690919063ffffffff16565b91508060010190506117b7565b506117fd81609c54612d1f90919063ffffffff16565b609c819055505050565b61180f612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156118e0576118df611767565b5b61192582611917609986815481106118f457fe5b906000526020600020906005020160010154609b54612d1f90919063ffffffff16565b6130a690919063ffffffff16565b609b81905550816099848154811061193957fe5b906000526020600020906005020160010181905550505050565b61195b612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60a15481565b611b16612db3565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806144496028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a3600060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b609a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000611cec611cc7609d5443612d1f90919063ffffffff16565b611cde60a054609f546130a690919063ffffffff16565b612d6990919063ffffffff16565b905090565b611cf9612db3565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806144496028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143fe6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a38060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900460ff1680611f295750611f28613605565b5b80611f3f575060008054906101000a900460ff16155b611f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611fe4576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b611fec61361c565b6103e860a360006101000a81548161ffff021916908361ffff16021790555083609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043609d819055508160a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156120f65760008060016101000a81548160ff0219169083151502179055505b50505050565b612104612db3565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806144496028913960400191505060405180910390fd5b6121b281610bc4565b612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806144246025913960400191505060405180910390fd5b61221f62017318609d546130a690919063ffffffff16565b4311612276576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144e66026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156122e757600080fd5b505af11580156122fb573d6000803e3d6000fd5b505050506040513d602081101561231157600080fd5b810190808051906020019092919050505050505050565b612330612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b811561240157612400611767565b5b6000609980549050905060005b81811015612501578473ffffffffffffffffffffffffffffffffffffffff166099828154811061243a57fe5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4572726f7220706f6f6c20616c7265616479206164646564000000000000000081525060200191505060405180910390fd5b80600101905061240e565b5061251785609b546130a690919063ffffffff16565b609b81905550609960405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200160008152602001841515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505050505050565b609f5481565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006099838154811061264157fe5b90600052602060002090600502019050818160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a78585604051808381526020018281526020019250505060405180910390a350505050565b61274f612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e88161ffff16111561288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4465762066656520636c616d706564206174203130250000000000000000000081525060200191505060405180910390fd5b8060a360006101000a81548161ffff021916908361ffff16021790555050565b6000609983815481106128bc57fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612928611767565b61293484838333612dbb565b60008311156129ae5761298e3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661312e909392919063ffffffff16565b6129a58382600001546130a690919063ffffffff16565b81600001819055505b6129e064e8d4a510006129d2846002015484600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b609c5481565b612a4b612db3565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143fe6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060998481548110612c6357fe5b906000526020600020906005020190506000609a600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600201549050612d148260010154612d0664e8d4a51000612cf88587600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b612d1f90919063ffffffff16565b935050505092915050565b6000612d6183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061372a565b905092915050565b6000612dab83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506137ea565b905092915050565b600033905090565b600082600001541415612dcd57612e2f565b6000612e178360010154612e0964e8d4a51000612dfb886002015488600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b612d1f90919063ffffffff16565b90506000811115612e2d57612e2c82826138b0565b5b505b50505050565b600060998581548110612e4457fe5b906000526020600020906005020190508060030160009054906101000a900460ff16612ebb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806144c06026913960400191505060405180910390fd5b6000609a600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508481600001541015612f89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b612f91611767565b612f9d86838387612dbb565b600085111561301557612fbd858260000154612d1f90919063ffffffff16565b816000018190555061301483868460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132759092919063ffffffff16565b5b61304764e8d4a51000613039846002015484600001546131ef90919063ffffffff16565b612d6990919063ffffffff16565b8160010181905550858373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568876040518082815260200191505060405180910390a3505050505050565b600080828401905083811015613124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6131e9846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613d92565b50505050565b600080831415613202576000905061326f565b600082840290508284828161321357fe5b041461326a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144716021913960400191505060405180910390fd5b809150505b92915050565b6133128363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613d92565b505050565b613412816040516024018080602001828103825283818151815260200191508051906020019080838360005b8381101561335e578082015181840152602081019050613343565b50505050905090810190601f16801561338b5780820380516001836020036101000a031916815260200191505b50925050506040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613fdd565b50565b6000806099838154811061342557fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134c257600080fd5b505afa1580156134d6573d6000803e3d6000fd5b505050506040513d60208110156134ec57600080fd5b81019080805190602001909291905050509050600081141561351357600092505050613600565b613540609b546135328460010154609c546131ef90919063ffffffff16565b612d6990919063ffffffff16565b9250600061357f61271061357160a360009054906101000a900461ffff1661ffff16876131ef90919063ffffffff16565b612d6990919063ffffffff16565b905060006135968286612d1f90919063ffffffff16565b90506135ad8260a4546130a690919063ffffffff16565b60a4819055506135f36135e0846135d264e8d4a51000856131ef90919063ffffffff16565b612d6990919063ffffffff16565b85600201546130a690919063ffffffff16565b8460020181905550505050505b919050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff168061363b575061363a613605565b5b80613651575060008054906101000a900460ff16155b6136a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156136f6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6136fe614006565b613706614104565b80156137275760008060016101000a81548160ff0219169083151502179055505b50565b60008383111582906137d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561379c578082015181840152602081019050613781565b50505050905090810190601f1680156137c95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613896576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561385b578082015181840152602081019050613840565b50505050905090810190601f1680156138885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816138a257fe5b049050809150509392505050565b60008114156138be57613d8e565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561394957600080fd5b505afa15801561395d573d6000803e3d6000fd5b505050506040513d602081101561397357600080fd5b8101908080519060200190929190505050905080821115613baa576139cd6040518060400160405280601e81526020017f7472616e73666572696e67206f757420666f7220746f20706572736f6e3a0000815250836142ab565b613a0c6040518060400160405280601c81526020017f42616c616e6365206f6620746869732061646472657373206973203a00000000815250826142ab565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a9f57600080fd5b505af1158015613ab3573d6000803e3d6000fd5b505050506040513d6020811015613ac957600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613b6457600080fd5b505afa158015613b78573d6000803e3d6000fd5b505050506040513d6020811015613b8e57600080fd5b810190808051906020019092919050505060a581905550613d44565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c3d57600080fd5b505af1158015613c51573d6000803e3d6000fd5b505050506040513d6020811015613c6757600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613d0257600080fd5b505afa158015613d16573d6000803e3d6000fd5b505050506040513d6020811015613d2c57600080fd5b810190808051906020019092919050505060a5819055505b600060a4541115613d8c57600060a4549050600060a481905550613d8a609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826138b0565b505b505b5050565b613db18273ffffffffffffffffffffffffffffffffffffffff166143b2565b613e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613e725780518252602082019150602081019050602083039250613e4f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ed4576040519150601f19603f3d011682016040523d82523d6000602084013e613ed9565b606091505b509150915081613f51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613fd757808060200190516020811015613f7057600080fd5b8101908080519060200190929190505050613fd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061450c602a913960400191505060405180910390fd5b5b50505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600060019054906101000a900460ff16806140255750614024613605565b5b8061403b575060008054906101000a900460ff16155b614090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156140e0576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156141015760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806141235750614122613605565b5b80614139575060008054906101000a900460ff16155b61418e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614492602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156141de576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b60006141e8612db3565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156142a85760008060016101000a81548160ff0219169083151502179055505b50565b6143ae82826040516024018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156142f95780820151818401526020810190506142de565b50505050905090810190601f1680156143265780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613fdd565b5050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156143f457506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c2042414453757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122046a359ebc04752352ee8195f7c94d4badce58f6c424e953f25f4c4f96853688f64736f6c634300060c0033
Deployed Bytecode Sourcemap
94765:17165:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97200:189;;;:::i;:::-;;;;;;;;;;;;;;;;;;;98739:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;96299:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108800:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96538:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;111037:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;110716:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;107232:334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;105831:382;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;97595:398;;;:::i;:::-;;102034:423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;106266:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96671:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;104530:828;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;97448:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;100469:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;109097:488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96711:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;96808:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;101552:340;;;:::i;:::-;;99936:364;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27677:148;;;:::i;:::-;;27035:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96848:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;111441:160;;;:::i;:::-;;96379:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;96934:216;;;:::i;:::-;;;;;;;;;;;;;;;;;;;111672:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96188:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;98385:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;108362:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;99011:718;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96759:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;96241:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;105433:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;100840:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;103627:704;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96633:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27980:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;101094:375;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;97200:189;97259:23;97313:68;97336:44;97353:26;;97336:12;:16;;:44;;;;:::i;:::-;97313:18;;:22;;:68;;;;:::i;:::-;97295:86;;97200:189;:::o;98739:95::-;98784:7;98811:8;:15;;;;98804:22;;98739:95;:::o;96299:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;108800:158::-;108850:4;108867:9;108918:4;108906:17;108898:25;;108949:1;108942:4;:8;108935:15;;;108800:158;;;:::o;96538:30::-;;;;:::o;111037:89::-;111080:7;111107:11;;;;;;;;;;;111100:18;;111037:89;:::o;110716:99::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110799:8:::1;110789:7;;:18;;;;;;;;;;;;;;;;;;110716:99:::0;:::o;107232:334::-;107279:21;107303:8;107312:4;107303:14;;;;;;;;;;;;;;;;;;107279:38;;107336:4;:17;;;;;;;;;;;;107328:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107407:21;107431:8;:14;107440:4;107431:14;;;;;;;;;;;:26;107446:10;107431:26;;;;;;;;;;;;;;;107407:50;;107478:17;:15;:17::i;:::-;107506:52;107529:4;107535;107541;107547:10;107506:22;:52::i;:::-;107232:334;;;:::o;105831:382::-;105918:21;105942:8;105951:4;105942:14;;;;;;;;;;;;;;;;;;105918:38;;106012:7;105975:4;:14;;:21;105990:5;105975:21;;;;;;;;;;;;;;;:33;105997:10;105975:33;;;;;;;;;;;;;;;;:44;;105967:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106103:46;106141:7;106103:4;:14;;:21;106118:5;106103:21;;;;;;;;;;;;;;;:33;106125:10;106103:33;;;;;;;;;;;;;;;;:37;;:46;;;;:::i;:::-;106067:4;:14;;:21;106082:5;106067:21;;;;;;;;;;;;;;;:33;106089:10;106067:33;;;;;;;;;;;;;;;:82;;;;106160:43;106170:4;106176:7;106185:5;106192:10;106160:9;:43::i;:::-;105831:382;;;;:::o;97595:398::-;97683:12;97675:5;97646:26;;:34;:49;97638:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97772:18;;97750:12;:19;97763:5;;97750:19;;;;;;;;;;;:40;;;;97831:51;97863:18;;97831:27;;:31;;:51;;;;:::i;:::-;97801:27;:81;;;;97914:1;97893:18;:22;;;;97955:12;97926:26;:41;;;;97980:5;;97978:7;;;;;;;;;;;97595:398::o;102034:423::-;102090:18;102111:50;102147:13;;102111:6;;;;;;;;;;;:16;;;102136:4;102111:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;:50;;;;:::i;:::-;102090:71;;102190:1;102177:10;:14;102174:276;;;102224:6;;;;;;;;;;;:16;;;102249:4;102224:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102208:13;:47;;;;102338:30;102357:10;102338:14;;:18;;:30;;;;:::i;:::-;102321:14;:47;;;;102404:34;102427:10;102404:18;;:22;;:34;;;;:::i;:::-;102383:18;:55;;;;102174:276;102034:423;;:::o;106266:127::-;106335:48;106345:4;106351:7;106360:10;106372;106335:9;:48::i;:::-;106266:127;;:::o;96671:33::-;;;;:::o;104530:828::-;104654:21;104678:8;104687:4;104678:14;;;;;;;;;;;;;;;;;;104654:38;;104703:21;104727:8;:14;104736:4;104727:14;;;;;;;;;;;:26;104742:10;104727:26;;;;;;;;;;;;;;;104703:50;;104766:17;:15;:17::i;:::-;104852:52;104875:4;104881;104887;104893:10;104852:22;:52::i;:::-;104998:1;104988:7;:11;104985:200;;;105016:72;105052:10;105073:4;105080:7;105016:4;:10;;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;105117:24;105133:7;105117:4;:11;;;:15;;:24;;;;:::i;:::-;105103:4;:11;;:38;;;;104985:200;105215:49;105259:4;105215:39;105231:4;:22;;;105215:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;105197:4;:15;;:67;;;;105334:4;105322:10;105314:34;;;105340:7;105314:34;;;;;;;;;;;;;;;;;;104530:828;;;;;:::o;97448:44::-;;;;;;;;;;;;;;;;;:::o;100469:167::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100615:13:::1;100585:8;100594:4;100585:14;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;100469:167:::0;;:::o;109097:488::-;109156:21;109180:8;109189:4;109180:14;;;;;;;;;;;;;;;;;;109156:38;;109213:4;:17;;;;;;;;;;;;109205:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109284:21;109308:8;:14;109317:4;109308:14;;;;;;;;;;;:26;109323:10;109308:26;;;;;;;;;;;;;;;109284:50;;109345:57;109377:10;109390:4;:11;;;109345:4;:10;;;;;;;;;;;;:23;;;;:57;;;;;:::i;:::-;109448:4;109436:10;109418:48;;;109454:4;:11;;;109418:48;;;;;;;;;;;;;;;;;;109491:1;109477:4;:11;;:15;;;;109521:1;109503:4;:15;;:19;;;;109097:488;;;:::o;96711:41::-;;;;:::o;96808:33::-;;;;:::o;101552:340::-;101597:34;;;;;;;;;;;;;;;;;;:11;:34::i;:::-;101642:14;101659:8;:15;;;;101642:32;;101685:15;101716:11;101730:1;101716:15;;101711:114;101739:6;101733:3;:12;101711:114;;;101782:31;101797:15;101808:3;101797:10;:15::i;:::-;101782:10;:14;;:31;;;;:::i;:::-;101769:44;;101747:5;;;;;101711:114;;;;101854:30;101873:10;101854:14;;:18;;:30;;;;:::i;:::-;101837:14;:47;;;;101552:340;;:::o;99936:364::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100068:11:::1;100064:61;;;100096:17;:15;:17::i;:::-;100064:61;100155:87;100220:11;100155:46;100175:8;100184:4;100175:14;;;;;;;;;;;;;;;;;;:25;;;100155:15;;:19;;:46;;;;:::i;:::-;:50;;:87;;;;:::i;:::-;100137:15;:105;;;;100281:11;100253:8;100262:4;100253:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;99936:364:::0;;;:::o;27677:148::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27784:1:::1;27747:40;;27768:6;;;;;;;;;;;27747:40;;;;;;;;;;;;27815:1;27798:6;;:19;;;;;;;;;;;;;;;;;;27677:148::o:0;27035:79::-;27073:7;27100:6;;;;;;;;;;;27093:13;;27035:79;:::o;96848:17::-;;;;:::o;111441:160::-;111283:12;:10;:12::i;:::-;111268:27;;:11;;;;;;;;;;;:27;;;111260:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111555:1:::1;111513:45;;111534:11;;;;;;;;;;;111513:45;;;;;;;;;;;;111591:1;111569:11;;:24;;;;;;;;;;;;;;;;;;111441:160::o:0;96379:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96934:216::-;96998:20;97049:93;97105:36;97122:18;;97105:12;:16;;:36;;;;:::i;:::-;97049:51;97081:18;;97049:27;;:31;;:51;;;;:::i;:::-;:55;;:93;;;;:::i;:::-;97031:111;;96934:216;:::o;111672:255::-;111283:12;:10;:12::i;:::-;111268:27;;:11;;;;;;;;;;;:27;;;111260:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111782:1:::1;111762:22;;:8;:22;;;;111754:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111877:8;111843:43;;111864:11;;;;;;;;;;;111843:43;;;;;;;;;;;;111911:8;111897:11;;:22;;;;;;;;;;;;;;;;;;111672:255:::0;:::o;96188:25::-;;;;;;;;;;;;;:::o;98385:346::-;23499:12;;;;;;;;;;;:31;;;;23515:15;:13;:15::i;:::-;23499:31;:47;;;;23535:11;;;;;;;;;;23534:12;23499:47;23491:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23606:19;23629:12;;;;;;;;;;;23628:13;23606:35;;23652:14;23648:83;;;23692:4;23677:12;;:19;;;;;;;;;;;;;;;;;;23719:4;23705:11;;:18;;;;;;;;;;;;;;;;;;23648:83;98528:35:::1;:33;:35::i;:::-;98584:4;98574:7;;:14;;;;;;;;;;;;;;;;;;98608:7;98599:6;;:16;;;;;;;;;;;;;;;;;;98636:8;98626:7;;:18;;;;;;;;;;;;;;;;;;98676:12;98655:18;:33;;;;98713:10;98699:11;;:24;;;;;;;;;;;;;;;;;;23753:14:::0;23749:57;;;23793:5;23778:12;;:20;;;;;;;;;;;;;;;;;;23749:57;98385:346;;;;:::o;108362:430::-;111283:12;:10;:12::i;:::-;111268:27;;:11;;;;;;;;;;;:27;;;111260:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108527:27:::1;108538:15;108527:10;:27::i;:::-;108519:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108630:30;108653:6;108630:18;;:22;;:30;;;;:::i;:::-;108615:12;:45;108607:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108737:12;108730:28;;;108759:15;108776:7;108730:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;108362:430:::0;;;:::o;99011:718::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99173:11:::1;99169:61;;;99201:17;:15;:17::i;:::-;99169:61;99242:14;99259:8;:15;;;;99242:32;;99290:11;99285:135;99313:6;99307:3;:12;99285:135;;;99374:6;99351:29;;:8;99360:3;99351:13;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;:29;;;;99343:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;99321:5;;;;;99285:135;;;;99450:32;99470:11;99450:15;;:19;;:32;;;;:::i;:::-;99432:15;:50;;;;99497:8;99525:185;;;;;;;;99560:6;99525:185;;;;;;99597:11;99525:185;;;;99646:1;99525:185;;;;99681:13;99525:185;;;;::::0;99497:224:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27317:1;99011:718:::0;;;;:::o;96759:42::-;;;;:::o;96241:22::-;;;;;;;;;;;;;:::o;105433:256::-;105531:21;105555:8;105564:4;105555:14;;;;;;;;;;;;;;;;;;105531:38;;105618:5;105580:4;:14;;:26;105595:10;105580:26;;;;;;;;;;;;;;;:35;105607:7;105580:35;;;;;;;;;;;;;;;:43;;;;105660:7;105639:42;;105648:10;105639:42;;;105669:4;105675:5;105639:42;;;;;;;;;;;;;;;;;;;;;;;;105433:256;;;;:::o;100840:152::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100924:4:::1;100912:8;:16;;;;100904:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;100976:8;100966:7;;:18;;;;;;;;;;;;;;;;;;100840:152:::0;:::o;103627:704::-;103695:21;103719:8;103728:4;103719:14;;;;;;;;;;;;;;;;;;103695:38;;103744:21;103768:8;:14;103777:4;103768:14;;;;;;;;;;;:26;103783:10;103768:26;;;;;;;;;;;;;;;103744:50;;103807:17;:15;:17::i;:::-;103893:52;103916:4;103922;103928;103934:10;103893:22;:52::i;:::-;104039:1;104029:7;:11;104026:168;;;104057:72;104093:10;104114:4;104121:7;104057:4;:10;;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;104158:24;104174:7;104158:4;:11;;;:15;;:24;;;;:::i;:::-;104144:4;:11;;:38;;;;104026:168;104224:49;104268:4;104224:39;104240:4;:22;;;104224:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;104206:4;:15;;:67;;;;104309:4;104297:10;104289:34;;;104315:7;104289:34;;;;;;;;;;;;;;;;;;103627:704;;;;:::o;96633:29::-;;;;:::o;27980:244::-;27257:12;:10;:12::i;:::-;27247:22;;:6;;;;;;;;;;;:22;;;27239:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28089:1:::1;28069:22;;:8;:22;;;;28061:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28179:8;28150:38;;28171:6;;;;;;;;;;;28150:38;;;;;;;;;;;;28208:8;28199:6;;:17;;;;;;;;;;;;;;;;;;27980:244:::0;:::o;101094:375::-;101196:7;101221:21;101245:8;101254:4;101245:14;;;;;;;;;;;;;;;;;;101221:38;;101270:21;101294:8;:14;101303:4;101294:14;;;;;;;;;;;:21;101309:5;101294:21;;;;;;;;;;;;;;;101270:45;;101326:25;101354:4;:22;;;101326:50;;101396:65;101445:4;:15;;;101396:44;101435:4;101396:34;101412:17;101396:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;101389:72;;;;;101094:375;;;;:::o;4134:136::-;4192:7;4219:43;4223:1;4226;4219:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4212:50;;4134:136;;;;:::o;5947:132::-;6005:7;6032:39;6036:1;6039;6032:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6025:46;;5947:132;;;;:::o;25422:106::-;25475:15;25510:10;25503:17;;25422:106;:::o;107574:410::-;107720:1;107705:4;:11;;;:16;107702:28;;;107723:7;;107702:28;107742:15;107760:126;107870:4;:15;;;107760:91;107846:4;107760:67;107804:4;:22;;;107760:4;:25;;;:43;;:67;;;;:::i;:::-;:85;;:91;;;;:::i;:::-;:109;;:126;;;;:::i;:::-;107742:144;;107912:1;107902:7;:11;107899:76;;;107930:33;107949:4;107955:7;107930:18;:33::i;:::-;107899:76;107574:410;;;;;;:::o;106443:781::-;106539:21;106563:8;106572:4;106563:14;;;;;;;;;;;;;;;;;;106539:38;;106596:4;:17;;;;;;;;;;;;106588:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106667:21;106691:8;:14;106700:4;106691:14;;;;;;;;;;;:20;106706:4;106691:20;;;;;;;;;;;;;;;106667:44;;106745:7;106730:4;:11;;;:22;;106722:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106788:17;:15;:17::i;:::-;106816:47;106839:4;106846;106852;106858;106816:22;:47::i;:::-;106966:1;106956:7;:11;106953:141;;;106998:24;107014:7;106998:4;:11;;;:15;;:24;;;;:::i;:::-;106984:4;:11;;:38;;;;107037:45;107069:2;107074:7;107037:4;:10;;;;;;;;;;;;:23;;;;:45;;;;;:::i;:::-;106953:141;107122:49;107166:4;107122:39;107138:4;:22;;;107122:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;107104:4;:15;;:67;;;;107202:4;107198:2;107189:27;;;107208:7;107189:27;;;;;;;;;;;;;;;;;;106443:781;;;;;;:::o;3678:181::-;3736:7;3756:9;3772:1;3768;:5;3756:17;;3797:1;3792;:6;;3784:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3850:1;3843:8;;;3678:181;;;;:::o;11531:205::-;11632:96;11652:5;11682:27;;;11711:4;11717:2;11721:5;11659:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11632:19;:96::i;:::-;11531:205;;;;:::o;5008:471::-;5066:7;5316:1;5311;:6;5307:47;;;5341:1;5334:8;;;;5307:47;5366:9;5382:1;5378;:5;5366:17;;5411:1;5406;5402;:5;;;;;;:10;5394:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5470:1;5463:8;;;5008:471;;;;;:::o;11346:177::-;11429:86;11449:5;11479:23;;;11504:2;11508:5;11456:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11429:19;:86::i;:::-;11346:177;;;:::o;36288:114::-;36338:59;36393:2;36354:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36338:15;:59::i;:::-;36288:114;:::o;102533:1024::-;102585:25;102623:21;102647:8;102656:4;102647:14;;;;;;;;;;;;;;;;;;102623:38;;102674:19;102696:4;:10;;;;;;;;;;;;:20;;;102725:4;102696:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102674:57;;102761:1;102746:11;:16;102742:88;;;102817:1;102810:8;;;;;;102742:88;102860:249;103093:15;;102860:138;102982:4;:15;;;102860:14;;:121;;:138;;;;:::i;:::-;:232;;:249;;;;:::i;:::-;102840:269;;103180:23;103206:41;103241:5;103206:30;103228:7;;;;;;;;;;;103206:30;;:17;:21;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;103180:67;;103258:32;103293:38;103315:15;103293:17;:21;;:38;;;;:::i;:::-;103258:73;;103366:40;103390:15;103366:19;;:23;;:40;;;;:::i;:::-;103344:19;:62;;;;103444:103;103485:51;103524:11;103485:34;103514:4;103485:24;:28;;:34;;;;:::i;:::-;:38;;:51;;;;:::i;:::-;103444:4;:22;;;:26;;:103;;;;:::i;:::-;103419:4;:22;;:128;;;;102533:1024;;;;;;;;:::o;23900:508::-;23947:4;24294:12;24317:4;24294:28;;24329:10;24375:4;24363:17;24357:23;;24401:1;24395:2;:7;24388:14;;;;23900:508;:::o;26613:129::-;23499:12;;;;;;;;;;;:31;;;;23515:15;:13;:15::i;:::-;23499:31;:47;;;;23535:11;;;;;;;;;;23534:12;23499:47;23491:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23606:19;23629:12;;;;;;;;;;;23628:13;23606:35;;23652:14;23648:83;;;23692:4;23677:12;;:19;;;;;;;;;;;;;;;;;;23719:4;23705:11;;:18;;;;;;;;;;;;;;;;;;23648:83;26671:26:::1;:24;:26::i;:::-;26708;:24;:26::i;:::-;23753:14:::0;23749:57;;;23793:5;23778:12;;:20;;;;;;;;;;;;;;;;;;23749:57;26613:129;:::o;4565:192::-;4651:7;4684:1;4679;:6;;4687:12;4671:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4711:9;4727:1;4723;:5;4711:17;;4748:1;4741:8;;;4565:192;;;;;:::o;6567:345::-;6653:7;6752:1;6748;:5;6755:12;6740:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6779:9;6795:1;6791;:5;;;;;;6779:17;;6903:1;6896:8;;;6567:345;;;;;:::o;109703:815::-;109795:1;109784:7;:12;109781:24;;;109798:7;;109781:24;109817:17;109837:6;;;;;;;;;;;:16;;;109862:4;109837:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109817:51;;109893:9;109883:7;:19;109879:413;;;109919:54;;;;;;;;;;;;;;;;;;109965:7;109919:11;:54::i;:::-;109988;;;;;;;;;;;;;;;;;;110032:9;109988:11;:54::i;:::-;110059:6;;;;;;;;;;;:15;;;110075:3;110080:9;110059:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110121:6;;;;;;;;;;;:16;;;110146:4;110121:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110105:13;:47;;;;109879:413;;;110187:6;;;;;;;;;;;:15;;;110203:3;110208:7;110187:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110247:6;;;;;;;;;;;:16;;;110272:4;110247:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110231:13;:47;;;;109879:413;110329:1;110307:19;;:23;110304:205;;;110347:15;110365:19;;110347:37;;110445:1;110423:19;:23;;;;110461:36;110480:7;;;;;;;;;;;110489;110461:18;:36::i;:::-;110304:205;;109703:815;;;;:::o;13390:1115::-;13995:27;14003:5;13995:25;;;:27::i;:::-;13987:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14132:12;14146:23;14181:5;14173:19;;14193:4;14173:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14131:67;;;;14217:7;14209:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14298:1;14278:10;:17;:21;14274:224;;;14420:10;14409:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14401:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14274:224;13390:1115;;;;:::o;31129:295::-;31194:21;31218:7;:14;31194:38;;31237:22;31080:42;31237:40;;31330:2;31321:7;31317:16;31413:1;31410;31395:13;31381:12;31365:14;31358:5;31347:68;31291:129;;;;;:::o;25343:69::-;23499:12;;;;;;;;;;;:31;;;;23515:15;:13;:15::i;:::-;23499:31;:47;;;;23535:11;;;;;;;;;;23534:12;23499:47;23491:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23606:19;23629:12;;;;;;;;;;;23628:13;23606:35;;23652:14;23648:83;;;23692:4;23677:12;;:19;;;;;;;;;;;;;;;;;;23719:4;23705:11;;:18;;;;;;;;;;;;;;;;;;23648:83;23753:14;23749:57;;;23793:5;23778:12;;:20;;;;;;;;;;;;;;;;;;23749:57;25343:69;:::o;26750:202::-;23499:12;;;;;;;;;;;:31;;;;23515:15;:13;:15::i;:::-;23499:31;:47;;;;23535:11;;;;;;;;;;23534:12;23499:47;23491:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23606:19;23629:12;;;;;;;;;;;23628:13;23606:35;;23652:14;23648:83;;;23692:4;23677:12;;:19;;;;;;;;;;;;;;;;;;23719:4;23705:11;;:18;;;;;;;;;;;;;;;;;;23648:83;26822:17:::1;26842:12;:10;:12::i;:::-;26822:32;;26874:9;26865:6;;:18;;;;;;;;;;;;;;;;;;26932:9;26899:43;;26928:1;26899:43;;;;;;;;;;;;23739:1;23753:14:::0;23749:57;;;23793:5;23778:12;;:20;;;;;;;;;;;;;;;;;;23749:57;26750:202;:::o;37150:132::-;37209:68;37269:2;37273;37225:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37209:15;:68::i;:::-;37150:132;;:::o;8830:619::-;8890:4;9152:16;9179:19;9201:66;9179:88;;;;9370:7;9358:20;9346:32;;9410:11;9398:8;:23;;:42;;;;;9437:3;9425:15;;:8;:15;;9398:42;9390:51;;;;8830:619;;;:::o
Swarm Source
ipfs://46a359ebc04752352ee8195f7c94d4badce58f6c424e953f25f4c4f96853688f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.