More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 287 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17247410 | 579 days ago | IN | 0 ETH | 0.00447198 | ||||
Withdraw | 17245824 | 579 days ago | IN | 0 ETH | 0.01132416 | ||||
Withdraw | 17245199 | 579 days ago | IN | 0 ETH | 0.01604509 | ||||
Withdraw | 17149957 | 592 days ago | IN | 0 ETH | 0.00432206 | ||||
Withdraw | 17143754 | 593 days ago | IN | 0 ETH | 0.00396115 | ||||
Withdraw | 17133581 | 595 days ago | IN | 0 ETH | 0.00398652 | ||||
Withdraw | 17125241 | 596 days ago | IN | 0 ETH | 0.00550965 | ||||
Withdraw | 17077131 | 603 days ago | IN | 0 ETH | 0.00735626 | ||||
Deposit | 17064012 | 605 days ago | IN | 0 ETH | 0.00364981 | ||||
Deposit | 17042906 | 608 days ago | IN | 0 ETH | 0.00452879 | ||||
Deposit | 17042848 | 608 days ago | IN | 0 ETH | 0.00457289 | ||||
Withdraw | 16977903 | 617 days ago | IN | 0 ETH | 0.0047412 | ||||
Deposit | 16957391 | 620 days ago | IN | 0 ETH | 0.00311684 | ||||
Withdraw | 16957388 | 620 days ago | IN | 0 ETH | 0.00196893 | ||||
Withdraw | 16954375 | 620 days ago | IN | 0 ETH | 0.00225711 | ||||
Withdraw | 16899100 | 628 days ago | IN | 0 ETH | 0.00383935 | ||||
Deposit | 16871188 | 632 days ago | IN | 0 ETH | 0.00501587 | ||||
Withdraw | 16871172 | 632 days ago | IN | 0 ETH | 0.00324516 | ||||
Deposit | 16816884 | 640 days ago | IN | 0 ETH | 0.00236463 | ||||
Deposit | 16797693 | 642 days ago | IN | 0 ETH | 0.00320976 | ||||
Withdraw | 16773007 | 646 days ago | IN | 0 ETH | 0.00171715 | ||||
Withdraw | 16773004 | 646 days ago | IN | 0 ETH | 0.00334663 | ||||
Deposit | 16763497 | 647 days ago | IN | 0 ETH | 0.00320429 | ||||
Withdraw | 16762784 | 647 days ago | IN | 0 ETH | 0.00146228 | ||||
Deposit | 16758301 | 648 days ago | IN | 0 ETH | 0.00363913 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakeContract
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-16 */ /** *Submitted for verification at BscScan.com on 2022-06-29 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.11; //import "@nomiclabs/buidler/console.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { 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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeERC20: approve from non-zero to non-zero allowance' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, 'SafeERC20: decreased allowance below zero' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, 'Address: insufficient balance for call'); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), 'Address: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract StakeContract is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 tokenAddress; // Address of token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block. uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs. uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below. } IERC20 public immutable stakingToken; IERC20 public immutable rewardToken; mapping (address => uint256) public holderUnlockTime; uint256 public totalStaked; uint256 public totalUsers; uint256 public apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes tokens. mapping (address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor( ) { stakingToken = IERC20(0x7adc29cec54b124a7E8E1B1415DFf95DDD13B173); rewardToken = stakingToken; apy = 12; lockDuration = 0; exitPenaltyPerc = 0; // staking pool poolInfo.push(PoolInfo({ tokenAddress: stakingToken, allocPoint: 1000, lastRewardTimestamp: 21616747, accTokensPerShare: 0 })); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require(poolInfo[0].lastRewardTimestamp == 21616747, "Can only start rewards once"); poolInfo[0].lastRewardTimestamp = block.timestamp; } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; if(pool.lastRewardTimestamp == 21616747){ return 0; } uint256 accTokensPerShare = pool.accTokensPerShare; uint256 lpSupply = totalStaked; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); accTokensPerShare = accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = totalStaked; if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); pool.accTokensPerShare = pool.accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); pool.lastRewardTimestamp = block.timestamp; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public onlyOwner { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Stake primary tokens function deposit(uint256 _amount) public nonReentrant { if(holderUnlockTime[msg.sender] == 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } } uint256 amountTransferred = 0; if(_amount > 0) { if (user.amount == 0) { // Only increment totalUsers if the user has not deposited before totalUsers += 1; } uint256 initialBalance = pool.tokenAddress.balanceOf(address(this)); pool.tokenAddress.safeTransferFrom(address(msg.sender), address(this), _amount); amountTransferred = pool.tokenAddress.balanceOf(address(this)) - initialBalance; user.amount = user.amount.add(amountTransferred); totalStaked += amountTransferred; } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } // Withdraw primary tokens from STAKING. function withdraw() public nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; updatePool(0); uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } if(_amount > 0) { user.amount = 0; totalStaked -= _amount; totalUsers -= 1; pool.tokenAddress.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if(user.amount > 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if(holderUnlockTime[msg.sender] >= block.timestamp){ _amount -= _amount * exitPenaltyPerc / 100; } holderUnlockTime[msg.sender] = 0; pool.tokenAddress.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if(pool.lastRewardTimestamp > block.timestamp){ return 0; } return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy / 100 / 365 days); } function rewardsRemaining() public view returns (uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } function getTotalUsers() public view returns (uint256) { return totalUsers; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000600a5534801561001557600080fd5b50600061002661024160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060018081905550737adc29cec54b124a7e8e1b1415dff95ddd13b17373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600c600581905550600060068190555060006007819055506008604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e88152602001630149d86b81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e8600a81905550610249565b600033905090565b60805160a051612f05620002926000396000818161058d015281816106780152818161083601528181610dc3015281816112e60152611a3401526000610c6c0152612f056000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063817b1cd2116100de578063b6b55f2511610097578063f2fde38b11610071578063f2fde38b146103e3578063f40f0f52146103ff578063f7c618c11461042f578063ff16ef391461044d5761018e565b8063b6b55f251461039f578063bff1f9e1146103bb578063db2e21bc146103d95761018e565b8063817b1cd2146102db5780638da5cb5b146102f95780638e0b019814610317578063999e2f75146103335780639be572f614610351578063a913a5f71461036f5761018e565b8063630b5ba11161014b578063746c8ae111610125578063746c8ae11461028b57806378c196f3146102955780637b280def146102b357806380dc0672146102d15761018e565b8063630b5ba114610259578063715018a61461026357806372f702f31461026d5761018e565b806304554443146101935780631526fe27146101b15780631959a002146101e45780633279beab146102155780633bcfc4b8146102315780633ccfd60b1461024f575b600080fd5b61019b610469565b6040516101a89190612306565b60405180910390f35b6101cb60048036038101906101c69190612352565b61046f565b6040516101db94939291906123fe565b60405180910390f35b6101fe60048036038101906101f99190612481565b6104cf565b60405161020c9291906124ae565b60405180910390f35b61022f600480360381019061022a9190612352565b6104f3565b005b6102396106bf565b6040516102469190612306565b60405180910390f35b6102576106c5565b005b610261610a4f565b005b61026b610b17565b005b610275610c6a565b60405161028291906124d7565b60405180910390f35b610293610c8e565b005b61029d610dbc565b6040516102aa9190612306565b60405180910390f35b6102bb610e6a565b6040516102c89190612306565b60405180910390f35b6102d9610e70565b005b6102e3610f19565b6040516102f09190612306565b60405180910390f35b610301610f1f565b60405161030e9190612501565b60405180910390f35b610331600480360381019061032c9190612352565b610f48565b005b61033b61102b565b6040516103489190612306565b60405180910390f35b6103596110b5565b6040516103669190612306565b60405180910390f35b61038960048036038101906103849190612481565b6110bf565b6040516103969190612306565b60405180910390f35b6103b960048036038101906103b49190612352565b6110d7565b005b6103c36115cc565b6040516103d09190612306565b60405180910390f35b6103e16115d2565b005b6103fd60048036038101906103f89190612481565b61181c565b005b61041960048036038101906104149190612481565b6118bd565b6040516104269190612306565b60405180910390f35b610437611a32565b60405161044491906124d7565b60405180910390f35b61046760048036038101906104629190612352565b611a56565b005b60065481565b6008818154811061047f57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60096020528060005260406000206000915090508060000154908060010154905082565b6104fb611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057f90612579565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105e49190612501565b602060405180830381865afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062591906125ae565b61062f919061260a565b811115610671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106689061268a565b60405180910390fd5b6106bc33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b50565b60055481565b6002600154141561070b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610702906126f6565b60405180910390fd5b60026001819055506000600860008154811061072a57610729612716565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107906000611bd2565b60006107da83600101546107cc64e8d4a510006107be88600301548860000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b611d7c90919063ffffffff16565b9050600081111561087b576107ed610dbc565b81111561082f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610826906127b7565b60405180910390fd5b61087a33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b5b6000821115610911576000836000018190555081600360008282546108a0919061260a565b925050819055506001600460008282546108ba919061260a565b9250508190555061091033838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b5b61094364e8d4a5100061093586600301548660000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b83600101819055506000836000015411156109ae576006544261096691906127d7565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506109f4565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a3a9190612306565b60405180910390a25050505060018081905550565b610a57611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90612579565b60405180910390fd5b6000600880549050905060005b81811015610b1357610b0281611bd2565b80610b0c9061282d565b9050610af1565b5050565b610b1f611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390612579565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c96611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90612579565b60405180910390fd5b630149d86b6008600081548110610d3d57610d3c612716565b5b90600052602060002090600402016002015414610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d86906128c2565b60405180910390fd5b426008600081548110610da557610da4612716565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1a9190612501565b602060405180830381865afa158015610e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5b91906125ae565b610e65919061260a565b905090565b60075481565b610e78611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90612579565b60405180910390fd5b610f0f6000611bd2565b6000600581905550565b60035481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f50611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490612579565b60405180910390fd5b6014811115611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061292e565b60405180910390fd5b8060078190555050565b600080600860008154811061104357611042612716565b5b9060005260206000209060040201905042816002015411156110695760009150506110b2565b6301e133806064600554600354846002015442611086919061260a565b611090919061294e565b61109a919061294e565b6110a491906129d7565b6110ae91906129d7565b9150505b90565b6000600454905090565b60026020528060005260406000206000915090505481565b6002600154141561111d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611114906126f6565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156111bf576006544261117b91906127d7565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060086000815481106111d6576111d5612716565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506112336000611bd2565b60008160000154111561132d57600061128a826001015461127c64e8d4a5100061126e87600301548760000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b611d7c90919063ffffffff16565b9050600081111561132b5761129d610dbc565b8111156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906127b7565b60405180910390fd5b61132a33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b5b505b6000808411156115375760008260000154141561135f5760016004600082825461135791906127d7565b925050819055505b60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113be9190612501565b602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff91906125ae565b90506114523330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611dc6909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114b09190612501565b602060405180830381865afa1580156114cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f191906125ae565b6114fb919061260a565b9150611514828460000154611e4f90919063ffffffff16565b8360000181905550816003600082825461152e91906127d7565b92505081905550505b61156964e8d4a5100061155b85600301548560000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c856040516115b79190612306565b60405180910390a25050506001808190555050565b60045481565b60026001541415611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f906126f6565b60405180910390fd5b60026001819055506000600860008154811061163757611636612716565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905080600360008282546116a5919061260a565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061171a57606460075482611702919061294e565b61170c91906129d7565b81611717919061260a565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117ae33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516118089190612306565b60405180910390a250505060018081905550565b611824611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890612579565b60405180910390fd5b6118ba81611ead565b50565b60008060086000815481106118d5576118d4612716565b5b906000526020600020906004020190506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050630149d86b8260020154141561194357600092505050611a2d565b60008260030154905060006003549050836002015442118015611967575060008114155b156119e25760006119a0600a54611992876001015461198461102b565b611cb790919063ffffffff16565b611d3290919063ffffffff16565b90506119de6119cf836119c164e8d4a5100085611cb790919063ffffffff16565b611d3290919063ffffffff16565b84611e4f90919063ffffffff16565b9250505b611a268360010154611a1864e8d4a51000611a0a868860000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b611d7c90919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611a5e611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290612579565b60405180910390fd5b612710811115611b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2790612a54565b60405180910390fd5b611b3a6000611bd2565b8060058190555050565b600033905090565b611bcd8363a9059cbb60e01b8484604051602401611b6b929190612a74565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fda565b505050565b600060088281548110611be857611be7612716565b5b9060005260206000209060040201905080600201544211611c095750611cb4565b600060035490506000811415611c29574282600201819055505050611cb4565b6000611c5d600a54611c4f8560010154611c4161102b565b611cb790919063ffffffff16565b611d3290919063ffffffff16565b9050611c9f611c8c83611c7e64e8d4a5100085611cb790919063ffffffff16565b611d3290919063ffffffff16565b8460030154611e4f90919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611cca5760009050611d2c565b60008284611cd8919061294e565b9050828482611ce791906129d7565b14611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90612b0f565b60405180910390fd5b809150505b92915050565b6000611d7483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120a1565b905092915050565b6000611dbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612104565b905092915050565b611e49846323b872dd60e01b858585604051602401611de793929190612b2f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fda565b50505050565b6000808284611e5e91906127d7565b905083811015611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90612bb2565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490612c44565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061203c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121689092919063ffffffff16565b905060008151111561209c578080602001905181019061205c9190612c9c565b61209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290612d3b565b60405180910390fd5b5b505050565b600080831182906120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120df9190612de3565b60405180910390fd5b50600083856120f791906129d7565b9050809150509392505050565b600083831115829061214c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121439190612de3565b60405180910390fd5b506000838561215b919061260a565b9050809150509392505050565b60606121778484600085612180565b90509392505050565b606061218b856122a2565b6121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190612e51565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121f39190612eb8565b60006040518083038185875af1925050503d8060008114612230576040519150601f19603f3d011682016040523d82523d6000602084013e612235565b606091505b5091509150811561224a57809250505061229a565b60008151111561225d5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122919190612de3565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156122e457506000801b8214155b92505050919050565b6000819050919050565b612300816122ed565b82525050565b600060208201905061231b60008301846122f7565b92915050565b600080fd5b61232f816122ed565b811461233a57600080fd5b50565b60008135905061234c81612326565b92915050565b60006020828403121561236857612367612321565b5b60006123768482850161233d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006123c46123bf6123ba8461237f565b61239f565b61237f565b9050919050565b60006123d6826123a9565b9050919050565b60006123e8826123cb565b9050919050565b6123f8816123dd565b82525050565b600060808201905061241360008301876123ef565b61242060208301866122f7565b61242d60408301856122f7565b61243a60608301846122f7565b95945050505050565b600061244e8261237f565b9050919050565b61245e81612443565b811461246957600080fd5b50565b60008135905061247b81612455565b92915050565b60006020828403121561249757612496612321565b5b60006124a58482850161246c565b91505092915050565b60006040820190506124c360008301856122f7565b6124d060208301846122f7565b9392505050565b60006020820190506124ec60008301846123ef565b92915050565b6124fb81612443565b82525050565b600060208201905061251660008301846124f2565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061256360208361251c565b915061256e8261252d565b602082019050919050565b6000602082019050818103600083015261259281612556565b9050919050565b6000815190506125a881612326565b92915050565b6000602082840312156125c4576125c3612321565b5b60006125d284828501612599565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612615826122ed565b9150612620836122ed565b925082821015612633576126326125db565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b6000612674601d8361251c565b915061267f8261263e565b602082019050919050565b600060208201905081810360008301526126a381612667565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006126e0601f8361251c565b91506126eb826126aa565b602082019050919050565b6000602082019050818103600083015261270f816126d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006127a160408361251c565b91506127ac82612745565b604082019050919050565b600060208201905081810360008301526127d081612794565b9050919050565b60006127e2826122ed565b91506127ed836122ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612822576128216125db565b5b828201905092915050565b6000612838826122ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561286b5761286a6125db565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006128ac601b8361251c565b91506128b782612876565b602082019050919050565b600060208201905081810360008301526128db8161289f565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000612918601b8361251c565b9150612923826128e2565b602082019050919050565b600060208201905081810360008301526129478161290b565b9050919050565b6000612959826122ed565b9150612964836122ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561299d5761299c6125db565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006129e2826122ed565b91506129ed836122ed565b9250826129fd576129fc6129a8565b5b828204905092915050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612a3e60188361251c565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b6000604082019050612a8960008301856124f2565b612a9660208301846122f7565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612af960218361251c565b9150612b0482612a9d565b604082019050919050565b60006020820190508181036000830152612b2881612aec565b9050919050565b6000606082019050612b4460008301866124f2565b612b5160208301856124f2565b612b5e60408301846122f7565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612b9c601b8361251c565b9150612ba782612b66565b602082019050919050565b60006020820190508181036000830152612bcb81612b8f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c2e60268361251c565b9150612c3982612bd2565b604082019050919050565b60006020820190508181036000830152612c5d81612c21565b9050919050565b60008115159050919050565b612c7981612c64565b8114612c8457600080fd5b50565b600081519050612c9681612c70565b92915050565b600060208284031215612cb257612cb1612321565b5b6000612cc084828501612c87565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612d25602a8361251c565b9150612d3082612cc9565b604082019050919050565b60006020820190508181036000830152612d5481612d18565b9050919050565b600081519050919050565b60005b83811015612d84578082015181840152602081019050612d69565b83811115612d93576000848401525b50505050565b6000601f19601f8301169050919050565b6000612db582612d5b565b612dbf818561251c565b9350612dcf818560208601612d66565b612dd881612d99565b840191505092915050565b60006020820190508181036000830152612dfd8184612daa565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612e3b601d8361251c565b9150612e4682612e05565b602082019050919050565b60006020820190508181036000830152612e6a81612e2e565b9050919050565b600081519050919050565b600081905092915050565b6000612e9282612e71565b612e9c8185612e7c565b9350612eac818560208601612d66565b80840191505092915050565b6000612ec48284612e87565b91508190509291505056fea26469706673582212204bbb96183f01815c84eac9d5a0ad2f6470dc55fb439c7f2772b94b6d255a050364736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063817b1cd2116100de578063b6b55f2511610097578063f2fde38b11610071578063f2fde38b146103e3578063f40f0f52146103ff578063f7c618c11461042f578063ff16ef391461044d5761018e565b8063b6b55f251461039f578063bff1f9e1146103bb578063db2e21bc146103d95761018e565b8063817b1cd2146102db5780638da5cb5b146102f95780638e0b019814610317578063999e2f75146103335780639be572f614610351578063a913a5f71461036f5761018e565b8063630b5ba11161014b578063746c8ae111610125578063746c8ae11461028b57806378c196f3146102955780637b280def146102b357806380dc0672146102d15761018e565b8063630b5ba114610259578063715018a61461026357806372f702f31461026d5761018e565b806304554443146101935780631526fe27146101b15780631959a002146101e45780633279beab146102155780633bcfc4b8146102315780633ccfd60b1461024f575b600080fd5b61019b610469565b6040516101a89190612306565b60405180910390f35b6101cb60048036038101906101c69190612352565b61046f565b6040516101db94939291906123fe565b60405180910390f35b6101fe60048036038101906101f99190612481565b6104cf565b60405161020c9291906124ae565b60405180910390f35b61022f600480360381019061022a9190612352565b6104f3565b005b6102396106bf565b6040516102469190612306565b60405180910390f35b6102576106c5565b005b610261610a4f565b005b61026b610b17565b005b610275610c6a565b60405161028291906124d7565b60405180910390f35b610293610c8e565b005b61029d610dbc565b6040516102aa9190612306565b60405180910390f35b6102bb610e6a565b6040516102c89190612306565b60405180910390f35b6102d9610e70565b005b6102e3610f19565b6040516102f09190612306565b60405180910390f35b610301610f1f565b60405161030e9190612501565b60405180910390f35b610331600480360381019061032c9190612352565b610f48565b005b61033b61102b565b6040516103489190612306565b60405180910390f35b6103596110b5565b6040516103669190612306565b60405180910390f35b61038960048036038101906103849190612481565b6110bf565b6040516103969190612306565b60405180910390f35b6103b960048036038101906103b49190612352565b6110d7565b005b6103c36115cc565b6040516103d09190612306565b60405180910390f35b6103e16115d2565b005b6103fd60048036038101906103f89190612481565b61181c565b005b61041960048036038101906104149190612481565b6118bd565b6040516104269190612306565b60405180910390f35b610437611a32565b60405161044491906124d7565b60405180910390f35b61046760048036038101906104629190612352565b611a56565b005b60065481565b6008818154811061047f57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60096020528060005260406000206000915090508060000154908060010154905082565b6104fb611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057f90612579565b60405180910390fd5b6003547f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105e49190612501565b602060405180830381865afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062591906125ae565b61062f919061260a565b811115610671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106689061268a565b60405180910390fd5b6106bc33827f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17373ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b50565b60055481565b6002600154141561070b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610702906126f6565b60405180910390fd5b60026001819055506000600860008154811061072a57610729612716565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107906000611bd2565b60006107da83600101546107cc64e8d4a510006107be88600301548860000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b611d7c90919063ffffffff16565b9050600081111561087b576107ed610dbc565b81111561082f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610826906127b7565b60405180910390fd5b61087a33827f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17373ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b5b6000821115610911576000836000018190555081600360008282546108a0919061260a565b925050819055506001600460008282546108ba919061260a565b9250508190555061091033838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b5b61094364e8d4a5100061093586600301548660000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b83600101819055506000836000015411156109ae576006544261096691906127d7565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506109f4565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a3a9190612306565b60405180910390a25050505060018081905550565b610a57611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90612579565b60405180910390fd5b6000600880549050905060005b81811015610b1357610b0281611bd2565b80610b0c9061282d565b9050610af1565b5050565b610b1f611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390612579565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17381565b610c96611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90612579565b60405180910390fd5b630149d86b6008600081548110610d3d57610d3c612716565b5b90600052602060002090600402016002015414610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d86906128c2565b60405180910390fd5b426008600081548110610da557610da4612716565b5b906000526020600020906004020160020181905550565b60006003547f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1a9190612501565b602060405180830381865afa158015610e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5b91906125ae565b610e65919061260a565b905090565b60075481565b610e78611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90612579565b60405180910390fd5b610f0f6000611bd2565b6000600581905550565b60035481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f50611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490612579565b60405180910390fd5b6014811115611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061292e565b60405180910390fd5b8060078190555050565b600080600860008154811061104357611042612716565b5b9060005260206000209060040201905042816002015411156110695760009150506110b2565b6301e133806064600554600354846002015442611086919061260a565b611090919061294e565b61109a919061294e565b6110a491906129d7565b6110ae91906129d7565b9150505b90565b6000600454905090565b60026020528060005260406000206000915090505481565b6002600154141561111d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611114906126f6565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156111bf576006544261117b91906127d7565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060086000815481106111d6576111d5612716565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506112336000611bd2565b60008160000154111561132d57600061128a826001015461127c64e8d4a5100061126e87600301548760000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b611d7c90919063ffffffff16565b9050600081111561132b5761129d610dbc565b8111156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906127b7565b60405180910390fd5b61132a33827f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17373ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b5b505b6000808411156115375760008260000154141561135f5760016004600082825461135791906127d7565b925050819055505b60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113be9190612501565b602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff91906125ae565b90506114523330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611dc6909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114b09190612501565b602060405180830381865afa1580156114cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f191906125ae565b6114fb919061260a565b9150611514828460000154611e4f90919063ffffffff16565b8360000181905550816003600082825461152e91906127d7565b92505081905550505b61156964e8d4a5100061155b85600301548560000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c856040516115b79190612306565b60405180910390a25050506001808190555050565b60045481565b60026001541415611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160f906126f6565b60405180910390fd5b60026001819055506000600860008154811061163757611636612716565b5b906000526020600020906004020190506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905080600360008282546116a5919061260a565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061171a57606460075482611702919061294e565b61170c91906129d7565b81611717919061260a565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117ae33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b4c9092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516118089190612306565b60405180910390a250505060018081905550565b611824611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890612579565b60405180910390fd5b6118ba81611ead565b50565b60008060086000815481106118d5576118d4612716565b5b906000526020600020906004020190506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050630149d86b8260020154141561194357600092505050611a2d565b60008260030154905060006003549050836002015442118015611967575060008114155b156119e25760006119a0600a54611992876001015461198461102b565b611cb790919063ffffffff16565b611d3290919063ffffffff16565b90506119de6119cf836119c164e8d4a5100085611cb790919063ffffffff16565b611d3290919063ffffffff16565b84611e4f90919063ffffffff16565b9250505b611a268360010154611a1864e8d4a51000611a0a868860000154611cb790919063ffffffff16565b611d3290919063ffffffff16565b611d7c90919063ffffffff16565b9450505050505b919050565b7f0000000000000000000000007adc29cec54b124a7e8e1b1415dff95ddd13b17381565b611a5e611b44565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290612579565b60405180910390fd5b612710811115611b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2790612a54565b60405180910390fd5b611b3a6000611bd2565b8060058190555050565b600033905090565b611bcd8363a9059cbb60e01b8484604051602401611b6b929190612a74565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fda565b505050565b600060088281548110611be857611be7612716565b5b9060005260206000209060040201905080600201544211611c095750611cb4565b600060035490506000811415611c29574282600201819055505050611cb4565b6000611c5d600a54611c4f8560010154611c4161102b565b611cb790919063ffffffff16565b611d3290919063ffffffff16565b9050611c9f611c8c83611c7e64e8d4a5100085611cb790919063ffffffff16565b611d3290919063ffffffff16565b8460030154611e4f90919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611cca5760009050611d2c565b60008284611cd8919061294e565b9050828482611ce791906129d7565b14611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90612b0f565b60405180910390fd5b809150505b92915050565b6000611d7483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120a1565b905092915050565b6000611dbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612104565b905092915050565b611e49846323b872dd60e01b858585604051602401611de793929190612b2f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fda565b50505050565b6000808284611e5e91906127d7565b905083811015611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90612bb2565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490612c44565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061203c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121689092919063ffffffff16565b905060008151111561209c578080602001905181019061205c9190612c9c565b61209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290612d3b565b60405180910390fd5b5b505050565b600080831182906120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120df9190612de3565b60405180910390fd5b50600083856120f791906129d7565b9050809150509392505050565b600083831115829061214c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121439190612de3565b60405180910390fd5b506000838561215b919061260a565b9050809150509392505050565b60606121778484600085612180565b90509392505050565b606061218b856122a2565b6121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190612e51565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121f39190612eb8565b60006040518083038185875af1925050503d8060008114612230576040519150601f19603f3d011682016040523d82523d6000602084013e612235565b606091505b5091509150811561224a57809250505061229a565b60008151111561225d5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122919190612de3565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156122e457506000801b8214155b92505050919050565b6000819050919050565b612300816122ed565b82525050565b600060208201905061231b60008301846122f7565b92915050565b600080fd5b61232f816122ed565b811461233a57600080fd5b50565b60008135905061234c81612326565b92915050565b60006020828403121561236857612367612321565b5b60006123768482850161233d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006123c46123bf6123ba8461237f565b61239f565b61237f565b9050919050565b60006123d6826123a9565b9050919050565b60006123e8826123cb565b9050919050565b6123f8816123dd565b82525050565b600060808201905061241360008301876123ef565b61242060208301866122f7565b61242d60408301856122f7565b61243a60608301846122f7565b95945050505050565b600061244e8261237f565b9050919050565b61245e81612443565b811461246957600080fd5b50565b60008135905061247b81612455565b92915050565b60006020828403121561249757612496612321565b5b60006124a58482850161246c565b91505092915050565b60006040820190506124c360008301856122f7565b6124d060208301846122f7565b9392505050565b60006020820190506124ec60008301846123ef565b92915050565b6124fb81612443565b82525050565b600060208201905061251660008301846124f2565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061256360208361251c565b915061256e8261252d565b602082019050919050565b6000602082019050818103600083015261259281612556565b9050919050565b6000815190506125a881612326565b92915050565b6000602082840312156125c4576125c3612321565b5b60006125d284828501612599565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612615826122ed565b9150612620836122ed565b925082821015612633576126326125db565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b6000612674601d8361251c565b915061267f8261263e565b602082019050919050565b600060208201905081810360008301526126a381612667565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006126e0601f8361251c565b91506126eb826126aa565b602082019050919050565b6000602082019050818103600083015261270f816126d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006127a160408361251c565b91506127ac82612745565b604082019050919050565b600060208201905081810360008301526127d081612794565b9050919050565b60006127e2826122ed565b91506127ed836122ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612822576128216125db565b5b828201905092915050565b6000612838826122ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561286b5761286a6125db565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006128ac601b8361251c565b91506128b782612876565b602082019050919050565b600060208201905081810360008301526128db8161289f565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000612918601b8361251c565b9150612923826128e2565b602082019050919050565b600060208201905081810360008301526129478161290b565b9050919050565b6000612959826122ed565b9150612964836122ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561299d5761299c6125db565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006129e2826122ed565b91506129ed836122ed565b9250826129fd576129fc6129a8565b5b828204905092915050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612a3e60188361251c565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b6000604082019050612a8960008301856124f2565b612a9660208301846122f7565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612af960218361251c565b9150612b0482612a9d565b604082019050919050565b60006020820190508181036000830152612b2881612aec565b9050919050565b6000606082019050612b4460008301866124f2565b612b5160208301856124f2565b612b5e60408301846122f7565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612b9c601b8361251c565b9150612ba782612b66565b602082019050919050565b60006020820190508181036000830152612bcb81612b8f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c2e60268361251c565b9150612c3982612bd2565b604082019050919050565b60006020820190508181036000830152612c5d81612c21565b9050919050565b60008115159050919050565b612c7981612c64565b8114612c8457600080fd5b50565b600081519050612c9681612c70565b92915050565b600060208284031215612cb257612cb1612321565b5b6000612cc084828501612c87565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612d25602a8361251c565b9150612d3082612cc9565b604082019050919050565b60006020820190508181036000830152612d5481612d18565b9050919050565b600081519050919050565b60005b83811015612d84578082015181840152602081019050612d69565b83811115612d93576000848401525b50505050565b6000601f19601f8301169050919050565b6000612db582612d5b565b612dbf818561251c565b9350612dcf818560208601612d66565b612dd881612d99565b840191505092915050565b60006020820190508181036000830152612dfd8184612daa565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612e3b601d8361251c565b9150612e4682612e05565b602082019050919050565b60006020820190508181036000830152612e6a81612e2e565b9050919050565b600081519050919050565b600081905092915050565b6000612e9282612e71565b612e9c8185612e7c565b9350612eac818560208601612d66565b80840191505092915050565b6000612ec48284612e87565b91508190509291505056fea26469706673582212204bbb96183f01815c84eac9d5a0ad2f6470dc55fb439c7f2772b94b6d255a050364736f6c634300080b0033
Deployed Bytecode Sourcemap
24256:8801:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25250:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25350:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;25429:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;31861:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25225:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29888:1083;;;:::i;:::-;;28140:190;;;:::i;:::-;;2885:140;;;:::i;:::-;;25014:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26388:204;;;:::i;:::-;;32442:133;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25284:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26289:91;;;:::i;:::-;;25160:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2243:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32763:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32125:309;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32963:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25099:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28367:1465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25193:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31042:670;;;:::i;:::-;;3180:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26657:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25057:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32583:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25250:27;;;;:::o;25350:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25429:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31861:256::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31999:11:::1;;31960;:21;;;31990:4;31960:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;31949:7;:61;;31941:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32055:54;32088:10;32101:7;32055:11;:24;;;;:54;;;;;:::i;:::-;31861:256:::0;:::o;25225:18::-;;;;:::o;29888:1083::-;23309:1;23907:7;;:19;;23899:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23309:1;24040:7;:18;;;;29949:21:::1;29973:8;29982:1;29973:11;;;;;;;;:::i;:::-;;;;;;;;;;;;29949:35;;29995:21;30019:8;:20;30028:10;30019:20;;;;;;;;;;;;;;;29995:44;;30052:15;30070:4;:11;;;30052:29;;30092:13;30103:1;30092:10;:13::i;:::-;30116:15;30134:70;30188:4;:15;;;30134:49;30178:4;30134:39;30150:4;:22;;;30134:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;30116:88;;30228:1;30218:7;:11;30215:218;;;30265:18;:16;:18::i;:::-;30254:7;:29;;30246:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30367:54;30400:10;30413:7;30367:11;:24;;;;:54;;;;;:::i;:::-;30215:218;30458:1;30448:7;:11;30445:200;;;30490:1;30476:4;:11;;:15;;;;30521:7;30506:11;;:22;;;;;;;:::i;:::-;;;;;;;;30557:1;30543:10;;:15;;;;;;;:::i;:::-;;;;;;;;30573:60;30612:10;30625:7;30573:4;:17;;;;;;;;;;;;:30;;;;:60;;;;;:::i;:::-;30445:200;30675:49;30719:4;30675:39;30691:4;:22;;;30675:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;30657:4;:15;;:67;;;;30762:1;30748:4;:11;;;:15;30745:172;;;30828:12;;30810:15;:30;;;;:::i;:::-;30779:16;:28;30796:10;30779:28;;;;;;;;;;;;;;;:61;;;;30745:172;;;30904:1;30873:16;:28;30890:10;30873:28;;;;;;;;;;;;;;;:32;;;;30745:172;30943:10;30934:29;;;30955:7;30934:29;;;;;;:::i;:::-;;;;;;;;29928:1043;;;;23265:1:::0;24219:7;:22;;;;29888:1083::o;28140:190::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28195:14:::1;28212:8;:15;;;;28195:32;;28243:11;28238:85;28266:6;28260:3;:12;28238:85;;;28296:15;28307:3;28296:10;:15::i;:::-;28274:5;;;;:::i;:::-;;;28238:85;;;;28184:146;28140:190::o:0;2885:140::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2984:1:::1;2947:40;;2968:6;::::0;::::1;;;;;;;;2947:40;;;;;;;;;;;;3015:1;2998:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2885:140::o:0;25014:36::-;;;:::o;26388:204::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26484:8:::1;26449;26458:1;26449:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:43;26441:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26569:15;26535:8;26544:1;26535:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;26388:204::o:0;32442:133::-;32491:7;32556:11;;32517;:21;;;32547:4;32517:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32510:57;;32442:133;:::o;25284:30::-;;;;:::o;26289:91::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26341:13:::1;26352:1;26341:10;:13::i;:::-;26371:1;26365:3;:7;;;;26289:91::o:0;25160:26::-;;;;:::o;2243:79::-;2281:7;2308:6;;;;;;;;;;;2301:13;;2243:79;:::o;32763:192::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32870:2:::1;32852:14;:20;;32844:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;32933:14;32915:15;:32;;;;32763:192:::0;:::o;32125:309::-;32177:7;32197:21;32221:8;32230:1;32221:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32197:35;;32273:15;32246:4;:24;;;:42;32243:81;;;32311:1;32304:8;;;;;32243:81;32417:8;32411:3;32405;;32390:11;;32362:4;:24;;;32344:15;:42;;;;:::i;:::-;32343:58;;;;:::i;:::-;32342:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32334:92;;;32125:309;;:::o;32963:91::-;33009:7;33036:10;;33029:17;;32963:91;:::o;25099:52::-;;;;;;;;;;;;;;;;;:::o;28367:1465::-;23309:1;23907:7;;:19;;23899:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23309:1;24040:7;:18;;;;28467:1:::1;28435:16;:28;28452:10;28435:28;;;;;;;;;;;;;;;;:33;28432:125;;;28533:12;;28515:15;:30;;;;:::i;:::-;28484:16;:28;28501:10;28484:28;;;;;;;;;;;;;;;:61;;;;28432:125;28567:21;28591:8;28600:1;28591:11;;;;;;;;:::i;:::-;;;;;;;;;;;;28567:35;;28613:21;28637:8;:20;28646:10;28637:20;;;;;;;;;;;;;;;28613:44;;28670:13;28681:1;28670:10;:13::i;:::-;28712:1;28698:4;:11;;;:15;28694:380;;;28730:15;28748:70;28802:4;:15;;;28748:49;28792:4;28748:39;28764:4;:22;;;28748:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;28730:88;;28846:1;28836:7;:11;28833:230;;;28887:18;:16;:18::i;:::-;28876:7;:29;;28868:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;28993:54;29026:10;29039:7;28993:11;:24;;;;:54;;;;;:::i;:::-;28833:230;28715:359;28694:380;29084:25;29137:1:::0;29127:7:::1;:11;29124:577;;;29174:1;29159:4;:11;;;:16;29155:155;;;29293:1;29279:10;;:15;;;;;;;:::i;:::-;;;;;;;;29155:155;29324:22;29349:4;:17;;;;;;;;;;;;:27;;;29385:4;29349:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29324:67;;29406:79;29449:10;29470:4;29477:7;29406:4;:17;;;;;;;;;;;;:34;;;;:79;;;;;;:::i;:::-;29565:14;29520:4;:17;;;;;;;;;;;;:27;;;29556:4;29520:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;29500:79;;29608:34;29624:17;29608:4;:11;;;:15;;:34;;;;:::i;:::-;29594:4;:11;;:48;;;;29672:17;29657:11;;:32;;;;;;;:::i;:::-;;;;;;;;29140:561;29124:577;29729:49;29773:4;29729:39;29745:4;:22;;;29729:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;29711:4;:15;;:67;;;;29804:10;29796:28;;;29816:7;29796:28;;;;;;:::i;:::-;;;;;;;;28421:1411;;;23265:1:::0;24219:7;:22;;;;28367:1465;:::o;25193:25::-;;;;:::o;31042:670::-;23309:1;23907:7;;:19;;23899:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23309:1;24040:7;:18;;;;31104:21:::1;31128:8;31137:1;31128:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31104:35;;31150:21;31174:8;:20;31183:10;31174:20;;;;;;;;;;;;;;;31150:44;;31205:15;31223:4;:11;;;31205:29;;31260:7;31245:11;;:22;;;;;;;:::i;:::-;;;;;;;;31396:15;31364:16;:28;31381:10;31364:28;;;;;;;;;;;;;;;;:47;31361:120;;31466:3;31448:15;;31438:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31427:42;;;;;:::i;:::-;;;31361:120;31522:1;31491:16;:28;31508:10;31491:28;;;;;;;;;;;;;;;:32;;;;31534:60;31573:10;31586:7;31534:4;:17;;;;;;;;;;;;:30;;;;:60;;;;;:::i;:::-;31619:1;31605:4;:11;;:15;;;;31649:1;31631:4;:15;;:19;;;;31684:10;31666:38;;;31696:7;31666:38;;;;;;:::i;:::-;;;;;;;;31093:619;;;23265:1:::0;24219:7;:22;;;;31042:670::o;3180:109::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3253:28:::1;3272:8;3253:18;:28::i;:::-;3180:109:::0;:::o;26657:724::-;26718:7;26738:21;26762:8;26771:1;26762:11;;;;;;;;:::i;:::-;;;;;;;;;;;;26738:35;;26784:21;26808:8;:15;26817:5;26808:15;;;;;;;;;;;;;;;26784:39;;26865:8;26837:4;:24;;;:36;26834:75;;;26896:1;26889:8;;;;;;26834:75;26919:25;26947:4;:22;;;26919:50;;26980:16;26999:11;;26980:30;;27043:4;:24;;;27025:15;:42;:59;;;;;27083:1;27071:8;:13;;27025:59;27021:270;;;27101:19;27123:63;27170:15;;27123:42;27149:4;:15;;;27123:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27101:85;;27221:58;27243:35;27269:8;27243:21;27259:4;27243:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;27221:17;:21;;:58;;;;:::i;:::-;27201:78;;27086:205;27021:270;27308:65;27357:4;:15;;;27308:44;27347:4;27308:34;27324:17;27308:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;27301:72;;;;;;26657:724;;;;:::o;25057:35::-;;;:::o;32583:172::-;2465:12;:10;:12::i;:::-;2455:22;;:6;;;;;;;;;;:22;;;2447:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32666:5:::1;32656:6;:15;;32648:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32711:13;32722:1;32711:10;:13::i;:::-;32741:6;32735:3;:12;;;;32583:172:::0;:::o;898:107::-;943:15;986:10;971:26;;898:107;:::o;12776:211::-;12893:86;12913:5;12943:23;;;12968:2;12972:5;12920:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12893:19;:86::i;:::-;12776:211;;;:::o;27457:600::-;27511:21;27535:8;27544:4;27535:14;;;;;;;;:::i;:::-;;;;;;;;;;;;27511:38;;27583:4;:24;;;27564:15;:43;27560:82;;27624:7;;;27560:82;27652:16;27671:11;;27652:30;;27709:1;27697:8;:13;27693:109;;;27754:15;27727:4;:24;;:42;;;;27784:7;;;;27693:109;27812:19;27834:63;27881:15;;27834:42;27860:4;:15;;;27834:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27812:85;;27933:63;27960:35;27986:8;27960:21;27976:4;27960:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;27933:4;:22;;;:26;;:63;;;;:::i;:::-;27908:4;:22;;:88;;;;28034:15;28007:4;:24;;:42;;;;27500:557;;;27457:600;;:::o;5859:471::-;5917:7;6167:1;6162;:6;6158:47;;;6192:1;6185:8;;;;6158:47;6217:9;6233:1;6229;:5;;;;:::i;:::-;6217:17;;6262:1;6257;6253;:5;;;;:::i;:::-;:10;6245:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6321:1;6314:8;;;5859:471;;;;;:::o;6806:132::-;6864:7;6891:39;6895:1;6898;6891:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6884:46;;6806:132;;;;:::o;4935:136::-;4993:7;5020:43;5024:1;5027;5020:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5013:50;;4935:136;;;;:::o;12995:248::-;13139:96;13159:5;13189:27;;;13218:4;13224:2;13228:5;13166:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13139:19;:96::i;:::-;12995:248;;;;:::o;4471:181::-;4529:7;4549:9;4565:1;4561;:5;;;;:::i;:::-;4549:17;;4590:1;4585;:6;;4577:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4643:1;4636:8;;;4471:181;;;;:::o;3395:229::-;3489:1;3469:22;;:8;:22;;;;3461:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3579:8;3550:38;;3571:6;;;;;;;;;;3550:38;;;;;;;;;;;;3608:8;3599:6;;:17;;;;;;;;;;;;;;;;;;3395:229;:::o;15311:774::-;15735:23;15761:69;15789:4;15761:69;;;;;;;;;;;;;;;;;15769:5;15761:27;;;;:69;;;;;:::i;:::-;15735:95;;15865:1;15845:10;:17;:21;15841:237;;;16000:10;15989:30;;;;;;;;;;;;:::i;:::-;15981:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;15841:237;15381:704;15311:774;;:::o;7434:312::-;7554:7;7586:1;7582;:5;7589:12;7574:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7613:9;7629:1;7625;:5;;;;:::i;:::-;7613:17;;7737:1;7730:8;;;7434:312;;;;;:::o;5374:226::-;5494:7;5527:1;5522;:6;;5530:12;5514:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5554:9;5570:1;5566;:5;;;;:::i;:::-;5554:17;;5591:1;5584:8;;;5374:226;;;;;:::o;19910:230::-;20047:12;20079:53;20102:6;20110:4;20116:1;20119:12;20079:22;:53::i;:::-;20072:60;;19910:230;;;;;:::o;21398:1020::-;21571:12;21604:18;21615:6;21604:10;:18::i;:::-;21596:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;21730:12;21744:23;21771:6;:11;;21790:8;21800:4;21771:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21729:76;;;;21820:7;21816:595;;;21851:10;21844:17;;;;;;21816:595;21985:1;21965:10;:17;:21;21961:439;;;22228:10;22222:17;22289:15;22276:10;22272:2;22268:19;22261:44;21961:439;22371:12;22364:20;;;;;;;;;;;:::i;:::-;;;;;;;;21398:1020;;;;;;;:::o;16773:641::-;16833:4;17095:16;17122:19;17144:66;17122:88;;;;17326:7;17314:20;17302:32;;17375:11;17363:8;:23;;:42;;;;;17402:3;17390:15;;:8;:15;;17363:42;17355:51;;;;16773:641;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:140::-;1919:9;1952:37;1983:5;1952:37;:::i;:::-;1939:50;;1855:140;;;:::o;2001:159::-;2102:51;2147:5;2102:51;:::i;:::-;2097:3;2090:64;2001:159;;:::o;2166:581::-;2357:4;2395:3;2384:9;2380:19;2372:27;;2409:85;2491:1;2480:9;2476:17;2467:6;2409:85;:::i;:::-;2504:72;2572:2;2561:9;2557:18;2548:6;2504:72;:::i;:::-;2586;2654:2;2643:9;2639:18;2630:6;2586:72;:::i;:::-;2668;2736:2;2725:9;2721:18;2712:6;2668:72;:::i;:::-;2166:581;;;;;;;:::o;2753:96::-;2790:7;2819:24;2837:5;2819:24;:::i;:::-;2808:35;;2753:96;;;:::o;2855:122::-;2928:24;2946:5;2928:24;:::i;:::-;2921:5;2918:35;2908:63;;2967:1;2964;2957:12;2908:63;2855:122;:::o;2983:139::-;3029:5;3067:6;3054:20;3045:29;;3083:33;3110:5;3083:33;:::i;:::-;2983:139;;;;:::o;3128:329::-;3187:6;3236:2;3224:9;3215:7;3211:23;3207:32;3204:119;;;3242:79;;:::i;:::-;3204:119;3362:1;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3333:117;3128:329;;;;:::o;3463:332::-;3584:4;3622:2;3611:9;3607:18;3599:26;;3635:71;3703:1;3692:9;3688:17;3679:6;3635:71;:::i;:::-;3716:72;3784:2;3773:9;3769:18;3760:6;3716:72;:::i;:::-;3463:332;;;;;:::o;3801:250::-;3908:4;3946:2;3935:9;3931:18;3923:26;;3959:85;4041:1;4030:9;4026:17;4017:6;3959:85;:::i;:::-;3801:250;;;;:::o;4057:118::-;4144:24;4162:5;4144:24;:::i;:::-;4139:3;4132:37;4057:118;;:::o;4181:222::-;4274:4;4312:2;4301:9;4297:18;4289:26;;4325:71;4393:1;4382:9;4378:17;4369:6;4325:71;:::i;:::-;4181:222;;;;:::o;4409:169::-;4493:11;4527:6;4522:3;4515:19;4567:4;4562:3;4558:14;4543:29;;4409:169;;;;:::o;4584:182::-;4724:34;4720:1;4712:6;4708:14;4701:58;4584:182;:::o;4772:366::-;4914:3;4935:67;4999:2;4994:3;4935:67;:::i;:::-;4928:74;;5011:93;5100:3;5011:93;:::i;:::-;5129:2;5124:3;5120:12;5113:19;;4772:366;;;:::o;5144:419::-;5310:4;5348:2;5337:9;5333:18;5325:26;;5397:9;5391:4;5387:20;5383:1;5372:9;5368:17;5361:47;5425:131;5551:4;5425:131;:::i;:::-;5417:139;;5144:419;;;:::o;5569:143::-;5626:5;5657:6;5651:13;5642:22;;5673:33;5700:5;5673:33;:::i;:::-;5569:143;;;;:::o;5718:351::-;5788:6;5837:2;5825:9;5816:7;5812:23;5808:32;5805:119;;;5843:79;;:::i;:::-;5805:119;5963:1;5988:64;6044:7;6035:6;6024:9;6020:22;5988:64;:::i;:::-;5978:74;;5934:128;5718:351;;;;:::o;6075:180::-;6123:77;6120:1;6113:88;6220:4;6217:1;6210:15;6244:4;6241:1;6234:15;6261:191;6301:4;6321:20;6339:1;6321:20;:::i;:::-;6316:25;;6355:20;6373:1;6355:20;:::i;:::-;6350:25;;6394:1;6391;6388:8;6385:34;;;6399:18;;:::i;:::-;6385:34;6444:1;6441;6437:9;6429:17;;6261:191;;;;:::o;6458:179::-;6598:31;6594:1;6586:6;6582:14;6575:55;6458:179;:::o;6643:366::-;6785:3;6806:67;6870:2;6865:3;6806:67;:::i;:::-;6799:74;;6882:93;6971:3;6882:93;:::i;:::-;7000:2;6995:3;6991:12;6984:19;;6643:366;;;:::o;7015:419::-;7181:4;7219:2;7208:9;7204:18;7196:26;;7268:9;7262:4;7258:20;7254:1;7243:9;7239:17;7232:47;7296:131;7422:4;7296:131;:::i;:::-;7288:139;;7015:419;;;:::o;7440:181::-;7580:33;7576:1;7568:6;7564:14;7557:57;7440:181;:::o;7627:366::-;7769:3;7790:67;7854:2;7849:3;7790:67;:::i;:::-;7783:74;;7866:93;7955:3;7866:93;:::i;:::-;7984:2;7979:3;7975:12;7968:19;;7627:366;;;:::o;7999:419::-;8165:4;8203:2;8192:9;8188:18;8180:26;;8252:9;8246:4;8242:20;8238:1;8227:9;8223:17;8216:47;8280:131;8406:4;8280:131;:::i;:::-;8272:139;;7999:419;;;:::o;8424:180::-;8472:77;8469:1;8462:88;8569:4;8566:1;8559:15;8593:4;8590:1;8583:15;8610:251;8750:34;8746:1;8738:6;8734:14;8727:58;8819:34;8814:2;8806:6;8802:15;8795:59;8610:251;:::o;8867:366::-;9009:3;9030:67;9094:2;9089:3;9030:67;:::i;:::-;9023:74;;9106:93;9195:3;9106:93;:::i;:::-;9224:2;9219:3;9215:12;9208:19;;8867:366;;;:::o;9239:419::-;9405:4;9443:2;9432:9;9428:18;9420:26;;9492:9;9486:4;9482:20;9478:1;9467:9;9463:17;9456:47;9520:131;9646:4;9520:131;:::i;:::-;9512:139;;9239:419;;;:::o;9664:305::-;9704:3;9723:20;9741:1;9723:20;:::i;:::-;9718:25;;9757:20;9775:1;9757:20;:::i;:::-;9752:25;;9911:1;9843:66;9839:74;9836:1;9833:81;9830:107;;;9917:18;;:::i;:::-;9830:107;9961:1;9958;9954:9;9947:16;;9664:305;;;;:::o;9975:233::-;10014:3;10037:24;10055:5;10037:24;:::i;:::-;10028:33;;10083:66;10076:5;10073:77;10070:103;;;10153:18;;:::i;:::-;10070:103;10200:1;10193:5;10189:13;10182:20;;9975:233;;;:::o;10214:177::-;10354:29;10350:1;10342:6;10338:14;10331:53;10214:177;:::o;10397:366::-;10539:3;10560:67;10624:2;10619:3;10560:67;:::i;:::-;10553:74;;10636:93;10725:3;10636:93;:::i;:::-;10754:2;10749:3;10745:12;10738:19;;10397:366;;;:::o;10769:419::-;10935:4;10973:2;10962:9;10958:18;10950:26;;11022:9;11016:4;11012:20;11008:1;10997:9;10993:17;10986:47;11050:131;11176:4;11050:131;:::i;:::-;11042:139;;10769:419;;;:::o;11194:177::-;11334:29;11330:1;11322:6;11318:14;11311:53;11194:177;:::o;11377:366::-;11519:3;11540:67;11604:2;11599:3;11540:67;:::i;:::-;11533:74;;11616:93;11705:3;11616:93;:::i;:::-;11734:2;11729:3;11725:12;11718:19;;11377:366;;;:::o;11749:419::-;11915:4;11953:2;11942:9;11938:18;11930:26;;12002:9;11996:4;11992:20;11988:1;11977:9;11973:17;11966:47;12030:131;12156:4;12030:131;:::i;:::-;12022:139;;11749:419;;;:::o;12174:348::-;12214:7;12237:20;12255:1;12237:20;:::i;:::-;12232:25;;12271:20;12289:1;12271:20;:::i;:::-;12266:25;;12459:1;12391:66;12387:74;12384:1;12381:81;12376:1;12369:9;12362:17;12358:105;12355:131;;;12466:18;;:::i;:::-;12355:131;12514:1;12511;12507:9;12496:20;;12174:348;;;;:::o;12528:180::-;12576:77;12573:1;12566:88;12673:4;12670:1;12663:15;12697:4;12694:1;12687:15;12714:185;12754:1;12771:20;12789:1;12771:20;:::i;:::-;12766:25;;12805:20;12823:1;12805:20;:::i;:::-;12800:25;;12844:1;12834:35;;12849:18;;:::i;:::-;12834:35;12891:1;12888;12884:9;12879:14;;12714:185;;;;:::o;12905:174::-;13045:26;13041:1;13033:6;13029:14;13022:50;12905:174;:::o;13085:366::-;13227:3;13248:67;13312:2;13307:3;13248:67;:::i;:::-;13241:74;;13324:93;13413:3;13324:93;:::i;:::-;13442:2;13437:3;13433:12;13426:19;;13085:366;;;:::o;13457:419::-;13623:4;13661:2;13650:9;13646:18;13638:26;;13710:9;13704:4;13700:20;13696:1;13685:9;13681:17;13674:47;13738:131;13864:4;13738:131;:::i;:::-;13730:139;;13457:419;;;:::o;13882:332::-;14003:4;14041:2;14030:9;14026:18;14018:26;;14054:71;14122:1;14111:9;14107:17;14098:6;14054:71;:::i;:::-;14135:72;14203:2;14192:9;14188:18;14179:6;14135:72;:::i;:::-;13882:332;;;;;:::o;14220:220::-;14360:34;14356:1;14348:6;14344:14;14337:58;14429:3;14424:2;14416:6;14412:15;14405:28;14220:220;:::o;14446:366::-;14588:3;14609:67;14673:2;14668:3;14609:67;:::i;:::-;14602:74;;14685:93;14774:3;14685:93;:::i;:::-;14803:2;14798:3;14794:12;14787:19;;14446:366;;;:::o;14818:419::-;14984:4;15022:2;15011:9;15007:18;14999:26;;15071:9;15065:4;15061:20;15057:1;15046:9;15042:17;15035:47;15099:131;15225:4;15099:131;:::i;:::-;15091:139;;14818:419;;;:::o;15243:442::-;15392:4;15430:2;15419:9;15415:18;15407:26;;15443:71;15511:1;15500:9;15496:17;15487:6;15443:71;:::i;:::-;15524:72;15592:2;15581:9;15577:18;15568:6;15524:72;:::i;:::-;15606;15674:2;15663:9;15659:18;15650:6;15606:72;:::i;:::-;15243:442;;;;;;:::o;15691:177::-;15831:29;15827:1;15819:6;15815:14;15808:53;15691:177;:::o;15874:366::-;16016:3;16037:67;16101:2;16096:3;16037:67;:::i;:::-;16030:74;;16113:93;16202:3;16113:93;:::i;:::-;16231:2;16226:3;16222:12;16215:19;;15874:366;;;:::o;16246:419::-;16412:4;16450:2;16439:9;16435:18;16427:26;;16499:9;16493:4;16489:20;16485:1;16474:9;16470:17;16463:47;16527:131;16653:4;16527:131;:::i;:::-;16519:139;;16246:419;;;:::o;16671:225::-;16811:34;16807:1;16799:6;16795:14;16788:58;16880:8;16875:2;16867:6;16863:15;16856:33;16671:225;:::o;16902:366::-;17044:3;17065:67;17129:2;17124:3;17065:67;:::i;:::-;17058:74;;17141:93;17230:3;17141:93;:::i;:::-;17259:2;17254:3;17250:12;17243:19;;16902:366;;;:::o;17274:419::-;17440:4;17478:2;17467:9;17463:18;17455:26;;17527:9;17521:4;17517:20;17513:1;17502:9;17498:17;17491:47;17555:131;17681:4;17555:131;:::i;:::-;17547:139;;17274:419;;;:::o;17699:90::-;17733:7;17776:5;17769:13;17762:21;17751:32;;17699:90;;;:::o;17795:116::-;17865:21;17880:5;17865:21;:::i;:::-;17858:5;17855:32;17845:60;;17901:1;17898;17891:12;17845:60;17795:116;:::o;17917:137::-;17971:5;18002:6;17996:13;17987:22;;18018:30;18042:5;18018:30;:::i;:::-;17917:137;;;;:::o;18060:345::-;18127:6;18176:2;18164:9;18155:7;18151:23;18147:32;18144:119;;;18182:79;;:::i;:::-;18144:119;18302:1;18327:61;18380:7;18371:6;18360:9;18356:22;18327:61;:::i;:::-;18317:71;;18273:125;18060:345;;;;:::o;18411:229::-;18551:34;18547:1;18539:6;18535:14;18528:58;18620:12;18615:2;18607:6;18603:15;18596:37;18411:229;:::o;18646:366::-;18788:3;18809:67;18873:2;18868:3;18809:67;:::i;:::-;18802:74;;18885:93;18974:3;18885:93;:::i;:::-;19003:2;18998:3;18994:12;18987:19;;18646:366;;;:::o;19018:419::-;19184:4;19222:2;19211:9;19207:18;19199:26;;19271:9;19265:4;19261:20;19257:1;19246:9;19242:17;19235:47;19299:131;19425:4;19299:131;:::i;:::-;19291:139;;19018:419;;;:::o;19443:99::-;19495:6;19529:5;19523:12;19513:22;;19443:99;;;:::o;19548:307::-;19616:1;19626:113;19640:6;19637:1;19634:13;19626:113;;;19725:1;19720:3;19716:11;19710:18;19706:1;19701:3;19697:11;19690:39;19662:2;19659:1;19655:10;19650:15;;19626:113;;;19757:6;19754:1;19751:13;19748:101;;;19837:1;19828:6;19823:3;19819:16;19812:27;19748:101;19597:258;19548:307;;;:::o;19861:102::-;19902:6;19953:2;19949:7;19944:2;19937:5;19933:14;19929:28;19919:38;;19861:102;;;:::o;19969:364::-;20057:3;20085:39;20118:5;20085:39;:::i;:::-;20140:71;20204:6;20199:3;20140:71;:::i;:::-;20133:78;;20220:52;20265:6;20260:3;20253:4;20246:5;20242:16;20220:52;:::i;:::-;20297:29;20319:6;20297:29;:::i;:::-;20292:3;20288:39;20281:46;;20061:272;19969:364;;;;:::o;20339:313::-;20452:4;20490:2;20479:9;20475:18;20467:26;;20539:9;20533:4;20529:20;20525:1;20514:9;20510:17;20503:47;20567:78;20640:4;20631:6;20567:78;:::i;:::-;20559:86;;20339:313;;;;:::o;20658:179::-;20798:31;20794:1;20786:6;20782:14;20775:55;20658:179;:::o;20843:366::-;20985:3;21006:67;21070:2;21065:3;21006:67;:::i;:::-;20999:74;;21082:93;21171:3;21082:93;:::i;:::-;21200:2;21195:3;21191:12;21184:19;;20843:366;;;:::o;21215:419::-;21381:4;21419:2;21408:9;21404:18;21396:26;;21468:9;21462:4;21458:20;21454:1;21443:9;21439:17;21432:47;21496:131;21622:4;21496:131;:::i;:::-;21488:139;;21215:419;;;:::o;21640:98::-;21691:6;21725:5;21719:12;21709:22;;21640:98;;;:::o;21744:147::-;21845:11;21882:3;21867:18;;21744:147;;;;:::o;21897:373::-;22001:3;22029:38;22061:5;22029:38;:::i;:::-;22083:88;22164:6;22159:3;22083:88;:::i;:::-;22076:95;;22180:52;22225:6;22220:3;22213:4;22206:5;22202:16;22180:52;:::i;:::-;22257:6;22252:3;22248:16;22241:23;;22005:265;21897:373;;;;:::o;22276:271::-;22406:3;22428:93;22517:3;22508:6;22428:93;:::i;:::-;22421:100;;22538:3;22531:10;;22276:271;;;;:::o
Swarm Source
ipfs://4bbb96183f01815c84eac9d5a0ad2f6470dc55fb439c7f2772b94b6d255a0503
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.