More Info
Private Name Tags
ContractCreator
Latest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 20791718 | 68 days ago | IN | 0 ETH | 0.0018404 | ||||
Deposit | 20741788 | 75 days ago | IN | 0 ETH | 0.00054552 | ||||
Withdraw | 20662878 | 86 days ago | IN | 0 ETH | 0.00036492 | ||||
Withdraw | 20655554 | 87 days ago | IN | 0 ETH | 0.00008453 | ||||
Withdraw | 20632812 | 90 days ago | IN | 0 ETH | 0.00017649 | ||||
Deposit | 20608824 | 94 days ago | IN | 0 ETH | 0.00014065 | ||||
Deposit | 20604251 | 94 days ago | IN | 0 ETH | 0.00017338 | ||||
Deposit | 20582049 | 97 days ago | IN | 0 ETH | 0.00035329 | ||||
Deposit | 20565461 | 100 days ago | IN | 0 ETH | 0.00025126 | ||||
Start Reward | 20565342 | 100 days ago | IN | 0 ETH | 0.0000617 | ||||
0x60c06040 | 20565280 | 100 days ago | IN | 0 ETH | 0.00335257 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AccordOneWeekPool
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-08-19 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.26; //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 Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { 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), 'SafeBEP20: 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, 'SafeBEP20: 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, 'SafeBEP20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 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 AccordOneWeekPool is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP 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 apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens.d 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(0x755F57aF4c14aABfe5fBc92b27b015DCDBd30C15); rewardToken = IERC20(0x755F57aF4c14aABfe5fBc92b27b015DCDBd30C15); apy = 30; lockDuration = 1 weeks; exitPenaltyPerc = 10; // staking pool poolInfo.push(PoolInfo({ lpToken: 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) { uint256 initialBalance = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); amountTransferred = pool.lpToken.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 { require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early"); 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; pool.lpToken.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.lpToken.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 <= 30, "May not set higher than 30%"); exitPenaltyPerc = newPenaltyPerc; } }
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":[{"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":"lpToken","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":[{"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
60c06040525f600955348015610013575f80fd5b505f61002361024960201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555073755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505073755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050601e60048190555062093a80600581905550600a6006819055506007604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e88152602001630149d86b81526020015f815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e8600981905550610250565b5f33905090565b60805160a051612d586102945f395f818161050d015281816105f60152818161082601528181610d750152818161126a015261195601525f610c260152612d585ff3fe608060405234801561000f575f80fd5b5060043610610156575f3560e01c806380dc0672116100c1578063b6b55f251161007a578063b6b55f2514610348578063db2e21bc14610364578063f2fde38b1461036e578063f40f0f521461038a578063f7c618c1146103ba578063ff16ef39146103d857610156565b806380dc067214610298578063817b1cd2146102a25780638da5cb5b146102c05780638e0b0198146102de578063999e2f75146102fa578063a913a5f71461031857610156565b8063630b5ba111610113578063630b5ba114610220578063715018a61461022a57806372f702f314610234578063746c8ae11461025257806378c196f31461025c5780637b280def1461027a57610156565b8063045544431461015a5780631526fe27146101785780631959a002146101ab5780633279beab146101dc5780633bcfc4b8146101f85780633ccfd60b14610216575b5f80fd5b6101626103f4565b60405161016f9190612202565b60405180910390f35b610192600480360381019061018d9190612249565b6103fa565b6040516101a294939291906122ee565b60405180910390f35b6101c560048036038101906101c0919061236c565b610454565b6040516101d3929190612397565b60405180910390f35b6101f660048036038101906101f19190612249565b610474565b005b61020061063d565b60405161020d9190612202565b60405180910390f35b61021e610643565b005b610228610a17565b005b610232610ad6565b005b61023c610c24565b60405161024991906123be565b60405180910390f35b61025a610c48565b005b610264610d6f565b6040516102719190612202565b60405180910390f35b610282610e1a565b60405161028f9190612202565b60405180910390f35b6102a0610e20565b005b6102aa610ec6565b6040516102b79190612202565b60405180910390f35b6102c8610ecc565b6040516102d591906123e6565b60405180910390f35b6102f860048036038101906102f39190612249565b610ef3565b005b610302610fd5565b60405161030f9190612202565b60405180910390f35b610332600480360381019061032d919061236c565b61105a565b60405161033f9190612202565b60405180910390f35b610362600480360381019061035d9190612249565b61106f565b005b61036c611518565b005b6103886004803603810190610383919061236c565b61174d565b005b6103a4600480360381019061039f919061236c565b6117ed565b6040516103b19190612202565b60405180910390f35b6103c2611954565b6040516103cf91906123be565b60405180910390f35b6103f260048036038101906103ed9190612249565b611978565b005b60055481565b60078181548110610409575f80fd5b905f5260205f2090600402015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b6008602052805f5260405f205f91509050805f0154908060010154905082565b61047c611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ff90612459565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161056491906123e6565b602060405180830381865afa15801561057f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a3919061248b565b6105ad91906124e3565b8111156105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690612560565b60405180910390fd5b61063a33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b50565b60045481565b600260015403610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067f906125c8565b60405180910390fd5b60026001819055504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070790612630565b60405180910390fd5b5f60075f815481106107255761072461264e565b5b905f5260205f20906004020190505f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490506107835f611af1565b5f6107cb83600101546107bd64e8d4a510006107af8860030154885f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b611c8f90919063ffffffff16565b90505f81111561086b576107dd610d6f565b81111561081f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610816906126eb565b60405180910390fd5b61086a33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5b5f8211156108e1575f835f01819055508160035f82825461088c91906124e3565b925050819055506108e03383865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5b61091264e8d4a510006109048660030154865f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b83600101819055505f835f0154111561097957600554426109339190612709565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506109bc565b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a029190612202565b60405180910390a25050505060018081905550565b610a1f611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa290612459565b60405180910390fd5b5f60078054905090505f5b81811015610ad257610ac781611af1565b806001019050610ab6565b5050565b610ade611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612459565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c50611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390612459565b60405180910390fd5b630149d86b60075f81548110610cf557610cf461264e565b5b905f5260205f2090600402016002015414610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c90612786565b60405180910390fd5b4260075f81548110610d5a57610d5961264e565b5b905f5260205f20906004020160020181905550565b5f6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dcc91906123e6565b602060405180830381865afa158015610de7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0b919061248b565b610e1591906124e3565b905090565b60065481565b610e28611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90612459565b60405180910390fd5b610ebd5f611af1565b5f600481905550565b60035481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610efb611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90612459565b60405180910390fd5b601e811115610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc2906127ee565b60405180910390fd5b8060068190555050565b5f8060075f81548110610feb57610fea61264e565b5b905f5260205f2090600402019050428160020154111561100e575f915050611057565b6301e13380606460045460035484600201544261102b91906124e3565b611035919061280c565b61103f919061280c565b611049919061287a565b611053919061287a565b9150505b90565b6002602052805f5260405f205f915090505481565b6002600154036110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab906125c8565b60405180910390fd5b60026001819055505f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403611150576005544261110e9190612709565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5f60075f815481106111655761116461264e565b5b905f5260205f20906004020190505f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506111bc5f611af1565b5f815f015411156112b1575f61120f826001015461120164e8d4a510006111f38760030154875f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b611c8f90919063ffffffff16565b90505f8111156112af57611221610d6f565b811115611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a906126eb565b60405180910390fd5b6112ae33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5b505b5f80841115611484575f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161131691906123e6565b602060405180830381865afa158015611331573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611355919061248b565b90506113a6333087875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cd8909392919063ffffffff16565b80845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161140291906123e6565b602060405180830381865afa15801561141d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611441919061248b565b61144b91906124e3565b915061146382845f0154611d6190919063ffffffff16565b835f01819055508160035f82825461147b9190612709565b92505081905550505b6114b564e8d4a510006114a78560030154855f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c856040516115039190612202565b60405180910390a25050506001808190555050565b60026001540361155d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611554906125c8565b60405180910390fd5b60026001819055505f60075f8154811061157a5761157961264e565b5b905f5260205f20906004020190505f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490508060035f8282546115e091906124e3565b925050819055504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106116535760646006548261163b919061280c565b611645919061287a565b8161165091906124e3565b90505b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116e23382855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5f825f01819055505f82600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516117399190612202565b60405180910390a250505060018081905550565b611755611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d890612459565b60405180910390fd5b6117ea81611dbe565b50565b5f8060075f815481106118035761180261264e565b5b905f5260205f20906004020190505f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050630149d86b82600201540361186a575f9250505061194f565b5f826003015490505f600354905083600201544211801561188b57505f8114155b15611905575f6118c36009546118b587600101546118a7610fd5565b611bcf90919063ffffffff16565b611c4690919063ffffffff16565b90506119016118f2836118e464e8d4a5100085611bcf90919063ffffffff16565b611c4690919063ffffffff16565b84611d6190919063ffffffff16565b9250505b611948836001015461193a64e8d4a5100061192c86885f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b611c8f90919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611980611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390612459565b60405180910390fd5b612710811115611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a48906128f4565b60405180910390fd5b611a5a5f611af1565b8060048190555050565b5f33905090565b611aec8363a9059cbb60e01b8484604051602401611a8a929190612912565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ee7565b505050565b5f60078281548110611b0657611b0561264e565b5b905f5260205f209060040201905080600201544211611b255750611bcc565b5f60035490505f8103611b42574282600201819055505050611bcc565b5f611b75600954611b678560010154611b59610fd5565b611bcf90919063ffffffff16565b611c4690919063ffffffff16565b9050611bb7611ba483611b9664e8d4a5100085611bcf90919063ffffffff16565b611c4690919063ffffffff16565b8460030154611d6190919063ffffffff16565b83600301819055504283600201819055505050505b50565b5f808303611bdf575f9050611c40565b5f8284611bec919061280c565b9050828482611bfb919061287a565b14611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906129a9565b60405180910390fd5b809150505b92915050565b5f611c8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611fac565b905092915050565b5f611cd083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061200d565b905092915050565b611d5b846323b872dd60e01b858585604051602401611cf9939291906129c7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ee7565b50505050565b5f808284611d6f9190612709565b905083811015611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90612a46565b60405180910390fd5b8091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390612ad4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f611f48826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661206f9092919063ffffffff16565b90505f81511115611fa75780806020019051810190611f679190612b27565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90612bc2565b60405180910390fd5b5b505050565b5f8083118290611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe99190612c40565b60405180910390fd5b505f8385612000919061287a565b9050809150509392505050565b5f838311158290612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204b9190612c40565b60405180910390fd5b505f838561206291906124e3565b9050809150509392505050565b606061207d84845f85612086565b90509392505050565b6060612091856121a3565b6120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790612caa565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516120f89190612d0c565b5f6040518083038185875af1925050503d805f8114612132576040519150601f19603f3d011682016040523d82523d5f602084013e612137565b606091505b5091509150811561214c57809250505061219b565b5f8151111561215e5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121929190612c40565b60405180910390fd5b949350505050565b5f805f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f1b9050833f91508082141580156121e157505f801b8214155b92505050919050565b5f819050919050565b6121fc816121ea565b82525050565b5f6020820190506122155f8301846121f3565b92915050565b5f80fd5b612228816121ea565b8114612232575f80fd5b50565b5f813590506122438161221f565b92915050565b5f6020828403121561225e5761225d61221b565b5b5f61226b84828501612235565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6122b66122b16122ac84612274565b612293565b612274565b9050919050565b5f6122c78261229c565b9050919050565b5f6122d8826122bd565b9050919050565b6122e8816122ce565b82525050565b5f6080820190506123015f8301876122df565b61230e60208301866121f3565b61231b60408301856121f3565b61232860608301846121f3565b95945050505050565b5f61233b82612274565b9050919050565b61234b81612331565b8114612355575f80fd5b50565b5f8135905061236681612342565b92915050565b5f602082840312156123815761238061221b565b5b5f61238e84828501612358565b91505092915050565b5f6040820190506123aa5f8301856121f3565b6123b760208301846121f3565b9392505050565b5f6020820190506123d15f8301846122df565b92915050565b6123e081612331565b82525050565b5f6020820190506123f95f8301846123d7565b92915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6124436020836123ff565b915061244e8261240f565b602082019050919050565b5f6020820190508181035f83015261247081612437565b9050919050565b5f815190506124858161221f565b92915050565b5f602082840312156124a05761249f61221b565b5b5f6124ad84828501612477565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124ed826121ea565b91506124f8836121ea565b92508282039050818111156125105761250f6124b6565b5b92915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f75740000005f82015250565b5f61254a601d836123ff565b915061255582612516565b602082019050919050565b5f6020820190508181035f8301526125778161253e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6125b2601f836123ff565b91506125bd8261257e565b602082019050919050565b5f6020820190508181035f8301526125df816125a6565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c795f82015250565b5f61261a6020836123ff565b9150612625826125e6565b602082019050919050565b5f6020820190508181035f8301526126478161260e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f43616e6e6f74207769746864726177206f746865722070656f706c65277320735f8201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b5f6126d56040836123ff565b91506126e08261267b565b604082019050919050565b5f6020820190508181035f830152612702816126c9565b9050919050565b5f612713826121ea565b915061271e836121ea565b9250828201905080821115612736576127356124b6565b5b92915050565b7f43616e206f6e6c792073746172742072657761726473206f6e636500000000005f82015250565b5f612770601b836123ff565b915061277b8261273c565b602082019050919050565b5f6020820190508181035f83015261279d81612764565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e2033302500000000005f82015250565b5f6127d8601b836123ff565b91506127e3826127a4565b602082019050919050565b5f6020820190508181035f830152612805816127cc565b9050919050565b5f612816826121ea565b9150612821836121ea565b925082820261282f816121ea565b91508282048414831517612846576128456124b6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612884826121ea565b915061288f836121ea565b92508261289f5761289e61284d565b5b828204905092915050565b7f415059206d7573742062652062656c6f772031303030302500000000000000005f82015250565b5f6128de6018836123ff565b91506128e9826128aa565b602082019050919050565b5f6020820190508181035f83015261290b816128d2565b9050919050565b5f6040820190506129255f8301856123d7565b61293260208301846121f3565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129936021836123ff565b915061299e82612939565b604082019050919050565b5f6020820190508181035f8301526129c081612987565b9050919050565b5f6060820190506129da5f8301866123d7565b6129e760208301856123d7565b6129f460408301846121f3565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f612a30601b836123ff565b9150612a3b826129fc565b602082019050919050565b5f6020820190508181035f830152612a5d81612a24565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612abe6026836123ff565b9150612ac982612a64565b604082019050919050565b5f6020820190508181035f830152612aeb81612ab2565b9050919050565b5f8115159050919050565b612b0681612af2565b8114612b10575f80fd5b50565b5f81519050612b2181612afd565b92915050565b5f60208284031215612b3c57612b3b61221b565b5b5f612b4984828501612b13565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f612bac602a836123ff565b9150612bb782612b52565b604082019050919050565b5f6020820190508181035f830152612bd981612ba0565b9050919050565b5f81519050919050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612c1282612be0565b612c1c81856123ff565b9350612c2c818560208601612bea565b612c3581612bf8565b840191505092915050565b5f6020820190508181035f830152612c588184612c08565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f612c94601d836123ff565b9150612c9f82612c60565b602082019050919050565b5f6020820190508181035f830152612cc181612c88565b9050919050565b5f81519050919050565b5f81905092915050565b5f612ce682612cc8565b612cf08185612cd2565b9350612d00818560208601612bea565b80840191505092915050565b5f612d178284612cdc565b91508190509291505056fea264697066735822122074496797a0c773c5184e2f4c4a6dffb35c98c0bfd09fb3f7a9799ad19ae800a464736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610156575f3560e01c806380dc0672116100c1578063b6b55f251161007a578063b6b55f2514610348578063db2e21bc14610364578063f2fde38b1461036e578063f40f0f521461038a578063f7c618c1146103ba578063ff16ef39146103d857610156565b806380dc067214610298578063817b1cd2146102a25780638da5cb5b146102c05780638e0b0198146102de578063999e2f75146102fa578063a913a5f71461031857610156565b8063630b5ba111610113578063630b5ba114610220578063715018a61461022a57806372f702f314610234578063746c8ae11461025257806378c196f31461025c5780637b280def1461027a57610156565b8063045544431461015a5780631526fe27146101785780631959a002146101ab5780633279beab146101dc5780633bcfc4b8146101f85780633ccfd60b14610216575b5f80fd5b6101626103f4565b60405161016f9190612202565b60405180910390f35b610192600480360381019061018d9190612249565b6103fa565b6040516101a294939291906122ee565b60405180910390f35b6101c560048036038101906101c0919061236c565b610454565b6040516101d3929190612397565b60405180910390f35b6101f660048036038101906101f19190612249565b610474565b005b61020061063d565b60405161020d9190612202565b60405180910390f35b61021e610643565b005b610228610a17565b005b610232610ad6565b005b61023c610c24565b60405161024991906123be565b60405180910390f35b61025a610c48565b005b610264610d6f565b6040516102719190612202565b60405180910390f35b610282610e1a565b60405161028f9190612202565b60405180910390f35b6102a0610e20565b005b6102aa610ec6565b6040516102b79190612202565b60405180910390f35b6102c8610ecc565b6040516102d591906123e6565b60405180910390f35b6102f860048036038101906102f39190612249565b610ef3565b005b610302610fd5565b60405161030f9190612202565b60405180910390f35b610332600480360381019061032d919061236c565b61105a565b60405161033f9190612202565b60405180910390f35b610362600480360381019061035d9190612249565b61106f565b005b61036c611518565b005b6103886004803603810190610383919061236c565b61174d565b005b6103a4600480360381019061039f919061236c565b6117ed565b6040516103b19190612202565b60405180910390f35b6103c2611954565b6040516103cf91906123be565b60405180910390f35b6103f260048036038101906103ed9190612249565b611978565b005b60055481565b60078181548110610409575f80fd5b905f5260205f2090600402015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b6008602052805f5260405f205f91509050805f0154908060010154905082565b61047c611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ff90612459565b60405180910390fd5b6003547f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161056491906123e6565b602060405180830381865afa15801561057f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a3919061248b565b6105ad91906124e3565b8111156105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690612560565b60405180910390fd5b61063a33827f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b50565b60045481565b600260015403610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067f906125c8565b60405180910390fd5b60026001819055504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070790612630565b60405180910390fd5b5f60075f815481106107255761072461264e565b5b905f5260205f20906004020190505f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490506107835f611af1565b5f6107cb83600101546107bd64e8d4a510006107af8860030154885f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b611c8f90919063ffffffff16565b90505f81111561086b576107dd610d6f565b81111561081f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610816906126eb565b60405180910390fd5b61086a33827f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5b5f8211156108e1575f835f01819055508160035f82825461088c91906124e3565b925050819055506108e03383865f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5b61091264e8d4a510006109048660030154865f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b83600101819055505f835f0154111561097957600554426109339190612709565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506109bc565b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a029190612202565b60405180910390a25050505060018081905550565b610a1f611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa290612459565b60405180910390fd5b5f60078054905090505f5b81811015610ad257610ac781611af1565b806001019050610ab6565b5050565b610ade611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612459565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1581565b610c50611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390612459565b60405180910390fd5b630149d86b60075f81548110610cf557610cf461264e565b5b905f5260205f2090600402016002015414610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c90612786565b60405180910390fd5b4260075f81548110610d5a57610d5961264e565b5b905f5260205f20906004020160020181905550565b5f6003547f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dcc91906123e6565b602060405180830381865afa158015610de7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0b919061248b565b610e1591906124e3565b905090565b60065481565b610e28611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90612459565b60405180910390fd5b610ebd5f611af1565b5f600481905550565b60035481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610efb611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90612459565b60405180910390fd5b601e811115610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc2906127ee565b60405180910390fd5b8060068190555050565b5f8060075f81548110610feb57610fea61264e565b5b905f5260205f2090600402019050428160020154111561100e575f915050611057565b6301e13380606460045460035484600201544261102b91906124e3565b611035919061280c565b61103f919061280c565b611049919061287a565b611053919061287a565b9150505b90565b6002602052805f5260405f205f915090505481565b6002600154036110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab906125c8565b60405180910390fd5b60026001819055505f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403611150576005544261110e9190612709565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5f60075f815481106111655761116461264e565b5b905f5260205f20906004020190505f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506111bc5f611af1565b5f815f015411156112b1575f61120f826001015461120164e8d4a510006111f38760030154875f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b611c8f90919063ffffffff16565b90505f8111156112af57611221610d6f565b811115611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a906126eb565b60405180910390fd5b6112ae33827f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1573ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5b505b5f80841115611484575f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161131691906123e6565b602060405180830381865afa158015611331573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611355919061248b565b90506113a6333087875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cd8909392919063ffffffff16565b80845f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161140291906123e6565b602060405180830381865afa15801561141d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611441919061248b565b61144b91906124e3565b915061146382845f0154611d6190919063ffffffff16565b835f01819055508160035f82825461147b9190612709565b92505081905550505b6114b564e8d4a510006114a78560030154855f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c856040516115039190612202565b60405180910390a25050506001808190555050565b60026001540361155d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611554906125c8565b60405180910390fd5b60026001819055505f60075f8154811061157a5761157961264e565b5b905f5260205f20906004020190505f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490508060035f8282546115e091906124e3565b925050819055504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106116535760646006548261163b919061280c565b611645919061287a565b8161165091906124e3565b90505b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116e23382855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a6b9092919063ffffffff16565b5f825f01819055505f82600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516117399190612202565b60405180910390a250505060018081905550565b611755611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d890612459565b60405180910390fd5b6117ea81611dbe565b50565b5f8060075f815481106118035761180261264e565b5b905f5260205f20906004020190505f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050630149d86b82600201540361186a575f9250505061194f565b5f826003015490505f600354905083600201544211801561188b57505f8114155b15611905575f6118c36009546118b587600101546118a7610fd5565b611bcf90919063ffffffff16565b611c4690919063ffffffff16565b90506119016118f2836118e464e8d4a5100085611bcf90919063ffffffff16565b611c4690919063ffffffff16565b84611d6190919063ffffffff16565b9250505b611948836001015461193a64e8d4a5100061192c86885f0154611bcf90919063ffffffff16565b611c4690919063ffffffff16565b611c8f90919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000755f57af4c14aabfe5fbc92b27b015dcdbd30c1581565b611980611a64565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390612459565b60405180910390fd5b612710811115611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a48906128f4565b60405180910390fd5b611a5a5f611af1565b8060048190555050565b5f33905090565b611aec8363a9059cbb60e01b8484604051602401611a8a929190612912565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ee7565b505050565b5f60078281548110611b0657611b0561264e565b5b905f5260205f209060040201905080600201544211611b255750611bcc565b5f60035490505f8103611b42574282600201819055505050611bcc565b5f611b75600954611b678560010154611b59610fd5565b611bcf90919063ffffffff16565b611c4690919063ffffffff16565b9050611bb7611ba483611b9664e8d4a5100085611bcf90919063ffffffff16565b611c4690919063ffffffff16565b8460030154611d6190919063ffffffff16565b83600301819055504283600201819055505050505b50565b5f808303611bdf575f9050611c40565b5f8284611bec919061280c565b9050828482611bfb919061287a565b14611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906129a9565b60405180910390fd5b809150505b92915050565b5f611c8783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611fac565b905092915050565b5f611cd083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061200d565b905092915050565b611d5b846323b872dd60e01b858585604051602401611cf9939291906129c7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ee7565b50505050565b5f808284611d6f9190612709565b905083811015611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90612a46565b60405180910390fd5b8091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390612ad4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f611f48826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661206f9092919063ffffffff16565b90505f81511115611fa75780806020019051810190611f679190612b27565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90612bc2565b60405180910390fd5b5b505050565b5f8083118290611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe99190612c40565b60405180910390fd5b505f8385612000919061287a565b9050809150509392505050565b5f838311158290612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204b9190612c40565b60405180910390fd5b505f838561206291906124e3565b9050809150509392505050565b606061207d84845f85612086565b90509392505050565b6060612091856121a3565b6120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790612caa565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516120f89190612d0c565b5f6040518083038185875af1925050503d805f8114612132576040519150601f19603f3d011682016040523d82523d5f602084013e612137565b606091505b5091509150811561214c57809250505061219b565b5f8151111561215e5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121929190612c40565b60405180910390fd5b949350505050565b5f805f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f1b9050833f91508082141580156121e157505f801b8214155b92505050919050565b5f819050919050565b6121fc816121ea565b82525050565b5f6020820190506122155f8301846121f3565b92915050565b5f80fd5b612228816121ea565b8114612232575f80fd5b50565b5f813590506122438161221f565b92915050565b5f6020828403121561225e5761225d61221b565b5b5f61226b84828501612235565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6122b66122b16122ac84612274565b612293565b612274565b9050919050565b5f6122c78261229c565b9050919050565b5f6122d8826122bd565b9050919050565b6122e8816122ce565b82525050565b5f6080820190506123015f8301876122df565b61230e60208301866121f3565b61231b60408301856121f3565b61232860608301846121f3565b95945050505050565b5f61233b82612274565b9050919050565b61234b81612331565b8114612355575f80fd5b50565b5f8135905061236681612342565b92915050565b5f602082840312156123815761238061221b565b5b5f61238e84828501612358565b91505092915050565b5f6040820190506123aa5f8301856121f3565b6123b760208301846121f3565b9392505050565b5f6020820190506123d15f8301846122df565b92915050565b6123e081612331565b82525050565b5f6020820190506123f95f8301846123d7565b92915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6124436020836123ff565b915061244e8261240f565b602082019050919050565b5f6020820190508181035f83015261247081612437565b9050919050565b5f815190506124858161221f565b92915050565b5f602082840312156124a05761249f61221b565b5b5f6124ad84828501612477565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124ed826121ea565b91506124f8836121ea565b92508282039050818111156125105761250f6124b6565b5b92915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f75740000005f82015250565b5f61254a601d836123ff565b915061255582612516565b602082019050919050565b5f6020820190508181035f8301526125778161253e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6125b2601f836123ff565b91506125bd8261257e565b602082019050919050565b5f6020820190508181035f8301526125df816125a6565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c795f82015250565b5f61261a6020836123ff565b9150612625826125e6565b602082019050919050565b5f6020820190508181035f8301526126478161260e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f43616e6e6f74207769746864726177206f746865722070656f706c65277320735f8201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b5f6126d56040836123ff565b91506126e08261267b565b604082019050919050565b5f6020820190508181035f830152612702816126c9565b9050919050565b5f612713826121ea565b915061271e836121ea565b9250828201905080821115612736576127356124b6565b5b92915050565b7f43616e206f6e6c792073746172742072657761726473206f6e636500000000005f82015250565b5f612770601b836123ff565b915061277b8261273c565b602082019050919050565b5f6020820190508181035f83015261279d81612764565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e2033302500000000005f82015250565b5f6127d8601b836123ff565b91506127e3826127a4565b602082019050919050565b5f6020820190508181035f830152612805816127cc565b9050919050565b5f612816826121ea565b9150612821836121ea565b925082820261282f816121ea565b91508282048414831517612846576128456124b6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612884826121ea565b915061288f836121ea565b92508261289f5761289e61284d565b5b828204905092915050565b7f415059206d7573742062652062656c6f772031303030302500000000000000005f82015250565b5f6128de6018836123ff565b91506128e9826128aa565b602082019050919050565b5f6020820190508181035f83015261290b816128d2565b9050919050565b5f6040820190506129255f8301856123d7565b61293260208301846121f3565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129936021836123ff565b915061299e82612939565b604082019050919050565b5f6020820190508181035f8301526129c081612987565b9050919050565b5f6060820190506129da5f8301866123d7565b6129e760208301856123d7565b6129f460408301846121f3565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f612a30601b836123ff565b9150612a3b826129fc565b602082019050919050565b5f6020820190508181035f830152612a5d81612a24565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612abe6026836123ff565b9150612ac982612a64565b604082019050919050565b5f6020820190508181035f830152612aeb81612ab2565b9050919050565b5f8115159050919050565b612b0681612af2565b8114612b10575f80fd5b50565b5f81519050612b2181612afd565b92915050565b5f60208284031215612b3c57612b3b61221b565b5b5f612b4984828501612b13565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f612bac602a836123ff565b9150612bb782612b52565b604082019050919050565b5f6020820190508181035f830152612bd981612ba0565b9050919050565b5f81519050919050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612c1282612be0565b612c1c81856123ff565b9350612c2c818560208601612bea565b612c3581612bf8565b840191505092915050565b5f6020820190508181035f830152612c588184612c08565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f612c94601d836123ff565b9150612c9f82612c60565b602082019050919050565b5f6020820190508181035f830152612cc181612c88565b9050919050565b5f81519050919050565b5f81905092915050565b5f612ce682612cc8565b612cf08185612cd2565b9350612d00818560208601612bea565b80840191505092915050565b5f612d178284612cdc565b91508190509291505056fea264697066735822122074496797a0c773c5184e2f4c4a6dffb35c98c0bfd09fb3f7a9799ad19ae800a464736f6c634300081a0033
Deployed Bytecode Sourcemap
24694:8598:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25661:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25761:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;25844:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;32195:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25636:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30159:1151;;;:::i;:::-;;28595:190;;;:::i;:::-;;2815:140;;;:::i;:::-;;25457:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26843:204;;;:::i;:::-;;32776:133;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25695:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26744:91;;;:::i;:::-;;25603:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2173:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33097:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32459:309;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25542:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28822:1281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31381:665;;;:::i;:::-;;3110:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27112:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25500:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32917:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25661:27;;;;:::o;25761:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25844:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32195:256::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32333:11:::1;;32294;:21;;;32324:4;32294:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32283:7;:61;;32275:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32389:54;32422:10;32435:7;32389:11;:24;;;;:54;;;;;:::i;:::-;32195:256:::0;:::o;25636:18::-;;;;:::o;30159:1151::-;23747:1;24345:7;;:19;24337:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23747:1;24478:7;:18;;;;30250:15:::1;30218:16;:28;30235:10;30218:28;;;;;;;;;;;;;;;;:47;;30210:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;30323:21;30347:8;30356:1;30347:11;;;;;;;;:::i;:::-;;;;;;;;;;;;30323:35;;30369:21;30393:8;:20;30402:10;30393:20;;;;;;;;;;;;;;;30369:44;;30426:15;30444:4;:11;;;30426:29;;30466:13;30477:1;30466:10;:13::i;:::-;30490:15;30508:70;30562:4;:15;;;30508:49;30552:4;30508:39;30524:4;:22;;;30508:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;30490:88;;30602:1;30592:7;:11;30589:218;;;30639:18;:16;:18::i;:::-;30628:7;:29;;30620:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30741:54;30774:10;30787:7;30741:11;:24;;;;:54;;;;;:::i;:::-;30589:218;30832:1;30822:7;:11;30819:165;;;30864:1;30850:4;:11;;:15;;;;30895:7;30880:11;;:22;;;;;;;:::i;:::-;;;;;;;;30917:55;30951:10;30964:7;30917:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;30819:165;31014:49;31058:4;31014:39;31030:4;:22;;;31014:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;30996:4;:15;;:67;;;;31101:1;31087:4;:11;;;:15;31084:172;;;31167:12;;31149:15;:30;;;;:::i;:::-;31118:16;:28;31135:10;31118:28;;;;;;;;;;;;;;;:61;;;;31084:172;;;31243:1;31212:16;:28;31229:10;31212:28;;;;;;;;;;;;;;;:32;;;;31084:172;31282:10;31273:29;;;31294:7;31273:29;;;;;;:::i;:::-;;;;;;;;30199:1111;;;;23703:1:::0;24657:7;:22;;;;30159:1151::o;28595:190::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28650:14:::1;28667:8;:15;;;;28650:32;;28698:11;28693:85;28721:6;28715:3;:12;28693:85;;;28751:15;28762:3;28751:10;:15::i;:::-;28729:5;;;;;28693:85;;;;28639:146;28595:190::o:0;2815:140::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2914:1:::1;2877:40;;2898:6;::::0;::::1;;;;;;;;2877:40;;;;;;;;;;;;2945:1;2928:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2815:140::o:0;25457:36::-;;;:::o;26843:204::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26939:8:::1;26904;26913:1;26904:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:43;26896:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;27024:15;26990:8;26999:1;26990:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;26843:204::o:0;32776:133::-;32825:7;32890:11;;32851;:21;;;32881:4;32851:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32844:57;;32776:133;:::o;25695:30::-;;;;:::o;26744:91::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26796:13:::1;26807:1;26796:10;:13::i;:::-;26826:1;26820:3;:7;;;;26744:91::o:0;25603:26::-;;;;:::o;2173:79::-;2211:7;2238:6;;;;;;;;;;;2231:13;;2173:79;:::o;33097:192::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33204:2:::1;33186:14;:20;;33178:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33267:14;33249:15;:32;;;;33097:192:::0;:::o;32459:309::-;32511:7;32531:21;32555:8;32564:1;32555:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32531:35;;32607:15;32580:4;:24;;;:42;32577:81;;;32645:1;32638:8;;;;;32577:81;32751:8;32745:3;32739;;32724:11;;32696:4;:24;;;32678:15;:42;;;;:::i;:::-;32677:58;;;;:::i;:::-;32676:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32668:92;;;32459:309;;:::o;25542:52::-;;;;;;;;;;;;;;;;;:::o;28822:1281::-;23747:1;24345:7;;:19;24337:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23747:1;24478:7;:18;;;;28922:1:::1;28890:16;:28;28907:10;28890:28;;;;;;;;;;;;;;;;:33:::0;28887:125:::1;;28988:12;;28970:15;:30;;;;:::i;:::-;28939:16;:28;28956:10;28939:28;;;;;;;;;;;;;;;:61;;;;28887:125;29022:21;29046:8;29055:1;29046:11;;;;;;;;:::i;:::-;;;;;;;;;;;;29022:35;;29068:21;29092:8;:20;29101:10;29092:20;;;;;;;;;;;;;;;29068:44;;29125:13;29136:1;29125:10;:13::i;:::-;29167:1;29153:4;:11;;;:15;29149:380;;;29185:15;29203:70;29257:4;:15;;;29203:49;29247:4;29203:39;29219:4;:22;;;29203:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;29185:88;;29301:1;29291:7;:11;29288:230;;;29342:18;:16;:18::i;:::-;29331:7;:29;;29323:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;29448:54;29481:10;29494:7;29448:11;:24;;;;:54;;;;;:::i;:::-;29288:230;29170:359;29149:380;29539:25;29592:1:::0;29582:7:::1;:11;29579:393;;;29610:22;29635:4;:12;;;;;;;;;;;;:22;;;29666:4;29635:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29610:62;;29687:74;29725:10;29746:4;29753:7;29687:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;29836:14;29796:4;:12;;;;;;;;;;;;:22;;;29827:4;29796:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29776:74;;29879:34;29895:17;29879:4;:11;;;:15;;:34;;;;:::i;:::-;29865:4;:11;;:48;;;;29943:17;29928:11;;:32;;;;;;;:::i;:::-;;;;;;;;29595:377;29579:393;30000:49;30044:4;30000:39;30016:4;:22;;;30000:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;29982:4;:15;;:67;;;;30075:10;30067:28;;;30087:7;30067:28;;;;;;:::i;:::-;;;;;;;;28876:1227;;;23703:1:::0;24657:7;:22;;;;28822:1281;:::o;31381:665::-;23747:1;24345:7;;:19;24337:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23747:1;24478:7;:18;;;;31443:21:::1;31467:8;31476:1;31467:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31443:35;;31489:21;31513:8;:20;31522:10;31513:20;;;;;;;;;;;;;;;31489:44;;31544:15;31562:4;:11;;;31544:29;;31599:7;31584:11;;:22;;;;;;;:::i;:::-;;;;;;;;31735:15;31703:16;:28;31720:10;31703:28;;;;;;;;;;;;;;;;:47;31700:120;;31805:3;31787:15;;31777:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31766:42;;;;;:::i;:::-;;;31700:120;31861:1;31830:16;:28;31847:10;31830:28;;;;;;;;;;;;;;;:32;;;;31873:55;31907:10;31920:7;31873:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;31953:1;31939:4;:11;;:15;;;;31983:1;31965:4;:15;;:19;;;;32018:10;32000:38;;;32030:7;32000:38;;;;;;:::i;:::-;;;;;;;;31432:614;;;23703:1:::0;24657:7;:22;;;;31381:665::o;3110:109::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3183:28:::1;3202:8;3183:18;:28::i;:::-;3110:109:::0;:::o;27112:724::-;27173:7;27193:21;27217:8;27226:1;27217:11;;;;;;;;:::i;:::-;;;;;;;;;;;;27193:35;;27239:21;27263:8;:15;27272:5;27263:15;;;;;;;;;;;;;;;27239:39;;27320:8;27292:4;:24;;;:36;27289:75;;27351:1;27344:8;;;;;;27289:75;27374:25;27402:4;:22;;;27374:50;;27435:16;27454:11;;27435:30;;27498:4;:24;;;27480:15;:42;:59;;;;;27538:1;27526:8;:13;;27480:59;27476:270;;;27556:19;27578:63;27625:15;;27578:42;27604:4;:15;;;27578:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27556:85;;27676:58;27698:35;27724:8;27698:21;27714:4;27698:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;27676:17;:21;;:58;;;;:::i;:::-;27656:78;;27541:205;27476:270;27763:65;27812:4;:15;;;27763:44;27802:4;27763:34;27779:17;27763:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;27756:72;;;;;;27112:724;;;;:::o;25500:35::-;;;:::o;32917:172::-;2395:12;:10;:12::i;:::-;2385:22;;:6;;;;;;;;;;:22;;;2377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33000:5:::1;32990:6;:15;;32982:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;33045:13;33056:1;33045:10;:13::i;:::-;33075:6;33069:3;:12;;;;32917:172:::0;:::o;828:107::-;873:15;916:10;901:26;;828:107;:::o;13214:211::-;13331:86;13351:5;13381:23;;;13406:2;13410:5;13358:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13331:19;:86::i;:::-;13214:211;;;:::o;27912:600::-;27966:21;27990:8;27999:4;27990:14;;;;;;;;:::i;:::-;;;;;;;;;;;;27966:38;;28038:4;:24;;;28019:15;:43;28015:82;;28079:7;;;28015:82;28107:16;28126:11;;28107:30;;28164:1;28152:8;:13;28148:109;;28209:15;28182:4;:24;;:42;;;;28239:7;;;;28148:109;28267:19;28289:63;28336:15;;28289:42;28315:4;:15;;;28289:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;28267:85;;28388:63;28415:35;28441:8;28415:21;28431:4;28415:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;28388:4;:22;;;:26;;:63;;;;:::i;:::-;28363:4;:22;;:88;;;;28489:15;28462:4;:24;;:42;;;;27955:557;;;27912:600;;:::o;5789:471::-;5847:7;6097:1;6092;:6;6088:47;;6122:1;6115:8;;;;6088:47;6147:9;6163:1;6159;:5;;;;:::i;:::-;6147:17;;6192:1;6187;6183;:5;;;;:::i;:::-;:10;6175:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6251:1;6244:8;;;5789:471;;;;;:::o;6736:132::-;6794:7;6821:39;6825:1;6828;6821:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6814:46;;6736:132;;;;:::o;4865:136::-;4923:7;4950:43;4954:1;4957;4950:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4943:50;;4865:136;;;;:::o;13433:248::-;13577:96;13597:5;13627:27;;;13656:4;13662:2;13666:5;13604:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13577:19;:96::i;:::-;13433:248;;;;:::o;4401:181::-;4459:7;4479:9;4495:1;4491;:5;;;;:::i;:::-;4479:17;;4520:1;4515;:6;;4507:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4573:1;4566:8;;;4401:181;;;;:::o;3325:229::-;3419:1;3399:22;;:8;:22;;;3391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3509:8;3480:38;;3501:6;;;;;;;;;;3480:38;;;;;;;;;;;;3538:8;3529:6;;:17;;;;;;;;;;;;;;;;;;3325:229;:::o;15749:774::-;16173:23;16199:69;16227:4;16199:69;;;;;;;;;;;;;;;;;16207:5;16199:27;;;;:69;;;;;:::i;:::-;16173:95;;16303:1;16283:10;:17;:21;16279:237;;;16438:10;16427:30;;;;;;;;;;;;:::i;:::-;16419:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16279:237;15819:704;15749:774;;:::o;7364:312::-;7484:7;7516:1;7512;:5;7519:12;7504:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7543:9;7559:1;7555;:5;;;;:::i;:::-;7543:17;;7667:1;7660:8;;;7364:312;;;;;:::o;5304:226::-;5424:7;5457:1;5452;:6;;5460:12;5444:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5484:9;5500:1;5496;:5;;;;:::i;:::-;5484:17;;5521:1;5514:8;;;5304:226;;;;;:::o;20348:230::-;20485:12;20517:53;20540:6;20548:4;20554:1;20557:12;20517:22;:53::i;:::-;20510:60;;20348:230;;;;;:::o;21836:1020::-;22009:12;22042:18;22053:6;22042:10;:18::i;:::-;22034:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22168:12;22182:23;22209:6;:11;;22228:8;22238:4;22209:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22167:76;;;;22258:7;22254:595;;;22289:10;22282:17;;;;;;22254:595;22423:1;22403:10;:17;:21;22399:439;;;22666:10;22660:17;22727:15;22714:10;22710:2;22706:19;22699:44;22399:439;22809:12;22802:20;;;;;;;;;;;:::i;:::-;;;;;;;;21836:1020;;;;;;;:::o;17211:641::-;17271:4;17533:16;17560:19;17582:66;17560:88;;;;17764:7;17752:20;17740:32;;17813:11;17801:8;:23;;:42;;;;;17840:3;17828:15;;:8;:15;;17801:42;17793:51;;;;17211: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:194;6301:4;6321:20;6339:1;6321:20;:::i;:::-;6316:25;;6355:20;6373:1;6355:20;:::i;:::-;6350:25;;6399:1;6396;6392:9;6384:17;;6423:1;6417:4;6414:11;6411:37;;;6428:18;;:::i;:::-;6411:37;6261:194;;;;:::o;6461:179::-;6601:31;6597:1;6589:6;6585:14;6578:55;6461:179;:::o;6646:366::-;6788:3;6809:67;6873:2;6868:3;6809:67;:::i;:::-;6802:74;;6885:93;6974:3;6885:93;:::i;:::-;7003:2;6998:3;6994:12;6987:19;;6646:366;;;:::o;7018:419::-;7184:4;7222:2;7211:9;7207:18;7199:26;;7271:9;7265:4;7261:20;7257:1;7246:9;7242:17;7235:47;7299:131;7425:4;7299:131;:::i;:::-;7291:139;;7018:419;;;:::o;7443:181::-;7583:33;7579:1;7571:6;7567:14;7560:57;7443:181;:::o;7630:366::-;7772:3;7793:67;7857:2;7852:3;7793:67;:::i;:::-;7786:74;;7869:93;7958:3;7869:93;:::i;:::-;7987:2;7982:3;7978:12;7971:19;;7630:366;;;:::o;8002:419::-;8168:4;8206:2;8195:9;8191:18;8183:26;;8255:9;8249:4;8245:20;8241:1;8230:9;8226:17;8219:47;8283:131;8409:4;8283:131;:::i;:::-;8275:139;;8002:419;;;:::o;8427:182::-;8567:34;8563:1;8555:6;8551:14;8544:58;8427:182;:::o;8615:366::-;8757:3;8778:67;8842:2;8837:3;8778:67;:::i;:::-;8771:74;;8854:93;8943:3;8854:93;:::i;:::-;8972:2;8967:3;8963:12;8956:19;;8615:366;;;:::o;8987:419::-;9153:4;9191:2;9180:9;9176:18;9168:26;;9240:9;9234:4;9230:20;9226:1;9215:9;9211:17;9204:47;9268:131;9394:4;9268:131;:::i;:::-;9260:139;;8987:419;;;:::o;9412:180::-;9460:77;9457:1;9450:88;9557:4;9554:1;9547:15;9581:4;9578:1;9571:15;9598:251;9738:34;9734:1;9726:6;9722:14;9715:58;9807:34;9802:2;9794:6;9790:15;9783:59;9598:251;:::o;9855:366::-;9997:3;10018:67;10082:2;10077:3;10018:67;:::i;:::-;10011:74;;10094:93;10183:3;10094:93;:::i;:::-;10212:2;10207:3;10203:12;10196:19;;9855:366;;;:::o;10227:419::-;10393:4;10431:2;10420:9;10416:18;10408:26;;10480:9;10474:4;10470:20;10466:1;10455:9;10451:17;10444:47;10508:131;10634:4;10508:131;:::i;:::-;10500:139;;10227:419;;;:::o;10652:191::-;10692:3;10711:20;10729:1;10711:20;:::i;:::-;10706:25;;10745:20;10763:1;10745:20;:::i;:::-;10740:25;;10788:1;10785;10781:9;10774:16;;10809:3;10806:1;10803:10;10800:36;;;10816:18;;:::i;:::-;10800:36;10652:191;;;;:::o;10849:177::-;10989:29;10985:1;10977:6;10973:14;10966:53;10849:177;:::o;11032:366::-;11174:3;11195:67;11259:2;11254:3;11195:67;:::i;:::-;11188:74;;11271:93;11360:3;11271:93;:::i;:::-;11389:2;11384:3;11380:12;11373:19;;11032:366;;;:::o;11404:419::-;11570:4;11608:2;11597:9;11593:18;11585:26;;11657:9;11651:4;11647:20;11643:1;11632:9;11628:17;11621:47;11685:131;11811:4;11685:131;:::i;:::-;11677:139;;11404:419;;;:::o;11829:177::-;11969:29;11965:1;11957:6;11953:14;11946:53;11829:177;:::o;12012:366::-;12154:3;12175:67;12239:2;12234:3;12175:67;:::i;:::-;12168:74;;12251:93;12340:3;12251:93;:::i;:::-;12369:2;12364:3;12360:12;12353:19;;12012:366;;;:::o;12384:419::-;12550:4;12588:2;12577:9;12573:18;12565:26;;12637:9;12631:4;12627:20;12623:1;12612:9;12608:17;12601:47;12665:131;12791:4;12665:131;:::i;:::-;12657:139;;12384:419;;;:::o;12809:410::-;12849:7;12872:20;12890:1;12872:20;:::i;:::-;12867:25;;12906:20;12924:1;12906:20;:::i;:::-;12901:25;;12961:1;12958;12954:9;12983:30;13001:11;12983:30;:::i;:::-;12972:41;;13162:1;13153:7;13149:15;13146:1;13143:22;13123:1;13116:9;13096:83;13073:139;;13192:18;;:::i;:::-;13073:139;12857:362;12809:410;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:185;13451:1;13468:20;13486:1;13468:20;:::i;:::-;13463:25;;13502:20;13520:1;13502:20;:::i;:::-;13497:25;;13541:1;13531:35;;13546:18;;:::i;:::-;13531:35;13588:1;13585;13581:9;13576:14;;13411:185;;;;:::o;13602:174::-;13742:26;13738:1;13730:6;13726:14;13719:50;13602:174;:::o;13782:366::-;13924:3;13945:67;14009:2;14004:3;13945:67;:::i;:::-;13938:74;;14021:93;14110:3;14021:93;:::i;:::-;14139:2;14134:3;14130:12;14123:19;;13782:366;;;:::o;14154:419::-;14320:4;14358:2;14347:9;14343:18;14335:26;;14407:9;14401:4;14397:20;14393:1;14382:9;14378:17;14371:47;14435:131;14561:4;14435:131;:::i;:::-;14427:139;;14154:419;;;:::o;14579:332::-;14700:4;14738:2;14727:9;14723:18;14715:26;;14751:71;14819:1;14808:9;14804:17;14795:6;14751:71;:::i;:::-;14832:72;14900:2;14889:9;14885:18;14876:6;14832:72;:::i;:::-;14579:332;;;;;:::o;14917:220::-;15057:34;15053:1;15045:6;15041:14;15034:58;15126:3;15121:2;15113:6;15109:15;15102:28;14917:220;:::o;15143:366::-;15285:3;15306:67;15370:2;15365:3;15306:67;:::i;:::-;15299:74;;15382:93;15471:3;15382:93;:::i;:::-;15500:2;15495:3;15491:12;15484:19;;15143:366;;;:::o;15515:419::-;15681:4;15719:2;15708:9;15704:18;15696:26;;15768:9;15762:4;15758:20;15754:1;15743:9;15739:17;15732:47;15796:131;15922:4;15796:131;:::i;:::-;15788:139;;15515:419;;;:::o;15940:442::-;16089:4;16127:2;16116:9;16112:18;16104:26;;16140:71;16208:1;16197:9;16193:17;16184:6;16140:71;:::i;:::-;16221:72;16289:2;16278:9;16274:18;16265:6;16221:72;:::i;:::-;16303;16371:2;16360:9;16356:18;16347:6;16303:72;:::i;:::-;15940:442;;;;;;:::o;16388:177::-;16528:29;16524:1;16516:6;16512:14;16505:53;16388:177;:::o;16571:366::-;16713:3;16734:67;16798:2;16793:3;16734:67;:::i;:::-;16727:74;;16810:93;16899:3;16810:93;:::i;:::-;16928:2;16923:3;16919:12;16912:19;;16571:366;;;:::o;16943:419::-;17109:4;17147:2;17136:9;17132:18;17124:26;;17196:9;17190:4;17186:20;17182:1;17171:9;17167:17;17160:47;17224:131;17350:4;17224:131;:::i;:::-;17216:139;;16943:419;;;:::o;17368:225::-;17508:34;17504:1;17496:6;17492:14;17485:58;17577:8;17572:2;17564:6;17560:15;17553:33;17368:225;:::o;17599:366::-;17741:3;17762:67;17826:2;17821:3;17762:67;:::i;:::-;17755:74;;17838:93;17927:3;17838:93;:::i;:::-;17956:2;17951:3;17947:12;17940:19;;17599:366;;;:::o;17971:419::-;18137:4;18175:2;18164:9;18160:18;18152:26;;18224:9;18218:4;18214:20;18210:1;18199:9;18195:17;18188:47;18252:131;18378:4;18252:131;:::i;:::-;18244:139;;17971:419;;;:::o;18396:90::-;18430:7;18473:5;18466:13;18459:21;18448:32;;18396:90;;;:::o;18492:116::-;18562:21;18577:5;18562:21;:::i;:::-;18555:5;18552:32;18542:60;;18598:1;18595;18588:12;18542:60;18492:116;:::o;18614:137::-;18668:5;18699:6;18693:13;18684:22;;18715:30;18739:5;18715:30;:::i;:::-;18614:137;;;;:::o;18757:345::-;18824:6;18873:2;18861:9;18852:7;18848:23;18844:32;18841:119;;;18879:79;;:::i;:::-;18841:119;18999:1;19024:61;19077:7;19068:6;19057:9;19053:22;19024:61;:::i;:::-;19014:71;;18970:125;18757:345;;;;:::o;19108:229::-;19248:34;19244:1;19236:6;19232:14;19225:58;19317:12;19312:2;19304:6;19300:15;19293:37;19108:229;:::o;19343:366::-;19485:3;19506:67;19570:2;19565:3;19506:67;:::i;:::-;19499:74;;19582:93;19671:3;19582:93;:::i;:::-;19700:2;19695:3;19691:12;19684:19;;19343:366;;;:::o;19715:419::-;19881:4;19919:2;19908:9;19904:18;19896:26;;19968:9;19962:4;19958:20;19954:1;19943:9;19939:17;19932:47;19996:131;20122:4;19996:131;:::i;:::-;19988:139;;19715:419;;;:::o;20140:99::-;20192:6;20226:5;20220:12;20210:22;;20140:99;;;:::o;20245:139::-;20334:6;20329:3;20324;20318:23;20375:1;20366:6;20361:3;20357:16;20350:27;20245:139;;;:::o;20390:102::-;20431:6;20482:2;20478:7;20473:2;20466:5;20462:14;20458:28;20448:38;;20390:102;;;:::o;20498:377::-;20586:3;20614:39;20647:5;20614:39;:::i;:::-;20669:71;20733:6;20728:3;20669:71;:::i;:::-;20662:78;;20749:65;20807:6;20802:3;20795:4;20788:5;20784:16;20749:65;:::i;:::-;20839:29;20861:6;20839:29;:::i;:::-;20834:3;20830:39;20823:46;;20590:285;20498:377;;;;:::o;20881:313::-;20994:4;21032:2;21021:9;21017:18;21009:26;;21081:9;21075:4;21071:20;21067:1;21056:9;21052:17;21045:47;21109:78;21182:4;21173:6;21109:78;:::i;:::-;21101:86;;20881:313;;;;:::o;21200:179::-;21340:31;21336:1;21328:6;21324:14;21317:55;21200:179;:::o;21385:366::-;21527:3;21548:67;21612:2;21607:3;21548:67;:::i;:::-;21541:74;;21624:93;21713:3;21624:93;:::i;:::-;21742:2;21737:3;21733:12;21726:19;;21385:366;;;:::o;21757:419::-;21923:4;21961:2;21950:9;21946:18;21938:26;;22010:9;22004:4;22000:20;21996:1;21985:9;21981:17;21974:47;22038:131;22164:4;22038:131;:::i;:::-;22030:139;;21757:419;;;:::o;22182:98::-;22233:6;22267:5;22261:12;22251:22;;22182:98;;;:::o;22286:147::-;22387:11;22424:3;22409:18;;22286:147;;;;:::o;22439:386::-;22543:3;22571:38;22603:5;22571:38;:::i;:::-;22625:88;22706:6;22701:3;22625:88;:::i;:::-;22618:95;;22722:65;22780:6;22775:3;22768:4;22761:5;22757:16;22722:65;:::i;:::-;22812:6;22807:3;22803:16;22796:23;;22547:278;22439:386;;;;:::o;22831:271::-;22961:3;22983:93;23072:3;23063:6;22983:93;:::i;:::-;22976:100;;23093:3;23086:10;;22831:271;;;;:::o
Swarm Source
ipfs://74496797a0c773c5184e2f4c4a6dffb35c98c0bfd09fb3f7a9799ad19ae800a4
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.