More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 75,318 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 104498122 | 37 days ago | IN | 0 FTM | 0.00004255 | ||||
Transfer | 104498118 | 37 days ago | IN | 0 FTM | 0.00004354 | ||||
Approve | 102074911 | 72 days ago | IN | 0 FTM | 0.00007631 | ||||
Approve | 101019488 | 85 days ago | IN | 0 FTM | 0.00010329 | ||||
Approve | 100363469 | 91 days ago | IN | 0 FTM | 0.00019316 | ||||
Approve | 100120320 | 94 days ago | IN | 0 FTM | 0.00012912 | ||||
Approve | 99121611 | 105 days ago | IN | 0 FTM | 0.00026782 | ||||
Approve | 98859157 | 108 days ago | IN | 0 FTM | 0.00010329 | ||||
Approve | 98857634 | 108 days ago | IN | 0 FTM | 0.00010329 | ||||
Approve | 98570865 | 111 days ago | IN | 0 FTM | 0.00025824 | ||||
Approve | 98570860 | 111 days ago | IN | 0 FTM | 0.00025824 | ||||
Approve | 95689292 | 144 days ago | IN | 0 FTM | 0.00015494 | ||||
Approve | 95037850 | 152 days ago | IN | 0 FTM | 0.0002114 | ||||
Transfer | 92354371 | 178 days ago | IN | 0 FTM | 0.00048323 | ||||
Approve | 89167934 | 214 days ago | IN | 0 FTM | 0.00038736 | ||||
Approve | 88201635 | 223 days ago | IN | 0 FTM | 0.00052755 | ||||
Approve | 88201609 | 223 days ago | IN | 0 FTM | 0.00052755 | ||||
Approve | 88201595 | 223 days ago | IN | 0 FTM | 0.00052755 | ||||
Approve | 87803635 | 227 days ago | IN | 0 FTM | 0.00116145 | ||||
Approve | 87803629 | 227 days ago | IN | 0 FTM | 0.00116145 | ||||
Approve | 87803624 | 227 days ago | IN | 0 FTM | 0.00116145 | ||||
Approve | 85041218 | 253 days ago | IN | 0 FTM | 0.00158335 | ||||
Approve | 84651059 | 257 days ago | IN | 0 FTM | 0.00049065 | ||||
Approve | 84651045 | 257 days ago | IN | 0 FTM | 0.00160108 | ||||
Approve | 80793565 | 312 days ago | IN | 0 FTM | 0.00013591 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
26158302 | 1179 days ago | 0.36530571 FTM | ||||
26158302 | 1179 days ago | 0.36530571 FTM | ||||
24658062 | 1194 days ago | 1.24266119 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM | ||||
24658062 | 1194 days ago | 0.79871346 FTM | ||||
24658062 | 1194 days ago | 0.79871346 FTM | ||||
24658062 | 1194 days ago | 0.0887516 FTM | ||||
24658062 | 1194 days ago | 0.0887516 FTM | ||||
24658062 | 1194 days ago | 1.24266119 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM | ||||
24658062 | 1194 days ago | 0.79871346 FTM | ||||
24658062 | 1194 days ago | 0.79871346 FTM | ||||
24658062 | 1194 days ago | 0.0887516 FTM | ||||
24658062 | 1194 days ago | 0.0887516 FTM | ||||
24658062 | 1194 days ago | 1.24266119 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM | ||||
24658062 | 1194 days ago | 0.79871346 FTM | ||||
24658062 | 1194 days ago | 0.79871346 FTM | ||||
24658062 | 1194 days ago | 0.0887516 FTM | ||||
24658062 | 1194 days ago | 0.0887516 FTM | ||||
24658062 | 1194 days ago | 1.24266119 FTM | ||||
24658062 | 1194 days ago | 0.22184855 FTM |
Loading...
Loading
This contract contains unverified libraries: IterableMapping
Contract Name:
Samurai
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-12-04 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title SafeMathUint * @dev Math operations with safety TKNcks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0, "toInt256Safe: B LESS THAN ZERO"); return b; } } pragma solidity ^0.8.0; /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety TKNcks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require( c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256), "mul: A B C combi values invalid with MIN_INT256" ); require((b == 0) || (c / b == a), "mul: A B C combi values invalid"); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256, "div: b == 1 OR A == MIN_INT256"); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require( (b >= 0 && c <= a) || (b < 0 && c > a), "sub: A B C combi values invalid" ); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require( (b >= 0 && c >= a) || (b < 0 && c < a), "add: A B C combi values invalid" ); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256, "abs: A EQUAL MIN INT256"); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0, "toUint256Safe: A LESS THAN ZERO"); return uint256(a); } } pragma solidity ^0.8.0; 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 TKNaper 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 untouTKNd) 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 untouTKNd) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouTKNd) 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 untouTKNd) 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; } } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint256) values; mapping(address => uint256) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint256) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int256) { if (!map.inserted[key]) { return -1; } return int256(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint256 index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint256) { return map.keys.length; } function set( Map storage map, address key, uint256 val ) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint256 index = map.indexOf[key]; uint256 lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } // OpenZeppelin Contracts v4.3.2 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { 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; } } /** * @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 Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } pragma solidity ^0.8.0; contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // OpenZeppelin Contracts v4.3.2 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' 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) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // OpenZeppelin Contracts v4.3.2 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased( IERC20 indexed token, address to, uint256 amount ); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require( payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch" ); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment( account, totalReceived, released(account) ); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment( account, totalReceived, released(token, account) ); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require( account != address(0), "PaymentSplitter: account is the zero address" ); require(shares_ > 0, "PaymentSplitter: shares are 0"); require( _shares[account] == 0, "PaymentSplitter: account already has shares" ); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } contract NODERewardManagement { using SafeMath for uint256; using IterableMapping for IterableMapping.Map; struct NodeEntity { string name; uint256 creationTime; uint256 lastClaimTime; uint256 rewardAvailable; } IterableMapping.Map private nodeOwners; mapping(address => NodeEntity[]) private _nodesOfUser; uint256 public nodePrice; uint256 public rewardPerNode; uint256 public claimTime; bool public autoDistri = true; bool public distribution = false; uint256 public gasForDistribution = 300000; uint256 public lastDistributionCount = 0; uint256 public lastIndexProcessed = 0; uint256 public totalNodesCreated = 0; uint256 public totalRewardStaked = 0; constructor( uint256 _nodePrice, uint256 _rewardPerNode, uint256 _claimTime ) { nodePrice = _nodePrice; rewardPerNode = _rewardPerNode; claimTime = _claimTime; } function distributeRewards(uint256 gas, uint256 rewardNode) private returns ( uint256, uint256, uint256 ) { distribution = true; uint256 numberOfnodeOwners = nodeOwners.keys.length; require(numberOfnodeOwners > 0, "DISTRI REWARDS: NO NODE OWNERS"); if (numberOfnodeOwners == 0) { return (0, 0, lastIndexProcessed); } uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 newGasLeft; uint256 localLastIndex = lastIndexProcessed; uint256 iterations = 0; uint256 newClaimTime = block.timestamp; uint256 nodesCount; uint256 claims = 0; NodeEntity[] storage nodes; NodeEntity storage _node; while (gasUsed < gas && iterations < numberOfnodeOwners) { localLastIndex++; if (localLastIndex >= nodeOwners.keys.length) { localLastIndex = 0; } nodes = _nodesOfUser[nodeOwners.keys[localLastIndex]]; nodesCount = nodes.length; for (uint256 i = 0; i < nodesCount; i++) { _node = nodes[i]; if (claimable(_node)) { _node.rewardAvailable += rewardNode; _node.lastClaimTime = newClaimTime; totalRewardStaked += rewardNode; claims++; } } iterations++; newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastIndexProcessed = localLastIndex; distribution = false; return (iterations, claims, lastIndexProcessed); } function createNode(address account, string memory nodeName) external { require( isNameAvailable(account, nodeName), "CREATE NODE: Name not available" ); _nodesOfUser[account].push( NodeEntity({ name: nodeName, creationTime: block.timestamp, lastClaimTime: block.timestamp, rewardAvailable: rewardPerNode }) ); nodeOwners.set(account, _nodesOfUser[account].length); totalNodesCreated++; if (autoDistri && !distribution) { distributeRewards(gasForDistribution, rewardPerNode); } } function isNameAvailable(address account, string memory nodeName) private view returns (bool) { NodeEntity[] memory nodes = _nodesOfUser[account]; for (uint256 i = 0; i < nodes.length; i++) { if (keccak256(bytes(nodes[i].name)) == keccak256(bytes(nodeName))) { return false; } } return true; } function _burn(uint256 index) internal { require(index < nodeOwners.size()); nodeOwners.remove(nodeOwners.getKeyAtIndex(index)); } function _getNodeWithCreatime( NodeEntity[] storage nodes, uint256 _creationTime ) private view returns (NodeEntity storage) { uint256 numberOfNodes = nodes.length; require( numberOfNodes > 0, "CASHOUT ERROR: You don't have nodes to cash-out" ); bool found = false; int256 index = binary_search(nodes, 0, numberOfNodes, _creationTime); uint256 validIndex; if (index >= 0) { found = true; validIndex = uint256(index); } require(found, "NODE SEARCH: No NODE Found with this blocktime"); return nodes[validIndex]; } function binary_search( NodeEntity[] memory arr, uint256 low, uint256 high, uint256 x ) private view returns (int256) { if (high >= low) { uint256 mid = (high + low).div(2); if (arr[mid].creationTime == x) { return int256(mid); } else if (arr[mid].creationTime > x) { return binary_search(arr, low, mid - 1, x); } else { return binary_search(arr, mid + 1, high, x); } } else { return -1; } } function _cashoutNodeReward(address account, uint256 _creationTime) external returns (uint256) { require(_creationTime > 0, "NODE: CREATIME must be higher than zero"); NodeEntity[] storage nodes = _nodesOfUser[account]; uint256 numberOfNodes = nodes.length; require( numberOfNodes > 0, "CASHOUT ERROR: You don't have nodes to cash-out" ); NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime); uint256 rewardNode = node.rewardAvailable; node.rewardAvailable = 0; return rewardNode; } function _cashoutAllNodesReward(address account) external returns (uint256) { NodeEntity[] storage nodes = _nodesOfUser[account]; uint256 nodesCount = nodes.length; require(nodesCount > 0, "NODE: CREATIME must be higher than zero"); NodeEntity storage _node; uint256 rewardsTotal = 0; for (uint256 i = 0; i < nodesCount; i++) { _node = nodes[i]; rewardsTotal += _node.rewardAvailable; _node.rewardAvailable = 0; } return rewardsTotal; } function claimable(NodeEntity memory node) private view returns (bool) { return node.lastClaimTime + claimTime <= block.timestamp; } function _getRewardAmountOf(address account) external view returns (uint256) { require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER"); uint256 nodesCount; uint256 rewardCount = 0; NodeEntity[] storage nodes = _nodesOfUser[account]; nodesCount = nodes.length; for (uint256 i = 0; i < nodesCount; i++) { rewardCount += nodes[i].rewardAvailable; } return rewardCount; } function _getRewardAmountOf(address account, uint256 _creationTime) external view returns (uint256) { require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER"); require(_creationTime > 0, "NODE: CREATIME must be higher than zero"); NodeEntity[] storage nodes = _nodesOfUser[account]; uint256 numberOfNodes = nodes.length; require( numberOfNodes > 0, "CASHOUT ERROR: You don't have nodes to cash-out" ); NodeEntity storage node = _getNodeWithCreatime(nodes, _creationTime); uint256 rewardNode = node.rewardAvailable; return rewardNode; } function _getNodeRewardAmountOf(address account, uint256 creationTime) external view returns (uint256) { return _getNodeWithCreatime(_nodesOfUser[account], creationTime) .rewardAvailable; } function _getNodesNames(address account) external view returns (string memory) { require(isNodeOwner(account), "GET NAMES: NO NODE OWNER"); NodeEntity[] memory nodes = _nodesOfUser[account]; uint256 nodesCount = nodes.length; NodeEntity memory _node; string memory names = nodes[0].name; string memory separator = "#"; for (uint256 i = 1; i < nodesCount; i++) { _node = nodes[i]; names = string(abi.encodePacked(names, separator, _node.name)); } return names; } function _getNodesCreationTime(address account) external view returns (string memory) { require(isNodeOwner(account), "GET CREATIME: NO NODE OWNER"); NodeEntity[] memory nodes = _nodesOfUser[account]; uint256 nodesCount = nodes.length; NodeEntity memory _node; string memory _creationTimes = uint2str(nodes[0].creationTime); string memory separator = "#"; for (uint256 i = 1; i < nodesCount; i++) { _node = nodes[i]; _creationTimes = string( abi.encodePacked( _creationTimes, separator, uint2str(_node.creationTime) ) ); } return _creationTimes; } function _getNodesRewardAvailable(address account) external view returns (string memory) { require(isNodeOwner(account), "GET REWARD: NO NODE OWNER"); NodeEntity[] memory nodes = _nodesOfUser[account]; uint256 nodesCount = nodes.length; NodeEntity memory _node; string memory _rewardsAvailable = uint2str(nodes[0].rewardAvailable); string memory separator = "#"; for (uint256 i = 1; i < nodesCount; i++) { _node = nodes[i]; _rewardsAvailable = string( abi.encodePacked( _rewardsAvailable, separator, uint2str(_node.rewardAvailable) ) ); } return _rewardsAvailable; } function _getNodesLastClaimTime(address account) external view returns (string memory) { require(isNodeOwner(account), "LAST CLAIME TIME: NO NODE OWNER"); NodeEntity[] memory nodes = _nodesOfUser[account]; uint256 nodesCount = nodes.length; NodeEntity memory _node; string memory _lastClaimTimes = uint2str(nodes[0].lastClaimTime); string memory separator = "#"; for (uint256 i = 1; i < nodesCount; i++) { _node = nodes[i]; _lastClaimTimes = string( abi.encodePacked( _lastClaimTimes, separator, uint2str(_node.lastClaimTime) ) ); } return _lastClaimTimes; } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function _changeNodePrice(uint256 newNodePrice) external { nodePrice = newNodePrice; } function _changeRewardPerNode(uint256 newPrice) external { rewardPerNode = newPrice; } function _changeClaimTime(uint256 newTime) external { claimTime = newTime; } function _changeAutoDistri(bool newMode) external { autoDistri = newMode; } function _changeGasDistri(uint256 newGasDistri) external { gasForDistribution = newGasDistri; } function _getNodeNumberOf(address account) public view returns (uint256) { return nodeOwners.get(account); } function isNodeOwner(address account) private view returns (bool) { return nodeOwners.get(account) > 0; } function _isNodeOwner(address account) external view returns (bool) { return isNodeOwner(account); } function _distributeRewards() external returns ( uint256, uint256, uint256 ) { return distributeRewards(gasForDistribution, rewardPerNode); } } pragma solidity ^0.8.0; contract Samurai is ERC20, Ownable, PaymentSplitter { using SafeMath for uint256; NODERewardManagement public nodeRewardManagement; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; address public futurUsePool; address public distributionPool; address public deadWallet = 0x000000000000000000000000000000000000dEaD; uint256 public rewardsFee; uint256 public liquidityPoolFee; uint256 public futurFee; uint256 public totalFees; uint256 public cashoutFee; uint256 private rwSwap; bool private swapping = false; bool private swapLiquify = false; uint256 public swapTokensAmount; mapping(address => bool) public _isBlacklisted; mapping(address => bool) public automatedMarketMakerPairs; event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event LiquidityWalletUpdated( address indexed newLiquidityWallet, address indexed oldLiquidityWallet ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); constructor( address[] memory payees, uint256[] memory shares, address[] memory addresses, uint256[] memory balances, uint256[] memory fees, uint256 swapAmount, uint256 nodePrice, uint256 rewardPerNode, uint256 claimTime, address uniV2Router ) ERC20("Katana", "KTNA") PaymentSplitter(payees, shares) { require(nodePrice > 0, "CONSTR: nodePrice amount incorrect"); require(rewardPerNode > 0, "CONSTR: rewardPerNode amount incorrect"); require(claimTime > 0, "CONSTR: claimTime incorrect"); nodeRewardManagement = new NODERewardManagement( nodePrice * (10**18), rewardPerNode * (10**18), claimTime ); futurUsePool = addresses[4]; distributionPool = addresses[5]; require( futurUsePool != address(0) && distributionPool != address(0), "FUTUR & REWARD ADDRESS CANNOT BE ZERO" ); require(uniV2Router != address(0), "ROUTER CANNOT BE ZERO"); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(uniV2Router); address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); require( fees[0] != 0 && fees[1] != 0 && fees[2] != 0 && fees[3] != 0, "CONSTR: Fees equal 0" ); futurFee = fees[0]; rewardsFee = fees[1]; liquidityPoolFee = fees[2]; cashoutFee = fees[3]; rwSwap = fees[4]; totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee); require( addresses.length > 0 && balances.length > 0, "CONSTR: addresses array length must be greater than zero" ); require( addresses.length == balances.length, "CONSTR: addresses arrays length mismatch" ); for (uint256 i = 0; i < addresses.length; i++) { _mint(addresses[i], balances[i] * (10**18)); } require( totalSupply() == 20456743e18, "CONSTR: totalSupply must equal 20 million" ); require(swapAmount > 0, "CONSTR: Swap amount incorrect"); swapTokensAmount = swapAmount * (10**18); } function updateUniswapV2Router(address newAddress) public onlyOwner { require( newAddress != address(uniswapV2Router), "TKN: The router already has that address" ); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()) .createPair(address(this), uniswapV2Router.WETH()); uniswapV2Pair = _uniswapV2Pair; } function updateSwapTokensAmount(uint256 newVal) external onlyOwner { swapTokensAmount = newVal; } function updateFuturWall(address payable wall) external onlyOwner { futurUsePool = wall; } function updateRewardsWall(address payable wall) external onlyOwner { distributionPool = wall; } function updateRewardsFee(uint256 value) external onlyOwner { rewardsFee = value; totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee); } function updateLiquiditFee(uint256 value) external onlyOwner { liquidityPoolFee = value; totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee); } function updateFuturFee(uint256 value) external onlyOwner { futurFee = value; totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee); } function updateCashoutFee(uint256 value) external onlyOwner { cashoutFee = value; } function updateRwSwapFee(uint256 value) external onlyOwner { rwSwap = value; } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, "TKN: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function blacklistMalicious(address account, bool value) external onlyOwner { _isBlacklisted[account] = value; } function _setAutomatedMarketMakerPair(address pair, bool value) private { require( automatedMarketMakerPairs[pair] != value, "TKN: Automated market maker pair is already set to that value" ); automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require( !_isBlacklisted[from] && !_isBlacklisted[to], "Blacklisted address" ); super._transfer(from, to, amount); } function swapAndSendToFee(address destination, uint256 tokens) private { uint256 initialETHBalance = address(this).balance; swapTokensForEth(tokens); uint256 newBalance = (address(this).balance).sub(initialETHBalance); payable(destination).transfer(newBalance); } function swapAndLiquify(uint256 tokens) private { uint256 half = tokens.div(2); uint256 otherHalf = tokens.sub(half); uint256 initialBalance = address(this).balance; swapTokensForEth(half); uint256 newBalance = address(this).balance.sub(initialBalance); addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0), block.timestamp ); } function createNodeWithTokens(string memory name) public { require( bytes(name).length > 3 && bytes(name).length < 32, "NODE CREATION: NAME SIZE INVALID" ); address sender = _msgSender(); require( sender != address(0), "NODE CREATION: creation from the zero address" ); require(!_isBlacklisted[sender], "NODE CREATION: Blacklisted address"); require( sender != futurUsePool && sender != distributionPool, "NODE CREATION: futur and rewardsPool cannot create node" ); uint256 nodePrice = nodeRewardManagement.nodePrice(); require( balanceOf(sender) >= nodePrice, "NODE CREATION: Balance too low for creation." ); uint256 contractTokenBalance = balanceOf(address(this)); bool swapAmountOk = contractTokenBalance >= swapTokensAmount; if ( swapAmountOk && swapLiquify && !swapping && sender != owner() && !automatedMarketMakerPairs[sender] ) { swapping = true; uint256 futurTokens = contractTokenBalance.mul(futurFee).div(100); swapAndSendToFee(futurUsePool, futurTokens); uint256 rewardsPoolTokens = contractTokenBalance .mul(rewardsFee) .div(100); uint256 rewardsTokenstoSwap = rewardsPoolTokens.mul(rwSwap).div( 100 ); swapAndSendToFee(distributionPool, rewardsTokenstoSwap); super._transfer( address(this), distributionPool, rewardsPoolTokens.sub(rewardsTokenstoSwap) ); uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div( 100 ); swapAndLiquify(swapTokens); swapTokensForEth(balanceOf(address(this))); swapping = false; } super._transfer(sender, address(this), nodePrice); nodeRewardManagement.createNode(sender, name); } function cashoutReward(uint256 blocktime) public { address sender = _msgSender(); require(sender != address(0), "CSHT: creation from the zero address"); require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address"); require( sender != futurUsePool && sender != distributionPool, "CSHT: futur and rewardsPool cannot cashout rewards" ); uint256 rewardAmount = nodeRewardManagement._getRewardAmountOf( sender, blocktime ); require( rewardAmount > 0, "CSHT: You don't have enough reward to cash out" ); if (swapLiquify) { uint256 feeAmount; if (cashoutFee > 0) { feeAmount = rewardAmount.mul(cashoutFee).div(100); swapAndSendToFee(futurUsePool, feeAmount); } rewardAmount -= feeAmount; } super._transfer(distributionPool, sender, rewardAmount); nodeRewardManagement._cashoutNodeReward(sender, blocktime); } function cashoutAll() public { address sender = _msgSender(); require( sender != address(0), "MANIA CSHT: creation from the zero address" ); require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address"); require( sender != futurUsePool && sender != distributionPool, "MANIA CSHT: futur and rewardsPool cannot cashout rewards" ); uint256 rewardAmount = nodeRewardManagement._getRewardAmountOf(sender); require( rewardAmount > 0, "MANIA CSHT: You don't have enough reward to cash out" ); if (swapLiquify) { uint256 feeAmount; if (cashoutFee > 0) { feeAmount = rewardAmount.mul(cashoutFee).div(100); swapAndSendToFee(futurUsePool, feeAmount); } rewardAmount -= feeAmount; } super._transfer(distributionPool, sender, rewardAmount); nodeRewardManagement._cashoutAllNodesReward(sender); } function changeSwapLiquify(bool newVal) public onlyOwner { swapLiquify = newVal; } function getNodeNumberOf(address account) public view returns (uint256) { return nodeRewardManagement._getNodeNumberOf(account); } function getRewardAmountOf(address account) public view onlyOwner returns (uint256) { return nodeRewardManagement._getRewardAmountOf(account); } function getRewardAmount() public view returns (uint256) { require(_msgSender() != address(0), "SENDER CAN'T BE ZERO"); require( nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER" ); return nodeRewardManagement._getRewardAmountOf(_msgSender()); } function changeNodePrice(uint256 newNodePrice) public onlyOwner { nodeRewardManagement._changeNodePrice(newNodePrice); } function getNodePrice() public view returns (uint256) { return nodeRewardManagement.nodePrice(); } function changeRewardPerNode(uint256 newPrice) public onlyOwner { nodeRewardManagement._changeRewardPerNode(newPrice); } function getRewardPerNode() public view returns (uint256) { return nodeRewardManagement.rewardPerNode(); } function changeClaimTime(uint256 newTime) public onlyOwner { nodeRewardManagement._changeClaimTime(newTime); } function getClaimTime() public view returns (uint256) { return nodeRewardManagement.claimTime(); } function changeAutoDistri(bool newMode) public onlyOwner { nodeRewardManagement._changeAutoDistri(newMode); } function getAutoDistri() public view returns (bool) { return nodeRewardManagement.autoDistri(); } function changeGasDistri(uint256 newGasDistri) public onlyOwner { nodeRewardManagement._changeGasDistri(newGasDistri); } function getGasDistri() public view returns (uint256) { return nodeRewardManagement.gasForDistribution(); } function getDistriCount() public view returns (uint256) { return nodeRewardManagement.lastDistributionCount(); } function getNodesNames() public view returns (string memory) { require(_msgSender() != address(0), "SENDER CAN'T BE ZERO"); require( nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER" ); return nodeRewardManagement._getNodesNames(_msgSender()); } function getNodesCreatime() public view returns (string memory) { require(_msgSender() != address(0), "SENDER CAN'T BE ZERO"); require( nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER" ); return nodeRewardManagement._getNodesCreationTime(_msgSender()); } function getNodesRewards() public view returns (string memory) { require(_msgSender() != address(0), "SENDER CAN'T BE ZERO"); require( nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER" ); return nodeRewardManagement._getNodesRewardAvailable(_msgSender()); } function getNodesLastClaims() public view returns (string memory) { require(_msgSender() != address(0), "SENDER CAN'T BE ZERO"); require( nodeRewardManagement._isNodeOwner(_msgSender()), "NO NODE OWNER" ); return nodeRewardManagement._getNodesLastClaimTime(_msgSender()); } function distributeRewards() public onlyOwner returns ( uint256, uint256, uint256 ) { return nodeRewardManagement._distributeRewards(); } function publiDistriRewards() public { nodeRewardManagement._distributeRewards(); } function getTotalRewardStaked() public view returns (uint256) { return nodeRewardManagement.totalRewardStaked(); } function getTotalNodesCreated() public view returns (uint256) { return nodeRewardManagement.totalNodesCreated(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nodePrice","type":"uint256"},{"internalType":"uint256","name":"rewardPerNode","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"},{"internalType":"address","name":"uniV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newMode","type":"bool"}],"name":"changeAutoDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"changeClaimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasDistri","type":"uint256"}],"name":"changeGasDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNodePrice","type":"uint256"}],"name":"changeNodePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeRewardPerNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurUsePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoDistri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistriCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGasDistri","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesCreatime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesLastClaims","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesRewards","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getRewardAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPerNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalNodesCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRewardStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeRewardManagement","outputs":[{"internalType":"contract NODERewardManagement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publiDistriRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateCashoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateFuturFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateFuturWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRwSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052601280546001600160a01b03191661dead1790556019805461ffff191690553480156200003057600080fd5b5060405162007a5d38038062007a5d833981016040819052620000539162001150565b60408051808201825260068152654b6174616e6160d01b6020808301918252835180850190945260048452634b544e4160e01b9084015281518d938d93929091620000a19160039162000f77565b508051620000b790600490602084019062000f77565b5050506000620000cc62000b3460201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080518251146200018c5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001df5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000183565b60005b82518110156200024b576200023683828151811062000205576200020562001373565b602002602001015183838151811062000222576200022262001373565b602002602001015162000b3860201b60201c565b8062000242816200133f565b915050620001e2565b50505060008411620002ab5760405162461bcd60e51b815260206004820152602260248201527f434f4e5354523a206e6f6465507269636520616d6f756e7420696e636f72726560448201526118dd60f21b606482015260840162000183565b600083116200030c5760405162461bcd60e51b815260206004820152602660248201527f434f4e5354523a207265776172645065724e6f646520616d6f756e7420696e636044820152651bdc9c9958dd60d21b606482015260840162000183565b600082116200035e5760405162461bcd60e51b815260206004820152601b60248201527f434f4e5354523a20636c61696d54696d6520696e636f72726563740000000000604482015260640162000183565b6200037284670de0b6b3a7640000620012e0565b6200038684670de0b6b3a7640000620012e0565b83604051620003959062001006565b92835260208301919091526040820152606001604051809103906000f080158015620003c5573d6000803e3d6000fd5b50600d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508760048151811062000402576200040262001373565b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508760058151811062000446576200044662001373565b6020908102919091010151601180546001600160a01b0319166001600160a01b0392831617905560105416158015906200048a57506011546001600160a01b031615155b620004e65760405162461bcd60e51b815260206004820152602560248201527f465554555220262052455741524420414444524553532043414e4e4f54204245604482015264205a45524f60d81b606482015260840162000183565b6001600160a01b0381166200053e5760405162461bcd60e51b815260206004820152601560248201527f524f555445522043414e4e4f54204245205a45524f0000000000000000000000604482015260640162000183565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200057f57600080fd5b505afa15801562000594573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ba919062001132565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200060357600080fd5b505afa15801562000618573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200063e919062001132565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200068757600080fd5b505af11580156200069c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006c2919062001132565b600e80546001600160a01b038086166001600160a01b031992831617909255600f80549284169290911691909117905590506200070181600162000d26565b8760008151811062000717576200071762001373565b60200260200101516000141580156200074e57508760018151811062000741576200074162001373565b6020026020010151600014155b8015620007795750876002815181106200076c576200076c62001373565b6020026020010151600014155b8015620007a457508760038151811062000797576200079762001373565b6020026020010151600014155b620007f25760405162461bcd60e51b815260206004820152601460248201527f434f4e5354523a204665657320657175616c2030000000000000000000000000604482015260640162000183565b8760008151811062000808576200080862001373565b6020026020010151601581905550876001815181106200082c576200082c62001373565b60200260200101516013819055508760028151811062000850576200085062001373565b60200260200101516014819055508760038151811062000874576200087462001373565b60200260200101516017819055508760048151811062000898576200089862001373565b6020026020010151601881905550620008df601554620008cb60145460135462000e1160201b6200313c1790919060201c565b62000e1160201b6200313c1790919060201c565b601655895115801590620008f4575060008951115b620009685760405162461bcd60e51b815260206004820152603860248201527f434f4e5354523a20616464726573736573206172726179206c656e677468206d60448201527f7573742062652067726561746572207468616e207a65726f0000000000000000606482015260840162000183565b88518a5114620009cc5760405162461bcd60e51b815260206004820152602860248201527f434f4e5354523a2061646472657373657320617272617973206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840162000183565b60005b8a5181101562000a475762000a328b8281518110620009f257620009f262001373565b60200260200101518b838151811062000a0f5762000a0f62001373565b6020026020010151670de0b6b3a764000062000a2c9190620012e0565b62000e7b565b8062000a3e816200133f565b915050620009cf565b506002546a10ebe24297ce6ff43c00001462000ab85760405162461bcd60e51b815260206004820152602960248201527f434f4e5354523a20746f74616c537570706c79206d75737420657175616c2032604482015268181036b4b63634b7b760b91b606482015260840162000183565b6000871162000b0a5760405162461bcd60e51b815260206004820152601d60248201527f434f4e5354523a205377617020616d6f756e7420696e636f7272656374000000604482015260640162000183565b62000b1e87670de0b6b3a7640000620012e0565b601a55506200139f9a5050505050505050505050565b3390565b6001600160a01b03821662000ba55760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000183565b6000811162000bf75760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000183565b6001600160a01b0382166000908152600860205260409020541562000c735760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000183565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038416908117909155600090815260086020526040902081905560065462000cdd908290620012c5565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6001600160a01b0382166000908152601c602052604090205460ff161515811515141562000dbd5760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c7565000000606482015260840162000183565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60008062000e208385620012c5565b90508381101562000e745760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000183565b9392505050565b6001600160a01b03821662000ed35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000183565b62000eef8160025462000e1160201b6200313c1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000f229183906200313c62000e11821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000f859062001302565b90600052602060002090601f01602090048101928262000fa9576000855562000ff4565b82601f1062000fc457805160ff191683800117855562000ff4565b8280016001018555821562000ff4579182015b8281111562000ff457825182559160200191906001019062000fd7565b506200100292915062001014565b5090565b6121c6806200589783390190565b5b8082111562001002576000815560010162001015565b80516001600160a01b03811681146200104357600080fd5b919050565b600082601f8301126200105a57600080fd5b81516020620010736200106d836200129f565b6200126c565b80838252828201915082860187848660051b89010111156200109457600080fd5b60005b85811015620010be57620010ab826200102b565b8452928401929084019060010162001097565b5090979650505050505050565b600082601f830112620010dd57600080fd5b81516020620010f06200106d836200129f565b80838252828201915082860187848660051b89010111156200111157600080fd5b60005b85811015620010be5781518452928401929084019060010162001114565b6000602082840312156200114557600080fd5b62000e74826200102b565b6000806000806000806000806000806101408b8d0312156200117157600080fd5b8a516001600160401b03808211156200118957600080fd5b620011978e838f0162001048565b9b5060208d0151915080821115620011ae57600080fd5b620011bc8e838f01620010cb565b9a5060408d0151915080821115620011d357600080fd5b620011e18e838f0162001048565b995060608d0151915080821115620011f857600080fd5b620012068e838f01620010cb565b985060808d01519150808211156200121d57600080fd5b506200122c8d828e01620010cb565b96505060a08b0151945060c08b0151935060e08b015192506101008b015191506200125b6101208c016200102b565b90509295989b9194979a5092959850565b604051601f8201601f191681016001600160401b038111828210171562001297576200129762001389565b604052919050565b60006001600160401b03821115620012bb57620012bb62001389565b5060051b60200190565b60008219821115620012db57620012db6200135d565b500190565b6000816000190483118215151615620012fd57620012fd6200135d565b500290565b600181811c908216806200131757607f821691505b602082108114156200133957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200135657620013566200135d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6144e880620013af6000396000f3fe6080604052600436106104355760003560e01c80638013858b11610229578063ab5747611161012e578063da41b333116100b6578063f2fde38b1161007a578063f2fde38b14610d3d578063f5a0725614610d5d578063f74c993414610d72578063f7b9f94314610d92578063f9afc76314610da757600080fd5b8063da41b33314610ca3578063db3ad6b514610cb8578063dd62ed3e14610ccd578063e33b7de314610d13578063ee1afdbf14610d2857600080fd5b8063c5ca7d6d116100fd578063c5ca7d6d14610bd7578063ce7c2ac214610bf7578063d0f7747414610c2d578063d79779b214610c4d578063d892934214610c8357600080fd5b8063ab57476114610b5c578063b62496f514610b72578063b96392c114610ba2578063bdf24a5314610bc257600080fd5b80639349c47d116101b15780639c82751c116101805780639c82751c14610ac7578063a457c2d714610ae7578063a5021a1714610b07578063a538ddf214610b1c578063a9059cbb14610b3c57600080fd5b80639349c47d14610a3c57806395d89b4114610a5c5780639852595c14610a715780639a7a23d614610aa757600080fd5b806388c41d7c116101f857806388c41d7c1461099e5780638b83209b146109be5780638bc9c7b0146109de5780638da5cb5b146109fe5780638f0ba4ca14610a1c57600080fd5b80638013858b14610934578063823349b31461095457806385141a77146109695780638743ef6d1461098957600080fd5b806348b750441161033a57806365b8dbc0116102c25780636d9ae0be116102865780636d9ae0be146108835780636f4a2cd01461089957806370a08231146108c9578063715018a6146108ff5780637b7703921461091457600080fd5b806365b8dbc0146107e357806365bfe430146108035780636770474b146108235780636815a91c14610843578063697e2f8e1461086357600080fd5b806354f12f1f1161030957806354f12f1f14610762578063583bd7a61461077857806359640ed9146107985780635b0d4674146107b85780635f1c3182146107cd57600080fd5b806348b75044146106f857806349bd5a5e146107185780634dc9b81914610738578063545579731461074d57600080fd5b806319165587116103bd578063313ce5671161038c578063313ce56714610641578063395093511461065d5780633a98ef391461067d578063406072a91461069257806342bc9fca146106d857600080fd5b806319165587146105bb5780631cdd3be3146105db57806323b872dd1461060b5780632bb14e1d1461062b57600080fd5b80630c08f300116104045780630c08f3001461052357806313114a9d14610543578063138a634a146105595780631694505e1461056e57806318160ddd146105a657600080fd5b806306fdde0314610483578063084a6bff146104ae578063095ea7b3146104d057806309a69f571461050057600080fd5b3661047e577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561048f57600080fd5b50610498610dbc565b6040516104a59190614080565b60405180910390f35b3480156104ba57600080fd5b506104ce6104c9366004613fb4565b610e4e565b005b3480156104dc57600080fd5b506104f06104eb366004613e60565b610ea8565b60405190151581526020016104a5565b34801561050c57600080fd5b50610515610ebf565b6040519081526020016104a5565b34801561052f57600080fd5b506104ce61053e366004613d7e565b611011565b34801561054f57600080fd5b5061051560165481565b34801561056557600080fd5b5061049861105d565b34801561057a57600080fd5b50600e5461058e906001600160a01b031681565b6040516001600160a01b0390911681526020016104a5565b3480156105b257600080fd5b50600254610515565b3480156105c757600080fd5b506104ce6105d6366004613d7e565b6111af565b3480156105e757600080fd5b506104f06105f6366004613d7e565b601b6020526000908152604090205460ff1681565b34801561061757600080fd5b506104f0610626366004613df1565b6112dd565b34801561063757600080fd5b5061051560135481565b34801561064d57600080fd5b50604051601281526020016104a5565b34801561066957600080fd5b506104f0610678366004613e60565b611347565b34801561068957600080fd5b50600654610515565b34801561069e57600080fd5b506105156106ad366004613db8565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156106e457600080fd5b506104ce6106f3366004613fb4565b61137d565b34801561070457600080fd5b506104ce610713366004613db8565b6113c1565b34801561072457600080fd5b50600f5461058e906001600160a01b031681565b34801561074457600080fd5b506105156115a9565b34801561075957600080fd5b506104ce6115ee565b34801561076e57600080fd5b5061051560145481565b34801561078457600080fd5b506104ce610793366004613e8c565b611941565b3480156107a457600080fd5b506104ce6107b3366004613fb4565b611985565b3480156107c457600080fd5b50610498611a11565b3480156107d957600080fd5b50610515601a5481565b3480156107ef57600080fd5b506104ce6107fe366004613d7e565b611aec565b34801561080f57600080fd5b506104ce61081e366004613fb4565b611d88565b34801561082f57600080fd5b506104ce61083e366004613fb4565b6120cd565b34801561084f57600080fd5b506104ce61085e366004613fb4565b6120fc565b34801561086f57600080fd5b50600d5461058e906001600160a01b031681565b34801561088f57600080fd5b5061051560175481565b3480156108a557600080fd5b506108ae61212b565b604080519384526020840192909252908201526060016104a5565b3480156108d557600080fd5b506105156108e4366004613d7e565b6001600160a01b031660009081526020819052604090205490565b34801561090b57600080fd5b506104ce6121ef565b34801561092057600080fd5b506104ce61092f366004613fb4565b612263565b34801561094057600080fd5b506104ce61094f366004613fb4565b6122be565b34801561096057600080fd5b50610515612319565b34801561097557600080fd5b5060125461058e906001600160a01b031681565b34801561099557600080fd5b506104ce61235e565b3480156109aa57600080fd5b506104ce6109b9366004613fb4565b6123e6565b3480156109ca57600080fd5b5061058e6109d9366004613fb4565b61242a565b3480156109ea57600080fd5b506104ce6109f9366004613fb4565b61245a565b348015610a0a57600080fd5b506005546001600160a01b031661058e565b348015610a2857600080fd5b506104ce610a37366004613ec6565b612489565b348015610a4857600080fd5b506104ce610a57366004613d7e565b612955565b348015610a6857600080fd5b506104986129a1565b348015610a7d57600080fd5b50610515610a8c366004613d7e565b6001600160a01b031660009081526009602052604090205490565b348015610ab357600080fd5b506104ce610ac2366004613e32565b6129b0565b348015610ad357600080fd5b506104ce610ae2366004613fb4565b612a7f565b348015610af357600080fd5b506104f0610b02366004613e60565b612ada565b348015610b1357600080fd5b50610515612b29565b348015610b2857600080fd5b5060105461058e906001600160a01b031681565b348015610b4857600080fd5b506104f0610b57366004613e60565b612b6e565b348015610b6857600080fd5b5061051560155481565b348015610b7e57600080fd5b506104f0610b8d366004613d7e565b601c6020526000908152604090205460ff1681565b348015610bae57600080fd5b50610515610bbd366004613d7e565b612b7b565b348015610bce57600080fd5b50610498612c26565b348015610be357600080fd5b5060115461058e906001600160a01b031681565b348015610c0357600080fd5b50610515610c12366004613d7e565b6001600160a01b031660009081526008602052604090205490565b348015610c3957600080fd5b506104ce610c48366004613e8c565b612d01565b348015610c5957600080fd5b50610515610c68366004613d7e565b6001600160a01b03166000908152600b602052604090205490565b348015610c8f57600080fd5b506104ce610c9e366004613e32565b612d5d565b348015610caf57600080fd5b50610515612db2565b348015610cc457600080fd5b50610515612df7565b348015610cd957600080fd5b50610515610ce8366004613db8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610d1f57600080fd5b50600754610515565b348015610d3457600080fd5b50610498612e3c565b348015610d4957600080fd5b506104ce610d58366004613d7e565b612f17565b348015610d6957600080fd5b50610515613002565b348015610d7e57600080fd5b50610515610d8d366004613d7e565b613047565b348015610d9e57600080fd5b5061051561307a565b348015610db357600080fd5b506104f06130bf565b606060038054610dcb9061439c565b80601f0160208091040260200160405190810160405280929190818152602001828054610df79061439c565b8015610e445780601f10610e1957610100808354040283529160200191610e44565b820191906000526020600020905b815481529060010190602001808311610e2757829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e815760405162461bcd60e51b8152600401610e78906141bc565b60405180910390fd5b6013819055601554601454610ea29190610e9c90849061313c565b9061313c565b60165550565b6000610eb533848461319b565b5060015b92915050565b600033610ede5760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610f2f57600080fd5b505afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190613ea9565b610f835760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b031663619a635e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610fd457600080fd5b505afa158015610fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613fcd565b905090565b6005546001600160a01b0316331461103b5760405162461bcd60e51b8152600401610e78906141bc565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60603361107c5760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156110cd57600080fd5b505afa1580156110e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111059190613ea9565b6111215760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b031663334de3a2335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160006040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261100c9190810190613f46565b6001600160a01b0381166000908152600860205260409020546111e45760405162461bcd60e51b8152600401610e789061412b565b60006111ef60075490565b6111f99047614300565b905060006112268383611221866001600160a01b031660009081526009602052604090205490565b6132c0565b9050806112455760405162461bcd60e51b8152600401610e7890614171565b6001600160a01b0383166000908152600960205260408120805483929061126d908490614300565b9250508190555080600760008282546112869190614300565b9091555061129690508382613306565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60006112ea84848461341f565b61133c843361133785604051806060016040528060288152602001614466602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906134fa565b61319b565b5060015b9392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610eb5918590611337908661313c565b6005546001600160a01b031633146113a75760405162461bcd60e51b8152600401610e78906141bc565b6014819055601554601354610ea29190610e9c908461313c565b6001600160a01b0381166000908152600860205260409020546113f65760405162461bcd60e51b8152600401610e789061412b565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114869190613fcd565b6114909190614300565b905060006114c9838361122187876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b9050806114e85760405162461bcd60e51b8152600401610e7890614171565b6001600160a01b038085166000908152600c602090815260408083209387168352929052908120805483929061151f908490614300565b90915550506001600160a01b0384166000908152600b60205260408120805483929061154c908490614300565b9091555061155d9050848483613534565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600d54604080516345193f5560e11b815290516000926001600160a01b031691638a327eaa916004808301926020929190829003018186803b158015610fd457600080fd5b33806116505760405162461bcd60e51b815260206004820152602b60248201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610e78565b6001600160a01b0381166000908152601b602052604090205460ff16156116b95760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610e78565b6010546001600160a01b038281169116148015906116e557506011546001600160a01b03828116911614155b6117575760405162461bcd60e51b815260206004820152603860248201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60448201527f6c2063616e6e6f7420636173686f7574207265776172647300000000000000006064820152608401610e78565b600d546040516330cd31af60e11b81526001600160a01b038381166004830152600092169063619a635e9060240160206040518083038186803b15801561179d57600080fd5b505afa1580156117b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d59190613fcd565b9050600081116118445760405162461bcd60e51b815260206004820152603460248201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f75676044820152731a081c995dd85c99081d1bc818d85cda081bdd5d60621b6064820152608401610e78565b601954610100900460ff16156118a657601754600090156118985761187f60646118796017548561358690919063ffffffff16565b90613605565b601054909150611898906001600160a01b031682613647565b6118a28183614359565b9150505b6011546118bd906001600160a01b03168383613696565b600d5460405163170a62c760e21b81526001600160a01b03848116600483015290911690635c298b1c90602401602060405180830381600087803b15801561190457600080fd5b505af1158015611918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193c9190613fcd565b505050565b6005546001600160a01b0316331461196b5760405162461bcd60e51b8152600401610e78906141bc565b601980549115156101000261ff0019909216919091179055565b6005546001600160a01b031633146119af5760405162461bcd60e51b8152600401610e78906141bc565b600d54604051631df3773160e31b8152600481018390526001600160a01b039091169063ef9bb988906024015b600060405180830381600087803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b5050505050565b606033611a305760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611a8157600080fd5b505afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613ea9565b611ad55760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b0316634a389fae33611134565b6005546001600160a01b03163314611b165760405162461bcd60e51b8152600401610e78906141bc565b600e546001600160a01b0382811691161415611b855760405162461bcd60e51b815260206004820152602860248201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610e78565b600e546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b158015611c1757600080fd5b505afa158015611c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4f9190613d9b565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce49190613d9b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611d2c57600080fd5b505af1158015611d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d649190613d9b565b600f80546001600160a01b0319166001600160a01b03929092169190911790555050565b3380611de45760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e78565b6001600160a01b0381166000908152601b602052604090205460ff1615611e4d5760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610e78565b6010546001600160a01b03828116911614801590611e7957506011546001600160a01b03828116911614155b611ee05760405162461bcd60e51b815260206004820152603260248201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e6044820152716f7420636173686f7574207265776172647360701b6064820152608401610e78565b600d546040516329b8573160e21b81526001600160a01b03838116600483015260248201859052600092169063a6e15cc49060440160206040518083038186803b158015611f2d57600080fd5b505afa158015611f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f659190613fcd565b905060008111611fce5760405162461bcd60e51b815260206004820152602e60248201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160448201526d1c99081d1bc818d85cda081bdd5d60921b6064820152608401610e78565b601954610100900460ff161561202a576017546000901561201c5761200360646118796017548561358690919063ffffffff16565b60105490915061201c906001600160a01b031682613647565b6120268183614359565b9150505b601154612041906001600160a01b03168383613696565b600d5460405163376db80160e11b81526001600160a01b0384811660048301526024820186905290911690636edb700290604401602060405180830381600087803b15801561208f57600080fd5b505af11580156120a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c79190613fcd565b50505050565b6005546001600160a01b031633146120f75760405162461bcd60e51b8152600401610e78906141bc565b601a55565b6005546001600160a01b031633146121265760405162461bcd60e51b8152600401610e78906141bc565b601755565b600554600090819081906001600160a01b0316331461215c5760405162461bcd60e51b8152600401610e78906141bc565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b1580156121ac57600080fd5b505af11580156121c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e49190613fe6565b925092509250909192565b6005546001600160a01b031633146122195760405162461bcd60e51b8152600401610e78906141bc565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461228d5760405162461bcd60e51b8152600401610e78906141bc565b600d546040516318df5db960e31b8152600481018390526001600160a01b039091169063c6faedc8906024016119dc565b6005546001600160a01b031633146122e85760405162461bcd60e51b8152600401610e78906141bc565b600d5460405163cece91eb60e01b8152600481018390526001600160a01b039091169063cece91eb906024016119dc565b600d546040805163b8527aef60e01b815290516000926001600160a01b03169163b8527aef916004808301926020929190829003018186803b158015610fd457600080fd5b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b1580156123ae57600080fd5b505af11580156123c2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193c9190613fe6565b6005546001600160a01b031633146124105760405162461bcd60e51b8152600401610e78906141bc565b6015819055601454601354610ea2918391610e9c9161313c565b6000600a828154811061243f5761243f6143ed565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146124845760405162461bcd60e51b8152600401610e78906141bc565b601855565b6003815111801561249b575060208151105b6124e75760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401610e78565b338061254c5760405162461bcd60e51b815260206004820152602e60248201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860448201526d65207a65726f206164647265737360901b6064820152608401610e78565b6001600160a01b0381166000908152601b602052604090205460ff16156125c05760405162461bcd60e51b815260206004820152602260248201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604482015261737360f01b6064820152608401610e78565b6010546001600160a01b038281169116148015906125ec57506011546001600160a01b03828116911614155b61265e5760405162461bcd60e51b815260206004820152603760248201527f4e4f4445204352454154494f4e3a20667574757220616e64207265776172647360448201527f506f6f6c2063616e6e6f7420637265617465206e6f64650000000000000000006064820152608401610e78565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b1580156126a357600080fd5b505afa1580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db9190613fcd565b9050806126fd836001600160a01b031660009081526020819052604090205490565b10156127605760405162461bcd60e51b815260206004820152602c60248201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660448201526b37b91031b932b0ba34b7b71760a11b6064820152608401610e78565b30600090815260208190526040902054601a548110801590819061278b5750601954610100900460ff165b801561279a575060195460ff16155b80156127b457506005546001600160a01b03858116911614155b80156127d957506001600160a01b0384166000908152601c602052604090205460ff16155b156128df576019805460ff1916600117905560155460009061280390606490611879908690613586565b60105490915061281c906001600160a01b031682613647565b600061283860646118796013548761358690919063ffffffff16565b9050600061285660646118796018548561358690919063ffffffff16565b60115490915061286f906001600160a01b031682613647565b6011546128909030906001600160a01b031661288b858561379f565b613696565b60006128ac60646118796014548961358690919063ffffffff16565b90506128b7816137e1565b306000908152602081905260409020546128d090613868565b50506019805460ff1916905550505b6128ea843085613696565b600d546040516312b8603f60e01b81526001600160a01b03909116906312b8603f9061291c908790899060040161405c565b600060405180830381600087803b15801561293657600080fd5b505af115801561294a573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b0316331461297f5760405162461bcd60e51b8152600401610e78906141bc565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610dcb9061439c565b6005546001600160a01b031633146129da5760405162461bcd60e51b8152600401610e78906141bc565b600f546001600160a01b0383811691161415612a715760405162461bcd60e51b815260206004820152604a60248201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460448201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746064820152694d616b6572506169727360b01b608482015260a401610e78565b612a7b82826139d1565b5050565b6005546001600160a01b03163314612aa95760405162461bcd60e51b8152600401610e78906141bc565b600d5460405163d1871a8960e01b8152600481018390526001600160a01b039091169063d1871a89906024016119dc565b6000610eb533846113378560405180606001604052806025815260200161448e602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906134fa565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b158015610fd457600080fd5b6000610eb533848461341f565b6005546000906001600160a01b03163314612ba85760405162461bcd60e51b8152600401610e78906141bc565b600d546040516330cd31af60e11b81526001600160a01b0384811660048301529091169063619a635e906024015b60206040518083038186803b158015612bee57600080fd5b505afa158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb99190613fcd565b606033612c455760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612c9657600080fd5b505afa158015612caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cce9190613ea9565b612cea5760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b031663c92819ce33611134565b6005546001600160a01b03163314612d2b5760405162461bcd60e51b8152600401610e78906141bc565b600d54604051636d58441560e11b815282151560048201526001600160a01b039091169063dab0882a906024016119dc565b6005546001600160a01b03163314612d875760405162461bcd60e51b8152600401610e78906141bc565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d546040805163fb10d6fb60e01b815290516000926001600160a01b03169163fb10d6fb916004808301926020929190829003018186803b158015610fd457600080fd5b600d546040805163613ff46f60e01b815290516000926001600160a01b03169163613ff46f916004808301926020929190829003018186803b158015610fd457600080fd5b606033612e5b5760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612eac57600080fd5b505afa158015612ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee49190613ea9565b612f005760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b0316635759fb0233611134565b6005546001600160a01b03163314612f415760405162461bcd60e51b8152600401610e78906141bc565b6001600160a01b038116612fa65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e78565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604080516327b3bf1160e01b815290516000926001600160a01b0316916327b3bf11916004808301926020929190829003018186803b158015610fd457600080fd5b600d5460405163112469f960e21b81526001600160a01b0383811660048301526000921690634491a7e490602401612bd6565b600d5460408051636f60a39360e11b815290516000926001600160a01b03169163dec14726916004808301926020929190829003018186803b158015610fd457600080fd5b600d54604080516385c44d9d60e01b815290516000926001600160a01b0316916385c44d9d916004808301926020929190829003018186803b15801561310457600080fd5b505afa158015613118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613ea9565b6000806131498385614300565b9050838110156113405760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e78565b6001600160a01b0383166131fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e78565b6001600160a01b03821661325e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e78565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6006546001600160a01b038416600090815260086020526040812054909183916132ea908661433a565b6132f49190614318565b6132fe9190614359565b949350505050565b804710156133565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e78565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146133a3576040519150601f19603f3d011682016040523d82523d6000602084013e6133a8565b606091505b505090508061193c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e78565b6001600160a01b0383166134455760405162461bcd60e51b8152600401610e78906141f1565b6001600160a01b03821661346b5760405162461bcd60e51b8152600401610e7890614093565b6001600160a01b0383166000908152601b602052604090205460ff161580156134ad57506001600160a01b0382166000908152601b602052604090205460ff16155b6134ef5760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610e78565b61193c838383613696565b6000818484111561351e5760405162461bcd60e51b8152600401610e789190614080565b50600061352b8486614359565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261193c908490613aba565b60008261359557506000610eb9565b60006135a1838561433a565b9050826135ae8583614318565b146113405760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e78565b600061134083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b8c565b4761365182613868565b600061365d478361379f565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611a0a573d6000803e3d6000fd5b6001600160a01b0383166136bc5760405162461bcd60e51b8152600401610e78906141f1565b6001600160a01b0382166136e25760405162461bcd60e51b8152600401610e7890614093565b61371f81604051806060016040528060268152602001614440602691396001600160a01b03861660009081526020819052604090205491906134fa565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461374e908261313c565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016132b3565b600061134083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506134fa565b60006137ee826002613605565b905060006137fc838361379f565b90504761380883613868565b6000613814478361379f565b90506138208382613bba565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061389d5761389d6143ed565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156138f157600080fd5b505afa158015613905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139299190613d9b565b8160018151811061393c5761393c6143ed565b6001600160a01b039283166020918202929092010152600e54613962913091168461319b565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061399b908590600090869030904290600401614236565b600060405180830381600087803b1580156139b557600080fd5b505af11580156139c9573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415613a665760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610e78565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000613b0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c739092919063ffffffff16565b80519091501561193c5780806020019051810190613b2d9190613ea9565b61193c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e78565b60008183613bad5760405162461bcd60e51b8152600401610e789190614080565b50600061352b8486614318565b600e54613bd29030906001600160a01b03168461319b565b600e5460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015613c3a57600080fd5b505af1158015613c4e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a0a9190613fe6565b60606132fe848460008585843b613ccc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e78565b600080866001600160a01b03168587604051613ce89190614040565b60006040518083038185875af1925050503d8060008114613d25576040519150601f19603f3d011682016040523d82523d6000602084013e613d2a565b606091505b5091509150613d3a828286613d45565b979650505050505050565b60608315613d54575081611340565b825115613d645782518084602001fd5b8160405162461bcd60e51b8152600401610e789190614080565b600060208284031215613d9057600080fd5b813561134081614419565b600060208284031215613dad57600080fd5b815161134081614419565b60008060408385031215613dcb57600080fd5b8235613dd681614419565b91506020830135613de681614419565b809150509250929050565b600080600060608486031215613e0657600080fd5b8335613e1181614419565b92506020840135613e2181614419565b929592945050506040919091013590565b60008060408385031215613e4557600080fd5b8235613e5081614419565b91506020830135613de681614431565b60008060408385031215613e7357600080fd5b8235613e7e81614419565b946020939093013593505050565b600060208284031215613e9e57600080fd5b813561134081614431565b600060208284031215613ebb57600080fd5b815161134081614431565b600060208284031215613ed857600080fd5b813567ffffffffffffffff811115613eef57600080fd5b8201601f81018413613f0057600080fd5b8035613f13613f0e826142d8565b6142a7565b818152856020838501011115613f2857600080fd5b81602084016020830137600091810160200191909152949350505050565b600060208284031215613f5857600080fd5b815167ffffffffffffffff811115613f6f57600080fd5b8201601f81018413613f8057600080fd5b8051613f8e613f0e826142d8565b818152856020838501011115613fa357600080fd5b61352b826020830160208601614370565b600060208284031215613fc657600080fd5b5035919050565b600060208284031215613fdf57600080fd5b5051919050565b600080600060608486031215613ffb57600080fd5b8351925060208401519150604084015190509250925092565b6000815180845261402c816020860160208601614370565b601f01601f19169290920160200192915050565b60008251614052818460208701614370565b9190910192915050565b6001600160a01b03831681526040602082018190526000906132fe90830184614014565b6020815260006113406020830184614014565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b60208082526014908201527353454e4445522043414e2754204245205a45524f60601b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156142865784516001600160a01b031683529383019391830191600101614261565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156142d0576142d0614403565b604052919050565b600067ffffffffffffffff8211156142f2576142f2614403565b50601f01601f191660200190565b60008219821115614313576143136143d7565b500190565b60008261433557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614354576143546143d7565b500290565b60008282101561436b5761436b6143d7565b500390565b60005b8381101561438b578181015183820152602001614373565b838111156120c75750506000910152565b600181811c908216806143b057607f821691505b602082108114156143d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461442e57600080fd5b50565b801515811461442e57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122067a7f090e3f7dbcbf09df4c647fbf52aa94f1c437176a7d28c3781c9727b00ae64736f6c6343000807003360806040526008805461ffff19166001179055620493e06009556000600a819055600b819055600c819055600d5534801561003957600080fd5b506040516121c63803806121c683398101604081905261005891610069565b600592909255600655600755610097565b60008060006060848603121561007e57600080fd5b8351925060208401519150604084015190509250925092565b612120806100a66000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806385c44d9d116100f9578063cece91eb11610097578063dec1472611610071578063dec14726146103a8578063ef9bb988146103b1578063f1fec2b8146103c4578063fb10d6fb146103cd57600080fd5b8063cece91eb14610361578063d1871a8914610374578063dab0882a1461038757600080fd5b8063a6e15cc4116100d3578063a6e15cc41461031f578063b8527aef14610332578063c6faedc81461033b578063c92819ce1461034e57600080fd5b806385c44d9d146102e657806388fe6553146102f35780638a327eaa1461031657600080fd5b80635c298b1c11610166578063619a635e11610140578063619a635e146102a45780636590c691146102b75780636edb7002146102ca57806372476577146102dd57600080fd5b80635c298b1c146102765780635ee58efc14610289578063613ff46f1461029b57600080fd5b806341ac82b0116101a257806341ac82b01461021a5780634491a7e41461023d5780634a389fae146102505780635759fb021461026357600080fd5b806312b8603f146101c957806327b3bf11146101de578063334de3a2146101fa575b600080fd5b6101dc6101d7366004611d41565b6103d6565b005b6101e760075481565b6040519081526020015b60405180910390f35b61020d610208366004611d26565b61058b565b6040516101f19190611ec4565b61022d610228366004611d26565b6107e6565b60405190151581526020016101f1565b6101e761024b366004611d26565b6107f7565b61020d61025e366004611d26565b61088c565b61020d610271366004611d26565b610ae2565b6101e7610284366004611d26565b610d38565b60085461022d90610100900460ff1681565b6101e760065481565b6101e76102b2366004611d26565b610dd3565b6101e76102c5366004611e03565b610e9d565b6101e76102d8366004611e03565b610eca565b6101e7600b5481565b60085461022d9060ff1681565b6102fb610f42565b604080519384526020840192909252908201526060016101f1565b6101e7600d5481565b6101e761032d366004611e03565b610f60565b6101e7600c5481565b6101dc610349366004611e4f565b600655565b61020d61035c366004611d26565b611028565b6101dc61036f366004611e4f565b600555565b6101dc610382366004611e4f565b600755565b6101dc610395366004611e2d565b6008805460ff1916911515919091179055565b6101e760095481565b6101dc6103bf366004611e4f565b600955565b6101e760055481565b6101e7600a5481565b6103e0828261127e565b6104315760405162461bcd60e51b815260206004820152601f60248201527f435245415445204e4f44453a204e616d65206e6f7420617661696c61626c650060448201526064015b60405180910390fd5b6001600160a01b03821660009081526004602081815260408084208151608081018352868152428185018190529281019290925260065460608301528054600181018255908552938290208151805192959094020192610495928492910190611c71565b50602082810151600183015560408084015160028401556060909301516003909201919091556001600160a01b0384166000818152600492839052838120549351632f0ad01760e21b81529283015260248201526044810191909152731b90eaa7dfc53db7e828281dda21b4276ab0e7b59063bc2b405c9060640160006040518083038186803b15801561052857600080fd5b505af415801561053c573d6000803e3d6000fd5b5050600c80549250905060006105518361208d565b909155505060085460ff1680156105705750600854610100900460ff16155b1561058757610583600954600654611400565b5050505b5050565b6060610596826116b2565b6105e25760405162461bcd60e51b815260206004820152601860248201527f474554204e414d45533a204e4f204e4f4445204f574e455200000000000000006044820152606401610428565b6001600160a01b038216600090815260046020908152604080832080548251818502810185019093528083529192909190849084015b828210156106fa578382906000526020600020906004020160405180608001604052908160008201805461064b90612052565b80601f016020809104026020016040519081016040528092919081815260200182805461067790612052565b80156106c45780601f10610699576101008083540402835291602001916106c4565b820191906000526020600020905b8154815290600101906020018083116106a757829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152505081526020019060010190610618565b5050505090506000815190506107316040518060800160405280606081526020016000815260200160008152602001600081525090565b600083600081518110610746576107466120be565b60200260200101516000015190506000604051806040016040528060018152602001602360f81b81525090506000600190505b848110156107da57858181518110610793576107936120be565b60200260200101519350828285600001516040516020016107b693929190611e81565b604051602081830303815290604052925080806107d29061208d565b915050610779565b50909695505050505050565b60006107f1826116b2565b92915050565b60405163732a2ccf60e01b81526000600482018190526001600160a01b038316602483015290731b90eaa7dfc53db7e828281dda21b4276ab0e7b59063732a2ccf9060440160206040518083038186803b15801561085457600080fd5b505af4158015610868573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f19190611e68565b6060610897826116b2565b6108e35760405162461bcd60e51b815260206004820152601960248201527f474554205245574152443a204e4f204e4f4445204f574e4552000000000000006044820152606401610428565b6001600160a01b038216600090815260046020908152604080832080548251818502810185019093528083529192909190849084015b828210156109fb578382906000526020600020906004020160405180608001604052908160008201805461094c90612052565b80601f016020809104026020016040519081016040528092919081815260200182805461097890612052565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152505081526020019060010190610919565b505050509050600081519050610a326040518060800160405280606081526020016000815260200160008152602001600081525090565b6000610a5b84600081518110610a4a57610a4a6120be565b602002602001015160600151611750565b604080518082019091526001808252602360f81b6020830152919250905b848110156107da57858181518110610a9357610a936120be565b602002602001015193508282610aac8660600151611750565b604051602001610abe93929190611e81565b60405160208183030381529060405292508080610ada9061208d565b915050610a79565b6060610aed826116b2565b610b395760405162461bcd60e51b815260206004820152601f60248201527f4c41535420434c41494d452054494d453a204e4f204e4f4445204f574e4552006044820152606401610428565b6001600160a01b038216600090815260046020908152604080832080548251818502810185019093528083529192909190849084015b82821015610c515783829060005260206000209060040201604051806080016040529081600082018054610ba290612052565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90612052565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152505081526020019060010190610b6f565b505050509050600081519050610c886040518060800160405280606081526020016000815260200160008152602001600081525090565b6000610cb184600081518110610ca057610ca06120be565b602002602001015160400151611750565b604080518082019091526001808252602360f81b6020830152919250905b848110156107da57858181518110610ce957610ce96120be565b602002602001015193508282610d028660400151611750565b604051602001610d1493929190611e81565b60405160208183030381529060405292508080610d309061208d565b915050610ccf565b6001600160a01b0381166000908152600460205260408120805480610d6f5760405162461bcd60e51b815260040161042890611ef7565b600080805b83811015610dc957848181548110610d8e57610d8e6120be565b90600052602060002090600402019250826003015482610dae9190611f8d565b60006003850155915080610dc18161208d565b915050610d74565b5095945050505050565b6000610dde826116b2565b610e2a5760405162461bcd60e51b815260206004820152601c60248201527f47455420524557415244204f463a204e4f204e4f4445204f574e4552000000006044820152606401610428565b6001600160a01b038216600090815260046020526040812080549190815b83811015610e9357818181548110610e6257610e626120be565b90600052602060002090600402016003015483610e7f9190611f8d565b925080610e8b8161208d565b915050610e48565b5090949350505050565b6001600160a01b0382166000908152600460205260408120610ebf9083611879565b600301549392505050565b6000808211610eeb5760405162461bcd60e51b815260040161042890611ef7565b6001600160a01b0383166000908152600460205260409020805480610f225760405162461bcd60e51b815260040161042890611f3e565b6000610f2e8386611879565b600301805460009091559695505050505050565b6000806000610f55600954600654611400565b925092509250909192565b6000610f6b836116b2565b610fb75760405162461bcd60e51b815260206004820152601c60248201527f47455420524557415244204f463a204e4f204e4f4445204f574e4552000000006044820152606401610428565b60008211610fd75760405162461bcd60e51b815260040161042890611ef7565b6001600160a01b038316600090815260046020526040902080548061100e5760405162461bcd60e51b815260040161042890611f3e565b600061101a8386611879565b600301549695505050505050565b6060611033826116b2565b61107f5760405162461bcd60e51b815260206004820152601b60248201527f474554204352454154494d453a204e4f204e4f4445204f574e455200000000006044820152606401610428565b6001600160a01b038216600090815260046020908152604080832080548251818502810185019093528083529192909190849084015b8282101561119757838290600052602060002090600402016040518060800160405290816000820180546110e890612052565b80601f016020809104026020016040519081016040528092919081815260200182805461111490612052565b80156111615780601f1061113657610100808354040283529160200191611161565b820191906000526020600020905b81548152906001019060200180831161114457829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481525050815260200190600101906110b5565b5050505090506000815190506111ce6040518060800160405280606081526020016000815260200160008152602001600081525090565b60006111f7846000815181106111e6576111e66120be565b602002602001015160200151611750565b604080518082019091526001808252602360f81b6020830152919250905b848110156107da5785818151811061122f5761122f6120be565b6020026020010151935082826112488660200151611750565b60405160200161125a93929190611e81565b604051602081830303815290604052925080806112769061208d565b915050611215565b6001600160a01b038216600090815260046020908152604080832080548251818502810185019093528083528493849084015b8282101561139357838290600052602060002090600402016040518060800160405290816000820180546112e490612052565b80601f016020809104026020016040519081016040528092919081815260200182805461131090612052565b801561135d5780601f106113325761010080835404028352916020019161135d565b820191906000526020600020905b81548152906001019060200180831161134057829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481525050815260200190600101906112b1565b50505050905060005b81518110156113f55783805190602001208282815181106113bf576113bf6120be565b6020026020010151600001518051906020012014156113e3576000925050506107f1565b806113ed8161208d565b91505061139c565b506001949350505050565b6008805461ff0019166101001790556000805481908190806114645760405162461bcd60e51b815260206004820152601e60248201527f44495354524920524557415244533a204e4f204e4f4445204f574e45525300006044820152606401610428565b8061147a575050600b54600092508291506116ab565b6000805a600b549091506000908142818080805b8f8a10801561149c57508a86105b1561168957866114ab8161208d565b600054909850881090506114be57600096505b600460008060000189815481106114d7576114d76120be565b60009182526020808320909101546001600160a01b0316835282019290925260400181208054955092505b848110156116515782818154811061151c5761151c6120be565b906000526020600020906004020191506115f08260405180608001604052908160008201805461154b90612052565b80601f016020809104026020016040519081016040528092919081815260200182805461157790612052565b80156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481525050611a53565b1561163f578f8260030160008282546116099190611f8d565b925050819055508582600201819055508f600d600082825461162b9190611f8d565b9091555084905061163b8161208d565b9450505b806116498161208d565b915050611502565b508561165c8161208d565b9650505a9750878911156116815761167e6116778a8a611a70565b8b90611ab9565b99505b87985061148e565b5050600b8590556008805461ff0019169055929a509198509196505050505050505b9250925092565b60405163732a2ccf60e01b81526000600482018190526001600160a01b0383166024830152908190731b90eaa7dfc53db7e828281dda21b4276ab0e7b59063732a2ccf9060440160206040518083038186803b15801561171157600080fd5b505af4158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117499190611e68565b1192915050565b6060816117745750506040805180820190915260018152600360fc1b602082015290565b8160005b811561179e57806117888161208d565b91506117979050600a83611fca565b9150611778565b60008167ffffffffffffffff8111156117b9576117b96120d4565b6040519080825280601f01601f1916602001820160405280156117e3576020820181803683370190505b509050815b8515611870576117f960018261200b565b90506000611808600a88611fca565b61181390600a611fec565b61181d908861200b565b611828906030611fa5565b905060008160f81b905080848481518110611845576118456120be565b60200101906001600160f81b031916908160001a905350611867600a89611fca565b975050506117e8565b50949350505050565b81546000908061189b5760405162461bcd60e51b815260040161042890611f3e565b6000806119b186805480602002602001604051908101604052809291908181526020016000905b828210156119a457838290600052602060002090600402016040518060800160405290816000820180546118f590612052565b80601f016020809104026020016040519081016040528092919081815260200182805461192190612052565b801561196e5780601f106119435761010080835404028352916020019161196e565b820191906000526020600020905b81548152906001019060200180831161195157829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481525050815260200190600101906118c2565b5050505060008588611b18565b905060008082126119c3575060019150805b82611a275760405162461bcd60e51b815260206004820152602e60248201527f4e4f4445205345415243483a204e6f204e4f444520466f756e6420776974682060448201526d7468697320626c6f636b74696d6560901b6064820152608401610428565b868181548110611a3957611a396120be565b906000526020600020906004020194505050505092915050565b6000426007548360400151611a689190611f8d565b111592915050565b6000611ab283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611bcc565b9392505050565b600080611ac68385611f8d565b905083811015611ab25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610428565b6000838310611bbf576000611b386002611b328787611f8d565b90611c06565b905082868281518110611b4d57611b4d6120be565b6020026020010151602001511415611b66579050611bc4565b82868281518110611b7957611b796120be565b6020026020010151602001511115611ba957611ba18686611b9b60018561200b565b86611b18565b915050611bc4565b611ba186611bb8836001611f8d565b8686611b18565b506000195b949350505050565b60008184841115611bf05760405162461bcd60e51b81526004016104289190611ec4565b506000611bfd848661200b565b95945050505050565b6000611ab283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183611c645760405162461bcd60e51b81526004016104289190611ec4565b506000611bfd8486611fca565b828054611c7d90612052565b90600052602060002090601f016020900481019282611c9f5760008555611ce5565b82601f10611cb857805160ff1916838001178555611ce5565b82800160010185558215611ce5579182015b82811115611ce5578251825591602001919060010190611cca565b50611cf1929150611cf5565b5090565b5b80821115611cf15760008155600101611cf6565b80356001600160a01b0381168114611d2157600080fd5b919050565b600060208284031215611d3857600080fd5b611ab282611d0a565b60008060408385031215611d5457600080fd5b611d5d83611d0a565b9150602083013567ffffffffffffffff80821115611d7a57600080fd5b818501915085601f830112611d8e57600080fd5b813581811115611da057611da06120d4565b604051601f8201601f19908116603f01168101908382118183101715611dc857611dc86120d4565b81604052828152886020848701011115611de157600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060408385031215611e1657600080fd5b611e1f83611d0a565b946020939093013593505050565b600060208284031215611e3f57600080fd5b81358015158114611ab257600080fd5b600060208284031215611e6157600080fd5b5035919050565b600060208284031215611e7a57600080fd5b5051919050565b60008451611e93818460208901612022565b845190830190611ea7818360208901612022565b8451910190611eba818360208801612022565b0195945050505050565b6020815260008251806020840152611ee3816040850160208701612022565b601f01601f19169190910160400192915050565b60208082526027908201527f4e4f44453a204352454154494d45206d75737420626520686967686572207468604082015266616e207a65726f60c81b606082015260800190565b6020808252602f908201527f434153484f5554204552524f523a20596f7520646f6e27742068617665206e6f60408201526e19195cc81d1bc818d85cda0b5bdd5d608a1b606082015260800190565b60008219821115611fa057611fa06120a8565b500190565b600060ff821660ff84168060ff03821115611fc257611fc26120a8565b019392505050565b600082611fe757634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612006576120066120a8565b500290565b60008282101561201d5761201d6120a8565b500390565b60005b8381101561203d578181015183820152602001612025565b8381111561204c576000848401525b50505050565b600181811c9082168061206657607f821691505b6020821081141561208757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120a1576120a16120a8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212207aa20d20fb4a39991ca00b526f5f4e528acacd39939a35fba6fa1fd67ffaea9164736f6c63430008070033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000026ac000000000000000000000000f491e7b69e4244ad4002bc14e878a34207e38c290000000000000000000000000000000000000000000000000000000000000004000000000000000000000000975e437997b74cddc94e764a5497006e9141d881000000000000000000000000098fe85f80567ea2cdcec39100680f85af812712000000000000000000000000b85914aa378a3810ae7e3d7ef1f968fda9cfbf59000000000000000000000000c8494e09ece40927987c0ca7f68c2a4b62d3b3e0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000008000000000000000000000000c1223aa0155b1f39d19088a7f3f88426b885e0a80000000000000000000000002f35c7e09b8726a3edd961664393dc6eb12e2bdd0000000000000000000000002af53dde08d6094566929e0bf4f9f8976d653f3a00000000000000000000000073eb7af0db6352e052356b4ec238970bb08b9e4500000000000000000000000091568ac24f7480ea9e97c320d6b3e628239789f1000000000000000000000000e50ec1021ce736a0c4f45a529faf24daf6f96bad00000000000000000000000099b1babf940b3ffd2be26c18e78b9b63e56d30dd000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b60000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000128e2e700000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e
Deployed Bytecode
0x6080604052600436106104355760003560e01c80638013858b11610229578063ab5747611161012e578063da41b333116100b6578063f2fde38b1161007a578063f2fde38b14610d3d578063f5a0725614610d5d578063f74c993414610d72578063f7b9f94314610d92578063f9afc76314610da757600080fd5b8063da41b33314610ca3578063db3ad6b514610cb8578063dd62ed3e14610ccd578063e33b7de314610d13578063ee1afdbf14610d2857600080fd5b8063c5ca7d6d116100fd578063c5ca7d6d14610bd7578063ce7c2ac214610bf7578063d0f7747414610c2d578063d79779b214610c4d578063d892934214610c8357600080fd5b8063ab57476114610b5c578063b62496f514610b72578063b96392c114610ba2578063bdf24a5314610bc257600080fd5b80639349c47d116101b15780639c82751c116101805780639c82751c14610ac7578063a457c2d714610ae7578063a5021a1714610b07578063a538ddf214610b1c578063a9059cbb14610b3c57600080fd5b80639349c47d14610a3c57806395d89b4114610a5c5780639852595c14610a715780639a7a23d614610aa757600080fd5b806388c41d7c116101f857806388c41d7c1461099e5780638b83209b146109be5780638bc9c7b0146109de5780638da5cb5b146109fe5780638f0ba4ca14610a1c57600080fd5b80638013858b14610934578063823349b31461095457806385141a77146109695780638743ef6d1461098957600080fd5b806348b750441161033a57806365b8dbc0116102c25780636d9ae0be116102865780636d9ae0be146108835780636f4a2cd01461089957806370a08231146108c9578063715018a6146108ff5780637b7703921461091457600080fd5b806365b8dbc0146107e357806365bfe430146108035780636770474b146108235780636815a91c14610843578063697e2f8e1461086357600080fd5b806354f12f1f1161030957806354f12f1f14610762578063583bd7a61461077857806359640ed9146107985780635b0d4674146107b85780635f1c3182146107cd57600080fd5b806348b75044146106f857806349bd5a5e146107185780634dc9b81914610738578063545579731461074d57600080fd5b806319165587116103bd578063313ce5671161038c578063313ce56714610641578063395093511461065d5780633a98ef391461067d578063406072a91461069257806342bc9fca146106d857600080fd5b806319165587146105bb5780631cdd3be3146105db57806323b872dd1461060b5780632bb14e1d1461062b57600080fd5b80630c08f300116104045780630c08f3001461052357806313114a9d14610543578063138a634a146105595780631694505e1461056e57806318160ddd146105a657600080fd5b806306fdde0314610483578063084a6bff146104ae578063095ea7b3146104d057806309a69f571461050057600080fd5b3661047e577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561048f57600080fd5b50610498610dbc565b6040516104a59190614080565b60405180910390f35b3480156104ba57600080fd5b506104ce6104c9366004613fb4565b610e4e565b005b3480156104dc57600080fd5b506104f06104eb366004613e60565b610ea8565b60405190151581526020016104a5565b34801561050c57600080fd5b50610515610ebf565b6040519081526020016104a5565b34801561052f57600080fd5b506104ce61053e366004613d7e565b611011565b34801561054f57600080fd5b5061051560165481565b34801561056557600080fd5b5061049861105d565b34801561057a57600080fd5b50600e5461058e906001600160a01b031681565b6040516001600160a01b0390911681526020016104a5565b3480156105b257600080fd5b50600254610515565b3480156105c757600080fd5b506104ce6105d6366004613d7e565b6111af565b3480156105e757600080fd5b506104f06105f6366004613d7e565b601b6020526000908152604090205460ff1681565b34801561061757600080fd5b506104f0610626366004613df1565b6112dd565b34801561063757600080fd5b5061051560135481565b34801561064d57600080fd5b50604051601281526020016104a5565b34801561066957600080fd5b506104f0610678366004613e60565b611347565b34801561068957600080fd5b50600654610515565b34801561069e57600080fd5b506105156106ad366004613db8565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b3480156106e457600080fd5b506104ce6106f3366004613fb4565b61137d565b34801561070457600080fd5b506104ce610713366004613db8565b6113c1565b34801561072457600080fd5b50600f5461058e906001600160a01b031681565b34801561074457600080fd5b506105156115a9565b34801561075957600080fd5b506104ce6115ee565b34801561076e57600080fd5b5061051560145481565b34801561078457600080fd5b506104ce610793366004613e8c565b611941565b3480156107a457600080fd5b506104ce6107b3366004613fb4565b611985565b3480156107c457600080fd5b50610498611a11565b3480156107d957600080fd5b50610515601a5481565b3480156107ef57600080fd5b506104ce6107fe366004613d7e565b611aec565b34801561080f57600080fd5b506104ce61081e366004613fb4565b611d88565b34801561082f57600080fd5b506104ce61083e366004613fb4565b6120cd565b34801561084f57600080fd5b506104ce61085e366004613fb4565b6120fc565b34801561086f57600080fd5b50600d5461058e906001600160a01b031681565b34801561088f57600080fd5b5061051560175481565b3480156108a557600080fd5b506108ae61212b565b604080519384526020840192909252908201526060016104a5565b3480156108d557600080fd5b506105156108e4366004613d7e565b6001600160a01b031660009081526020819052604090205490565b34801561090b57600080fd5b506104ce6121ef565b34801561092057600080fd5b506104ce61092f366004613fb4565b612263565b34801561094057600080fd5b506104ce61094f366004613fb4565b6122be565b34801561096057600080fd5b50610515612319565b34801561097557600080fd5b5060125461058e906001600160a01b031681565b34801561099557600080fd5b506104ce61235e565b3480156109aa57600080fd5b506104ce6109b9366004613fb4565b6123e6565b3480156109ca57600080fd5b5061058e6109d9366004613fb4565b61242a565b3480156109ea57600080fd5b506104ce6109f9366004613fb4565b61245a565b348015610a0a57600080fd5b506005546001600160a01b031661058e565b348015610a2857600080fd5b506104ce610a37366004613ec6565b612489565b348015610a4857600080fd5b506104ce610a57366004613d7e565b612955565b348015610a6857600080fd5b506104986129a1565b348015610a7d57600080fd5b50610515610a8c366004613d7e565b6001600160a01b031660009081526009602052604090205490565b348015610ab357600080fd5b506104ce610ac2366004613e32565b6129b0565b348015610ad357600080fd5b506104ce610ae2366004613fb4565b612a7f565b348015610af357600080fd5b506104f0610b02366004613e60565b612ada565b348015610b1357600080fd5b50610515612b29565b348015610b2857600080fd5b5060105461058e906001600160a01b031681565b348015610b4857600080fd5b506104f0610b57366004613e60565b612b6e565b348015610b6857600080fd5b5061051560155481565b348015610b7e57600080fd5b506104f0610b8d366004613d7e565b601c6020526000908152604090205460ff1681565b348015610bae57600080fd5b50610515610bbd366004613d7e565b612b7b565b348015610bce57600080fd5b50610498612c26565b348015610be357600080fd5b5060115461058e906001600160a01b031681565b348015610c0357600080fd5b50610515610c12366004613d7e565b6001600160a01b031660009081526008602052604090205490565b348015610c3957600080fd5b506104ce610c48366004613e8c565b612d01565b348015610c5957600080fd5b50610515610c68366004613d7e565b6001600160a01b03166000908152600b602052604090205490565b348015610c8f57600080fd5b506104ce610c9e366004613e32565b612d5d565b348015610caf57600080fd5b50610515612db2565b348015610cc457600080fd5b50610515612df7565b348015610cd957600080fd5b50610515610ce8366004613db8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610d1f57600080fd5b50600754610515565b348015610d3457600080fd5b50610498612e3c565b348015610d4957600080fd5b506104ce610d58366004613d7e565b612f17565b348015610d6957600080fd5b50610515613002565b348015610d7e57600080fd5b50610515610d8d366004613d7e565b613047565b348015610d9e57600080fd5b5061051561307a565b348015610db357600080fd5b506104f06130bf565b606060038054610dcb9061439c565b80601f0160208091040260200160405190810160405280929190818152602001828054610df79061439c565b8015610e445780601f10610e1957610100808354040283529160200191610e44565b820191906000526020600020905b815481529060010190602001808311610e2757829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e815760405162461bcd60e51b8152600401610e78906141bc565b60405180910390fd5b6013819055601554601454610ea29190610e9c90849061313c565b9061313c565b60165550565b6000610eb533848461319b565b5060015b92915050565b600033610ede5760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610f2f57600080fd5b505afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190613ea9565b610f835760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b031663619a635e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610fd457600080fd5b505afa158015610fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613fcd565b905090565b6005546001600160a01b0316331461103b5760405162461bcd60e51b8152600401610e78906141bc565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60603361107c5760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156110cd57600080fd5b505afa1580156110e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111059190613ea9565b6111215760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b031663334de3a2335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160006040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261100c9190810190613f46565b6001600160a01b0381166000908152600860205260409020546111e45760405162461bcd60e51b8152600401610e789061412b565b60006111ef60075490565b6111f99047614300565b905060006112268383611221866001600160a01b031660009081526009602052604090205490565b6132c0565b9050806112455760405162461bcd60e51b8152600401610e7890614171565b6001600160a01b0383166000908152600960205260408120805483929061126d908490614300565b9250508190555080600760008282546112869190614300565b9091555061129690508382613306565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60006112ea84848461341f565b61133c843361133785604051806060016040528060288152602001614466602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906134fa565b61319b565b5060015b9392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610eb5918590611337908661313c565b6005546001600160a01b031633146113a75760405162461bcd60e51b8152600401610e78906141bc565b6014819055601554601354610ea29190610e9c908461313c565b6001600160a01b0381166000908152600860205260409020546113f65760405162461bcd60e51b8152600401610e789061412b565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114869190613fcd565b6114909190614300565b905060006114c9838361122187876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b9050806114e85760405162461bcd60e51b8152600401610e7890614171565b6001600160a01b038085166000908152600c602090815260408083209387168352929052908120805483929061151f908490614300565b90915550506001600160a01b0384166000908152600b60205260408120805483929061154c908490614300565b9091555061155d9050848483613534565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600d54604080516345193f5560e11b815290516000926001600160a01b031691638a327eaa916004808301926020929190829003018186803b158015610fd457600080fd5b33806116505760405162461bcd60e51b815260206004820152602b60248201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610e78565b6001600160a01b0381166000908152601b602052604090205460ff16156116b95760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610e78565b6010546001600160a01b038281169116148015906116e557506011546001600160a01b03828116911614155b6117575760405162461bcd60e51b815260206004820152603860248201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60448201527f6c2063616e6e6f7420636173686f7574207265776172647300000000000000006064820152608401610e78565b600d546040516330cd31af60e11b81526001600160a01b038381166004830152600092169063619a635e9060240160206040518083038186803b15801561179d57600080fd5b505afa1580156117b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d59190613fcd565b9050600081116118445760405162461bcd60e51b815260206004820152603460248201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f75676044820152731a081c995dd85c99081d1bc818d85cda081bdd5d60621b6064820152608401610e78565b601954610100900460ff16156118a657601754600090156118985761187f60646118796017548561358690919063ffffffff16565b90613605565b601054909150611898906001600160a01b031682613647565b6118a28183614359565b9150505b6011546118bd906001600160a01b03168383613696565b600d5460405163170a62c760e21b81526001600160a01b03848116600483015290911690635c298b1c90602401602060405180830381600087803b15801561190457600080fd5b505af1158015611918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193c9190613fcd565b505050565b6005546001600160a01b0316331461196b5760405162461bcd60e51b8152600401610e78906141bc565b601980549115156101000261ff0019909216919091179055565b6005546001600160a01b031633146119af5760405162461bcd60e51b8152600401610e78906141bc565b600d54604051631df3773160e31b8152600481018390526001600160a01b039091169063ef9bb988906024015b600060405180830381600087803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b5050505050565b606033611a305760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611a8157600080fd5b505afa158015611a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab99190613ea9565b611ad55760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b0316634a389fae33611134565b6005546001600160a01b03163314611b165760405162461bcd60e51b8152600401610e78906141bc565b600e546001600160a01b0382811691161415611b855760405162461bcd60e51b815260206004820152602860248201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610e78565b600e546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b158015611c1757600080fd5b505afa158015611c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4f9190613d9b565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce49190613d9b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611d2c57600080fd5b505af1158015611d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d649190613d9b565b600f80546001600160a01b0319166001600160a01b03929092169190911790555050565b3380611de45760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e78565b6001600160a01b0381166000908152601b602052604090205460ff1615611e4d5760405162461bcd60e51b815260206004820152601f60248201527f4d414e494120435348543a20426c61636b6c69737465642061646472657373006044820152606401610e78565b6010546001600160a01b03828116911614801590611e7957506011546001600160a01b03828116911614155b611ee05760405162461bcd60e51b815260206004820152603260248201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e6044820152716f7420636173686f7574207265776172647360701b6064820152608401610e78565b600d546040516329b8573160e21b81526001600160a01b03838116600483015260248201859052600092169063a6e15cc49060440160206040518083038186803b158015611f2d57600080fd5b505afa158015611f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f659190613fcd565b905060008111611fce5760405162461bcd60e51b815260206004820152602e60248201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160448201526d1c99081d1bc818d85cda081bdd5d60921b6064820152608401610e78565b601954610100900460ff161561202a576017546000901561201c5761200360646118796017548561358690919063ffffffff16565b60105490915061201c906001600160a01b031682613647565b6120268183614359565b9150505b601154612041906001600160a01b03168383613696565b600d5460405163376db80160e11b81526001600160a01b0384811660048301526024820186905290911690636edb700290604401602060405180830381600087803b15801561208f57600080fd5b505af11580156120a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c79190613fcd565b50505050565b6005546001600160a01b031633146120f75760405162461bcd60e51b8152600401610e78906141bc565b601a55565b6005546001600160a01b031633146121265760405162461bcd60e51b8152600401610e78906141bc565b601755565b600554600090819081906001600160a01b0316331461215c5760405162461bcd60e51b8152600401610e78906141bc565b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b1580156121ac57600080fd5b505af11580156121c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e49190613fe6565b925092509250909192565b6005546001600160a01b031633146122195760405162461bcd60e51b8152600401610e78906141bc565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461228d5760405162461bcd60e51b8152600401610e78906141bc565b600d546040516318df5db960e31b8152600481018390526001600160a01b039091169063c6faedc8906024016119dc565b6005546001600160a01b031633146122e85760405162461bcd60e51b8152600401610e78906141bc565b600d5460405163cece91eb60e01b8152600481018390526001600160a01b039091169063cece91eb906024016119dc565b600d546040805163b8527aef60e01b815290516000926001600160a01b03169163b8527aef916004808301926020929190829003018186803b158015610fd457600080fd5b600d60009054906101000a90046001600160a01b03166001600160a01b03166388fe65536040518163ffffffff1660e01b8152600401606060405180830381600087803b1580156123ae57600080fd5b505af11580156123c2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193c9190613fe6565b6005546001600160a01b031633146124105760405162461bcd60e51b8152600401610e78906141bc565b6015819055601454601354610ea2918391610e9c9161313c565b6000600a828154811061243f5761243f6143ed565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146124845760405162461bcd60e51b8152600401610e78906141bc565b601855565b6003815111801561249b575060208151105b6124e75760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401610e78565b338061254c5760405162461bcd60e51b815260206004820152602e60248201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860448201526d65207a65726f206164647265737360901b6064820152608401610e78565b6001600160a01b0381166000908152601b602052604090205460ff16156125c05760405162461bcd60e51b815260206004820152602260248201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604482015261737360f01b6064820152608401610e78565b6010546001600160a01b038281169116148015906125ec57506011546001600160a01b03828116911614155b61265e5760405162461bcd60e51b815260206004820152603760248201527f4e4f4445204352454154494f4e3a20667574757220616e64207265776172647360448201527f506f6f6c2063616e6e6f7420637265617465206e6f64650000000000000000006064820152608401610e78565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b1580156126a357600080fd5b505afa1580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db9190613fcd565b9050806126fd836001600160a01b031660009081526020819052604090205490565b10156127605760405162461bcd60e51b815260206004820152602c60248201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660448201526b37b91031b932b0ba34b7b71760a11b6064820152608401610e78565b30600090815260208190526040902054601a548110801590819061278b5750601954610100900460ff165b801561279a575060195460ff16155b80156127b457506005546001600160a01b03858116911614155b80156127d957506001600160a01b0384166000908152601c602052604090205460ff16155b156128df576019805460ff1916600117905560155460009061280390606490611879908690613586565b60105490915061281c906001600160a01b031682613647565b600061283860646118796013548761358690919063ffffffff16565b9050600061285660646118796018548561358690919063ffffffff16565b60115490915061286f906001600160a01b031682613647565b6011546128909030906001600160a01b031661288b858561379f565b613696565b60006128ac60646118796014548961358690919063ffffffff16565b90506128b7816137e1565b306000908152602081905260409020546128d090613868565b50506019805460ff1916905550505b6128ea843085613696565b600d546040516312b8603f60e01b81526001600160a01b03909116906312b8603f9061291c908790899060040161405c565b600060405180830381600087803b15801561293657600080fd5b505af115801561294a573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b0316331461297f5760405162461bcd60e51b8152600401610e78906141bc565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610dcb9061439c565b6005546001600160a01b031633146129da5760405162461bcd60e51b8152600401610e78906141bc565b600f546001600160a01b0383811691161415612a715760405162461bcd60e51b815260206004820152604a60248201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460448201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746064820152694d616b6572506169727360b01b608482015260a401610e78565b612a7b82826139d1565b5050565b6005546001600160a01b03163314612aa95760405162461bcd60e51b8152600401610e78906141bc565b600d5460405163d1871a8960e01b8152600481018390526001600160a01b039091169063d1871a89906024016119dc565b6000610eb533846113378560405180606001604052806025815260200161448e602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906134fa565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b158015610fd457600080fd5b6000610eb533848461341f565b6005546000906001600160a01b03163314612ba85760405162461bcd60e51b8152600401610e78906141bc565b600d546040516330cd31af60e11b81526001600160a01b0384811660048301529091169063619a635e906024015b60206040518083038186803b158015612bee57600080fd5b505afa158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb99190613fcd565b606033612c455760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612c9657600080fd5b505afa158015612caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cce9190613ea9565b612cea5760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b031663c92819ce33611134565b6005546001600160a01b03163314612d2b5760405162461bcd60e51b8152600401610e78906141bc565b600d54604051636d58441560e11b815282151560048201526001600160a01b039091169063dab0882a906024016119dc565b6005546001600160a01b03163314612d875760405162461bcd60e51b8152600401610e78906141bc565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d546040805163fb10d6fb60e01b815290516000926001600160a01b03169163fb10d6fb916004808301926020929190829003018186803b158015610fd457600080fd5b600d546040805163613ff46f60e01b815290516000926001600160a01b03169163613ff46f916004808301926020929190829003018186803b158015610fd457600080fd5b606033612e5b5760405162461bcd60e51b8152600401610e78906140fd565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612eac57600080fd5b505afa158015612ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee49190613ea9565b612f005760405162461bcd60e51b8152600401610e78906140d6565b600d546001600160a01b0316635759fb0233611134565b6005546001600160a01b03163314612f415760405162461bcd60e51b8152600401610e78906141bc565b6001600160a01b038116612fa65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e78565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604080516327b3bf1160e01b815290516000926001600160a01b0316916327b3bf11916004808301926020929190829003018186803b158015610fd457600080fd5b600d5460405163112469f960e21b81526001600160a01b0383811660048301526000921690634491a7e490602401612bd6565b600d5460408051636f60a39360e11b815290516000926001600160a01b03169163dec14726916004808301926020929190829003018186803b158015610fd457600080fd5b600d54604080516385c44d9d60e01b815290516000926001600160a01b0316916385c44d9d916004808301926020929190829003018186803b15801561310457600080fd5b505afa158015613118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190613ea9565b6000806131498385614300565b9050838110156113405760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e78565b6001600160a01b0383166131fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e78565b6001600160a01b03821661325e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e78565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6006546001600160a01b038416600090815260086020526040812054909183916132ea908661433a565b6132f49190614318565b6132fe9190614359565b949350505050565b804710156133565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e78565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146133a3576040519150601f19603f3d011682016040523d82523d6000602084013e6133a8565b606091505b505090508061193c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e78565b6001600160a01b0383166134455760405162461bcd60e51b8152600401610e78906141f1565b6001600160a01b03821661346b5760405162461bcd60e51b8152600401610e7890614093565b6001600160a01b0383166000908152601b602052604090205460ff161580156134ad57506001600160a01b0382166000908152601b602052604090205460ff16155b6134ef5760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401610e78565b61193c838383613696565b6000818484111561351e5760405162461bcd60e51b8152600401610e789190614080565b50600061352b8486614359565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261193c908490613aba565b60008261359557506000610eb9565b60006135a1838561433a565b9050826135ae8583614318565b146113405760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e78565b600061134083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b8c565b4761365182613868565b600061365d478361379f565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611a0a573d6000803e3d6000fd5b6001600160a01b0383166136bc5760405162461bcd60e51b8152600401610e78906141f1565b6001600160a01b0382166136e25760405162461bcd60e51b8152600401610e7890614093565b61371f81604051806060016040528060268152602001614440602691396001600160a01b03861660009081526020819052604090205491906134fa565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461374e908261313c565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016132b3565b600061134083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506134fa565b60006137ee826002613605565b905060006137fc838361379f565b90504761380883613868565b6000613814478361379f565b90506138208382613bba565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061389d5761389d6143ed565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156138f157600080fd5b505afa158015613905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139299190613d9b565b8160018151811061393c5761393c6143ed565b6001600160a01b039283166020918202929092010152600e54613962913091168461319b565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061399b908590600090869030904290600401614236565b600060405180830381600087803b1580156139b557600080fd5b505af11580156139c9573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415613a665760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610e78565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000613b0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c739092919063ffffffff16565b80519091501561193c5780806020019051810190613b2d9190613ea9565b61193c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e78565b60008183613bad5760405162461bcd60e51b8152600401610e789190614080565b50600061352b8486614318565b600e54613bd29030906001600160a01b03168461319b565b600e5460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015613c3a57600080fd5b505af1158015613c4e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a0a9190613fe6565b60606132fe848460008585843b613ccc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e78565b600080866001600160a01b03168587604051613ce89190614040565b60006040518083038185875af1925050503d8060008114613d25576040519150601f19603f3d011682016040523d82523d6000602084013e613d2a565b606091505b5091509150613d3a828286613d45565b979650505050505050565b60608315613d54575081611340565b825115613d645782518084602001fd5b8160405162461bcd60e51b8152600401610e789190614080565b600060208284031215613d9057600080fd5b813561134081614419565b600060208284031215613dad57600080fd5b815161134081614419565b60008060408385031215613dcb57600080fd5b8235613dd681614419565b91506020830135613de681614419565b809150509250929050565b600080600060608486031215613e0657600080fd5b8335613e1181614419565b92506020840135613e2181614419565b929592945050506040919091013590565b60008060408385031215613e4557600080fd5b8235613e5081614419565b91506020830135613de681614431565b60008060408385031215613e7357600080fd5b8235613e7e81614419565b946020939093013593505050565b600060208284031215613e9e57600080fd5b813561134081614431565b600060208284031215613ebb57600080fd5b815161134081614431565b600060208284031215613ed857600080fd5b813567ffffffffffffffff811115613eef57600080fd5b8201601f81018413613f0057600080fd5b8035613f13613f0e826142d8565b6142a7565b818152856020838501011115613f2857600080fd5b81602084016020830137600091810160200191909152949350505050565b600060208284031215613f5857600080fd5b815167ffffffffffffffff811115613f6f57600080fd5b8201601f81018413613f8057600080fd5b8051613f8e613f0e826142d8565b818152856020838501011115613fa357600080fd5b61352b826020830160208601614370565b600060208284031215613fc657600080fd5b5035919050565b600060208284031215613fdf57600080fd5b5051919050565b600080600060608486031215613ffb57600080fd5b8351925060208401519150604084015190509250925092565b6000815180845261402c816020860160208601614370565b601f01601f19169290920160200192915050565b60008251614052818460208701614370565b9190910192915050565b6001600160a01b03831681526040602082018190526000906132fe90830184614014565b6020815260006113406020830184614014565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b60208082526014908201527353454e4445522043414e2754204245205a45524f60601b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156142865784516001600160a01b031683529383019391830191600101614261565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156142d0576142d0614403565b604052919050565b600067ffffffffffffffff8211156142f2576142f2614403565b50601f01601f191660200190565b60008219821115614313576143136143d7565b500190565b60008261433557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614354576143546143d7565b500290565b60008282101561436b5761436b6143d7565b500390565b60005b8381101561438b578181015183820152602001614373565b838111156120c75750506000910152565b600181811c908216806143b057607f821691505b602082108114156143d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461442e57600080fd5b50565b801515811461442e57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122067a7f090e3f7dbcbf09df4c647fbf52aa94f1c437176a7d28c3781c9727b00ae64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000026ac000000000000000000000000f491e7b69e4244ad4002bc14e878a34207e38c290000000000000000000000000000000000000000000000000000000000000004000000000000000000000000975e437997b74cddc94e764a5497006e9141d881000000000000000000000000098fe85f80567ea2cdcec39100680f85af812712000000000000000000000000b85914aa378a3810ae7e3d7ef1f968fda9cfbf59000000000000000000000000c8494e09ece40927987c0ca7f68c2a4b62d3b3e0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000008000000000000000000000000c1223aa0155b1f39d19088a7f3f88426b885e0a80000000000000000000000002f35c7e09b8726a3edd961664393dc6eb12e2bdd0000000000000000000000002af53dde08d6094566929e0bf4f9f8976d653f3a00000000000000000000000073eb7af0db6352e052356b4ec238970bb08b9e4500000000000000000000000091568ac24f7480ea9e97c320d6b3e628239789f1000000000000000000000000e50ec1021ce736a0c4f45a529faf24daf6f96bad00000000000000000000000099b1babf940b3ffd2be26c18e78b9b63e56d30dd000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b600000000000000000000000000000000000000000000000000000000000035b60000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000128e2e700000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e
-----Decoded View---------------
Arg [0] : payees (address[]): 0x975E437997B74Cddc94e764A5497006E9141d881,0x098fE85f80567EA2cDcEC39100680f85AF812712,0xb85914Aa378A3810ae7E3D7Ef1F968fDA9CfBF59,0xC8494e09Ece40927987C0CA7f68c2A4B62d3B3e0
Arg [1] : shares (uint256[]): 25,25,25,25
Arg [2] : addresses (address[]): 0xc1223AA0155B1f39d19088A7F3f88426B885e0a8,0x2f35C7E09B8726a3eDd961664393dC6eB12E2bdd,0x2AF53dde08d6094566929e0bf4F9F8976D653f3a,0x73eb7af0db6352e052356B4Ec238970bB08b9e45,0x91568aC24F7480eA9E97c320d6B3E628239789f1,0xE50ec1021ce736a0c4f45a529faf24DAf6f96baD,0x99B1BaBf940B3FfD2Be26c18e78B9b63E56D30DD,0x000000000000000000000000000000000000dEaD
Arg [3] : balances (uint256[]): 220000,220000,220000,220000,10000,100000,10000,19456743
Arg [4] : fees (uint256[]): 2,60,10,10,30
Arg [5] : swapAmount (uint256): 30
Arg [6] : nodePrice (uint256): 100
Arg [7] : rewardPerNode (uint256): 1
Arg [8] : claimTime (uint256): 9900
Arg [9] : uniV2Router (address): 0xF491e7B69E4244ad4002BC14e878a34207E38c29
-----Encoded View---------------
44 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000004c0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 00000000000000000000000000000000000000000000000000000000000026ac
Arg [9] : 000000000000000000000000f491e7b69e4244ad4002bc14e878a34207e38c29
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [11] : 000000000000000000000000975e437997b74cddc94e764a5497006e9141d881
Arg [12] : 000000000000000000000000098fe85f80567ea2cdcec39100680f85af812712
Arg [13] : 000000000000000000000000b85914aa378a3810ae7e3d7ef1f968fda9cfbf59
Arg [14] : 000000000000000000000000c8494e09ece40927987c0ca7f68c2a4b62d3b3e0
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [21] : 000000000000000000000000c1223aa0155b1f39d19088a7f3f88426b885e0a8
Arg [22] : 0000000000000000000000002f35c7e09b8726a3edd961664393dc6eb12e2bdd
Arg [23] : 0000000000000000000000002af53dde08d6094566929e0bf4f9f8976d653f3a
Arg [24] : 00000000000000000000000073eb7af0db6352e052356b4ec238970bb08b9e45
Arg [25] : 00000000000000000000000091568ac24f7480ea9e97c320d6b3e628239789f1
Arg [26] : 000000000000000000000000e50ec1021ce736a0c4f45a529faf24daf6f96bad
Arg [27] : 00000000000000000000000099b1babf940b3ffd2be26c18e78b9b63e56d30dd
Arg [28] : 000000000000000000000000000000000000000000000000000000000000dead
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [30] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [31] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [32] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [33] : 0000000000000000000000000000000000000000000000000000000000035b60
Arg [34] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [35] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [36] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [37] : 000000000000000000000000000000000000000000000000000000000128e2e7
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [40] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [41] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [42] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [43] : 000000000000000000000000000000000000000000000000000000000000001e
Deployed Bytecode Sourcemap
68249:17125:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50452:40;27528:10;50452:40;;;-1:-1:-1;;;;;6678:32:1;;;6660:51;;50482:9:0;6742:2:1;6727:18;;6720:34;6633:18;50452:40:0;;;;;;;68249:17125;;;;;33638:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72958:166;;;;;;;;;;-1:-1:-1;72958:166:0;;;;;:::i;:::-;;:::i;:::-;;35946:210;;;;;;;;;;-1:-1:-1;35946:210:0;;;;;:::i;:::-;;:::i;:::-;;;8452:14:1;;8445:22;8427:41;;8415:2;8400:18;35946:210:0;8287:187:1;81614:327:0;;;;;;;;;;;;;:::i;:::-;;;22481:25:1;;;22469:2;22454:18;81614:327:0;22335:177:1;72728:104:0;;;;;;;;;;-1:-1:-1;72728:104:0;;;;;:::i;:::-;;:::i;68738:24::-;;;;;;;;;;;;;;;;83388:327;;;;;;;;;;;;;:::i;68400:41::-;;;;;;;;;;-1:-1:-1;68400:41:0;;;;-1:-1:-1;;;;;68400:41:0;;;;;;-1:-1:-1;;;;;6434:32:1;;;6416:51;;6404:2;6389:18;68400:41:0;6270:203:1;34758:108:0;;;;;;;;;;-1:-1:-1;34846:12:0;;34758:108;;52270:616;;;;;;;;;;-1:-1:-1;52270:616:0;;;;;:::i;:::-;;:::i;68949:46::-;;;;;;;;;;-1:-1:-1;68949:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36638:454;;;;;;;;;;-1:-1:-1;36638:454:0;;;;;:::i;:::-;;:::i;68638:25::-;;;;;;;;;;;;;;;;34600:93;;;;;;;;;;-1:-1:-1;34600:93:0;;34683:2;23968:36:1;;23956:2;23941:18;34600:93:0;23826:184:1;37501:300:0;;;;;;;;;;-1:-1:-1;37501:300:0;;;;;:::i;:::-;;:::i;50583:91::-;;;;;;;;;;-1:-1:-1;50654:12:0;;50583:91;;51712:167;;;;;;;;;;-1:-1:-1;51712:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;51841:21:0;;;51809:7;51841:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;51712:167;73132:173;;;;;;;;;;-1:-1:-1;73132:173:0;;;;;:::i;:::-;;:::i;53154:704::-;;;;;;;;;;-1:-1:-1;53154:704:0;;;;;:::i;:::-;;:::i;68450:28::-;;;;;;;;;;-1:-1:-1;68450:28:0;;;;-1:-1:-1;;;;;68450:28:0;;;85107:128;;;;;;;;;;;;;:::i;80068:1075::-;;;;;;;;;;;;;:::i;68670:31::-;;;;;;;;;;;;;;;;81151:96;;;;;;;;;;-1:-1:-1;81151:96:0;;;;;:::i;:::-;;:::i;82983:134::-;;;;;;;;;;-1:-1:-1;82983:134:0;;;;;:::i;:::-;;:::i;84068:339::-;;;;;;;;;;;;;:::i;68909:31::-;;;;;;;;;;;;;;;;72067:534;;;;;;;;;;-1:-1:-1;72067:534:0;;;;;:::i;:::-;;:::i;78963:1097::-;;;;;;;;;;-1:-1:-1;78963:1097:0;;;;;:::i;:::-;;:::i;72609:111::-;;;;;;;;;;-1:-1:-1;72609:111:0;;;;;:::i;:::-;;:::i;73483:97::-;;;;;;;;;;-1:-1:-1;73483:97:0;;;;;:::i;:::-;;:::i;68343:48::-;;;;;;;;;;-1:-1:-1;68343:48:0;;;;-1:-1:-1;;;;;68343:48:0;;;68771:25;;;;;;;;;;;;;;;;84763:231;;;;;;;;;;;;;:::i;:::-;;;;23704:25:1;;;23760:2;23745:18;;23738:34;;;;23788:18;;;23781:34;23692:2;23677:18;84763:231:0;23502:319:1;34929:177:0;;;;;;;;;;-1:-1:-1;34929:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;35080:18:0;35048:7;35080:18;;;;;;;;;;;;34929:177;28833:148;;;;;;;;;;;;;:::i;82211:134::-;;;;;;;;;;-1:-1:-1;82211:134:0;;;;;:::i;:::-;;:::i;81949:::-;;;;;;;;;;-1:-1:-1;81949:134:0;;;;;:::i;:::-;;:::i;85243:128::-;;;;;;;;;;;;;:::i;68559:70::-;;;;;;;;;;-1:-1:-1;68559:70:0;;;;-1:-1:-1;;;;;68559:70:0;;;85002:97;;;;;;;;;;;;;:::i;73313:162::-;;;;;;;;;;-1:-1:-1;73313:162:0;;;;;:::i;:::-;;:::i;51970:100::-;;;;;;;;;;-1:-1:-1;51970:100:0;;;;;:::i;:::-;;:::i;73588:92::-;;;;;;;;;;-1:-1:-1;73588:92:0;;;;;:::i;:::-;;:::i;28191:79::-;;;;;;;;;;-1:-1:-1;28256:6:0;;-1:-1:-1;;;;;28256:6:0;28191:79;;76762:2193;;;;;;;;;;-1:-1:-1;76762:2193:0;;;;;:::i;:::-;;:::i;72840:110::-;;;;;;;;;;-1:-1:-1;72840:110:0;;;;;:::i;:::-;;:::i;33857:104::-;;;;;;;;;;;;;:::i;51434:109::-;;;;;;;;;;-1:-1:-1;51434:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;51517:18:0;51490:7;51517:18;;;:9;:18;;;;;;;51434:109;73688:321;;;;;;;;;;-1:-1:-1;73688:321:0;;;;;:::i;:::-;;:::i;82481:124::-;;;;;;;;;;-1:-1:-1;82481:124:0;;;;;:::i;:::-;;:::i;38304:400::-;;;;;;;;;;-1:-1:-1;38304:400:0;;;;;:::i;:::-;;:::i;82091:112::-;;;;;;;;;;;;;:::i;68485:27::-;;;;;;;;;;-1:-1:-1;68485:27:0;;;;-1:-1:-1;;;;;68485:27:0;;;35319:216;;;;;;;;;;-1:-1:-1;35319:216:0;;;;;:::i;:::-;;:::i;68708:23::-;;;;;;;;;;;;;;;;69002:57;;;;;;;;;;-1:-1:-1;69002:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;81407:199;;;;;;;;;;-1:-1:-1;81407:199:0;;;;;:::i;:::-;;:::i;83723:337::-;;;;;;;;;;;;;:::i;68519:31::-;;;;;;;;;;-1:-1:-1;68519:31:0;;;;-1:-1:-1;;;;;68519:31:0;;;51230:105;;;;;;;;;;-1:-1:-1;51230:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;51311:16:0;51284:7;51311:16;;;:7;:16;;;;;;;51230:105;82733:123;;;;;;;;;;-1:-1:-1;82733:123:0;;;;;:::i;:::-;;:::i;51020:119::-;;;;;;;;;;-1:-1:-1;51020:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;51105:26:0;51078:7;51105:26;;;:19;:26;;;;;;;51020:119;74017:149;;;;;;;;;;-1:-1:-1;74017:149:0;;;;;:::i;:::-;;:::i;83254:126::-;;;;;;;;;;;;;:::i;82353:120::-;;;;;;;;;;;;;:::i;35598:201::-;;;;;;;;;;-1:-1:-1;35598:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;35764:18:0;;;35732:7;35764:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35598:201;50768:95;;;;;;;;;;-1:-1:-1;50841:14:0;;50768:95;;84415:340;;;;;;;;;;;;;:::i;29136:281::-;;;;;;;;;;-1:-1:-1;29136:281:0;;;;;:::i;:::-;;:::i;82613:112::-;;;;;;;;;;;;;:::i;81255:144::-;;;;;;;;;;-1:-1:-1;81255:144:0;;;;;:::i;:::-;;:::i;83125:121::-;;;;;;;;;;;;;:::i;82864:111::-;;;;;;;;;;;;;:::i;33638:100::-;33692:13;33725:5;33718:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33638:100;:::o;72958:166::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;;;;;;;;;73029:10:::1;:18:::0;;;73107:8:::1;::::0;73085:16:::1;::::0;73070:46:::1;::::0;73107:8;73070:32:::1;::::0;73042:5;;73070:14:::1;:32::i;:::-;:36:::0;::::1;:46::i;:::-;73058:9;:58:::0;-1:-1:-1;72958:166:0:o;35946:210::-;36065:4;36087:39;27528:10;36110:7;36119:6;36087:8;:39::i;:::-;-1:-1:-1;36144:4:0;35946:210;;;;;:::o;81614:327::-;81662:7;27528:10;81682:59;;;;-1:-1:-1;;;81682:59:0;;;;;;;:::i;:::-;81774:20;;-1:-1:-1;;;;;81774:20:0;:33;27528:10;81774:47;;-1:-1:-1;;;;;;81774:47:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;81774:47:0;;;6416:51:1;6389:18;;81774:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81752:110;;;;-1:-1:-1;;;81752:110:0;;;;;;;:::i;:::-;81880:20;;-1:-1:-1;;;;;81880:20:0;:39;27528:10;81880:53;;-1:-1:-1;;;;;;81880:53:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;81880:53:0;;;6416:51:1;6389:18;;81880:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81873:60;;81614:327;:::o;72728:104::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;72805:12:::1;:19:::0;;-1:-1:-1;;;;;;72805:19:0::1;-1:-1:-1::0;;;;;72805:19:0;;;::::1;::::0;;;::::1;::::0;;72728:104::o;83388:327::-;83434:13;27528:10;83460:59;;;;-1:-1:-1;;;83460:59:0;;;;;;;:::i;:::-;83552:20;;-1:-1:-1;;;;;83552:20:0;:33;27528:10;83552:47;;-1:-1:-1;;;;;;83552:47:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;83552:47:0;;;6416:51:1;6389:18;;83552:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83530:110;;;;-1:-1:-1;;;83530:110:0;;;;;;;:::i;:::-;83658:20;;-1:-1:-1;;;;;83658:20:0;:35;27528:10;83694:12;83658:49;;-1:-1:-1;;;;;;83658:49:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;83658:49:0;;;6416:51:1;6389:18;;83658:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;83658:49:0;;;;;;;;;;;;:::i;52270:616::-;-1:-1:-1;;;;;52346:16:0;;52365:1;52346:16;;;:7;:16;;;;;;52338:71;;;;-1:-1:-1;;;52338:71:0;;;;;;;:::i;:::-;52422:21;52470:15;50841:14;;;50768:95;52470:15;52446:39;;:21;:39;:::i;:::-;52422:63;;52496:15;52514:108;52544:7;52566:13;52594:17;52603:7;-1:-1:-1;;;;;51517:18:0;51490:7;51517:18;;;:9;:18;;;;;;;51434:109;52594:17;52514:15;:108::i;:::-;52496:126;-1:-1:-1;52643:12:0;52635:68;;;;-1:-1:-1;;;52635:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52716:18:0;;;;;;:9;:18;;;;;:29;;52738:7;;52716:18;:29;;52738:7;;52716:29;:::i;:::-;;;;;;;;52774:7;52756:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;52794:35:0;;-1:-1:-1;52812:7:0;52821;52794:17;:35::i;:::-;52845:33;;;-1:-1:-1;;;;;6678:32:1;;6660:51;;6742:2;6727:18;;6720:34;;;52845:33:0;;6633:18:1;52845:33:0;;;;;;;52327:559;;52270:616;:::o;36638:454::-;36778:4;36795:36;36805:6;36813:9;36824:6;36795:9;:36::i;:::-;36842:220;36865:6;27528:10;36913:138;36969:6;36913:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36913:19:0;;;;;;:11;:19;;;;;;;;27528:10;36913:33;;;;;;;;;;:37;:138::i;:::-;36842:8;:220::i;:::-;-1:-1:-1;37080:4:0;36638:454;;;;;;:::o;37501:300::-;27528:10;37616:4;37710:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;37710:34:0;;;;;;;;;;37616:4;;37638:133;;37688:7;;37710:50;;37749:10;37710:38;:50::i;73132:173::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;73204:16:::1;:24:::0;;;73288:8:::1;::::0;73251:10:::1;::::0;:46:::1;::::0;73288:8;73251:32:::1;::::0;73223:5;73251:14:::1;:32::i;53154:704::-:0;-1:-1:-1;;;;;53236:16:0;;53255:1;53236:16;;;:7;:16;;;;;;53228:71;;;;-1:-1:-1;;;53228:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51105:26:0;;53312:21;51105:26;;;:19;:26;;;;;;53336:30;;-1:-1:-1;;;53336:30:0;;53360:4;53336:30;;;6416:51:1;-1:-1:-1;;;;;53336:15:0;;;;;6389:18:1;;53336:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;53312:90;;53413:15;53431:115;53461:7;53483:13;53511:24;53520:5;53527:7;-1:-1:-1;;;;;51841:21:0;;;51809:7;51841:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;51712:167;53431:115;53413:133;-1:-1:-1;53567:12:0;53559:68;;;;-1:-1:-1;;;53559:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53640:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;53674:7;;53640:21;:41;;53674:7;;53640:41;:::i;:::-;;;;-1:-1:-1;;;;;;;53692:26:0;;;;;;:19;:26;;;;;:37;;53722:7;;53692:26;:37;;53722:7;;53692:37;:::i;:::-;;;;-1:-1:-1;53742:47:0;;-1:-1:-1;53765:5:0;53772:7;53781;53742:22;:47::i;:::-;53805:45;;;-1:-1:-1;;;;;6678:32:1;;;6660:51;;6742:2;6727:18;;6720:34;;;53805:45:0;;;;;6633:18:1;53805:45:0;;;;;;;53217:641;;53154:704;;:::o;85107:128::-;85187:20;;:40;;;-1:-1:-1;;;85187:40:0;;;;85160:7;;-1:-1:-1;;;;;85187:20:0;;:38;;:40;;;;;;;;;;;;;;:20;:40;;;;;;;;;;80068:1075;27528:10;;80148:113;;;;-1:-1:-1;;;80148:113:0;;21704:2:1;80148:113:0;;;21686:21:1;21743:2;21723:18;;;21716:30;21782:34;21762:18;;;21755:62;-1:-1:-1;;;21833:18:1;;;21826:41;21884:19;;80148:113:0;21502:407:1;80148:113:0;-1:-1:-1;;;;;80281:22:0;;;;;;:14;:22;;;;;;;;80280:23;80272:67;;;;-1:-1:-1;;;80272:67:0;;15251:2:1;80272:67:0;;;15233:21:1;15290:2;15270:18;;;15263:30;15329:33;15309:18;;;15302:61;15380:18;;80272:67:0;15049:355:1;80272:67:0;80382:12;;-1:-1:-1;;;;;80372:22:0;;;80382:12;;80372:22;;;;:52;;-1:-1:-1;80408:16:0;;-1:-1:-1;;;;;80398:26:0;;;80408:16;;80398:26;;80372:52;80350:158;;;;-1:-1:-1;;;80350:158:0;;18521:2:1;80350:158:0;;;18503:21:1;18560:2;18540:18;;;18533:30;18599:34;18579:18;;;18572:62;18670:26;18650:18;;;18643:54;18714:19;;80350:158:0;18319:420:1;80350:158:0;80542:20;;:47;;-1:-1:-1;;;80542:47:0;;-1:-1:-1;;;;;6434:32:1;;;80542:47:0;;;6416:51:1;80519:20:0;;80542;;:39;;6389:18:1;;80542:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80519:70;;80637:1;80622:12;:16;80600:118;;;;-1:-1:-1;;;80600:118:0;;22116:2:1;80600:118:0;;;22098:21:1;22155:2;22135:18;;;22128:30;22194:34;22174:18;;;22167:62;-1:-1:-1;;;22245:18:1;;;22238:50;22305:19;;80600:118:0;21914:416:1;80600:118:0;80733:11;;;;;;;80729:279;;;80797:10;;80761:17;;80797:14;80793:164;;80844:37;80877:3;80844:28;80861:10;;80844:12;:16;;:28;;;;:::i;:::-;:32;;:37::i;:::-;80917:12;;80832:49;;-1:-1:-1;80900:41:0;;-1:-1:-1;;;;;80917:12:0;80832:49;80900:16;:41::i;:::-;80971:25;80987:9;80971:25;;:::i;:::-;;;80746:262;80729:279;81034:16;;81018:55;;-1:-1:-1;;;;;81034:16:0;81052:6;81060:12;81018:15;:55::i;:::-;81084:20;;:51;;-1:-1:-1;;;81084:51:0;;-1:-1:-1;;;;;6434:32:1;;;81084:51:0;;;6416::1;81084:20:0;;;;:43;;6389:18:1;;81084:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80097:1046;;80068:1075::o;81151:96::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;81219:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;81219:20:0;;::::1;::::0;;;::::1;::::0;;81151:96::o;82983:134::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;83058:20:::1;::::0;:51:::1;::::0;-1:-1:-1;;;83058:51:0;;::::1;::::0;::::1;22481:25:1::0;;;-1:-1:-1;;;;;83058:20:0;;::::1;::::0;:37:::1;::::0;22454:18:1;;83058:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;82983:134:::0;:::o;84068:339::-;84116:13;27528:10;84142:59;;;;-1:-1:-1;;;84142:59:0;;;;;;;:::i;:::-;84234:20;;-1:-1:-1;;;;;84234:20:0;:33;27528:10;84234:47;;-1:-1:-1;;;;;;84234:47:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;84234:47:0;;;6416:51:1;6389:18;;84234:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84212:110;;;;-1:-1:-1;;;84212:110:0;;;;;;;:::i;:::-;84340:20;;-1:-1:-1;;;;;84340:20:0;:45;27528:10;84386:12;27448:98;72067:534;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;72190:15:::1;::::0;-1:-1:-1;;;;;72168:38:0;;::::1;72190:15:::0;::::1;72168:38;;72146:128;;;::::0;-1:-1:-1;;;72146:128:0;;15611:2:1;72146:128:0::1;::::0;::::1;15593:21:1::0;15650:2;15630:18;;;15623:30;15689:34;15669:18;;;15662:62;-1:-1:-1;;;15740:18:1;;;15733:38;15788:19;;72146:128:0::1;15409:404:1::0;72146:128:0::1;72332:15;::::0;72290:59:::1;::::0;-1:-1:-1;;;;;72332:15:0;;::::1;::::0;72290:59;::::1;::::0;::::1;::::0;72332:15:::1;::::0;72290:59:::1;72360:15;:48:::0;;-1:-1:-1;;;;;;72360:48:0::1;-1:-1:-1::0;;;;;72360:48:0;::::1;::::0;;::::1;::::0;;;72462:25:::1;::::0;;-1:-1:-1;;;72462:25:0;;;;-1:-1:-1;;72360:48:0;72462:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;72360:48;72462:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72444:69:0::1;;72522:4;72529:15;;;;;;;;;-1:-1:-1::0;;;;;72529:15:0::1;-1:-1:-1::0;;;;;72529:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72444:108;::::0;-1:-1:-1;;;;;;72444:108:0::1;::::0;;;;;;-1:-1:-1;;;;;6995:15:1;;;72444:108:0::1;::::0;::::1;6977:34:1::0;7047:15;;7027:18;;;7020:43;6912:18;;72444:108:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72563:13;:30:::0;;-1:-1:-1;;;;;;72563:30:0::1;-1:-1:-1::0;;;;;72563:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;72067:534:0:o;78963:1097::-;27528:10;;79063:70;;;;-1:-1:-1;;;79063:70:0;;12070:2:1;79063:70:0;;;12052:21:1;12109:2;12089:18;;;12082:30;12148:34;12128:18;;;12121:62;-1:-1:-1;;;12199:18:1;;;12192:35;12244:19;;79063:70:0;11868:401:1;79063:70:0;-1:-1:-1;;;;;79153:22:0;;;;;;:14;:22;;;;;;;;79152:23;79144:67;;;;-1:-1:-1;;;79144:67:0;;15251:2:1;79144:67:0;;;15233:21:1;15290:2;15270:18;;;15263:30;15329:33;15309:18;;;15302:61;15380:18;;79144:67:0;15049:355:1;79144:67:0;79254:12;;-1:-1:-1;;;;;79244:22:0;;;79254:12;;79244:22;;;;:52;;-1:-1:-1;79280:16:0;;-1:-1:-1;;;;;79270:26:0;;;79280:16;;79270:26;;79244:52;79222:152;;;;-1:-1:-1;;;79222:152:0;;9378:2:1;79222:152:0;;;9360:21:1;9417:2;9397:18;;;9390:30;9456:34;9436:18;;;9429:62;-1:-1:-1;;;9507:18:1;;;9500:48;9565:19;;79222:152:0;9176:414:1;79222:152:0;79408:20;;:95;;-1:-1:-1;;;79408:95:0;;-1:-1:-1;;;;;6678:32:1;;;79408:95:0;;;6660:51:1;6727:18;;;6720:34;;;79385:20:0;;79408;;:39;;6633:18:1;;79408:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79385:118;;79551:1;79536:12;:16;79514:112;;;;-1:-1:-1;;;79514:112:0;;13659:2:1;79514:112:0;;;13641:21:1;13698:2;13678:18;;;13671:30;13737:34;13717:18;;;13710:62;-1:-1:-1;;;13788:18:1;;;13781:44;13842:19;;79514:112:0;13457:410:1;79514:112:0;79643:11;;;;;;;79639:279;;;79707:10;;79671:17;;79707:14;79703:164;;79754:37;79787:3;79754:28;79771:10;;79754:12;:16;;:28;;;;:::i;:37::-;79827:12;;79742:49;;-1:-1:-1;79810:41:0;;-1:-1:-1;;;;;79827:12:0;79742:49;79810:16;:41::i;:::-;79881:25;79897:9;79881:25;;:::i;:::-;;;79656:262;79639:279;79944:16;;79928:55;;-1:-1:-1;;;;;79944:16:0;79962:6;79970:12;79928:15;:55::i;:::-;79994:20;;:58;;-1:-1:-1;;;79994:58:0;;-1:-1:-1;;;;;6678:32:1;;;79994:58:0;;;6660:51:1;6727:18;;;6720:34;;;79994:20:0;;;;:39;;6633:18:1;;79994:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79012:1048;;78963:1097;:::o;72609:111::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;72687:16:::1;:25:::0;72609:111::o;73483:97::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;73554:10:::1;:18:::0;73483:97::o;84763:231::-;28403:6;;84859:7;;;;;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;84945:20:::1;;;;;;;;;-1:-1:-1::0;;;;;84945:20:0::1;-1:-1:-1::0;;;;;84945:39:0::1;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84938:48;;;;;;84763:231:::0;;;:::o;28833:148::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;28924:6:::1;::::0;28903:40:::1;::::0;28940:1:::1;::::0;-1:-1:-1;;;;;28924:6:0::1;::::0;28903:40:::1;::::0;28940:1;;28903:40:::1;28954:6;:19:::0;;-1:-1:-1;;;;;;28954:19:0::1;::::0;;28833:148::o;82211:134::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;82286:20:::1;::::0;:51:::1;::::0;-1:-1:-1;;;82286:51:0;;::::1;::::0;::::1;22481:25:1::0;;;-1:-1:-1;;;;;82286:20:0;;::::1;::::0;:41:::1;::::0;22454:18:1;;82286:51:0::1;22335:177:1::0;81949:134:0;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;82024:20:::1;::::0;:51:::1;::::0;-1:-1:-1;;;82024:51:0;;::::1;::::0;::::1;22481:25:1::0;;;-1:-1:-1;;;;;82024:20:0;;::::1;::::0;:37:::1;::::0;22454:18:1;;82024:51:0::1;22335:177:1::0;85243:128:0;85323:20;;:40;;;-1:-1:-1;;;85323:40:0;;;;85296:7;;-1:-1:-1;;;;;85323:20:0;;:38;;:40;;;;;;;;;;;;;;:20;:40;;;;;;;;;;85002:97;85050:20;;;;;;;;;-1:-1:-1;;;;;85050:20:0;-1:-1:-1;;;;;85050:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;73313:162::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;73382:8:::1;:16:::0;;;73436::::1;::::0;73421:10:::1;::::0;:46:::1;::::0;73393:5;;73421:32:::1;::::0;:14:::1;:32::i;51970:100::-:0;52021:7;52048;52056:5;52048:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;52048:14:0;;51970:100;-1:-1:-1;;51970:100:0:o;73588:92::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;73658:6:::1;:14:::0;73588:92::o;76762:2193::-;76873:1;76858:4;76852:18;:22;:49;;;;;76899:2;76884:4;76878:18;:23;76852:49;76830:131;;;;-1:-1:-1;;;76830:131:0;;10543:2:1;76830:131:0;;;10525:21:1;;;10562:18;;;10555:30;10621:34;10601:18;;;10594:62;10673:18;;76830:131:0;10341:356:1;76830:131:0;27528:10;;77012:116;;;;-1:-1:-1;;;77012:116:0;;18946:2:1;77012:116:0;;;18928:21:1;18985:2;18965:18;;;18958:30;19024:34;19004:18;;;18997:62;-1:-1:-1;;;19075:18:1;;;19068:44;19129:19;;77012:116:0;18744:410:1;77012:116:0;-1:-1:-1;;;;;77148:22:0;;;;;;:14;:22;;;;;;;;77147:23;77139:70;;;;-1:-1:-1;;;77139:70:0;;18118:2:1;77139:70:0;;;18100:21:1;18157:2;18137:18;;;18130:30;18196:34;18176:18;;;18169:62;-1:-1:-1;;;18247:18:1;;;18240:32;18289:19;;77139:70:0;17916:398:1;77139:70:0;77252:12;;-1:-1:-1;;;;;77242:22:0;;;77252:12;;77242:22;;;;:52;;-1:-1:-1;77278:16:0;;-1:-1:-1;;;;;77268:26:0;;;77278:16;;77268:26;;77242:52;77220:157;;;;-1:-1:-1;;;77220:157:0;;17694:2:1;77220:157:0;;;17676:21:1;17733:2;17713:18;;;17706:30;17772:34;17752:18;;;17745:62;17843:25;17823:18;;;17816:53;17886:19;;77220:157:0;17492:419:1;77220:157:0;77408:20;;:32;;;-1:-1:-1;;;77408:32:0;;;;77388:17;;-1:-1:-1;;;;;77408:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77388:52;;77494:9;77473:17;77483:6;-1:-1:-1;;;;;35080:18:0;35048:7;35080:18;;;;;;;;;;;;34929:177;77473:17;:30;;77451:124;;;;-1:-1:-1;;;77451:124:0;;16020:2:1;77451:124:0;;;16002:21:1;16059:2;16039:18;;;16032:30;16098:34;16078:18;;;16071:62;-1:-1:-1;;;16149:18:1;;;16142:42;16201:19;;77451:124:0;15818:408:1;77451:124:0;77635:4;77586:28;35080:18;;;;;;;;;;;77696:16;;77672:40;;;;;;;77741;;-1:-1:-1;77770:11:0;;;;;;;77741:40;:66;;;;-1:-1:-1;77799:8:0;;;;77798:9;77741:66;:100;;;;-1:-1:-1;28256:6:0;;-1:-1:-1;;;;;77824:17:0;;;28256:6;;77824:17;;77741:100;:151;;;;-1:-1:-1;;;;;;77859:33:0;;;;;;:25;:33;;;;;;;;77858:34;77741:151;77723:1109;;;77919:8;:15;;-1:-1:-1;;77919:15:0;77930:4;77919:15;;;77998:8;;77919;;77973:43;;78012:3;;77973:34;;:20;;:24;:34::i;:43::-;78050:12;;77951:65;;-1:-1:-1;78033:43:0;;-1:-1:-1;;;;;78050:12:0;77951:65;78033:16;:43::i;:::-;78093:25;78121:81;78198:3;78121:54;78164:10;;78121:20;:42;;:54;;;;:::i;:81::-;78093:109;;78219:27;78249:70;78301:3;78249:29;78271:6;;78249:17;:21;;:29;;;;:::i;:70::-;78353:16;;78219:100;;-1:-1:-1;78336:55:0;;-1:-1:-1;;;;;78353:16:0;78219:100;78336:16;:55::i;:::-;78472:16;;78406:158;;78448:4;;-1:-1:-1;;;;;78472:16:0;78507:42;:17;78529:19;78507:21;:42::i;:::-;78406:15;:158::i;:::-;78581:18;78602:83;78667:3;78602:42;78627:16;;78602:20;:24;;:42;;;;:::i;:83::-;78581:104;;78702:26;78717:10;78702:14;:26::i;:::-;78780:4;35048:7;35080:18;;;;;;;;;;;78745:42;;:16;:42::i;:::-;-1:-1:-1;;78804:8:0;:16;;-1:-1:-1;;78804:16:0;;;-1:-1:-1;;77723:1109:0;78842:49;78858:6;78874:4;78881:9;78842:15;:49::i;:::-;78902:20;;:45;;-1:-1:-1;;;78902:45:0;;-1:-1:-1;;;;;78902:20:0;;;;:31;;:45;;78934:6;;78942:4;;78902:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76819:2136;;;;76762:2193;:::o;72840:110::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;72919:16:::1;:23:::0;;-1:-1:-1;;;;;;72919:23:0::1;-1:-1:-1::0;;;;;72919:23:0;;;::::1;::::0;;;::::1;::::0;;72840:110::o;33857:104::-;33913:13;33946:7;33939:14;;;;;:::i;73688:321::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;73832:13:::1;::::0;-1:-1:-1;;;;;73824:21:0;;::::1;73832:13:::0;::::1;73824:21;;73802:145;;;::::0;-1:-1:-1;;;73802:145:0;;17211:2:1;73802:145:0::1;::::0;::::1;17193:21:1::0;17250:2;17230:18;;;17223:30;17289:34;17269:18;;;17262:62;17360:34;17340:18;;;17333:62;-1:-1:-1;;;17411:19:1;;;17404:41;17462:19;;73802:145:0::1;17009:478:1::0;73802:145:0::1;73960:41;73989:4;73995:5;73960:28;:41::i;:::-;73688:321:::0;;:::o;82481:124::-;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;82551:20:::1;::::0;:46:::1;::::0;-1:-1:-1;;;82551:46:0;;::::1;::::0;::::1;22481:25:1::0;;;-1:-1:-1;;;;;82551:20:0;;::::1;::::0;:37:::1;::::0;22454:18:1;;82551:46:0::1;22335:177:1::0;38304:400:0;38424:4;38446:228;27528:10;38496:7;38518:145;38575:15;38518:145;;;;;;;;;;;;;;;;;27528:10;38518:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38518:34:0;;;;;;;;;;;;:38;:145::i;82091:112::-;82163:20;;:32;;;-1:-1:-1;;;82163:32:0;;;;82136:7;;-1:-1:-1;;;;;82163:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;35319:216;35441:4;35463:42;27528:10;35487:9;35498:6;35463:9;:42::i;81407:199::-;28403:6;;81518:7;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;81550:20:::1;::::0;:48:::1;::::0;-1:-1:-1;;;81550:48:0;;-1:-1:-1;;;;;6434:32:1;;;81550:48:0::1;::::0;::::1;6416:51:1::0;81550:20:0;;::::1;::::0;:39:::1;::::0;6389:18:1;;81550:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;83723:337::-:0;83772:13;27528:10;83798:59;;;;-1:-1:-1;;;83798:59:0;;;;;;;:::i;:::-;83890:20;;-1:-1:-1;;;;;83890:20:0;:33;27528:10;83890:47;;-1:-1:-1;;;;;;83890:47:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;83890:47:0;;;6416:51:1;6389:18;;83890:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83868:110;;;;-1:-1:-1;;;83868:110:0;;;;;;;:::i;:::-;83996:20;;-1:-1:-1;;;;;83996:20:0;:42;27528:10;84039:12;27448:98;82733:123;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;82801:20:::1;::::0;:47:::1;::::0;-1:-1:-1;;;82801:47:0;;8452:14:1;;8445:22;82801:47:0::1;::::0;::::1;8427:41:1::0;-1:-1:-1;;;;;82801:20:0;;::::1;::::0;:38:::1;::::0;8400:18:1;;82801:47:0::1;8287:187:1::0;74017:149:0;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;74127:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;74127:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;74017:149::o;83254:126::-;83328:20;;:44;;;-1:-1:-1;;;83328:44:0;;;;83301:7;;-1:-1:-1;;;;;83328:20:0;;:42;;:44;;;;;;;;;;;;;;:20;:44;;;;;;;;;;82353:120;82429:20;;:36;;;-1:-1:-1;;;82429:36:0;;;;82402:7;;-1:-1:-1;;;;;82429:20:0;;:34;;:36;;;;;;;;;;;;;;:20;:36;;;;;;;;;;84415:340;84466:13;27528:10;84492:59;;;;-1:-1:-1;;;84492:59:0;;;;;;;:::i;:::-;84584:20;;-1:-1:-1;;;;;84584:20:0;:33;27528:10;84584:47;;-1:-1:-1;;;;;;84584:47:0;;;;;;;-1:-1:-1;;;;;6434:32:1;;;84584:47:0;;;6416:51:1;6389:18;;84584:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84562:110;;;;-1:-1:-1;;;84562:110:0;;;;;;;:::i;:::-;84690:20;;-1:-1:-1;;;;;84690:20:0;:43;27528:10;84734:12;27448:98;29136:281;28403:6;;-1:-1:-1;;;;;28403:6:0;27528:10;28403:22;28395:67;;;;-1:-1:-1;;;28395:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29239:22:0;::::1;29217:110;;;::::0;-1:-1:-1;;;29217:110:0;;10904:2:1;29217:110:0::1;::::0;::::1;10886:21:1::0;10943:2;10923:18;;;10916:30;10982:34;10962:18;;;10955:62;-1:-1:-1;;;11033:18:1;;;11026:36;11079:19;;29217:110:0::1;10702:402:1::0;29217:110:0::1;29364:6;::::0;29343:38:::1;::::0;-1:-1:-1;;;;;29343:38:0;;::::1;::::0;29364:6:::1;::::0;29343:38:::1;::::0;29364:6:::1;::::0;29343:38:::1;29392:6;:17:::0;;-1:-1:-1;;;;;;29392:17:0::1;-1:-1:-1::0;;;;;29392:17:0;;;::::1;::::0;;;::::1;::::0;;29136:281::o;82613:112::-;82685:20;;:32;;;-1:-1:-1;;;82685:32:0;;;;82658:7;;-1:-1:-1;;;;;82685:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;81255:144;81345:20;;:46;;-1:-1:-1;;;81345:46:0;;-1:-1:-1;;;;;6434:32:1;;;81345:46:0;;;6416:51:1;81318:7:0;;81345:20;;:37;;6389:18:1;;81345:46:0;6270:203:1;83125:121:0;83197:20;;:41;;;-1:-1:-1;;;83197:41:0;;;;83170:7;;-1:-1:-1;;;;;83197:20:0;;:39;;:41;;;;;;;;;;;;;;:20;:41;;;;;;;;;;82864:111;82934:20;;:33;;;-1:-1:-1;;;82934:33:0;;;;82910:4;;-1:-1:-1;;;;;82934:20:0;;:31;;:33;;;;;;;;;;;;;;:20;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2945:181::-;3003:7;;3035:5;3039:1;3035;:5;:::i;:::-;3023:17;;3064:1;3059;:6;;3051:46;;;;-1:-1:-1;;;3051:46:0;;11714:2:1;3051:46:0;;;11696:21:1;11753:2;11733:18;;;11726:30;11792:29;11772:18;;;11765:57;11839:18;;3051:46:0;11512:351:1;41695:380:0;-1:-1:-1;;;;;41831:19:0;;41823:68;;;;-1:-1:-1;;;41823:68:0;;20530:2:1;41823:68:0;;;20512:21:1;20569:2;20549:18;;;20542:30;20608:34;20588:18;;;20581:62;-1:-1:-1;;;20659:18:1;;;20652:34;20703:19;;41823:68:0;20328:400:1;41823:68:0;-1:-1:-1;;;;;41910:21:0;;41902:68;;;;-1:-1:-1;;;41902:68:0;;11311:2:1;41902:68:0;;;11293:21:1;11350:2;11330:18;;;11323:30;11389:34;11369:18;;;11362:62;-1:-1:-1;;;11440:18:1;;;11433:32;11482:19;;41902:68:0;11109:398:1;41902:68:0;-1:-1:-1;;;;;41983:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;42035:32;;22481:25:1;;;42035:32:0;;22454:18:1;42035:32:0;;;;;;;;41695:380;;;:::o;54036:261::-;54259:12;;-1:-1:-1;;;;;54239:16:0;;54182:7;54239:16;;;:7;:16;;;;;;54182:7;;54274:15;;54223:32;;:13;:32;:::i;:::-;54222:49;;;;:::i;:::-;:67;;;;:::i;:::-;54202:87;54036:261;-1:-1:-1;;;;54036:261:0:o;11191:391::-;11320:6;11295:21;:31;;11273:110;;;;-1:-1:-1;;;11273:110:0;;14074:2:1;11273:110:0;;;14056:21:1;14113:2;14093:18;;;14086:30;14152:31;14132:18;;;14125:59;14201:18;;11273:110:0;13872:353:1;11273:110:0;11397:12;11415:9;-1:-1:-1;;;;;11415:14:0;11437:6;11415:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11396:52;;;11481:7;11459:115;;;;-1:-1:-1;;;11459:115:0;;13232:2:1;11459:115:0;;;13214:21:1;13271:2;13251:18;;;13244:30;13310:34;13290:18;;;13283:62;13381:28;13361:18;;;13354:56;13427:19;;11459:115:0;13030:422:1;74532:445:0;-1:-1:-1;;;;;74664:18:0;;74656:68;;;;-1:-1:-1;;;74656:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;74743:16:0;;74735:64;;;;-1:-1:-1;;;74735:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;74833:20:0;;;;;;:14;:20;;;;;;;;74832:21;:44;;;;-1:-1:-1;;;;;;74858:18:0;;;;;;:14;:18;;;;;;;;74857:19;74832:44;74810:113;;;;-1:-1:-1;;;74810:113:0;;16863:2:1;74810:113:0;;;16845:21:1;16902:2;16882:18;;;16875:30;-1:-1:-1;;;16921:18:1;;;16914:49;16980:18;;74810:113:0;16661:343:1;74810:113:0;74936:33;74952:4;74958:2;74962:6;74936:15;:33::i;3848:226::-;3968:7;4004:12;3996:6;;;;3988:29;;;;-1:-1:-1;;;3988:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4028:9:0;4040:5;4044:1;4040;:5;:::i;:::-;4028:17;3848:226;-1:-1:-1;;;;;3848:226:0:o;43433:248::-;43604:58;;;-1:-1:-1;;;;;6678:32:1;;43604:58:0;;;6660:51:1;6727:18;;;;6720:34;;;43604:58:0;;;;;;;;;;6633:18:1;;;;43604:58:0;;;;;;;;-1:-1:-1;;;;;43604:58:0;-1:-1:-1;;;43604:58:0;;;43550:123;;43584:5;;43550:19;:123::i;4333:471::-;4391:7;4636:6;4632:47;;-1:-1:-1;4666:1:0;4659:8;;4632:47;4691:9;4703:5;4707:1;4703;:5;:::i;:::-;4691:17;-1:-1:-1;4736:1:0;4727:5;4731:1;4691:17;4727:5;:::i;:::-;:10;4719:56;;;;-1:-1:-1;;;4719:56:0;;19361:2:1;4719:56:0;;;19343:21:1;19400:2;19380:18;;;19373:30;19439:34;19419:18;;;19412:62;-1:-1:-1;;;19490:18:1;;;19483:31;19531:19;;4719:56:0;19159:397:1;5280:132:0;5338:7;5365:39;5369:1;5372;5365:39;;;;;;;;;;;;;;;;;:3;:39::i;74985:306::-;75095:21;75129:24;75146:6;75129:16;:24::i;:::-;75164:18;75185:46;75186:21;75213:17;75185:27;:46::i;:::-;75242:41;;75164:67;;-1:-1:-1;;;;;;75242:29:0;;;:41;;;;;75164:67;;75242:41;;;;75164:67;75242:29;:41;;;;;;;;;;;;;;;;;;;39194:610;-1:-1:-1;;;;;39334:20:0;;39326:70;;;;-1:-1:-1;;;39326:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39415:23:0;;39407:71;;;;-1:-1:-1;;;39407:71:0;;;;;;;:::i;:::-;39571:108;39607:6;39571:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39571:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;39551:17:0;;;:9;:17;;;;;;;;;;;:128;;;;39713:20;;;;;;;:32;;39738:6;39713:24;:32::i;:::-;-1:-1:-1;;;;;39690:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;39761:35;22481:25:1;;;39690:20:0;;39761:35;;;;;;22454:18:1;39761:35:0;22335:177:1;3409:136:0;3467:7;3494:43;3498:1;3501;3494:43;;;;;;;;;;;;;;;;;:3;:43::i;75299:420::-;75358:12;75373:13;:6;75384:1;75373:10;:13::i;:::-;75358:28;-1:-1:-1;75397:17:0;75417:16;:6;75358:28;75417:10;:16::i;:::-;75397:36;-1:-1:-1;75471:21:0;75505:22;75522:4;75505:16;:22::i;:::-;75540:18;75561:41;:21;75587:14;75561:25;:41::i;:::-;75540:62;;75615:35;75628:9;75639:10;75615:12;:35::i;:::-;75668:43;;;23704:25:1;;;23760:2;23745:18;;23738:34;;;23788:18;;;23781:34;;;75668:43:0;;23692:2:1;23677:18;75668:43:0;;;;;;;75347:372;;;;75299:420;:::o;75727:503::-;75817:16;;;75831:1;75817:16;;;;;;;;75793:21;;75817:16;;;;;;;;;;-1:-1:-1;75817:16:0;75793:40;;75862:4;75844;75849:1;75844:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75844:23:0;;;:7;;;;;;;;;;:23;;;;75888:15;;:22;;;-1:-1:-1;;;75888:22:0;;;;:15;;;;;:20;;:22;;;;;75844:7;;75888:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75878:4;75883:1;75878:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75878:32:0;;;:7;;;;;;;;;:32;75955:15;;75923:62;;75940:4;;75955:15;75973:11;75923:8;:62::i;:::-;75998:15;;:224;;-1:-1:-1;;;75998:224:0;;-1:-1:-1;;;;;75998:15:0;;;;:66;;:224;;76079:11;;75998:15;;76149:4;;76176;;76196:15;;75998:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75782:448;75727:503;:::o;74174:350::-;-1:-1:-1;;;;;74279:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;74257:151;;;;-1:-1:-1;;;74257:151:0;;16433:2:1;74257:151:0;;;16415:21:1;16472:2;16452:18;;;16445:30;16511:34;16491:18;;;16484:62;16582:31;16562:18;;;16555:59;16631:19;;74257:151:0;16231:425:1;74257:151:0;-1:-1:-1;;;;;74419:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;74419:39:0;;;;;;;;;;74476:40;;74419:39;;:31;74476:40;;;74174:350;;:::o;46400:802::-;46824:23;46850:106;46892:4;46850:106;;;;;;;;;;;;;;;;;46858:5;-1:-1:-1;;;;;46850:27:0;;;:106;;;;;:::i;:::-;46971:17;;46824:132;;-1:-1:-1;46971:21:0;46967:228;;47086:10;47075:30;;;;;;;;;;;;:::i;:::-;47049:134;;;;-1:-1:-1;;;47049:134:0;;21293:2:1;47049:134:0;;;21275:21:1;21332:2;21312:18;;;21305:30;21371:34;21351:18;;;21344:62;-1:-1:-1;;;21422:18:1;;;21415:40;21472:19;;47049:134:0;21091:406:1;5908:312:0;6028:7;6063:12;6056:5;6048:28;;;;-1:-1:-1;;;6048:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6087:9:0;6099:5;6103:1;6099;:5;:::i;76238:516::-;76418:15;;76386:62;;76403:4;;-1:-1:-1;;;;;76418:15:0;76436:11;76386:8;:62::i;:::-;76491:15;;:255;;-1:-1:-1;;;76491:255:0;;76563:4;76491:255;;;8016:34:1;8066:18;;;8059:34;;;76491:15:0;8109:18:1;;;8102:34;;;8152:18;;;8145:34;;;8195:19;;;8188:44;76720:15:0;8248:19:1;;;8241:35;-1:-1:-1;;;;;76491:15:0;;;;:31;;76530:9;;7950:19:1;;76491:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12613:229::-;12750:12;12782:52;12804:6;12812:4;12818:1;12821:12;12750;10354:20;;14153:60;;;;-1:-1:-1;;;14153:60:0;;20935:2:1;14153:60:0;;;20917:21:1;20974:2;20954:18;;;20947:30;21013:31;20993:18;;;20986:59;21062:18;;14153:60:0;20733:353:1;14153:60:0;14227:12;14241:23;14268:6;-1:-1:-1;;;;;14268:11:0;14287:5;14308:4;14268:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14226:97;;;;14341:51;14358:7;14367:10;14379:12;14341:16;:51::i;:::-;14334:58;13829:571;-1:-1:-1;;;;;;;13829:571:0:o;16789:712::-;16939:12;16968:7;16964:530;;;-1:-1:-1;16999:10:0;16992:17;;16964:530;17113:17;;:21;17109:374;;17311:10;17305:17;17372:15;17359:10;17355:2;17351:19;17344:44;17109:374;17454:12;17447:20;;-1:-1:-1;;;17447:20:0;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;782:388::-;850:6;858;911:2;899:9;890:7;886:23;882:32;879:52;;;927:1;924;917:12;879:52;966:9;953:23;985:31;1010:5;985:31;:::i;:::-;1035:5;-1:-1:-1;1092:2:1;1077:18;;1064:32;1105:33;1064:32;1105:33;:::i;:::-;1157:7;1147:17;;;782:388;;;;;:::o;1175:456::-;1252:6;1260;1268;1321:2;1309:9;1300:7;1296:23;1292:32;1289:52;;;1337:1;1334;1327:12;1289:52;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1175:456;;1567:7;;-1:-1:-1;;;1621:2:1;1606:18;;;;1593:32;;1175:456::o;1636:382::-;1701:6;1709;1762:2;1750:9;1741:7;1737:23;1733:32;1730:52;;;1778:1;1775;1768:12;1730:52;1817:9;1804:23;1836:31;1861:5;1836:31;:::i;:::-;1886:5;-1:-1:-1;1943:2:1;1928:18;;1915:32;1956:30;1915:32;1956:30;:::i;2023:315::-;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:1:o;2343:241::-;2399:6;2452:2;2440:9;2431:7;2427:23;2423:32;2420:52;;;2468:1;2465;2458:12;2420:52;2507:9;2494:23;2526:28;2548:5;2526:28;:::i;2589:245::-;2656:6;2709:2;2697:9;2688:7;2684:23;2680:32;2677:52;;;2725:1;2722;2715:12;2677:52;2757:9;2751:16;2776:28;2798:5;2776:28;:::i;3514:673::-;3583:6;3636:2;3624:9;3615:7;3611:23;3607:32;3604:52;;;3652:1;3649;3642:12;3604:52;3692:9;3679:23;3725:18;3717:6;3714:30;3711:50;;;3757:1;3754;3747:12;3711:50;3780:22;;3833:4;3825:13;;3821:27;-1:-1:-1;3811:55:1;;3862:1;3859;3852:12;3811:55;3898:2;3885:16;3923:49;3939:32;3968:2;3939:32;:::i;:::-;3923:49;:::i;:::-;3995:2;3988:5;3981:17;4035:7;4030:2;4025;4021;4017:11;4013:20;4010:33;4007:53;;;4056:1;4053;4046:12;4007:53;4111:2;4106;4102;4098:11;4093:2;4086:5;4082:14;4069:45;4155:1;4134:14;;;4150:2;4130:23;4123:34;;;;4138:5;3514:673;-1:-1:-1;;;;3514:673:1:o;4192:636::-;4272:6;4325:2;4313:9;4304:7;4300:23;4296:32;4293:52;;;4341:1;4338;4331:12;4293:52;4374:9;4368:16;4407:18;4399:6;4396:30;4393:50;;;4439:1;4436;4429:12;4393:50;4462:22;;4515:4;4507:13;;4503:27;-1:-1:-1;4493:55:1;;4544:1;4541;4534:12;4493:55;4573:2;4567:9;4598:49;4614:32;4643:2;4614:32;:::i;4598:49::-;4670:2;4663:5;4656:17;4710:7;4705:2;4700;4696;4692:11;4688:20;4685:33;4682:53;;;4731:1;4728;4721:12;4682:53;4744:54;4795:2;4790;4783:5;4779:14;4774:2;4770;4766:11;4744:54;:::i;4833:180::-;4892:6;4945:2;4933:9;4924:7;4920:23;4916:32;4913:52;;;4961:1;4958;4951:12;4913:52;-1:-1:-1;4984:23:1;;4833:180;-1:-1:-1;4833:180:1:o;5018:184::-;5088:6;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;-1:-1:-1;5180:16:1;;5018:184;-1:-1:-1;5018:184:1:o;5207:306::-;5295:6;5303;5311;5364:2;5352:9;5343:7;5339:23;5335:32;5332:52;;;5380:1;5377;5370:12;5332:52;5409:9;5403:16;5393:26;;5459:2;5448:9;5444:18;5438:25;5428:35;;5503:2;5492:9;5488:18;5482:25;5472:35;;5207:306;;;;;:::o;5518:258::-;5560:3;5598:5;5592:12;5625:6;5620:3;5613:19;5641:63;5697:6;5690:4;5685:3;5681:14;5674:4;5667:5;5663:16;5641:63;:::i;:::-;5758:2;5737:15;-1:-1:-1;;5733:29:1;5724:39;;;;5765:4;5720:50;;5518:258;-1:-1:-1;;5518:258:1:o;5781:274::-;5910:3;5948:6;5942:13;5964:53;6010:6;6005:3;5998:4;5990:6;5986:17;5964:53;:::i;:::-;6033:16;;;;;5781:274;-1:-1:-1;;5781:274:1:o;7074:317::-;-1:-1:-1;;;;;7251:32:1;;7233:51;;7320:2;7315;7300:18;;7293:30;;;-1:-1:-1;;7340:45:1;;7366:18;;7358:6;7340:45;:::i;8951:220::-;9100:2;9089:9;9082:21;9063:4;9120:45;9161:2;9150:9;9146:18;9138:6;9120:45;:::i;9595:399::-;9797:2;9779:21;;;9836:2;9816:18;;;9809:30;9875:34;9870:2;9855:18;;9848:62;-1:-1:-1;;;9941:2:1;9926:18;;9919:33;9984:3;9969:19;;9595:399::o;9999:337::-;10201:2;10183:21;;;10240:2;10220:18;;;10213:30;-1:-1:-1;;;10274:2:1;10259:18;;10252:43;10327:2;10312:18;;9999:337::o;12274:344::-;12476:2;12458:21;;;12515:2;12495:18;;;12488:30;-1:-1:-1;;;12549:2:1;12534:18;;12527:50;12609:2;12594:18;;12274:344::o;12623:402::-;12825:2;12807:21;;;12864:2;12844:18;;;12837:30;12903:34;12898:2;12883:18;;12876:62;-1:-1:-1;;;12969:2:1;12954:18;;12947:36;13015:3;13000:19;;12623:402::o;14637:407::-;14839:2;14821:21;;;14878:2;14858:18;;;14851:30;14917:34;14912:2;14897:18;;14890:62;-1:-1:-1;;;14983:2:1;14968:18;;14961:41;15034:3;15019:19;;14637:407::o;19561:356::-;19763:2;19745:21;;;19782:18;;;19775:30;19841:34;19836:2;19821:18;;19814:62;19908:2;19893:18;;19561:356::o;19922:401::-;20124:2;20106:21;;;20163:2;20143:18;;;20136:30;20202:34;20197:2;20182:18;;20175:62;-1:-1:-1;;;20268:2:1;20253:18;;20246:35;20313:3;20298:19;;19922:401::o;22517:980::-;22779:4;22827:3;22816:9;22812:19;22858:6;22847:9;22840:25;22884:2;22922:6;22917:2;22906:9;22902:18;22895:34;22965:3;22960:2;22949:9;22945:18;22938:31;22989:6;23024;23018:13;23055:6;23047;23040:22;23093:3;23082:9;23078:19;23071:26;;23132:2;23124:6;23120:15;23106:29;;23153:1;23163:195;23177:6;23174:1;23171:13;23163:195;;;23242:13;;-1:-1:-1;;;;;23238:39:1;23226:52;;23333:15;;;;23298:12;;;;23274:1;23192:9;23163:195;;;-1:-1:-1;;;;;;;23414:32:1;;;;23409:2;23394:18;;23387:60;-1:-1:-1;;;23478:3:1;23463:19;23456:35;23375:3;22517:980;-1:-1:-1;;;22517:980:1:o;24015:275::-;24086:2;24080:9;24151:2;24132:13;;-1:-1:-1;;24128:27:1;24116:40;;24186:18;24171:34;;24207:22;;;24168:62;24165:88;;;24233:18;;:::i;:::-;24269:2;24262:22;24015:275;;-1:-1:-1;24015:275:1:o;24295:187::-;24344:4;24377:18;24369:6;24366:30;24363:56;;;24399:18;;:::i;:::-;-1:-1:-1;24465:2:1;24444:15;-1:-1:-1;;24440:29:1;24471:4;24436:40;;24295:187::o;24487:128::-;24527:3;24558:1;24554:6;24551:1;24548:13;24545:39;;;24564:18;;:::i;:::-;-1:-1:-1;24600:9:1;;24487:128::o;24620:217::-;24660:1;24686;24676:132;;24730:10;24725:3;24721:20;24718:1;24711:31;24765:4;24762:1;24755:15;24793:4;24790:1;24783:15;24676:132;-1:-1:-1;24822:9:1;;24620:217::o;24842:168::-;24882:7;24948:1;24944;24940:6;24936:14;24933:1;24930:21;24925:1;24918:9;24911:17;24907:45;24904:71;;;24955:18;;:::i;:::-;-1:-1:-1;24995:9:1;;24842:168::o;25015:125::-;25055:4;25083:1;25080;25077:8;25074:34;;;25088:18;;:::i;:::-;-1:-1:-1;25125:9:1;;25015:125::o;25145:258::-;25217:1;25227:113;25241:6;25238:1;25235:13;25227:113;;;25317:11;;;25311:18;25298:11;;;25291:39;25263:2;25256:10;25227:113;;;25358:6;25355:1;25352:13;25349:48;;;-1:-1:-1;;25393:1:1;25375:16;;25368:27;25145:258::o;25408:380::-;25487:1;25483:12;;;;25530;;;25551:61;;25605:4;25597:6;25593:17;25583:27;;25551:61;25658:2;25650:6;25647:14;25627:18;25624:38;25621:161;;;25704:10;25699:3;25695:20;25692:1;25685:31;25739:4;25736:1;25729:15;25767:4;25764:1;25757:15;25621:161;;25408:380;;;:::o;25793:127::-;25854:10;25849:3;25845:20;25842:1;25835:31;25885:4;25882:1;25875:15;25909:4;25906:1;25899:15;25925:127;25986:10;25981:3;25977:20;25974:1;25967:31;26017:4;26014:1;26007:15;26041:4;26038:1;26031:15;26057:127;26118:10;26113:3;26109:20;26106:1;26099:31;26149:4;26146:1;26139:15;26173:4;26170:1;26163:15;26189:131;-1:-1:-1;;;;;26264:31:1;;26254:42;;26244:70;;26310:1;26307;26300:12;26244:70;26189:131;:::o;26325:118::-;26411:5;26404:13;26397:21;26390:5;26387:32;26377:60;;26433:1;26430;26423:12
Swarm Source
ipfs://7aa20d20fb4a39991ca00b526f5f4e528acacd39939a35fba6fa1fd67ffaea91
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.