More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,249 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 30925343 | 491 days ago | IN | 0 BTT | 26.93380787 | ||||
Harvest | 30925334 | 491 days ago | IN | 0 BTT | 49.29252862 | ||||
Withdraw | 30365438 | 504 days ago | IN | 0 BTT | 22.6311 | ||||
Harvest | 30365421 | 504 days ago | IN | 0 BTT | 36.9537 | ||||
Withdraw | 29842196 | 517 days ago | IN | 0 BTT | 71.7475 | ||||
Withdraw | 29842176 | 517 days ago | IN | 0 BTT | 71.7295 | ||||
Withdraw | 29842162 | 517 days ago | IN | 0 BTT | 71.7475 | ||||
Withdraw | 29842150 | 517 days ago | IN | 0 BTT | 71.7235 | ||||
Withdraw | 29842134 | 517 days ago | IN | 0 BTT | 87.715 | ||||
Withdraw | 19092203 | 774 days ago | IN | 0 BTT | 52.62610167 | ||||
Withdraw | 18172940 | 795 days ago | IN | 0 BTT | 17.5083 | ||||
Withdraw | 18172904 | 795 days ago | IN | 0 BTT | 22.6383 | ||||
Withdraw | 18135590 | 796 days ago | IN | 0 BTT | 31.6593922 | ||||
Withdraw | 17640170 | 808 days ago | IN | 0 BTT | 22.6347 | ||||
Withdraw | 16901450 | 826 days ago | IN | 0 BTT | 52.6254 | ||||
Withdraw | 15057770 | 870 days ago | IN | 0 BTT | 43.0413 | ||||
Withdraw | 14585921 | 881 days ago | IN | 0 BTT | 43.0341 | ||||
Withdraw | 14422708 | 885 days ago | IN | 0 BTT | 39.1254 | ||||
Withdraw | 13254339 | 913 days ago | IN | 0 BTT | 22.6347 | ||||
Harvest Multiple... | 13254270 | 913 days ago | IN | 0 BTT | 42.2877 | ||||
Withdraw | 13251647 | 913 days ago | IN | 0 BTT | 22.6383 | ||||
Harvest Multiple... | 13251588 | 913 days ago | IN | 0 BTT | 42.2877 | ||||
Withdraw | 12773943 | 924 days ago | IN | 0 BTT | 8.7597 | ||||
Withdraw | 12773938 | 924 days ago | IN | 0 BTT | 22.6203 | ||||
Withdraw | 12660175 | 927 days ago | IN | 0 BTT | 52.0485 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
30925334 | 491 days ago | 2,485.85382631 BTT | ||||
30365421 | 504 days ago | 127,320.47339839 BTT | ||||
29842196 | 517 days ago | 99,658,109,524.40986233 BTT | ||||
29842176 | 517 days ago | 116,812,643,781.84971934 BTT | ||||
29842162 | 517 days ago | 76,720,789,572.97308085 BTT | ||||
29842150 | 517 days ago | 42,765,095,632.84449554 BTT | ||||
29842134 | 517 days ago | 42,138,516,456.41128177 BTT | ||||
19092203 | 774 days ago | 88,609,006.74031947 BTT | ||||
16901450 | 826 days ago | 43,647,696.48241253 BTT | ||||
15057770 | 870 days ago | 942,688.49803919 BTT | ||||
14585921 | 881 days ago | 4,338,067.02909651 BTT | ||||
14422708 | 885 days ago | 274,152,372.88781773 BTT | ||||
13254270 | 913 days ago | 3,108,381,096.1202299 BTT | ||||
13251588 | 913 days ago | 10,182,023,389.36084844 BTT | ||||
12660175 | 927 days ago | 57,352.64330602 BTT | ||||
12660135 | 927 days ago | 55,672.43445259 BTT | ||||
12557677 | 930 days ago | 5,500,336.75435792 BTT | ||||
12342986 | 935 days ago | 9,126,455.89326621 BTT | ||||
11959777 | 944 days ago | 31,066,959.02424787 BTT | ||||
11853082 | 946 days ago | 691,337.60671386 BTT | ||||
11848360 | 946 days ago | 627,000.62403937 BTT | ||||
11848327 | 946 days ago | 3,118,136.30886708 BTT | ||||
11800616 | 948 days ago | 196,366.31370403 BTT | ||||
11569051 | 953 days ago | 1,042,069.63152822 BTT | ||||
11549611 | 954 days ago | 12,599,578.41888732 BTT |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
KyberFairLaunchV2
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.6; pragma abicoder v2; import {ReentrancyGuard} from './ReentrancyGuard.sol'; import {SafeMath} from './SafeMath.sol'; import {SafeERC20} from './SafeERC20.sol'; import {IERC20Ext} from './IERC20Ext.sol'; import {PermissionAdmin} from './PermissionAdmin.sol'; import {IKyberFairLaunchV2} from './IKyberFairLaunchV2.sol'; import {IKyberRewardLockerV2} from './IKyberRewardLockerV2.sol'; import {GeneratedToken} from './GeneratedToken.sol'; /// FairLaunch contract for Kyber DMM Liquidity Mining program /// Create a new token for each pool /// Allow stakers to stake LP tokens and receive reward tokens /// Allow extend or renew a pool to continue/restart the LM program /// When harvesting, rewards will be transferred to a RewardLocker /// Support multiple reward tokens, reward tokens must be distinct and immutable contract KyberFairLaunchV2 is IKyberFairLaunchV2, PermissionAdmin, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20Ext; struct UserRewardData { uint256 unclaimedReward; uint256 lastRewardPerShare; } // Info of each user. struct UserInfo { uint256 amount; // How many Staking tokens the user has provided. mapping(uint256 => UserRewardData) userRewardData; // // Basically, any point in time, the amount of reward token // entitled to a user but is pending to be distributed is: // // pending reward = user.unclaimAmount + (user.amount * (pool.accRewardPerShare - user.lastRewardPerShare) // // Whenever a user deposits or withdraws Staking tokens to a pool. Here's what happens: // 1. The pool's `accRewardPerShare` (and `lastRewardTime`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `lastRewardPerShare` gets updated. // 4. User's `amount` gets updated. } struct PoolRewardData { uint256 rewardPerSecond; uint256 accRewardPerShare; } // Info of each pool // poolRewardData: reward data for each reward token // rewardPerSecond: amount of reward token per second // accRewardPerShare: accumulated reward per share of token // totalStake: total amount of stakeToken has been staked // stakeToken: token to stake, should be the DMM-LP token // generatedToken: token that has been deployed for this pool // startTime: the time that the reward starts // endTime: the time that the reward ends // lastRewardTime: last time that rewards distribution occurs // vestingDuration: time vesting for token struct PoolInfo { uint256 totalStake; address stakeToken; GeneratedToken generatedToken; uint32 startTime; uint32 endTime; uint32 lastRewardTime; uint32 vestingDuration; mapping(uint256 => PoolRewardData) poolRewardData; } // check if a pool exists for a stakeToken mapping(address => bool) public poolExists; // list reward tokens, use 0x0 for native token, shouldn't be too many reward tokens // don't validate values or length by trusting the deployer address[] public rewardTokens; uint256[] public multipliers; // contract for locking reward IKyberRewardLockerV2 public immutable rewardLocker; // Info of each pool. uint256 public override poolLength; uint256 internal constant PRECISION = 1e12; mapping(uint256 => PoolInfo) internal poolInfo; // Info of each user that stakes Staking tokens. mapping(uint256 => mapping(address => UserInfo)) internal userInfo; event AddNewPool( address indexed stakeToken, address indexed generatedToken, uint32 startTime, uint32 endTime, uint32 vestingDuration ); event RenewPool( uint256 indexed pid, uint32 indexed startTime, uint32 indexed endTime, uint32 vestingDuration ); event UpdatePool(uint256 indexed pid, uint32 indexed endTime, uint32 indexed vestingDuration); event Deposit( address indexed user, uint256 indexed pid, uint256 indexed timestamp, uint256 amount ); event Withdraw( address indexed user, uint256 indexed pid, uint256 indexed timestamp, uint256 amount ); event Harvest( address indexed user, uint256 indexed pid, address indexed rewardToken, uint256 lockedAmount, uint256 timestamp ); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 indexed timestamp, uint256 amount ); constructor( address _admin, address[] memory _rewardTokens, IKyberRewardLockerV2 _rewardLocker ) PermissionAdmin(_admin) { rewardTokens = _rewardTokens; rewardLocker = _rewardLocker; // approve allowance to reward locker multipliers = new uint256[](_rewardTokens.length); for (uint256 i = 0; i < _rewardTokens.length; i++) { if (_rewardTokens[i] != address(0)) { uint8 dToken = IERC20Ext(_rewardTokens[i]).decimals(); multipliers[i] = dToken >= 18 ? 1 : 10**(18 - dToken); IERC20Ext(_rewardTokens[i]).safeApprove(address(_rewardLocker), type(uint256).max); } else { multipliers[i] = 1; } } } receive() external payable {} /** * @dev Allow admin to withdraw only reward tokens */ function adminWithdraw(uint256 rewardTokenIndex, uint256 amount) external onlyAdmin { IERC20Ext rewardToken = IERC20Ext(rewardTokens[rewardTokenIndex]); if (rewardToken == IERC20Ext(0)) { (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'transfer reward token failed'); } else { rewardToken.safeTransfer(msg.sender, amount); } } /** * @dev Add a new lp to the pool. Can only be called by the admin. * @param _stakeToken: token to be staked to the pool * @param _startTime: time where the reward starts * @param _endTime: time where the reward ends * @param _vestingDuration: time vesting for token * @param _totalRewards: amount of total reward token for the pool for each reward token * @param _tokenName: name of the generated token * @param _tokenSymbol: symbol of the generated token */ function addPool( address _stakeToken, uint32 _startTime, uint32 _endTime, uint32 _vestingDuration, uint256[] calldata _totalRewards, string memory _tokenName, string memory _tokenSymbol ) external override onlyAdmin { require(!poolExists[_stakeToken], 'add: duplicated pool'); require(_stakeToken != address(0), 'add: invalid stake token'); require(rewardTokens.length == _totalRewards.length, 'add: invalid length'); require(_startTime > _getBlockTime() && _endTime > _startTime, 'add: invalid times'); GeneratedToken _generatedToken; if (bytes(_tokenName).length != 0 && bytes(_tokenSymbol).length != 0) { _generatedToken = new GeneratedToken(_tokenName, _tokenSymbol); poolInfo[poolLength].generatedToken = _generatedToken; } poolInfo[poolLength].stakeToken = _stakeToken; poolInfo[poolLength].startTime = _startTime; poolInfo[poolLength].endTime = _endTime; poolInfo[poolLength].lastRewardTime = _startTime; poolInfo[poolLength].vestingDuration = _vestingDuration; for (uint256 i = 0; i < _totalRewards.length; i++) { uint256 _rewardPerSecond = _totalRewards[i].mul(multipliers[i]).div(_endTime - _startTime); require(_rewardPerSecond != 0, 'reward too small'); poolInfo[poolLength].poolRewardData[i] = PoolRewardData({ rewardPerSecond: _rewardPerSecond, accRewardPerShare: 0 }); } poolLength++; poolExists[_stakeToken] = true; emit AddNewPool(_stakeToken, address(_generatedToken), _startTime, _endTime, _vestingDuration); } /** * @dev Renew a pool to start another liquidity mining program * @param _pid: id of the pool to renew, must be pool that has not started or already ended * @param _startTime: time where the reward starts * @param _endTime: time where the reward ends * @param _vestingDuration: time vesting for token * @param _totalRewards: amount of total reward token for the pool for each reward token * 0 if we want to stop the pool from accumulating rewards */ function renewPool( uint256 _pid, uint32 _startTime, uint32 _endTime, uint32 _vestingDuration, uint256[] calldata _totalRewards ) external override onlyAdmin { updatePoolRewards(_pid); PoolInfo storage pool = poolInfo[_pid]; // check if pool has not started or already ended require( pool.startTime > _getBlockTime() || pool.endTime < _getBlockTime(), 'renew: invalid pool state to renew' ); // checking data of new pool require(rewardTokens.length == _totalRewards.length, 'renew: invalid length'); require(_startTime > _getBlockTime() && _endTime > _startTime, 'renew: invalid times'); pool.startTime = _startTime; pool.endTime = _endTime; pool.lastRewardTime = _startTime; pool.vestingDuration = _vestingDuration; for (uint256 i = 0; i < _totalRewards.length; i++) { uint256 _rewardPerSecond = _totalRewards[i].mul(multipliers[i]).div(_endTime - _startTime); require(_rewardPerSecond != 0, 'reward too small'); pool.poolRewardData[i].rewardPerSecond = _rewardPerSecond; } emit RenewPool(_pid, _startTime, _endTime, _vestingDuration); } /** * @dev Update a pool, allow to change end time, reward per second * @param _pid: pool id to be renew * @param _endTime: time where the reward ends * @param _vestingDuration: time vesting for token * @param _totalRewards: amount of total reward token for the pool for each reward token * 0 if we want to stop the pool from accumulating rewards */ function updatePool( uint256 _pid, uint32 _endTime, uint32 _vestingDuration, uint256[] calldata _totalRewards ) external override onlyAdmin { updatePoolRewards(_pid); PoolInfo storage pool = poolInfo[_pid]; // should call renew pool if the pool has ended require(pool.endTime > _getBlockTime(), 'update: pool already ended'); require(rewardTokens.length == _totalRewards.length, 'update: invalid length'); require(_endTime > _getBlockTime() && _endTime > pool.startTime, 'update: invalid end time'); pool.endTime = _endTime; pool.vestingDuration = _vestingDuration; for (uint256 i = 0; i < _totalRewards.length; i++) { uint256 _rewardPerSecond = _totalRewards[i].mul(multipliers[i]).div( _endTime - pool.startTime ); require(_rewardPerSecond != 0, 'reward too small'); pool.poolRewardData[i].rewardPerSecond = _rewardPerSecond; } emit UpdatePool(_pid, _endTime, _vestingDuration); } /** * @dev Deposit tokens to accumulate rewards * @param _pid: id of the pool * @param _amount: amount of stakeToken to be deposited * @param _shouldHarvest: whether to harvest the reward or not */ function deposit( uint256 _pid, uint256 _amount, bool _shouldHarvest ) external override nonReentrant { // update pool rewards, user's rewards updatePoolRewards(_pid); _updateUserReward(msg.sender, _pid, _shouldHarvest); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; // collect stakeToken IERC20Ext(pool.stakeToken).safeTransferFrom(msg.sender, address(this), _amount); // mint new token for users GeneratedToken token = pool.generatedToken; if (token != GeneratedToken(0)) { token.mint(msg.sender, _amount); } // update user staked amount, and total staked amount for the pool user.amount = user.amount.add(_amount); pool.totalStake = pool.totalStake.add(_amount); emit Deposit(msg.sender, _pid, _getBlockTime(), _amount); } /** * @dev Withdraw token (of the sender) from pool, also harvest rewards * @param _pid: id of the pool * @param _amount: amount of stakeToken to withdraw */ function withdraw(uint256 _pid, uint256 _amount) external override nonReentrant { _withdraw(_pid, _amount); } /** * @dev Withdraw all tokens (of the sender) from pool, also harvest reward * @param _pid: id of the pool */ function withdrawAll(uint256 _pid) external override nonReentrant { _withdraw(_pid, userInfo[_pid][msg.sender].amount); } /** * @notice EMERGENCY USAGE ONLY, USER'S REWARDS WILL BE RESET * @dev Emergency withdrawal function to allow withdraw all deposited tokens (of the sender) * and reset all rewards * @param _pid: id of the pool */ function emergencyWithdraw(uint256 _pid) external override nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; for (uint256 i = 0; i < rewardTokens.length; i++) { UserRewardData storage rewardData = user.userRewardData[i]; rewardData.lastRewardPerShare = 0; rewardData.unclaimedReward = 0; } pool.totalStake = pool.totalStake.sub(amount); if (amount > 0) { GeneratedToken token = pool.generatedToken; if (token != GeneratedToken(0)) { token.burn(msg.sender, amount); } IERC20Ext(pool.stakeToken).safeTransfer(msg.sender, amount); } emit EmergencyWithdraw(msg.sender, _pid, _getBlockTime(), amount); } /** * @dev Harvest rewards from multiple pools for the sender * combine rewards from all pools and only transfer once to save gas */ function harvestMultiplePools(uint256[] calldata _pids) external override { require(_pids.length > 0, 'harvest: empty pool ids'); if (!_isSameVestingDuration(_pids)) { //harvest one by one if pools not have same vesting duration for (uint256 i = 0; i < _pids.length; i++) { harvest(_pids[i]); } return; } address[] memory rTokens = rewardTokens; uint256[] memory totalRewards = new uint256[](rTokens.length); address account = msg.sender; uint256 pid; for (uint256 i = 0; i < _pids.length; i++) { pid = _pids[i]; updatePoolRewards(pid); // update user reward without harvesting _updateUserReward(account, pid, false); for (uint256 j = 0; j < rTokens.length; j++) { uint256 reward = userInfo[pid][account].userRewardData[j].unclaimedReward; if (reward > 0) { totalRewards[j] = totalRewards[j].add(reward); userInfo[pid][account].userRewardData[j].unclaimedReward = 0; emit Harvest(account, pid, rTokens[j], reward.div(multipliers[j]), _getBlockTime()); } } } uint32 duration = poolInfo[_pids[0]].vestingDuration; // use same duration for (uint256 i = 0; i < totalRewards.length; i++) { if (totalRewards[i] > 0) { _lockReward(IERC20Ext(rTokens[i]), account, totalRewards[i].div(multipliers[i]), duration); } } } /** * @dev Get pending rewards of a user from a pool, mostly for front-end * @param _pid: id of the pool * @param _user: user to check for pending rewards */ function pendingRewards(uint256 _pid, address _user) external override view returns (uint256[] memory rewards) { uint256 rTokensLength = rewardTokens.length; rewards = new uint256[](rTokensLength); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 _totalStake = pool.totalStake; uint256 _poolLastRewardTime = pool.lastRewardTime; uint32 lastAccountedTime = _lastAccountedRewardTime(_pid); for (uint256 i = 0; i < rTokensLength; i++) { uint256 _accRewardPerShare = pool.poolRewardData[i].accRewardPerShare; if (lastAccountedTime > _poolLastRewardTime && _totalStake != 0) { uint256 reward = (lastAccountedTime - _poolLastRewardTime).mul( pool.poolRewardData[i].rewardPerSecond ); _accRewardPerShare = _accRewardPerShare.add(reward.mul(PRECISION) / _totalStake); } rewards[i] = user.amount.mul(_accRewardPerShare.sub(user.userRewardData[i].lastRewardPerShare)) / PRECISION; rewards[i] = rewards[i].add(user.userRewardData[i].unclaimedReward); } } /** * @dev Return list reward tokens */ function getRewardTokens() external override view returns (address[] memory) { return rewardTokens; } /** * @dev Return full details of a pool */ function getPoolInfo(uint256 _pid) external override view returns ( uint256 totalStake, address stakeToken, address generatedToken, uint32 startTime, uint32 endTime, uint32 lastRewardTime, uint32 vestingDuration, uint256[] memory rewardPerSeconds, uint256[] memory rewardMultipliers, uint256[] memory accRewardPerShares ) { PoolInfo storage pool = poolInfo[_pid]; totalStake = pool.totalStake; stakeToken = pool.stakeToken; generatedToken = address(pool.generatedToken); startTime = pool.startTime; endTime = pool.endTime; lastRewardTime = pool.lastRewardTime; vestingDuration = pool.vestingDuration; rewardPerSeconds = new uint256[](rewardTokens.length); rewardMultipliers = new uint256[](multipliers.length); accRewardPerShares = new uint256[](rewardTokens.length); for (uint256 i = 0; i < rewardTokens.length; i++) { rewardPerSeconds[i] = pool.poolRewardData[i].rewardPerSecond; rewardMultipliers[i] = multipliers[i]; accRewardPerShares[i] = pool.poolRewardData[i].accRewardPerShare; } } /** * @dev Return user's info including deposited amount and reward data */ function getUserInfo(uint256 _pid, address _account) external override view returns ( uint256 amount, uint256[] memory unclaimedRewards, uint256[] memory lastRewardPerShares ) { UserInfo storage user = userInfo[_pid][_account]; amount = user.amount; unclaimedRewards = new uint256[](rewardTokens.length); lastRewardPerShares = new uint256[](rewardTokens.length); for (uint256 i = 0; i < rewardTokens.length; i++) { unclaimedRewards[i] = user.userRewardData[i].unclaimedReward; lastRewardPerShares[i] = user.userRewardData[i].lastRewardPerShare; } } /** * @dev Harvest rewards from a pool for the sender * @param _pid: id of the pool */ function harvest(uint256 _pid) public override { updatePoolRewards(_pid); _updateUserReward(msg.sender, _pid, true); } /** * @dev Update rewards for one pool */ function updatePoolRewards(uint256 _pid) public override { require(_pid < poolLength, 'invalid pool id'); PoolInfo storage pool = poolInfo[_pid]; uint32 lastAccountedTime = _lastAccountedRewardTime(_pid); if (lastAccountedTime <= pool.lastRewardTime) return; uint256 _totalStake = pool.totalStake; if (_totalStake == 0) { pool.lastRewardTime = lastAccountedTime; return; } uint256 secondsPassed = lastAccountedTime - pool.lastRewardTime; for (uint256 i = 0; i < rewardTokens.length; i++) { PoolRewardData storage rewardData = pool.poolRewardData[i]; uint256 reward = secondsPassed.mul(rewardData.rewardPerSecond); rewardData.accRewardPerShare = rewardData.accRewardPerShare.add( reward.mul(PRECISION) / _totalStake ); } pool.lastRewardTime = lastAccountedTime; } /** * @dev Withdraw _amount of stakeToken from pool _pid, also harvest reward for the sender */ function _withdraw(uint256 _pid, uint256 _amount) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, 'withdraw: insufficient amount'); // update pool reward and harvest updatePoolRewards(_pid); _updateUserReward(msg.sender, _pid, true); user.amount = user.amount.sub(_amount); pool.totalStake = pool.totalStake.sub(_amount); GeneratedToken token = pool.generatedToken; if (token != GeneratedToken(0)) { token.burn(msg.sender, _amount); } IERC20Ext(pool.stakeToken).safeTransfer(msg.sender, _amount); emit Withdraw(msg.sender, _pid, _getBlockTime(), _amount); } /** * @dev Update reward of _to address from pool _pid, harvest if needed */ function _updateUserReward( address _to, uint256 _pid, bool shouldHarvest ) internal { uint256 userAmount = userInfo[_pid][_to].amount; uint256 rTokensLength = rewardTokens.length; if (userAmount == 0) { // update user last reward per share to the latest pool reward per share // by right if user.amount is 0, user.unclaimedReward should be 0 as well, // except when user uses emergencyWithdraw function for (uint256 i = 0; i < rTokensLength; i++) { userInfo[_pid][_to].userRewardData[i].lastRewardPerShare = poolInfo[_pid].poolRewardData[i] .accRewardPerShare; } return; } for (uint256 i = 0; i < rTokensLength; i++) { uint256 lastAccRewardPerShare = poolInfo[_pid].poolRewardData[i].accRewardPerShare; UserRewardData storage rewardData = userInfo[_pid][_to].userRewardData[i]; // user's unclaim reward + user's amount * (pool's accRewardPerShare - user's lastRewardPerShare) / precision uint256 _pending = userAmount.mul(lastAccRewardPerShare.sub(rewardData.lastRewardPerShare)) / PRECISION; _pending = _pending.add(rewardData.unclaimedReward); rewardData.unclaimedReward = shouldHarvest ? 0 : _pending; // update user last reward per share to the latest pool reward per share rewardData.lastRewardPerShare = lastAccRewardPerShare; if (shouldHarvest && _pending > 0) { uint256 _lockAmount = _pending.div(multipliers[i]); _lockReward(IERC20Ext(rewardTokens[i]), _to, _lockAmount, poolInfo[_pid].vestingDuration); emit Harvest(_to, _pid, rewardTokens[i], _lockAmount, _getBlockTime()); } } } /** * @dev Call locker contract to lock rewards */ function _lockReward( IERC20Ext token, address _account, uint256 _amount, uint32 _vestingDuration ) internal { uint256 value = token == IERC20Ext(0) ? _amount : 0; rewardLocker.lock{value: value}(token, _account, _amount, _vestingDuration); } /** * @dev Returns last accounted reward time, either the current time number or the endTime of the pool */ function _lastAccountedRewardTime(uint256 _pid) internal view returns (uint32 _value) { _value = poolInfo[_pid].endTime; if (_value > _getBlockTime()) _value = _getBlockTime(); } function _getBlockTime() internal virtual view returns (uint32) { return uint32(block.timestamp); } function _isSameVestingDuration(uint256[] calldata _pids) private view returns (bool) { uint256 val = poolInfo[_pids[0]].vestingDuration; for (uint256 i = 1; i < _pids.length; i++) { if (poolInfo[_pids[i]].vestingDuration != val) return false; } return true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; import "./IERC20.sol"; import "./SafeMath.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.6; pragma abicoder v2; import {ERC20} from './ERC20.sol'; contract GeneratedToken is ERC20 { address internal deployer; modifier onlyDeployer() { require(msg.sender == deployer, 'unauthorized'); _; } constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) { deployer = msg.sender; } function mint(address account, uint256 amount) external onlyDeployer { super._mint(account, amount); } function burn(address account, uint256 amount) external onlyDeployer { super._burn(account, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import "./IERC20.sol"; /** * @dev Interface extending ERC20 standard to include decimals() as * it is optional in the OpenZeppelin IERC20 interface. */ interface IERC20Ext is IERC20 { /** * @dev This function is required as Kyber requires to interact * with token.decimals() with many of its operations. */ function decimals() external view returns (uint8 digits); }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.6; pragma abicoder v2; interface IKyberFairLaunchV2 { /** * @dev Add a new lp to the pool. Can only be called by the admin. * @param _stakeToken: token to be staked to the pool * @param _startTime: time where the reward starts * @param _endTime: time where the reward ends * @param _vestingDuration: time vesting for token * @param _rewardPerSeconds: amount of reward token per second for the pool * @param _tokenName: name of the generated token * @param _tokenSymbol: symbol of the generated token */ function addPool( address _stakeToken, uint32 _startTime, uint32 _endTime, uint32 _vestingDuration, uint256[] calldata _rewardPerSeconds, string memory _tokenName, string memory _tokenSymbol ) external; /** * @dev Renew a pool to start another liquidity mining program * @param _pid: id of the pool to renew, must be pool that has not started or already ended * @param _startTime: time where the reward starts * @param _endTime: time where the reward ends * @param _vestingDuration: time vesting for token * @param _rewardPerSeconds: amount of reward token per second for the pool * 0 if we want to stop the pool from accumulating rewards */ function renewPool( uint256 _pid, uint32 _startTime, uint32 _endTime, uint32 _vestingDuration, uint256[] calldata _rewardPerSeconds ) external; /** * @dev Update a pool, allow to change end time, reward per second * @param _pid: pool id to be renew * @param _endTime: time where the reward ends * @param _vestingDuration: time vesting for token * @param _rewardPerSeconds: amount of reward token per second for the pool * 0 if we want to stop the pool from accumulating rewards */ function updatePool( uint256 _pid, uint32 _endTime, uint32 _vestingDuration, uint256[] calldata _rewardPerSeconds ) external; /** * @dev deposit to tokens to accumulate rewards * @param _pid: id of the pool * @param _amount: amount of stakeToken to be deposited * @param _shouldHarvest: whether to harvest the reward or not */ function deposit( uint256 _pid, uint256 _amount, bool _shouldHarvest ) external; /** * @dev withdraw token (of the sender) from pool, also harvest reward * @param _pid: id of the pool * @param _amount: amount of stakeToken to withdraw */ function withdraw(uint256 _pid, uint256 _amount) external; /** * @dev withdraw all tokens (of the sender) from pool, also harvest reward * @param _pid: id of the pool */ function withdrawAll(uint256 _pid) external; /** * @dev emergency withdrawal function to allow withdraw all deposited token (of the sender) * without harvesting the reward * @param _pid: id of the pool */ function emergencyWithdraw(uint256 _pid) external; /** * @dev harvest reward from pool for the sender * @param _pid: id of the pool */ function harvest(uint256 _pid) external; /** * @dev harvest rewards from multiple pools for the sender */ function harvestMultiplePools(uint256[] calldata _pids) external; /** * @dev update reward for one pool */ function updatePoolRewards(uint256 _pid) external; /** * @dev return the total of pools that have been added */ function poolLength() external view returns (uint256); /** * @dev return full details of a pool */ function getPoolInfo(uint256 _pid) external view returns ( uint256 totalStake, address stakeToken, address generatedToken, uint32 startTime, uint32 endTime, uint32 lastRewardSecond, uint32 vestingDuration, uint256[] memory rewardPerSeconds, uint256[] memory rewardMultipliers, uint256[] memory accRewardPerShares ); /** * @dev get user's info */ function getUserInfo(uint256 _pid, address _account) external view returns ( uint256 amount, uint256[] memory unclaimedRewards, uint256[] memory lastRewardPerShares ); /** * @dev return list reward tokens */ function getRewardTokens() external view returns (address[] memory); /** * @dev get pending reward of a user from a pool, mostly for front-end * @param _pid: id of the pool * @param _user: user to check for pending rewards */ function pendingRewards(uint256 _pid, address _user) external view returns (uint256[] memory rewards); }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.6; pragma abicoder v2; import {IERC20Ext} from './IERC20Ext.sol'; interface IKyberRewardLockerV2 { struct VestingSchedule { uint64 startTime; uint64 endTime; uint128 quantity; uint128 vestedQuantity; } event VestingEntryCreated( IERC20Ext indexed token, address indexed beneficiary, uint256 startTime, uint256 endTime, uint256 quantity, uint256 index ); event VestingEntryQueued( uint256 indexed index, IERC20Ext indexed token, address indexed beneficiary, uint256 quantity ); event Vested( IERC20Ext indexed token, address indexed beneficiary, uint256 vestedQuantity, uint256 index ); /** * @dev queue a vesting schedule starting from now */ function lock( IERC20Ext token, address account, uint256 amount, uint32 vestingDuration ) external payable; /** * @dev queue a vesting schedule */ function lockWithStartTime( IERC20Ext token, address account, uint256 quantity, uint256 startTime, uint32 vestingDuration ) external payable; /** * @dev vest all completed schedules for multiple tokens */ function vestCompletedSchedulesForMultipleTokens(IERC20Ext[] calldata tokens) external returns (uint256[] memory vestedAmounts); /** * @dev claim multiple tokens for specific vesting schedule, * if schedule has not ended yet, claiming amounts are linear with vesting times */ function vestScheduleForMultipleTokensAtIndices( IERC20Ext[] calldata tokens, uint256[][] calldata indices ) external returns (uint256[] memory vestedAmounts); /** * @dev for all completed schedule, claim token */ function vestCompletedSchedules(IERC20Ext token) external returns (uint256); /** * @dev claim token for specific vesting schedule, * @dev if schedule has not ended yet, claiming amount is linear with vesting times */ function vestScheduleAtIndices(IERC20Ext token, uint256[] calldata indexes) external returns (uint256); /** * @dev claim token for specific vesting schedule from startIndex to endIndex */ function vestSchedulesInRange( IERC20Ext token, uint256 startIndex, uint256 endIndex ) external returns (uint256); /** * @dev length of vesting schedules array */ function numVestingSchedules(address account, IERC20Ext token) external view returns (uint256); /** * @dev get detailed of each vesting schedule */ function getVestingScheduleAtIndex( address account, IERC20Ext token, uint256 index ) external view returns (VestingSchedule memory); /** * @dev get vesting shedules array */ function getVestingSchedules(address account, IERC20Ext token) external view returns (VestingSchedule[] memory schedules); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; abstract contract PermissionAdmin { address public admin; address public pendingAdmin; event AdminClaimed(address newAdmin, address previousAdmin); event TransferAdminPending(address pendingAdmin); constructor(address _admin) { require(_admin != address(0), "admin 0"); admin = _admin; } modifier onlyAdmin() { require(msg.sender == admin, "only admin"); _; } /** * @dev Allows the current admin to set the pendingAdmin address. * @param newAdmin The address to transfer ownership to. */ function transferAdmin(address newAdmin) public onlyAdmin { require(newAdmin != address(0), "new admin 0"); emit TransferAdminPending(newAdmin); pendingAdmin = newAdmin; } /** * @dev Allows the current admin to set the admin in one tx. Useful initial deployment. * @param newAdmin The address to transfer ownership to. */ function transferAdminQuickly(address newAdmin) public onlyAdmin { require(newAdmin != address(0), "admin 0"); emit TransferAdminPending(newAdmin); emit AdminClaimed(newAdmin, admin); admin = newAdmin; } /** * @dev Allows the pendingAdmin address to finalize the change admin process. */ function claimAdmin() public { require(pendingAdmin == msg.sender, "not pending"); emit AdminClaimed(pendingAdmin, admin); admin = pendingAdmin; pendingAdmin = address(0); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ 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 make 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"contract IKyberRewardLockerV2","name":"_rewardLocker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"generatedToken","type":"address"},{"indexed":false,"internalType":"uint32","name":"startTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"endTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"vestingDuration","type":"uint32"}],"name":"AddNewPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"startTime","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"endTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"vestingDuration","type":"uint32"}],"name":"RenewPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"endTime","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"vestingDuration","type":"uint32"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint32","name":"_startTime","type":"uint32"},{"internalType":"uint32","name":"_endTime","type":"uint32"},{"internalType":"uint32","name":"_vestingDuration","type":"uint32"},{"internalType":"uint256[]","name":"_totalRewards","type":"uint256[]"},{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardTokenIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_shouldHarvest","type":"bool"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"address","name":"stakeToken","type":"address"},{"internalType":"address","name":"generatedToken","type":"address"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint32","name":"lastRewardTime","type":"uint32"},{"internalType":"uint32","name":"vestingDuration","type":"uint32"},{"internalType":"uint256[]","name":"rewardPerSeconds","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardMultipliers","type":"uint256[]"},{"internalType":"uint256[]","name":"accRewardPerShares","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"unclaimedRewards","type":"uint256[]"},{"internalType":"uint256[]","name":"lastRewardPerShares","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"}],"name":"harvestMultiplePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multipliers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint32","name":"_startTime","type":"uint32"},{"internalType":"uint32","name":"_endTime","type":"uint32"},{"internalType":"uint32","name":"_vestingDuration","type":"uint32"},{"internalType":"uint256[]","name":"_totalRewards","type":"uint256[]"}],"name":"renewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardLocker","outputs":[{"internalType":"contract IKyberRewardLockerV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint32","name":"_endTime","type":"uint32"},{"internalType":"uint32","name":"_vestingDuration","type":"uint32"},{"internalType":"uint256[]","name":"_totalRewards","type":"uint256[]"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePoolRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620051e3380380620051e383398101604081905262000034916200077c565b826001600160a01b0381166200007b576040805162461bcd60e51b8152602060048201526007602482015266061646d696e20360cc1b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b039290921691909117905560016002558151620000b5906004906020850190620006b0565b506001600160601b0319606082901b1660805281516001600160401b0381118015620000e057600080fd5b506040519080825280602002602001820160405280156200010b578160200160208202803683370190505b50805162000122916005916020909101906200071a565b5060005b8251811015620002905760006001600160a01b03168382815181106200014857fe5b60200260200101516001600160a01b0316146200026a5760008382815181106200016e57fe5b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620001af57600080fd5b505afa158015620001c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ea919062000865565b905060128160ff16101562000209578060120360ff16600a0a6200020c565b60015b600583815481106200021a57fe5b906000526020600020018190555062000263836000198685815181106200023d57fe5b60200260200101516001600160a01b03166200029a60201b620021cb179092919060201c565b5062000287565b6001600582815481106200027a57fe5b6000918252602090912001555b60010162000126565b50505050620008a1565b80158062000324575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620002f457600080fd5b505afa15801562000309573d6000803e3d6000fd5b505050506040513d60208110156200032057600080fd5b5051155b620003615760405162461bcd60e51b8152600401808060200182810382526036815260200180620051ad6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003b9918591620003be16565b505050565b60006200041a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200047a60201b62002318179092919060201c565b805190915015620003b9578080602001905160208110156200043b57600080fd5b5051620003b95760405162461bcd60e51b815260040180806020018281038252602a81526020018062005183602a913960400191505060405180910390fd5b60606200048b848460008562000495565b90505b9392505050565b606082471015620004d85760405162461bcd60e51b81526004018080602001828103825260268152602001806200515d6026913960400191505060405180910390fd5b620004e385620005fc565b62000535576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310620005755780518252601f19909201916020918201910162000554565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620005d9576040519150601f19603f3d011682016040523d82523d6000602084013e620005de565b606091505b509092509050620005f182828662000606565b979650505050505050565b803b15155b919050565b60608315620006175750816200048e565b825115620006285782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620006745781810151838201526020016200065a565b50505050905090810190601f168015620006a25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b82805482825590600052602060002090810192821562000708579160200282015b828111156200070857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620006d1565b506200071692915062000758565b5090565b82805482825590600052602060002090810192821562000708579160200282015b82811115620007085782518255916020019190600101906200073b565b5b8082111562000716576000815560010162000759565b8051620006018162000888565b60008060006060848603121562000791578283fd5b83516200079e8162000888565b602085810151919450906001600160401b0380821115620007bd578485fd5b818701915087601f830112620007d1578485fd5b815181811115620007de57fe5b83810260405185828201018181108582111715620007f857fe5b604052828152858101935084860182860187018c101562000817578889fd5b8895505b8386101562000844576200082f816200076f565b8552600195909501949386019386016200081b565b508097505050505050506200085c604085016200076f565b90509250925092565b60006020828403121562000877578081fd5b815160ff811681146200048e578182fd5b6001600160a01b03811681146200089e57600080fd5b50565b60805160601c614899620008c4600039806108f3528061290a52506148996000f3fe608060405260043610620001c35760003560e01c80637acc867811620000f7578063c401fb4f1162000097578063d18df53c116200006d578063d18df53c1462000508578063ddc63262146200053c578063f851a4401462000561578063fef12687146200057957620001cb565b8063c401fb4f1462000497578063c4f59f9b14620004bc578063d12e4ceb14620004e357620001cb565b8063a3a19dfb11620000cd578063a3a19dfb1462000428578063ac7fc263146200044d578063adb82b31146200047257620001cb565b80637acc867814620003b95780637bb7bed114620003de578063958e2d31146200040357620001cb565b806343a0d06611620001635780635312ea8e11620001395780635312ea8e146200035757806375829def146200037c57806377f50f9714620003a157620001cb565b806343a0d06614620002e6578063441a3e70146200030d57806352fd9f2f146200033257620001cb565b806326782247116200019957806326782247146200026a5780632f380b3514620002915780633892601c14620002ce57620001cb565b8063081e3eda14620001d05780631069f3b514620002005780631e1c6a07146200023657620001cb565b36620001cb57005b600080fd5b348015620001dd57600080fd5b50620001e86200059e565b604051620001f79190620036a7565b60405180910390f35b3480156200020d57600080fd5b50620002256200021f36600462003035565b620005a4565b604051620001f79392919062003748565b3480156200024357600080fd5b506200025b6200025536600462002edd565b620006de565b604051620001f79190620032dd565b3480156200027757600080fd5b5062000282620006f3565b604051620001f791906200324c565b3480156200029e57600080fd5b50620002b6620002b03660046200301c565b62000702565b604051620001f79a99989796959493929190620036b0565b348015620002db57600080fd5b5062000282620008f1565b348015620002f357600080fd5b506200030b6200030536600462003085565b62000915565b005b3480156200031a57600080fd5b506200030b6200032c36600462003063565b62000adb565b3480156200033f57600080fd5b506200030b6200035136600462002fd8565b62000b4c565b3480156200036457600080fd5b506200030b620003763660046200301c565b62000ee5565b3480156200038957600080fd5b506200030b6200039b36600462002edd565b620010a7565b348015620003ae57600080fd5b506200030b620011ae565b348015620003c657600080fd5b506200030b620003d836600462002edd565b62001281565b348015620003eb57600080fd5b5062000282620003fd3660046200301c565b620013d0565b3480156200041057600080fd5b506200030b620004223660046200301c565b620013fb565b3480156200043557600080fd5b506200030b62000447366004620030c3565b62001486565b3480156200045a57600080fd5b50620001e86200046c3660046200301c565b620016de565b3480156200047f57600080fd5b506200030b620004913660046200301c565b62001700565b348015620004a457600080fd5b506200030b620004b636600462003138565b6200184b565b348015620004c957600080fd5b50620004d462001ab0565b604051620001f7919062003279565b348015620004f057600080fd5b506200030b6200050236600462003063565b62001b14565b3480156200051557600080fd5b506200052d6200052736600462003035565b62001c33565b604051620001f79190620032c8565b3480156200054957600080fd5b506200030b6200055b3660046200301c565b62001e14565b3480156200056e57600080fd5b506200028262001e2d565b3480156200058657600080fd5b506200030b6200059836600462002efa565b62001e3c565b60065481565b60008281526008602090815260408083206001600160a01b038516845290915290208054600454909160609182919067ffffffffffffffff81118015620005ea57600080fd5b5060405190808252806020026020018201604052801562000615578160200160208202803683370190505b5060045490935067ffffffffffffffff811180156200063357600080fd5b506040519080825280602002602001820160405280156200065e578160200160208202803683370190505b50915060005b600454811015620006d557600081815260018301602052604090205484518590839081106200068f57fe5b60200260200101818152505081600101600082815260200190815260200160002060010154838281518110620006c157fe5b602090810291909101015260010162000664565b50509250925092565b60036020526000908152604090205460ff1681565b6001546001600160a01b031681565b6000818152600760205260409020805460018201546002830154600384015460045493946001600160a01b03938416949383169363ffffffff600160a01b8504811694600160c01b8104821694600160e01b909104821693911691606091829182919067ffffffffffffffff811180156200077c57600080fd5b50604051908082528060200260200182016040528015620007a7578160200160208202803683370190505b5060055490945067ffffffffffffffff81118015620007c557600080fd5b50604051908082528060200260200182016040528015620007f0578160200160208202803683370190505b5060045490935067ffffffffffffffff811180156200080e57600080fd5b5060405190808252806020026020018201604052801562000839578160200160208202803683370190505b50915060005b600454811015620008e257600081815260048301602052604090205485518690839081106200086a57fe5b602002602001018181525050600581815481106200088457fe5b90600052602060002001548482815181106200089c57fe5b60200260200101818152505081600401600082815260200190815260200160002060010154838281518110620008ce57fe5b60209081029190910101526001016200083f565b50509193959799509193959799565b7f000000000000000000000000000000000000000000000000000000000000000081565b6002805414156200096d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600280556200097c8362001700565b6200098933848362002333565b600083815260076020908152604080832060088352818420338086529352922060018301549091620009c7916001600160a01b03169030876200258f565b60028201546001600160a01b0316801562000a5a576040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038216906340c10f199062000a25903390899060040162003260565b600060405180830381600087803b15801562000a4057600080fd5b505af115801562000a55573d6000803e3d6000fd5b505050505b815462000a6890866200260a565b8255825462000a7890866200260a565b835562000a846200266e565b63ffffffff1686336001600160a01b03167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e8860405162000ac69190620036a7565b60405180910390a45050600160025550505050565b60028054141562000b33576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002805562000b43828262002672565b50506001600255565b8062000b755760405162461bcd60e51b815260040162000b6c9062003348565b60405180910390fd5b62000b818282620027e0565b62000bc05760005b8181101562000bb95762000bb083838381811062000ba357fe5b9050602002013562001e14565b60010162000b89565b5062000ee1565b6000600480548060200260200160405190810160405280929190818152602001828054801562000c1a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000bfb575b505050505090506000815167ffffffffffffffff8111801562000c3c57600080fd5b5060405190808252806020026020018201604052801562000c67578160200160208202803683370190505b509050336000805b8581101562000e0a5786868281811062000c8557fe5b90506020020135915062000c998262001700565b62000ca78383600062002333565b60005b855181101562000e005760008381526008602090815260408083206001600160a01b03881684528252808320848452600101909152902054801562000df65762000d128187848151811062000cfb57fe5b60200260200101516200260a90919063ffffffff16565b86838151811062000d1f57fe5b60209081029190910181019190915260008581526008825260408082206001600160a01b0389168352835280822085835260010190925290812055865187908390811062000d6957fe5b60200260200101516001600160a01b031684866001600160a01b03167ff75f3d433c6628e04e01a0be1a2c6692a6011ce4b00389824cfa8b8a12f3c1c462000dd36005878154811062000db857fe5b9060005260206000200154866200288190919063ffffffff16565b62000ddd6200266e565b60405162000ded92919062003781565b60405180910390a45b5060010162000caa565b5060010162000c6f565b506000600760008888600081811062000e1f57fe5b6020908102929092013583525081019190915260400160009081206003015463ffffffff1691505b845181101562000eda57600085828151811062000e6057fe5b6020026020010151111562000ed15762000ed186828151811062000e8057fe5b60200260200101518562000eca6005858154811062000e9b57fe5b906000526020600020015489868151811062000eb357fe5b60200260200101516200288190919063ffffffff16565b85620028ea565b60010162000e47565b5050505050505b5050565b60028054141562000f3d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600280556000818152600760209081526040808320600883528184203385529092528220805483825591929091905b60045481101562000f99576000818152600180850160205260408220808201839055919091550162000f6c565b50825462000fa8908262002998565b83558015620010485760028301546001600160a01b031680156200102b57604051632770a7eb60e21b81526001600160a01b03821690639dc29fac9062000ff6903390869060040162003260565b600060405180830381600087803b1580156200101157600080fd5b505af115801562001026573d6000803e3d6000fd5b505050505b600184015462001046906001600160a01b03163384620029f6565b505b620010526200266e565b63ffffffff1684336001600160a01b03167f2369db1bafee945aee5630782f4a170682e3f8188d8dc247a4c73eb8c9e692d284604051620010949190620036a7565b60405180910390a4505060016002555050565b6000546001600160a01b03163314620010f4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b03811662001150576040805162461bcd60e51b815260206004820152600b60248201527f6e65772061646d696e2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146200120e576040805162461bcd60e51b815260206004820152600b60248201527f6e6f742070656e64696e67000000000000000000000000000000000000000000604482015290519081900360640190fd5b600154600054604080516001600160a01b03938416815292909116602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314620012ce576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b0381166200132a576040805162461bcd60e51b815260206004820152600760248201527f61646d696e203000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600054604080516001600160a01b038085168252909216602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048181548110620013e157600080fd5b6000918252602090912001546001600160a01b0316905081565b60028054141562001453576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002805560008181526008602090815260408083203384529091529020546200147e90829062002672565b506001600255565b6000546001600160a01b03163314620014d3576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b620014de8562001700565b6000858152600760205260409020620014f66200266e565b600282015463ffffffff918216600160c01b909104909116116200152e5760405162461bcd60e51b815260040162000b6c9062003670565b6004548214620015525760405162461bcd60e51b815260040162000b6c90620033ed565b6200155c6200266e565b63ffffffff168563ffffffff161180156200158b5750600281015463ffffffff600160a01b9091048116908616115b620015aa5760405162461bcd60e51b815260040162000b6c9062003492565b60028101805463ffffffff60c01b1916600160c01b63ffffffff888116919091029190911790915560038201805463ffffffff191691861691909117905560005b828110156200169a5760006200165e8360020160149054906101000a900463ffffffff16880363ffffffff1662001657600585815481106200162957fe5b90600052602060002001548888878181106200164157fe5b9050602002013562002a6390919063ffffffff16565b9062002881565b905080620016805760405162461bcd60e51b815260040162000b6c9062003537565b6000828152600484016020526040902055600101620015eb565b508363ffffffff168563ffffffff16877f5af4b4ed394dca9f180924459d4de6143b41833ed4899ddafbd0aa26de5ff7b560405160405180910390a4505050505050565b60058181548110620016ef57600080fd5b600091825260209091200154905081565b6006548110620017245760405162461bcd60e51b815260040162000b6c9062003424565b6000818152600760205260408120906200173e8362002ac1565b600283015490915063ffffffff600160e01b9091048116908216116200176657505062001848565b8154806200179b57506002909101805463ffffffff909216600160e01b026001600160e01b0390921691909117905562001848565b600283015463ffffffff600160e01b909104811683031660005b6004548110156200181e57600081815260048601602052604081208054909190620017e290859062002a63565b90506200181085620017fa8364e8d4a5100062002a63565b816200180257fe5b60018501549190046200260a565b6001928301555001620017b5565b5050506002909101805463ffffffff909216600160e01b026001600160e01b039092169190911790555b50565b6000546001600160a01b0316331462001898576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b620018a38662001700565b6000868152600760205260409020620018bb6200266e565b600282015463ffffffff918216600160a01b9091049091161180620018ff5750620018e56200266e565b600282015463ffffffff918216600160c01b909104909116105b6200191e5760405162461bcd60e51b815260040162000b6c9062003613565b6004548214620019425760405162461bcd60e51b815260040162000b6c9062003500565b6200194c6200266e565b63ffffffff168663ffffffff161180156200197257508563ffffffff168563ffffffff16115b620019915760405162461bcd60e51b815260040162000b6c90620034c9565b60028101805463ffffffff60a01b1916600160a01b63ffffffff8981169182029290921763ffffffff60c01b1916600160c01b89841602176001600160e01b0316600160e01b919091021790915560038201805463ffffffff191691861691909117905560005b8281101562001a5e57600062001a2288880363ffffffff1662001657600585815481106200162957fe5b90508062001a445760405162461bcd60e51b815260040162000b6c9062003537565b6000828152600484016020526040902055600101620019f8565b508463ffffffff168663ffffffff16887fb604531d649168314d05bda3f75bfa2aab29e79121f8cee6dc685dc2a031c43d8760405162001a9f919062003795565b60405180910390a450505050505050565b6060600480548060200260200160405190810160405280929190818152602001828054801562001b0a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162001aeb575b5050505050905090565b6000546001600160a01b0316331462001b61576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60006004838154811062001b7157fe5b6000918252602090912001546001600160a01b031690508062001c18576000336001600160a01b03168360405162001ba99062003249565b60006040518083038185875af1925050503d806000811462001be8576040519150601f19603f3d011682016040523d82523d6000602084013e62001bed565b606091505b505090508062001c115760405162461bcd60e51b815260040162000b6c90620035a5565b5062001c2e565b62001c2e6001600160a01b0382163384620029f6565b505050565b6004546060908067ffffffffffffffff8111801562001c5157600080fd5b5060405190808252806020026020018201604052801562001c7c578160200160208202803683370190505b506000858152600760209081526040808320600883528184206001600160a01b038916855290925282208154600283015494965091939092600160e01b90910463ffffffff169062001cce8962002ac1565b905060005b8681101562001e0757600081815260048701602052604090206001015463ffffffff83168410801562001d0557508415155b1562001d6357600082815260048801602052604081205462001d359063ffffffff808716889003919062002a6316565b905062001d5f8662001d4d8364e8d4a5100062002a63565b8162001d5557fe5b849190046200260a565b9150505b600082815260018088016020526040909120015464e8d4a510009062001d999062001d9090849062002998565b88549062002a63565b8162001da157fe5b0489838151811062001daf57fe5b60200260200101818152505062001de5866001016000848152602001908152602001600020600001548a848151811062000cfb57fe5b89838151811062001df257fe5b60209081029190910101525060010162001cd3565b5050505050505092915050565b62001e1f8162001700565b620018483382600162002333565b6000546001600160a01b031681565b6000546001600160a01b0316331462001e89576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b03881660009081526003602052604090205460ff161562001ec55760405162461bcd60e51b815260040162000b6c90620035dc565b6001600160a01b03881662001eee5760405162461bcd60e51b815260040162000b6c906200337f565b600454831462001f125760405162461bcd60e51b815260040162000b6c906200345b565b62001f1c6200266e565b63ffffffff168763ffffffff1611801562001f4257508663ffffffff168663ffffffff16115b62001f615760405162461bcd60e51b815260040162000b6c90620033b6565b6000825160001415801562001f765750815115155b1562001fe757828260405162001f8c9062002ddd565b62001f9992919062003316565b604051809103906000f08015801562001fb6573d6000803e3d6000fd5b50600654600090815260076020526040902060020180546001600160a01b0319166001600160a01b03831617905590505b6006805460009081526007602052604080822060010180546001600160a01b0319166001600160a01b038e16179055825482528082206002908101805463ffffffff60a01b1916600160a01b63ffffffff8f811691820292909217909255855485528385208301805463ffffffff60c01b1916600160c01b8f8416021790558554855283852090920180546001600160e01b0316600160e01b909202919091179055925482528120600301805463ffffffff1916928916929092179091555b848110156200214a576000620020e88a8a0363ffffffff166200165760058581548110620020d057fe5b90600052602060002001548a8a878181106200164157fe5b9050806200210a5760405162461bcd60e51b815260040162000b6c9062003537565b60408051808201825291825260006020808401828152600654835260078252838320868452600401909152919020915182555160019182015501620020a6565b506006805460019081019091556001600160a01b03808b1660008181526003602052604090819020805460ff1916909417909355915190831691907fee97de5694d00acf6fe59073e574f8fa17901ad0ce3eabb3740a73b4a4fc8b6290620021b8908c908c908c90620037a6565b60405180910390a3505050505050505050565b8015806200226e5750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200223e57600080fd5b505afa15801562002253573d6000803e3d6000fd5b505050506040513d60208110156200226a57600080fd5b5051155b620022ab5760405162461bcd60e51b81526004018080602001828103825260368152602001806200482e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167f095ea7b30000000000000000000000000000000000000000000000000000000017905262001c2e90849062002b10565b606062002329848460008562002bc7565b90505b9392505050565b60008281526008602090815260408083206001600160a01b038716845290915290205460045481620023c55760005b81811015620023bc5760008581526007602090815260408083208484526004018252808320600190810154898552600884528285206001600160a01b038c1686528452828520868652820190935292208201550162002362565b50505062001c2e565b60005b81811015620025875760008581526007602090815260408083208484526004018252808320600190810154898552600884528285206001600160a01b038c16865284528285208686528201909352908320908101549192909164e8d4a510009062002442906200243a90869062002998565b889062002a63565b816200244a57fe5b835491900491506200245e9082906200260a565b9050866200246d578062002470565b60005b825560018201839055868015620024875750600081115b156200257b576000620024bc60058681548110620024a157fe5b9060005260206000200154836200288190919063ffffffff16565b90506200250b60048681548110620024d057fe5b60009182526020808320909101548c835260079091526040909120600301546001600160a01b03909116908c90849063ffffffff16620028ea565b600485815481106200251957fe5b6000918252602090912001546001600160a01b03908116908a908c167ff75f3d433c6628e04e01a0be1a2c6692a6011ce4b00389824cfa8b8a12f3c1c484620025616200266e565b6040516200257192919062003781565b60405180910390a4505b505050600101620023c8565b505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790526200260490859062002b10565b50505050565b60008282018381101562002665576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b4290565b6000828152600760209081526040808320600883528184203385529092529091208054831115620026b75760405162461bcd60e51b815260040162000b6c906200356e565b620026c28462001700565b620026d03385600162002333565b8054620026de908462002998565b81558154620026ee908462002998565b825560028201546001600160a01b031680156200276a57604051632770a7eb60e21b81526001600160a01b03821690639dc29fac9062002735903390889060040162003260565b600060405180830381600087803b1580156200275057600080fd5b505af115801562002765573d6000803e3d6000fd5b505050505b600183015462002785906001600160a01b03163386620029f6565b6200278f6200266e565b63ffffffff1685336001600160a01b03167f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9487604051620027d19190620036a7565b60405180910390a45050505050565b6000806007600085856000818110620027f557fe5b602090810292909201358352508101919091526040016000206003015463ffffffff16905060015b83811015620028765781600760008787858181106200283857fe5b602090810292909201358352508101919091526040016000206003015463ffffffff16146200286d5760009250505062002668565b6001016200281d565b506001949350505050565b6000808211620028d8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381620028e257fe5b049392505050565b60006001600160a01b038516156200290457600062002906565b825b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631e2fabb682878787876040518663ffffffff1660e01b81526004016200295d9493929190620032e8565b6000604051808303818588803b1580156200297757600080fd5b505af11580156200298c573d6000803e3d6000fd5b50505050505050505050565b600082821115620029f0576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905262001c2e90849062002b10565b60008262002a745750600062002668565b8282028284828162002a8257fe5b0414620026655760405162461bcd60e51b8152600401808060200182810382526021815260200180620047e36021913960400191505060405180910390fd5b600081815260076020526040902060020154600160c01b900463ffffffff1662002aea6200266e565b63ffffffff168163ffffffff16111562002b0b5762002b086200266e565b90505b919050565b600062002b67826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023189092919063ffffffff16565b80519091501562001c2e5780806020019051602081101562002b8857600080fd5b505162001c2e5760405162461bcd60e51b815260040180806020018281038252602a81526020018062004804602a913960400191505060405180910390fd5b60608247101562002c0a5760405162461bcd60e51b8152600401808060200182810382526026815260200180620047bd6026913960400191505060405180910390fd5b62002c158562002d2d565b62002c67576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831062002ca75780518252601f19909201916020918201910162002c86565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462002d0b576040519150601f19603f3d011682016040523d82523d6000602084013e62002d10565b606091505b509150915062002d2282828662002d33565b979650505050505050565b3b151590565b6060831562002d445750816200232c565b82511562002d555782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002da157818101518382015260200162002d87565b50505050905090810190601f16801562002dcf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b610ff680620037c783390190565b80356001600160a01b038116811462002b0b57600080fd5b60008083601f84011262002e15578081fd5b50813567ffffffffffffffff81111562002e2d578182fd5b602083019150836020808302850101111562002e4857600080fd5b9250929050565b600082601f83011262002e60578081fd5b813567ffffffffffffffff8082111562002e7657fe5b604051601f8301601f19168101602001828111828210171562002e9557fe5b60405282815284830160200186101562002ead578384fd5b82602086016020830137918201602001929092529392505050565b803563ffffffff8116811462002b0b57600080fd5b60006020828403121562002eef578081fd5b6200232c8262002deb565b60008060008060008060008060e0898b03121562002f16578384fd5b62002f218962002deb565b975062002f3160208a0162002ec8565b965062002f4160408a0162002ec8565b955062002f5160608a0162002ec8565b9450608089013567ffffffffffffffff8082111562002f6e578586fd5b62002f7c8c838d0162002e03565b909650945060a08b013591508082111562002f95578384fd5b62002fa38c838d0162002e4f565b935060c08b013591508082111562002fb9578283fd5b5062002fc88b828c0162002e4f565b9150509295985092959890939650565b6000806020838503121562002feb578182fd5b823567ffffffffffffffff81111562003002578283fd5b620030108582860162002e03565b90969095509350505050565b6000602082840312156200302e578081fd5b5035919050565b6000806040838503121562003048578182fd5b823591506200305a6020840162002deb565b90509250929050565b6000806040838503121562003076578182fd5b50508035926020909101359150565b6000806000606084860312156200309a578283fd5b833592506020840135915060408401358015158114620030b8578182fd5b809150509250925092565b600080600080600060808688031215620030db578081fd5b85359450620030ed6020870162002ec8565b9350620030fd6040870162002ec8565b9250606086013567ffffffffffffffff81111562003119578182fd5b620031278882890162002e03565b969995985093965092949392505050565b60008060008060008060a0878903121562003151578182fd5b86359550620031636020880162002ec8565b9450620031736040880162002ec8565b9350620031836060880162002ec8565b9250608087013567ffffffffffffffff8111156200319f578283fd5b620031ad89828a0162002e03565b979a9699509497509295939492505050565b6000815180845260208085019450808401835b83811015620031f057815187529582019590820190600101620031d2565b509495945050505050565b60008151808452815b81811015620032225760208185018101518683018201520162003204565b81811115620032345782602083870101525b50601f01601f19169290920160200192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015620032bc5783516001600160a01b03168352928401929184019160010162003295565b50909695505050505050565b6000602082526200232c6020830184620031bf565b901515815260200190565b6001600160a01b039485168152929093166020830152604082015263ffffffff909116606082015260800190565b6000604082526200332b6040830185620031fb565b82810360208401526200333f8185620031fb565b95945050505050565b60208082526017908201527f686172766573743a20656d70747920706f6f6c20696473000000000000000000604082015260600190565b60208082526018908201527f6164643a20696e76616c6964207374616b6520746f6b656e0000000000000000604082015260600190565b60208082526012908201527f6164643a20696e76616c69642074696d65730000000000000000000000000000604082015260600190565b60208082526016908201527f7570646174653a20696e76616c6964206c656e67746800000000000000000000604082015260600190565b6020808252600f908201527f696e76616c696420706f6f6c2069640000000000000000000000000000000000604082015260600190565b60208082526013908201527f6164643a20696e76616c6964206c656e67746800000000000000000000000000604082015260600190565b60208082526018908201527f7570646174653a20696e76616c696420656e642074696d650000000000000000604082015260600190565b60208082526014908201527f72656e65773a20696e76616c69642074696d6573000000000000000000000000604082015260600190565b60208082526015908201527f72656e65773a20696e76616c6964206c656e6774680000000000000000000000604082015260600190565b60208082526010908201527f72657761726420746f6f20736d616c6c00000000000000000000000000000000604082015260600190565b6020808252601d908201527f77697468647261773a20696e73756666696369656e7420616d6f756e74000000604082015260600190565b6020808252601c908201527f7472616e736665722072657761726420746f6b656e206661696c656400000000604082015260600190565b60208082526014908201527f6164643a206475706c69636174656420706f6f6c000000000000000000000000604082015260600190565b60208082526022908201527f72656e65773a20696e76616c696420706f6f6c20737461746520746f2072656e60408201527f6577000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f7570646174653a20706f6f6c20616c726561647920656e646564000000000000604082015260600190565b90815260200190565b8a81526001600160a01b038a811660208301528916604082015263ffffffff8881166060830152878116608083015286811660a0830152851660c082015261014060e082018190526000906200370983820187620031bf565b9050828103610100840152620037208186620031bf565b9050828103610120840152620037378185620031bf565b9d9c50505050505050505050505050565b600084825260606020830152620037636060830185620031bf565b8281036040840152620037778185620031bf565b9695505050505050565b91825263ffffffff16602082015260400190565b63ffffffff91909116815260200190565b63ffffffff9384168152918316602083015290911660408201526060019056fe60806040523480156200001157600080fd5b5060405162000ff638038062000ff68339810160408190526200003491620001d6565b8151829082906200004d9060039060208501906200008f565b508051620000639060049060208401906200008f565b505060058054601260ff1990911617610100600160a81b0319166101003302179055506200023d915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620000c7576000855562000112565b82601f10620000e257805160ff191683800117855562000112565b8280016001018555821562000112579182015b8281111562000112578251825591602001919060010190620000f5565b506200012092915062000124565b5090565b5b8082111562000120576000815560010162000125565b600082601f8301126200014c578081fd5b81516001600160401b03808211156200016157fe5b6040516020601f8401601f19168201810183811183821017156200018157fe5b604052838252858401810187101562000198578485fd5b8492505b83831015620001bb57858301810151828401820152918201916200019c565b83831115620001cc57848185840101525b5095945050505050565b60008060408385031215620001e9578182fd5b82516001600160401b038082111562000200578384fd5b6200020e868387016200013b565b9350602085015191508082111562000224578283fd5b5062000233858286016200013b565b9150509250929050565b610da9806200024d6000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806340c10f191161008c5780639dc29fac116100665780639dc29fac146101a2578063a457c2d7146101b5578063a9059cbb146101c8578063dd62ed3e146101db576100df565b806340c10f191461017257806370a082311461018757806395d89b411461019a576100df565b806323b872dd116100bd57806323b872dd14610137578063313ce5671461014a578063395093511461015f576100df565b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610122575b600080fd5b6100ec6101ee565b6040516100f99190610b8e565b60405180910390f35b610115610110366004610b5a565b610284565b6040516100f99190610b83565b61012a6102a1565b6040516100f99190610c18565b610115610145366004610b1f565b6102a7565b61015261032e565b6040516100f99190610c21565b61011561016d366004610b5a565b610337565b610185610180366004610b5a565b610385565b005b61012a610195366004610ad3565b6103cb565b6100ec6103ea565b6101856101b0366004610b5a565b61044b565b6101156101c3366004610b5a565b610484565b6101156101d6366004610b5a565b6104ec565b61012a6101e9366004610aed565b610500565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561027a5780601f1061024f5761010080835404028352916020019161027a565b820191906000526020600020905b81548152906001019060200180831161025d57829003601f168201915b5050505050905090565b600061029861029161052b565b848461052f565b50600192915050565b60025490565b60006102b484848461061b565b610324846102c061052b565b61031f85604051806060016040528060288152602001610cbd602891396001600160a01b038a166000908152600160205260408120906102fe61052b565b6001600160a01b031681526020810191909152604001600020549190610776565b61052f565b5060019392505050565b60055460ff1690565b600061029861034461052b565b8461031f856001600061035561052b565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061080d565b60055461010090046001600160a01b031633146103bd5760405162461bcd60e51b81526004016103b490610be1565b60405180910390fd5b6103c7828261086e565b5050565b6001600160a01b0381166000908152602081905260409020545b919050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561027a5780601f1061024f5761010080835404028352916020019161027a565b60055461010090046001600160a01b0316331461047a5760405162461bcd60e51b81526004016103b490610be1565b6103c7828261095e565b600061029861049161052b565b8461031f85604051806060016040528060258152602001610d4f60259139600160006104bb61052b565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610776565b60006102986104f961052b565b848461061b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166105745760405162461bcd60e51b8152600401808060200182810382526024815260200180610d2b6024913960400191505060405180910390fd5b6001600160a01b0382166105b95760405162461bcd60e51b8152600401808060200182810382526022815260200180610c756022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166106605760405162461bcd60e51b8152600401808060200182810382526025815260200180610d066025913960400191505060405180910390fd5b6001600160a01b0382166106a55760405162461bcd60e51b8152600401808060200182810382526023815260200180610c306023913960400191505060405180910390fd5b6106b0838383610a5a565b6106ed81604051806060016040528060268152602001610c97602691396001600160a01b0386166000908152602081905260409020549190610776565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461071c908261080d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156108055760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156107ca5781810151838201526020016107b2565b50505050905090810190601f1680156107f75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610867576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b0382166108c9576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6108d560008383610a5a565b6002546108e2908261080d565b6002556001600160a01b038216600090815260208190526040902054610908908261080d565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166109a35760405162461bcd60e51b8152600401808060200182810382526021815260200180610ce56021913960400191505060405180910390fd5b6109af82600083610a5a565b6109ec81604051806060016040528060228152602001610c53602291396001600160a01b0385166000908152602081905260409020549190610776565b6001600160a01b038316600090815260208190526040902055600254610a129082610a5f565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b505050565b600082821115610ab6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b80356001600160a01b03811681146103e557600080fd5b600060208284031215610ae4578081fd5b61086782610abc565b60008060408385031215610aff578081fd5b610b0883610abc565b9150610b1660208401610abc565b90509250929050565b600080600060608486031215610b33578081fd5b610b3c84610abc565b9250610b4a60208501610abc565b9150604084013590509250925092565b60008060408385031215610b6c578182fd5b610b7583610abc565b946020939093013593505050565b901515815260200190565b6000602080835283518082850152825b81811015610bba57858101830151858201604001528201610b9e565b81811115610bcb5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600c908201527f756e617574686f72697a65640000000000000000000000000000000000000000604082015260600190565b90815260200190565b60ff9190911681526020019056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220aab5d45caea3d506e75cfdec4d70b7aaf37cdf455d26a128beb5e30d97eadc5464736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220f0867824aabc990139bcc1e46e0f7838ee46bc3873ff85d0a854ec04dbc4a01264736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000000000375442dcacefc8f93be8a102ea30aa16b658f1e10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e79bfc312328ab75272785dbf5bd871b253709a500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610620001c35760003560e01c80637acc867811620000f7578063c401fb4f1162000097578063d18df53c116200006d578063d18df53c1462000508578063ddc63262146200053c578063f851a4401462000561578063fef12687146200057957620001cb565b8063c401fb4f1462000497578063c4f59f9b14620004bc578063d12e4ceb14620004e357620001cb565b8063a3a19dfb11620000cd578063a3a19dfb1462000428578063ac7fc263146200044d578063adb82b31146200047257620001cb565b80637acc867814620003b95780637bb7bed114620003de578063958e2d31146200040357620001cb565b806343a0d06611620001635780635312ea8e11620001395780635312ea8e146200035757806375829def146200037c57806377f50f9714620003a157620001cb565b806343a0d06614620002e6578063441a3e70146200030d57806352fd9f2f146200033257620001cb565b806326782247116200019957806326782247146200026a5780632f380b3514620002915780633892601c14620002ce57620001cb565b8063081e3eda14620001d05780631069f3b514620002005780631e1c6a07146200023657620001cb565b36620001cb57005b600080fd5b348015620001dd57600080fd5b50620001e86200059e565b604051620001f79190620036a7565b60405180910390f35b3480156200020d57600080fd5b50620002256200021f36600462003035565b620005a4565b604051620001f79392919062003748565b3480156200024357600080fd5b506200025b6200025536600462002edd565b620006de565b604051620001f79190620032dd565b3480156200027757600080fd5b5062000282620006f3565b604051620001f791906200324c565b3480156200029e57600080fd5b50620002b6620002b03660046200301c565b62000702565b604051620001f79a99989796959493929190620036b0565b348015620002db57600080fd5b5062000282620008f1565b348015620002f357600080fd5b506200030b6200030536600462003085565b62000915565b005b3480156200031a57600080fd5b506200030b6200032c36600462003063565b62000adb565b3480156200033f57600080fd5b506200030b6200035136600462002fd8565b62000b4c565b3480156200036457600080fd5b506200030b620003763660046200301c565b62000ee5565b3480156200038957600080fd5b506200030b6200039b36600462002edd565b620010a7565b348015620003ae57600080fd5b506200030b620011ae565b348015620003c657600080fd5b506200030b620003d836600462002edd565b62001281565b348015620003eb57600080fd5b5062000282620003fd3660046200301c565b620013d0565b3480156200041057600080fd5b506200030b620004223660046200301c565b620013fb565b3480156200043557600080fd5b506200030b62000447366004620030c3565b62001486565b3480156200045a57600080fd5b50620001e86200046c3660046200301c565b620016de565b3480156200047f57600080fd5b506200030b620004913660046200301c565b62001700565b348015620004a457600080fd5b506200030b620004b636600462003138565b6200184b565b348015620004c957600080fd5b50620004d462001ab0565b604051620001f7919062003279565b348015620004f057600080fd5b506200030b6200050236600462003063565b62001b14565b3480156200051557600080fd5b506200052d6200052736600462003035565b62001c33565b604051620001f79190620032c8565b3480156200054957600080fd5b506200030b6200055b3660046200301c565b62001e14565b3480156200056e57600080fd5b506200028262001e2d565b3480156200058657600080fd5b506200030b6200059836600462002efa565b62001e3c565b60065481565b60008281526008602090815260408083206001600160a01b038516845290915290208054600454909160609182919067ffffffffffffffff81118015620005ea57600080fd5b5060405190808252806020026020018201604052801562000615578160200160208202803683370190505b5060045490935067ffffffffffffffff811180156200063357600080fd5b506040519080825280602002602001820160405280156200065e578160200160208202803683370190505b50915060005b600454811015620006d557600081815260018301602052604090205484518590839081106200068f57fe5b60200260200101818152505081600101600082815260200190815260200160002060010154838281518110620006c157fe5b602090810291909101015260010162000664565b50509250925092565b60036020526000908152604090205460ff1681565b6001546001600160a01b031681565b6000818152600760205260409020805460018201546002830154600384015460045493946001600160a01b03938416949383169363ffffffff600160a01b8504811694600160c01b8104821694600160e01b909104821693911691606091829182919067ffffffffffffffff811180156200077c57600080fd5b50604051908082528060200260200182016040528015620007a7578160200160208202803683370190505b5060055490945067ffffffffffffffff81118015620007c557600080fd5b50604051908082528060200260200182016040528015620007f0578160200160208202803683370190505b5060045490935067ffffffffffffffff811180156200080e57600080fd5b5060405190808252806020026020018201604052801562000839578160200160208202803683370190505b50915060005b600454811015620008e257600081815260048301602052604090205485518690839081106200086a57fe5b602002602001018181525050600581815481106200088457fe5b90600052602060002001548482815181106200089c57fe5b60200260200101818152505081600401600082815260200190815260200160002060010154838281518110620008ce57fe5b60209081029190910101526001016200083f565b50509193959799509193959799565b7f000000000000000000000000e79bfc312328ab75272785dbf5bd871b253709a581565b6002805414156200096d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600280556200097c8362001700565b6200098933848362002333565b600083815260076020908152604080832060088352818420338086529352922060018301549091620009c7916001600160a01b03169030876200258f565b60028201546001600160a01b0316801562000a5a576040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038216906340c10f199062000a25903390899060040162003260565b600060405180830381600087803b15801562000a4057600080fd5b505af115801562000a55573d6000803e3d6000fd5b505050505b815462000a6890866200260a565b8255825462000a7890866200260a565b835562000a846200266e565b63ffffffff1686336001600160a01b03167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e8860405162000ac69190620036a7565b60405180910390a45050600160025550505050565b60028054141562000b33576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002805562000b43828262002672565b50506001600255565b8062000b755760405162461bcd60e51b815260040162000b6c9062003348565b60405180910390fd5b62000b818282620027e0565b62000bc05760005b8181101562000bb95762000bb083838381811062000ba357fe5b9050602002013562001e14565b60010162000b89565b5062000ee1565b6000600480548060200260200160405190810160405280929190818152602001828054801562000c1a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000bfb575b505050505090506000815167ffffffffffffffff8111801562000c3c57600080fd5b5060405190808252806020026020018201604052801562000c67578160200160208202803683370190505b509050336000805b8581101562000e0a5786868281811062000c8557fe5b90506020020135915062000c998262001700565b62000ca78383600062002333565b60005b855181101562000e005760008381526008602090815260408083206001600160a01b03881684528252808320848452600101909152902054801562000df65762000d128187848151811062000cfb57fe5b60200260200101516200260a90919063ffffffff16565b86838151811062000d1f57fe5b60209081029190910181019190915260008581526008825260408082206001600160a01b0389168352835280822085835260010190925290812055865187908390811062000d6957fe5b60200260200101516001600160a01b031684866001600160a01b03167ff75f3d433c6628e04e01a0be1a2c6692a6011ce4b00389824cfa8b8a12f3c1c462000dd36005878154811062000db857fe5b9060005260206000200154866200288190919063ffffffff16565b62000ddd6200266e565b60405162000ded92919062003781565b60405180910390a45b5060010162000caa565b5060010162000c6f565b506000600760008888600081811062000e1f57fe5b6020908102929092013583525081019190915260400160009081206003015463ffffffff1691505b845181101562000eda57600085828151811062000e6057fe5b6020026020010151111562000ed15762000ed186828151811062000e8057fe5b60200260200101518562000eca6005858154811062000e9b57fe5b906000526020600020015489868151811062000eb357fe5b60200260200101516200288190919063ffffffff16565b85620028ea565b60010162000e47565b5050505050505b5050565b60028054141562000f3d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600280556000818152600760209081526040808320600883528184203385529092528220805483825591929091905b60045481101562000f99576000818152600180850160205260408220808201839055919091550162000f6c565b50825462000fa8908262002998565b83558015620010485760028301546001600160a01b031680156200102b57604051632770a7eb60e21b81526001600160a01b03821690639dc29fac9062000ff6903390869060040162003260565b600060405180830381600087803b1580156200101157600080fd5b505af115801562001026573d6000803e3d6000fd5b505050505b600184015462001046906001600160a01b03163384620029f6565b505b620010526200266e565b63ffffffff1684336001600160a01b03167f2369db1bafee945aee5630782f4a170682e3f8188d8dc247a4c73eb8c9e692d284604051620010949190620036a7565b60405180910390a4505060016002555050565b6000546001600160a01b03163314620010f4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b03811662001150576040805162461bcd60e51b815260206004820152600b60248201527f6e65772061646d696e2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146200120e576040805162461bcd60e51b815260206004820152600b60248201527f6e6f742070656e64696e67000000000000000000000000000000000000000000604482015290519081900360640190fd5b600154600054604080516001600160a01b03938416815292909116602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314620012ce576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b0381166200132a576040805162461bcd60e51b815260206004820152600760248201527f61646d696e203000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600054604080516001600160a01b038085168252909216602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048181548110620013e157600080fd5b6000918252602090912001546001600160a01b0316905081565b60028054141562001453576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002805560008181526008602090815260408083203384529091529020546200147e90829062002672565b506001600255565b6000546001600160a01b03163314620014d3576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b620014de8562001700565b6000858152600760205260409020620014f66200266e565b600282015463ffffffff918216600160c01b909104909116116200152e5760405162461bcd60e51b815260040162000b6c9062003670565b6004548214620015525760405162461bcd60e51b815260040162000b6c90620033ed565b6200155c6200266e565b63ffffffff168563ffffffff161180156200158b5750600281015463ffffffff600160a01b9091048116908616115b620015aa5760405162461bcd60e51b815260040162000b6c9062003492565b60028101805463ffffffff60c01b1916600160c01b63ffffffff888116919091029190911790915560038201805463ffffffff191691861691909117905560005b828110156200169a5760006200165e8360020160149054906101000a900463ffffffff16880363ffffffff1662001657600585815481106200162957fe5b90600052602060002001548888878181106200164157fe5b9050602002013562002a6390919063ffffffff16565b9062002881565b905080620016805760405162461bcd60e51b815260040162000b6c9062003537565b6000828152600484016020526040902055600101620015eb565b508363ffffffff168563ffffffff16877f5af4b4ed394dca9f180924459d4de6143b41833ed4899ddafbd0aa26de5ff7b560405160405180910390a4505050505050565b60058181548110620016ef57600080fd5b600091825260209091200154905081565b6006548110620017245760405162461bcd60e51b815260040162000b6c9062003424565b6000818152600760205260408120906200173e8362002ac1565b600283015490915063ffffffff600160e01b9091048116908216116200176657505062001848565b8154806200179b57506002909101805463ffffffff909216600160e01b026001600160e01b0390921691909117905562001848565b600283015463ffffffff600160e01b909104811683031660005b6004548110156200181e57600081815260048601602052604081208054909190620017e290859062002a63565b90506200181085620017fa8364e8d4a5100062002a63565b816200180257fe5b60018501549190046200260a565b6001928301555001620017b5565b5050506002909101805463ffffffff909216600160e01b026001600160e01b039092169190911790555b50565b6000546001600160a01b0316331462001898576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b620018a38662001700565b6000868152600760205260409020620018bb6200266e565b600282015463ffffffff918216600160a01b9091049091161180620018ff5750620018e56200266e565b600282015463ffffffff918216600160c01b909104909116105b6200191e5760405162461bcd60e51b815260040162000b6c9062003613565b6004548214620019425760405162461bcd60e51b815260040162000b6c9062003500565b6200194c6200266e565b63ffffffff168663ffffffff161180156200197257508563ffffffff168563ffffffff16115b620019915760405162461bcd60e51b815260040162000b6c90620034c9565b60028101805463ffffffff60a01b1916600160a01b63ffffffff8981169182029290921763ffffffff60c01b1916600160c01b89841602176001600160e01b0316600160e01b919091021790915560038201805463ffffffff191691861691909117905560005b8281101562001a5e57600062001a2288880363ffffffff1662001657600585815481106200162957fe5b90508062001a445760405162461bcd60e51b815260040162000b6c9062003537565b6000828152600484016020526040902055600101620019f8565b508463ffffffff168663ffffffff16887fb604531d649168314d05bda3f75bfa2aab29e79121f8cee6dc685dc2a031c43d8760405162001a9f919062003795565b60405180910390a450505050505050565b6060600480548060200260200160405190810160405280929190818152602001828054801562001b0a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162001aeb575b5050505050905090565b6000546001600160a01b0316331462001b61576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60006004838154811062001b7157fe5b6000918252602090912001546001600160a01b031690508062001c18576000336001600160a01b03168360405162001ba99062003249565b60006040518083038185875af1925050503d806000811462001be8576040519150601f19603f3d011682016040523d82523d6000602084013e62001bed565b606091505b505090508062001c115760405162461bcd60e51b815260040162000b6c90620035a5565b5062001c2e565b62001c2e6001600160a01b0382163384620029f6565b505050565b6004546060908067ffffffffffffffff8111801562001c5157600080fd5b5060405190808252806020026020018201604052801562001c7c578160200160208202803683370190505b506000858152600760209081526040808320600883528184206001600160a01b038916855290925282208154600283015494965091939092600160e01b90910463ffffffff169062001cce8962002ac1565b905060005b8681101562001e0757600081815260048701602052604090206001015463ffffffff83168410801562001d0557508415155b1562001d6357600082815260048801602052604081205462001d359063ffffffff808716889003919062002a6316565b905062001d5f8662001d4d8364e8d4a5100062002a63565b8162001d5557fe5b849190046200260a565b9150505b600082815260018088016020526040909120015464e8d4a510009062001d999062001d9090849062002998565b88549062002a63565b8162001da157fe5b0489838151811062001daf57fe5b60200260200101818152505062001de5866001016000848152602001908152602001600020600001548a848151811062000cfb57fe5b89838151811062001df257fe5b60209081029190910101525060010162001cd3565b5050505050505092915050565b62001e1f8162001700565b620018483382600162002333565b6000546001600160a01b031681565b6000546001600160a01b0316331462001e89576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b03881660009081526003602052604090205460ff161562001ec55760405162461bcd60e51b815260040162000b6c90620035dc565b6001600160a01b03881662001eee5760405162461bcd60e51b815260040162000b6c906200337f565b600454831462001f125760405162461bcd60e51b815260040162000b6c906200345b565b62001f1c6200266e565b63ffffffff168763ffffffff1611801562001f4257508663ffffffff168663ffffffff16115b62001f615760405162461bcd60e51b815260040162000b6c90620033b6565b6000825160001415801562001f765750815115155b1562001fe757828260405162001f8c9062002ddd565b62001f9992919062003316565b604051809103906000f08015801562001fb6573d6000803e3d6000fd5b50600654600090815260076020526040902060020180546001600160a01b0319166001600160a01b03831617905590505b6006805460009081526007602052604080822060010180546001600160a01b0319166001600160a01b038e16179055825482528082206002908101805463ffffffff60a01b1916600160a01b63ffffffff8f811691820292909217909255855485528385208301805463ffffffff60c01b1916600160c01b8f8416021790558554855283852090920180546001600160e01b0316600160e01b909202919091179055925482528120600301805463ffffffff1916928916929092179091555b848110156200214a576000620020e88a8a0363ffffffff166200165760058581548110620020d057fe5b90600052602060002001548a8a878181106200164157fe5b9050806200210a5760405162461bcd60e51b815260040162000b6c9062003537565b60408051808201825291825260006020808401828152600654835260078252838320868452600401909152919020915182555160019182015501620020a6565b506006805460019081019091556001600160a01b03808b1660008181526003602052604090819020805460ff1916909417909355915190831691907fee97de5694d00acf6fe59073e574f8fa17901ad0ce3eabb3740a73b4a4fc8b6290620021b8908c908c908c90620037a6565b60405180910390a3505050505050505050565b8015806200226e5750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200223e57600080fd5b505afa15801562002253573d6000803e3d6000fd5b505050506040513d60208110156200226a57600080fd5b5051155b620022ab5760405162461bcd60e51b81526004018080602001828103825260368152602001806200482e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167f095ea7b30000000000000000000000000000000000000000000000000000000017905262001c2e90849062002b10565b606062002329848460008562002bc7565b90505b9392505050565b60008281526008602090815260408083206001600160a01b038716845290915290205460045481620023c55760005b81811015620023bc5760008581526007602090815260408083208484526004018252808320600190810154898552600884528285206001600160a01b038c1686528452828520868652820190935292208201550162002362565b50505062001c2e565b60005b81811015620025875760008581526007602090815260408083208484526004018252808320600190810154898552600884528285206001600160a01b038c16865284528285208686528201909352908320908101549192909164e8d4a510009062002442906200243a90869062002998565b889062002a63565b816200244a57fe5b835491900491506200245e9082906200260a565b9050866200246d578062002470565b60005b825560018201839055868015620024875750600081115b156200257b576000620024bc60058681548110620024a157fe5b9060005260206000200154836200288190919063ffffffff16565b90506200250b60048681548110620024d057fe5b60009182526020808320909101548c835260079091526040909120600301546001600160a01b03909116908c90849063ffffffff16620028ea565b600485815481106200251957fe5b6000918252602090912001546001600160a01b03908116908a908c167ff75f3d433c6628e04e01a0be1a2c6692a6011ce4b00389824cfa8b8a12f3c1c484620025616200266e565b6040516200257192919062003781565b60405180910390a4505b505050600101620023c8565b505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790526200260490859062002b10565b50505050565b60008282018381101562002665576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b4290565b6000828152600760209081526040808320600883528184203385529092529091208054831115620026b75760405162461bcd60e51b815260040162000b6c906200356e565b620026c28462001700565b620026d03385600162002333565b8054620026de908462002998565b81558154620026ee908462002998565b825560028201546001600160a01b031680156200276a57604051632770a7eb60e21b81526001600160a01b03821690639dc29fac9062002735903390889060040162003260565b600060405180830381600087803b1580156200275057600080fd5b505af115801562002765573d6000803e3d6000fd5b505050505b600183015462002785906001600160a01b03163386620029f6565b6200278f6200266e565b63ffffffff1685336001600160a01b03167f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9487604051620027d19190620036a7565b60405180910390a45050505050565b6000806007600085856000818110620027f557fe5b602090810292909201358352508101919091526040016000206003015463ffffffff16905060015b83811015620028765781600760008787858181106200283857fe5b602090810292909201358352508101919091526040016000206003015463ffffffff16146200286d5760009250505062002668565b6001016200281d565b506001949350505050565b6000808211620028d8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381620028e257fe5b049392505050565b60006001600160a01b038516156200290457600062002906565b825b90507f000000000000000000000000e79bfc312328ab75272785dbf5bd871b253709a56001600160a01b0316631e2fabb682878787876040518663ffffffff1660e01b81526004016200295d9493929190620032e8565b6000604051808303818588803b1580156200297757600080fd5b505af11580156200298c573d6000803e3d6000fd5b50505050505050505050565b600082821115620029f0576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905262001c2e90849062002b10565b60008262002a745750600062002668565b8282028284828162002a8257fe5b0414620026655760405162461bcd60e51b8152600401808060200182810382526021815260200180620047e36021913960400191505060405180910390fd5b600081815260076020526040902060020154600160c01b900463ffffffff1662002aea6200266e565b63ffffffff168163ffffffff16111562002b0b5762002b086200266e565b90505b919050565b600062002b67826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023189092919063ffffffff16565b80519091501562001c2e5780806020019051602081101562002b8857600080fd5b505162001c2e5760405162461bcd60e51b815260040180806020018281038252602a81526020018062004804602a913960400191505060405180910390fd5b60608247101562002c0a5760405162461bcd60e51b8152600401808060200182810382526026815260200180620047bd6026913960400191505060405180910390fd5b62002c158562002d2d565b62002c67576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831062002ca75780518252601f19909201916020918201910162002c86565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462002d0b576040519150601f19603f3d011682016040523d82523d6000602084013e62002d10565b606091505b509150915062002d2282828662002d33565b979650505050505050565b3b151590565b6060831562002d445750816200232c565b82511562002d555782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562002da157818101518382015260200162002d87565b50505050905090810190601f16801562002dcf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b610ff680620037c783390190565b80356001600160a01b038116811462002b0b57600080fd5b60008083601f84011262002e15578081fd5b50813567ffffffffffffffff81111562002e2d578182fd5b602083019150836020808302850101111562002e4857600080fd5b9250929050565b600082601f83011262002e60578081fd5b813567ffffffffffffffff8082111562002e7657fe5b604051601f8301601f19168101602001828111828210171562002e9557fe5b60405282815284830160200186101562002ead578384fd5b82602086016020830137918201602001929092529392505050565b803563ffffffff8116811462002b0b57600080fd5b60006020828403121562002eef578081fd5b6200232c8262002deb565b60008060008060008060008060e0898b03121562002f16578384fd5b62002f218962002deb565b975062002f3160208a0162002ec8565b965062002f4160408a0162002ec8565b955062002f5160608a0162002ec8565b9450608089013567ffffffffffffffff8082111562002f6e578586fd5b62002f7c8c838d0162002e03565b909650945060a08b013591508082111562002f95578384fd5b62002fa38c838d0162002e4f565b935060c08b013591508082111562002fb9578283fd5b5062002fc88b828c0162002e4f565b9150509295985092959890939650565b6000806020838503121562002feb578182fd5b823567ffffffffffffffff81111562003002578283fd5b620030108582860162002e03565b90969095509350505050565b6000602082840312156200302e578081fd5b5035919050565b6000806040838503121562003048578182fd5b823591506200305a6020840162002deb565b90509250929050565b6000806040838503121562003076578182fd5b50508035926020909101359150565b6000806000606084860312156200309a578283fd5b833592506020840135915060408401358015158114620030b8578182fd5b809150509250925092565b600080600080600060808688031215620030db578081fd5b85359450620030ed6020870162002ec8565b9350620030fd6040870162002ec8565b9250606086013567ffffffffffffffff81111562003119578182fd5b620031278882890162002e03565b969995985093965092949392505050565b60008060008060008060a0878903121562003151578182fd5b86359550620031636020880162002ec8565b9450620031736040880162002ec8565b9350620031836060880162002ec8565b9250608087013567ffffffffffffffff8111156200319f578283fd5b620031ad89828a0162002e03565b979a9699509497509295939492505050565b6000815180845260208085019450808401835b83811015620031f057815187529582019590820190600101620031d2565b509495945050505050565b60008151808452815b81811015620032225760208185018101518683018201520162003204565b81811115620032345782602083870101525b50601f01601f19169290920160200192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015620032bc5783516001600160a01b03168352928401929184019160010162003295565b50909695505050505050565b6000602082526200232c6020830184620031bf565b901515815260200190565b6001600160a01b039485168152929093166020830152604082015263ffffffff909116606082015260800190565b6000604082526200332b6040830185620031fb565b82810360208401526200333f8185620031fb565b95945050505050565b60208082526017908201527f686172766573743a20656d70747920706f6f6c20696473000000000000000000604082015260600190565b60208082526018908201527f6164643a20696e76616c6964207374616b6520746f6b656e0000000000000000604082015260600190565b60208082526012908201527f6164643a20696e76616c69642074696d65730000000000000000000000000000604082015260600190565b60208082526016908201527f7570646174653a20696e76616c6964206c656e67746800000000000000000000604082015260600190565b6020808252600f908201527f696e76616c696420706f6f6c2069640000000000000000000000000000000000604082015260600190565b60208082526013908201527f6164643a20696e76616c6964206c656e67746800000000000000000000000000604082015260600190565b60208082526018908201527f7570646174653a20696e76616c696420656e642074696d650000000000000000604082015260600190565b60208082526014908201527f72656e65773a20696e76616c69642074696d6573000000000000000000000000604082015260600190565b60208082526015908201527f72656e65773a20696e76616c6964206c656e6774680000000000000000000000604082015260600190565b60208082526010908201527f72657761726420746f6f20736d616c6c00000000000000000000000000000000604082015260600190565b6020808252601d908201527f77697468647261773a20696e73756666696369656e7420616d6f756e74000000604082015260600190565b6020808252601c908201527f7472616e736665722072657761726420746f6b656e206661696c656400000000604082015260600190565b60208082526014908201527f6164643a206475706c69636174656420706f6f6c000000000000000000000000604082015260600190565b60208082526022908201527f72656e65773a20696e76616c696420706f6f6c20737461746520746f2072656e60408201527f6577000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f7570646174653a20706f6f6c20616c726561647920656e646564000000000000604082015260600190565b90815260200190565b8a81526001600160a01b038a811660208301528916604082015263ffffffff8881166060830152878116608083015286811660a0830152851660c082015261014060e082018190526000906200370983820187620031bf565b9050828103610100840152620037208186620031bf565b9050828103610120840152620037378185620031bf565b9d9c50505050505050505050505050565b600084825260606020830152620037636060830185620031bf565b8281036040840152620037778185620031bf565b9695505050505050565b91825263ffffffff16602082015260400190565b63ffffffff91909116815260200190565b63ffffffff9384168152918316602083015290911660408201526060019056fe60806040523480156200001157600080fd5b5060405162000ff638038062000ff68339810160408190526200003491620001d6565b8151829082906200004d9060039060208501906200008f565b508051620000639060049060208401906200008f565b505060058054601260ff1990911617610100600160a81b0319166101003302179055506200023d915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620000c7576000855562000112565b82601f10620000e257805160ff191683800117855562000112565b8280016001018555821562000112579182015b8281111562000112578251825591602001919060010190620000f5565b506200012092915062000124565b5090565b5b8082111562000120576000815560010162000125565b600082601f8301126200014c578081fd5b81516001600160401b03808211156200016157fe5b6040516020601f8401601f19168201810183811183821017156200018157fe5b604052838252858401810187101562000198578485fd5b8492505b83831015620001bb57858301810151828401820152918201916200019c565b83831115620001cc57848185840101525b5095945050505050565b60008060408385031215620001e9578182fd5b82516001600160401b038082111562000200578384fd5b6200020e868387016200013b565b9350602085015191508082111562000224578283fd5b5062000233858286016200013b565b9150509250929050565b610da9806200024d6000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806340c10f191161008c5780639dc29fac116100665780639dc29fac146101a2578063a457c2d7146101b5578063a9059cbb146101c8578063dd62ed3e146101db576100df565b806340c10f191461017257806370a082311461018757806395d89b411461019a576100df565b806323b872dd116100bd57806323b872dd14610137578063313ce5671461014a578063395093511461015f576100df565b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610122575b600080fd5b6100ec6101ee565b6040516100f99190610b8e565b60405180910390f35b610115610110366004610b5a565b610284565b6040516100f99190610b83565b61012a6102a1565b6040516100f99190610c18565b610115610145366004610b1f565b6102a7565b61015261032e565b6040516100f99190610c21565b61011561016d366004610b5a565b610337565b610185610180366004610b5a565b610385565b005b61012a610195366004610ad3565b6103cb565b6100ec6103ea565b6101856101b0366004610b5a565b61044b565b6101156101c3366004610b5a565b610484565b6101156101d6366004610b5a565b6104ec565b61012a6101e9366004610aed565b610500565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561027a5780601f1061024f5761010080835404028352916020019161027a565b820191906000526020600020905b81548152906001019060200180831161025d57829003601f168201915b5050505050905090565b600061029861029161052b565b848461052f565b50600192915050565b60025490565b60006102b484848461061b565b610324846102c061052b565b61031f85604051806060016040528060288152602001610cbd602891396001600160a01b038a166000908152600160205260408120906102fe61052b565b6001600160a01b031681526020810191909152604001600020549190610776565b61052f565b5060019392505050565b60055460ff1690565b600061029861034461052b565b8461031f856001600061035561052b565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061080d565b60055461010090046001600160a01b031633146103bd5760405162461bcd60e51b81526004016103b490610be1565b60405180910390fd5b6103c7828261086e565b5050565b6001600160a01b0381166000908152602081905260409020545b919050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561027a5780601f1061024f5761010080835404028352916020019161027a565b60055461010090046001600160a01b0316331461047a5760405162461bcd60e51b81526004016103b490610be1565b6103c7828261095e565b600061029861049161052b565b8461031f85604051806060016040528060258152602001610d4f60259139600160006104bb61052b565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610776565b60006102986104f961052b565b848461061b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166105745760405162461bcd60e51b8152600401808060200182810382526024815260200180610d2b6024913960400191505060405180910390fd5b6001600160a01b0382166105b95760405162461bcd60e51b8152600401808060200182810382526022815260200180610c756022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166106605760405162461bcd60e51b8152600401808060200182810382526025815260200180610d066025913960400191505060405180910390fd5b6001600160a01b0382166106a55760405162461bcd60e51b8152600401808060200182810382526023815260200180610c306023913960400191505060405180910390fd5b6106b0838383610a5a565b6106ed81604051806060016040528060268152602001610c97602691396001600160a01b0386166000908152602081905260409020549190610776565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461071c908261080d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156108055760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156107ca5781810151838201526020016107b2565b50505050905090810190601f1680156107f75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610867576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b0382166108c9576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6108d560008383610a5a565b6002546108e2908261080d565b6002556001600160a01b038216600090815260208190526040902054610908908261080d565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166109a35760405162461bcd60e51b8152600401808060200182810382526021815260200180610ce56021913960400191505060405180910390fd5b6109af82600083610a5a565b6109ec81604051806060016040528060228152602001610c53602291396001600160a01b0385166000908152602081905260409020549190610776565b6001600160a01b038316600090815260208190526040902055600254610a129082610a5f565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b505050565b600082821115610ab6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b80356001600160a01b03811681146103e557600080fd5b600060208284031215610ae4578081fd5b61086782610abc565b60008060408385031215610aff578081fd5b610b0883610abc565b9150610b1660208401610abc565b90509250929050565b600080600060608486031215610b33578081fd5b610b3c84610abc565b9250610b4a60208501610abc565b9150604084013590509250925092565b60008060408385031215610b6c578182fd5b610b7583610abc565b946020939093013593505050565b901515815260200190565b6000602080835283518082850152825b81811015610bba57858101830151858201604001528201610b9e565b81811115610bcb5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600c908201527f756e617574686f72697a65640000000000000000000000000000000000000000604082015260600190565b90815260200190565b60ff9190911681526020019056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220aab5d45caea3d506e75cfdec4d70b7aaf37cdf455d26a128beb5e30d97eadc5464736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220f0867824aabc990139bcc1e46e0f7838ee46bc3873ff85d0a854ec04dbc4a01264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000375442dcacefc8f93be8a102ea30aa16b658f1e10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e79bfc312328ab75272785dbf5bd871b253709a500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _admin (address): 0x375442dCACEfc8F93be8A102EA30Aa16b658f1E1
Arg [1] : _rewardTokens (address[]): 0x0000000000000000000000000000000000000000
Arg [2] : _rewardLocker (address): 0xE79bfc312328Ab75272785DBf5Bd871b253709A5
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000375442dcacefc8f93be8a102ea30aa16b658f1e1
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 000000000000000000000000e79bfc312328ab75272785dbf5bd871b253709a5
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
877:22161:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3251:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17652:626;;;;;;;;;;-1:-1:-1;17652:626:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;2879:42::-;;;;;;;;;;-1:-1:-1;2879:42:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;123:27:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16420:1144:8:-;;;;;;;;;;-1:-1:-1;16420:1144:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;3172:50::-;;;;;;;;;;;;;:::i;10912:857::-;;;;;;;;;;-1:-1:-1;10912:857:8;;;;;:::i;:::-;;:::i;:::-;;11945:115;;;;;;;;;;-1:-1:-1;11945:115:8;;;;;:::i;:::-;;:::i;13498:1405::-;;;;;;;;;;-1:-1:-1;13498:1405:8;;;;;:::i;:::-;;:::i;12550:798::-;;;;;;;;;;-1:-1:-1;12550:798:8;;;;;:::i;:::-;;:::i;637:199:9:-;;;;;;;;;;-1:-1:-1;637:199:9;;;;;:::i;:::-;;:::i;1354:209::-;;;;;;;;;;;;;:::i;1011:239::-;;;;;;;;;;-1:-1:-1;1011:239:9;;;;;:::i;:::-;;:::i;3074:29:8:-;;;;;;;;;;-1:-1:-1;3074:29:8;;;;;:::i;:::-;;:::i;12186:127::-;;;;;;;;;;-1:-1:-1;12186:127:8;;;;;:::i;:::-;;:::i;9711:982::-;;;;;;;;;;-1:-1:-1;9711:982:8;;;;;:::i;:::-;;:::i;3107:28::-;;;;;;;;;;-1:-1:-1;3107:28:8;;;;;:::i;:::-;;:::i;18562:852::-;;;;;;;;;;-1:-1:-1;18562:852:8;;;;;:::i;:::-;;:::i;8176:1156::-;;;;;;;;;;-1:-1:-1;8176:1156:8;;;;;:::i;:::-;;:::i;16257:107::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5221:387::-;;;;;;;;;;-1:-1:-1;5221:387:8;;;;;:::i;:::-;;:::i;15079:1126::-;;;;;;;;;;-1:-1:-1;15079:1126:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18380:128::-;;;;;;;;;;-1:-1:-1;18380:128:8;;;;;:::i;:::-;;:::i;97:20:9:-;;;;;;;;;;;;;:::i;6103:1589:8:-;;;;;;;;;;-1:-1:-1;6103:1589:8;;;;;:::i;:::-;;:::i;3251:34::-;;;;:::o;17652:626::-;17760:14;17898;;;:8;:14;;;;;;;;-1:-1:-1;;;;;17898:24:8;;;;;;;;;17937:11;;17987:12;:19;17937:11;;17782:33;;;;17898:24;17973:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17973:34:8;-1:-1:-1;18049:12:8;:19;17954:53;;-1:-1:-1;18035:34:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18035:34:8;;18013:56;;18080:9;18075:199;18099:12;:19;18095:23;;18075:199;;;18155:22;;;;:19;;;:22;;;;;:38;18133:19;;:16;;18175:1;;18133:19;;;;;;;;;;;:60;;;;;18226:4;:19;;:22;18246:1;18226:22;;;;;;;;;;;:41;;;18201:19;18221:1;18201:22;;;;;;;;;;;;;;;;;:66;18120:3;;18075:199;;;;17652:626;;;;;;:::o;2879:42::-;;;;;;;;;;;;;;;:::o;123:27:9:-;;;-1:-1:-1;;;;;123:27:9;;:::o;16420:1144:8:-;16510:18;16854:14;;;:8;:14;;;;;16887:15;;16921;;;;16967:19;;;;17113:20;;;;17172:12;:19;16887:15;;-1:-1:-1;;;;;16921:15:8;;;;16967:19;;;;17005:14;-1:-1:-1;;;17005:14:8;;;;;-1:-1:-1;;;17035:12:8;;;;;-1:-1:-1;;;17070:19:8;;;;;;17113:20;;;16697:33;;;;;;16854:14;17158:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17158:34:8;-1:-1:-1;17232:11:8;:18;17139:53;;-1:-1:-1;17218:33:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17218:33:8;-1:-1:-1;17292:12:8;:19;17198:53;;-1:-1:-1;17278:34:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17278:34:8;;17257:55;;17323:9;17318:242;17342:12;:19;17338:23;;17318:242;;;17398:22;;;;:19;;;:22;;;;;:38;17376:19;;:16;;17418:1;;17376:19;;;;;;;;;;;:60;;;;;17467:11;17479:1;17467:14;;;;;;;;;;;;;;;;17444:17;17462:1;17444:20;;;;;;;;;;;;;:37;;;;;17513:4;:19;;:22;17533:1;17513:22;;;;;;;;;;;:40;;;17489:18;17508:1;17489:21;;;;;;;;;;;;;;;;;:64;17363:3;;17318:242;;;;16420:1144;;;;;;;;;;;;:::o;3172:50::-;;;:::o;10912:857::-;1680:1:10;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:18;;11077:23:8::1;11095:4:::0;11077:17:::1;:23::i;:::-;11106:51;11124:10;11136:4;11142:14;11106:17;:51::i;:::-;11164:21;11188:14:::0;;;:8:::1;:14;::::0;;;;;;;11232:8:::1;:14:::0;;;;;11247:10:::1;11232:26:::0;;;;;;;11301:15:::1;::::0;::::1;::::0;11232:26;;11291:79:::1;::::0;-1:-1:-1;;;;;11301:15:8::1;::::0;11355:4:::1;11362:7:::0;11291:43:::1;:79::i;:::-;11431:19;::::0;::::1;::::0;-1:-1:-1;;;;;11431:19:8::1;11460:26:::0;;11456:78:::1;;11496:31;::::0;;;;-1:-1:-1;;;;;11496:10:8;::::1;::::0;::::1;::::0;:31:::1;::::0;11507:10:::1;::::0;11519:7;;11496:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;11456:78;11625:11:::0;;:24:::1;::::0;11641:7;11625:15:::1;:24::i;:::-;11611:38:::0;;11673:15;;:28:::1;::::0;11693:7;11673:19:::1;:28::i;:::-;11655:46:::0;;11739:15:::1;:13;:15::i;:::-;11713:51;;11733:4;11721:10;-1:-1:-1::0;;;;;11713:51:8::1;;11756:7;11713:51;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:10;2563:7;:22;-1:-1:-1;;;;10912:857:8:o;11945:115::-;1680:1:10;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:18;;12031:24:8::1;12041:4:::0;12047:7;12031:9:::1;:24::i;:::-;-1:-1:-1::0;;1637:1:10;2563:7;:22;11945:115:8:o;13498:1405::-;13586:16;13578:52;;;;-1:-1:-1;;;13578:52:8;;;;;;;:::i;:::-;;;;;;;;;13642:29;13665:5;;13642:22;:29::i;:::-;13637:210;;13753:9;13748:79;13768:16;;;13748:79;;;13801:17;13809:5;;13815:1;13809:8;;;;;;;;;;;;;13801:7;:17::i;:::-;13786:3;;13748:79;;;;13834:7;;13637:210;13852:24;13879:12;13852:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13852:39:8;;;;;;;;;;;;;;;;;;;;;;;13897:29;13943:7;:14;13929:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13929:29:8;-1:-1:-1;13897:61:8;-1:-1:-1;13982:10:8;13964:15;;14016:600;14036:16;;;14016:600;;;14073:5;;14079:1;14073:8;;;;;;;;;;;;;14067:14;;14089:22;14107:3;14089:17;:22::i;:::-;14166:38;14184:7;14193:3;14198:5;14166:17;:38::i;:::-;14218:9;14213:397;14237:7;:14;14233:1;:18;14213:397;;;14268:14;14285:13;;;:8;:13;;;;;;;;-1:-1:-1;;;;;14285:22:8;;;;;;;;;:40;;;:37;;:40;;;;;:56;14355:10;;14351:251;;14397:27;14417:6;14397:12;14410:1;14397:15;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;14379:12;14392:1;14379:15;;;;;;;;;;;;;;;;;;:45;;;;14495:1;14436:13;;;:8;:13;;;;;;-1:-1:-1;;;;;14436:22:8;;;;;;;;;:40;;;:37;;:40;;;;;;:60;14535:10;;:7;;14474:1;;14535:10;;;;;;;;;;;;-1:-1:-1;;;;;14513:78:8;14530:3;14521:7;-1:-1:-1;;;;;14513:78:8;;14547:26;14558:11;14570:1;14558:14;;;;;;;;;;;;;;;;14547:6;:10;;:26;;;;:::i;:::-;14575:15;:13;:15::i;:::-;14513:78;;;;;;;:::i;:::-;;;;;;;;14351:251;-1:-1:-1;14253:3:8;;14213:397;;;-1:-1:-1;14054:3:8;;14016:600;;;;14622:15;14640:8;:18;14649:5;;14655:1;14649:8;;;;;;;;;;;;;;;;14640:18;;-1:-1:-1;14640:18:8;;;;;;;;-1:-1:-1;14640:18:8;;;:34;;;;;;-1:-1:-1;14701:198:8;14725:12;:19;14721:1;:23;14701:198;;;14781:1;14763:12;14776:1;14763:15;;;;;;;;;;;;;;:19;14759:134;;;14794:90;14816:7;14824:1;14816:10;;;;;;;;;;;;;;14829:7;14838:35;14858:11;14870:1;14858:14;;;;;;;;;;;;;;;;14838:12;14851:1;14838:15;;;;;;;;;;;;;;:19;;:35;;;;:::i;:::-;14875:8;14794:11;:90::i;:::-;14746:3;;14701:198;;;;13498:1405;;;;;;;;:::o;12550:798::-;1680:1:10;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:18;;12628:21:8::1;12652:14:::0;;;:8:::1;:14;::::0;;;;;;;12696:8:::1;:14:::0;;;;;12711:10:::1;12696:26:::0;;;;;;;12745:11;;12763:15;;;12652:14;;12696:26;;12745:11;12784:202:::1;12808:12;:19:::0;12804:23;::::1;12784:202;;;12842:33;12878:22:::0;;;:19:::1;::::0;;::::1;:22;::::0;;;;12908:29;;::::1;:33:::0;;;12949:30;;;;12829:3:::1;12784:202;;;-1:-1:-1::0;13010:15:8;;:27:::1;::::0;13030:6;13010:19:::1;:27::i;:::-;12992:45:::0;;13048:10;;13044:228:::1;;13091:19;::::0;::::1;::::0;-1:-1:-1;;;;;13091:19:8::1;13122:26:::0;;13118:81:::1;;13160:30;::::0;-1:-1:-1;;;13160:30:8;;-1:-1:-1;;;;;13160:10:8;::::1;::::0;::::1;::::0;:30:::1;::::0;13171:10:::1;::::0;13183:6;;13160:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13118:81;13216:15;::::0;::::1;::::0;13206:59:::1;::::0;-1:-1:-1;;;;;13216:15:8::1;13246:10;13258:6:::0;13206:39:::1;:59::i;:::-;13044:228;;13319:15;:13;:15::i;:::-;13283:60;;13313:4;13301:10;-1:-1:-1::0;;;;;13283:60:8::1;;13336:6;13283:60;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:10;2563:7;:22;-1:-1:-1;;12550:798:8:o;637:199:9:-;446:5;;-1:-1:-1;;;;;446:5:9;432:10;:19;424:42;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;;;;-1:-1:-1;;;;;713:22:9;::::1;705:46;;;::::0;;-1:-1:-1;;;705:46:9;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;766:30;::::0;;-1:-1:-1;;;;;766:30:9;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;806:12;:23:::0;;-1:-1:-1;;;;;;806:23:9::1;-1:-1:-1::0;;;;;806:23:9;;;::::1;::::0;;;::::1;::::0;;637:199::o;1354:209::-;1401:12;;-1:-1:-1;;;;;1401:12:9;1417:10;1401:26;1393:50;;;;;-1:-1:-1;;;1393:50:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1471:12;;;1485:5;1458:33;;;-1:-1:-1;;;;;1471:12:9;;;1458:33;;1485:5;;;;1458:33;;;;;;;;;;;;;;;;1509:12;;;;1501:20;;-1:-1:-1;;;;;;1501:20:9;;;-1:-1:-1;;;;;1509:12:9;;1501:20;;;;1531:25;;;1354:209::o;1011:239::-;446:5;;-1:-1:-1;;;;;446:5:9;432:10;:19;424:42;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;;;;-1:-1:-1;;;;;1094:22:9;::::1;1086:42;;;::::0;;-1:-1:-1;;;1086:42:9;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1143:30;::::0;;-1:-1:-1;;;;;1143:30:9;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;1211:5;::::0;1188:29:::1;::::0;;-1:-1:-1;;;;;1188:29:9;;::::1;::::0;;1211:5;;::::1;1188:29;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;1227:5;:16:::0;;-1:-1:-1;;;;;;1227:16:9::1;-1:-1:-1::0;;;;;1227:16:9;;;::::1;::::0;;;::::1;::::0;;1011:239::o;3074:29:8:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3074:29:8;;-1:-1:-1;3074:29:8;:::o;12186:127::-;1680:1:10;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:18;;12274:14:8::1;::::0;;;:8:::1;:14;::::0;;;;;;;12289:10:::1;12274:26:::0;;;;;;;:33;12258:50:::1;::::0;12268:4;;12258:9:::1;:50::i;:::-;-1:-1:-1::0;1637:1:10;2563:7;:22;12186:127:8:o;9711:982::-;446:5:9;;-1:-1:-1;;;;;446:5:9;432:10;:19;424:42;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;;;;9875:23:8::1;9893:4;9875:17;:23::i;:::-;9905:21;9929:14:::0;;;:8:::1;:14;::::0;;;;10025:15:::1;:13;:15::i;:::-;10010:12;::::0;::::1;::::0;:30:::1;::::0;;::::1;-1:-1:-1::0;;;10010:12:8;;::::1;::::0;;::::1;:30;10002:69;;;;-1:-1:-1::0;;;10002:69:8::1;;;;;;;:::i;:::-;10085:12;:19:::0;:43;::::1;10077:78;;;;-1:-1:-1::0;;;10077:78:8::1;;;;;;;:::i;:::-;10180:15;:13;:15::i;:::-;10169:26;;:8;:26;;;:55;;;;-1:-1:-1::0;10210:14:8::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;10210:14:8;;::::1;::::0;::::1;10199:25:::0;;::::1;;10169:55;10161:92;;;;-1:-1:-1::0;;;10161:92:8::1;;;;;;;:::i;:::-;10260:12;::::0;::::1;:23:::0;;-1:-1:-1;;;;10260:23:8::1;-1:-1:-1::0;;;10260:23:8::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;10289:20:::1;::::0;::::1;:39:::0;;-1:-1:-1;;10289:39:8::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;10334:299:8::1;10354:24:::0;;::::1;10334:299;;;10393:24;10420:83;10481:4;:14;;;;;;;;;;;;10470:8;:25;10420:83;;:36;10441:11;10453:1;10441:14;;;;;;;;;;;;;;;;10420:13;;10434:1;10420:16;;;;;;;;;;;;;:20;;:36;;;;:::i;:::-;:40:::0;::::1;:83::i;:::-;10393:110:::0;-1:-1:-1;10519:21:8;10511:50:::1;;;;-1:-1:-1::0;;;10511:50:8::1;;;;;;;:::i;:::-;10569:22;::::0;;;:19:::1;::::0;::::1;:22;::::0;;;;:57;10380:3:::1;;10334:299;;;;10671:16;10644:44;;10661:8;10644:44;;10655:4;10644:44;;;;;;;;;;476:1:9;9711:982:8::0;;;;;:::o;3107:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3107:28:8;:::o;18562:852::-;18640:10;;18633:4;:17;18625:45;;;;-1:-1:-1;;;18625:45:8;;;;;;;:::i;:::-;18676:21;18700:14;;;:8;:14;;;;;;18747:30;18709:4;18747:24;:30::i;:::-;18808:19;;;;18720:57;;-1:-1:-1;18808:19:8;-1:-1:-1;;;18808:19:8;;;;;18787:40;;;;18783:53;;18829:7;;;;18783:53;18863:15;;18888:16;18884:90;;-1:-1:-1;18914:19:8;;;;:39;;;;;;-1:-1:-1;;;18914:39:8;-1:-1:-1;;;;;18914:39:8;;;;;;;;;18961:7;;18884:90;19023:19;;;;;-1:-1:-1;;;19023:19:8;;;;;19003:39;;18979:63;:21;19048:317;19072:12;:19;19068:23;;19048:317;;;19106:33;19142:22;;;:19;;;:22;;;;;19207:26;;19142:22;;19106:33;19189:45;;:13;;:17;:45::i;:::-;19172:62;-1:-1:-1;19273:85:8;19339:11;19315:21;19172:62;3328:4;19315:10;:21::i;:::-;:35;;;;;19273:28;;;;;19315:35;;19273:32;:85::i;:::-;19242:28;;;;:116;-1:-1:-1;19093:3:8;19048:317;;;-1:-1:-1;;;19370:19:8;;;;:39;;;;;;-1:-1:-1;;;19370:39:8;-1:-1:-1;;;;;19370:39:8;;;;;;;;;18562:852;;:::o;8176:1156::-;446:5:9;;-1:-1:-1;;;;;446:5:9;432:10;:19;424:42;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;;;;8362:23:8::1;8380:4;8362:17;:23::i;:::-;8392:21;8416:14:::0;;;:8:::1;:14;::::0;;;;8522:15:::1;:13;:15::i;:::-;8505:14;::::0;::::1;::::0;:32:::1;::::0;;::::1;-1:-1:-1::0;;;8505:14:8;;::::1;::::0;;::::1;:32;::::0;:66:::1;;;8556:15;:13;:15::i;:::-;8541:12;::::0;::::1;::::0;:30:::1;::::0;;::::1;-1:-1:-1::0;;;8541:12:8;;::::1;::::0;;::::1;:30;8505:66;8490:131;;;;-1:-1:-1::0;;;8490:131:8::1;;;;;;;:::i;:::-;8668:12;:19:::0;:43;::::1;8660:77;;;;-1:-1:-1::0;;;8660:77:8::1;;;;;;;:::i;:::-;8764:15;:13;:15::i;:::-;8751:28;;:10;:28;;;:53;;;;;8794:10;8783:21;;:8;:21;;;8751:53;8743:86;;;;-1:-1:-1::0;;;8743:86:8::1;;;;;;;:::i;:::-;8836:14;::::0;::::1;:27:::0;;-1:-1:-1;;;;8836:27:8::1;-1:-1:-1::0;;;8836:27:8::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;8869:23:8::1;-1:-1:-1::0;;;8869:23:8;;::::1;;;-1:-1:-1::0;;;;;8898:32:8::1;-1:-1:-1::0;;;8898:32:8;;;::::1;;::::0;;;8936:20:::1;::::0;::::1;:39:::0;;-1:-1:-1;;8936:39:8::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;8982:279:8::1;9002:24:::0;;::::1;8982:279;;;9041:24;9068:63;9120:10;9109:8;:21;9068:63;;:36;9089:11;9101:1;9089:14;;;;;;;9068:63;9041:90:::0;-1:-1:-1;9147:21:8;9139:50:::1;;;;-1:-1:-1::0;;;9139:50:8::1;;;;;;;:::i;:::-;9197:22;::::0;;;:19:::1;::::0;::::1;:22;::::0;;;;:57;9028:3:::1;;8982:279;;;;9300:8;9272:55;;9288:10;9272:55;;9282:4;9272:55;9310:16;9272:55;;;;;;:::i;:::-;;;;;;;;476:1:9;8176:1156:8::0;;;;;;:::o;16257:107::-;16316:16;16347:12;16340:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16340:19:8;;;;;;;;;;;;;;;;;;;;;;;16257:107;:::o;5221:387::-;446:5:9;;-1:-1:-1;;;;;446:5:9;432:10;:19;424:42;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;;;;5311:21:8::1;5345:12;5358:16;5345:30;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;5345:30:8::1;::::0;-1:-1:-1;5386:27:8;5382:222:::1;;5424:12;5442:10;-1:-1:-1::0;;;;;5442:15:8::1;5465:6;5442:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5423:53;;;5492:7;5484:48;;;;-1:-1:-1::0;;;5484:48:8::1;;;;;;;:::i;:::-;5382:222;;;;5553:44;-1:-1:-1::0;;;;;5553:24:8;::::1;5578:10;5590:6:::0;5553:24:::1;:44::i;:::-;476:1:9;5221:387:8::0;;:::o;15079:1126::-;15238:12;:19;15180:24;;15238:19;15273:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15273:28:8;-1:-1:-1;15307:21:8;15331:14;;;:8;:14;;;;;;;;15375:8;:14;;;;;-1:-1:-1;;;;;15375:21:8;;;;;;;;;15424:15;;15475:19;;;;15263:38;;-1:-1:-1;15331:14:8;;15375:21;;-1:-1:-1;;;15475:19:8;;;;;;15527:30;15331:14;15527:24;:30::i;:::-;15500:57;;15568:9;15563:638;15587:13;15583:1;:17;15563:638;;;15615:26;15644:22;;;:19;;;:22;;;;;:40;;;15696:39;;;;-1:-1:-1;15696:59:8;;;;-1:-1:-1;15739:16:8;;;15696:59;15692:296;;;15767:14;15841:22;;;:19;;;:22;;;;;:38;15784:105;;15785:39;;;;;;;;15841:38;15784:45;:105;:::i;:::-;15767:122;-1:-1:-1;15920:59:8;15967:11;15943:21;15767:122;3328:4;15943:10;:21::i;:::-;:35;;;;;15920:18;;15943:35;;15920:22;:59::i;:::-;15899:80;;15692:296;;16056:22;;;;:19;;;;:22;;;;;;:41;;3328:4;;16017:82;;16033:65;;:18;;:22;:65::i;:::-;16017:11;;;:15;:82::i;:::-;:102;;;;;;15996:7;16004:1;15996:10;;;;;;;;;;;;;:123;;;;;16140:54;16155:4;:19;;:22;16175:1;16155:22;;;;;;;;;;;:38;;;16140:7;16148:1;16140:10;;;;;;;:54;16127:7;16135:1;16127:10;;;;;;;;;;;;;;;;;:67;-1:-1:-1;15602:3:8;;15563:638;;;;15079:1126;;;;;;;;;;:::o;18380:128::-;18433:23;18451:4;18433:17;:23::i;:::-;18462:41;18480:10;18492:4;18498;18462:17;:41::i;97:20:9:-;;;-1:-1:-1;;;;;97:20:9;;:::o;6103:1589:8:-;446:5:9;;-1:-1:-1;;;;;446:5:9;432:10;:19;424:42;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;-1:-1:-1;;;424:42:9;;;;;;;;;;;;;;;-1:-1:-1;;;;;6365:23:8;::::1;;::::0;;;:10:::1;:23;::::0;;;;;::::1;;6364:24;6356:57;;;;-1:-1:-1::0;;;6356:57:8::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6427:25:8;::::1;6419:62;;;;-1:-1:-1::0;;;6419:62:8::1;;;;;;;:::i;:::-;6495:12;:19:::0;:43;::::1;6487:75;;;;-1:-1:-1::0;;;6487:75:8::1;;;;;;;:::i;:::-;6590:15;:13;:15::i;:::-;6577:28;;:10;:28;;;:53;;;;;6620:10;6609:21;;:8;:21;;;6577:53;6569:84;;;;-1:-1:-1::0;;;6569:84:8::1;;;;;;;:::i;:::-;6660:30;6706:10;6700:24;6728:1;6700:29;;:64;;;;-1:-1:-1::0;6733:26:8;;:31;::::1;6700:64;6696:208;;;6811:10;6823:12;6792:44;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;6853:10:8::1;::::0;6844:20:::1;::::0;;;:8:::1;:20;::::0;;;;:35:::1;;:53:::0;;-1:-1:-1;;;;;;6844:53:8::1;-1:-1:-1::0;;;;;6844:53:8;::::1;;::::0;;;-1:-1:-1;6696:208:8::1;6919:10;::::0;;6910:20:::1;::::0;;;:8:::1;:20;::::0;;;;;:31:::1;;:45:::0;;-1:-1:-1;;;;;;6910:45:8::1;-1:-1:-1::0;;;;;6910:45:8;::::1;;::::0;;6970:10;;6961:20;;;;;:30:::1;::::0;;::::1;:43:::0;;-1:-1:-1;;;;6961:43:8::1;-1:-1:-1::0;;;6961:43:8::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;7019:10;;7010:20;;;;;:28;::::1;:39:::0;;-1:-1:-1;;;;7010:39:8::1;-1:-1:-1::0;;;7010:39:8;;::::1;;;::::0;;7064:10;;7055:20;;;;;:35;;::::1;:48:::0;;-1:-1:-1;;;;;7055:48:8::1;-1:-1:-1::0;;;7055:48:8;;::::1;::::0;;;::::1;::::0;;7118:10;;7109:20;;;;:36:::1;;:55:::0;;-1:-1:-1;;7109:55:8::1;::::0;;::::1;::::0;;;::::1;::::0;;;7171:361:::1;7191:24:::0;;::::1;7171:361;;;7230:24;7257:63;7309:10;7298:8;:21;7257:63;;:36;7278:11;7290:1;7278:14;;;;;;;;;;;;;;;;7257:13;;7271:1;7257:16;;;;;;:63;7230:90:::0;-1:-1:-1;7336:21:8;7328:50:::1;;;;-1:-1:-1::0;;;7328:50:8::1;;;;;;;:::i;:::-;7428:97;::::0;;;;::::1;::::0;;;;;-1:-1:-1;7428:97:8::1;::::0;;::::1;::::0;;;7396:10:::1;::::0;7387:20;;:8:::1;:20:::0;;;;;:38;;;:35:::1;;:38:::0;;;;;;:138;;;;;::::1;::::0;;::::1;::::0;7217:3:::1;7171:361;;;-1:-1:-1::0;7538:10:8::1;:12:::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;7556:23:8;;::::1;7538:10;7556:23:::0;;;:10:::1;:23;::::0;;;;;;:30;;-1:-1:-1;;7556:30:8::1;::::0;;::::1;::::0;;;7598:89;;;;::::1;::::0;7556:23;7598:89:::1;::::0;::::1;::::0;7648:10;;7660:8;;7670:16;;7598:89:::1;:::i;:::-;;;;;;;;476:1:9;6103:1589:8::0;;;;;;;;:::o;1321:613:11:-;1686:10;;;1685:62;;-1:-1:-1;1702:39:11;;;;;;1726:4;1702:39;;;;-1:-1:-1;;;;;1702:39:11;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1702:39:11;:44;1685:62;1677:150;;;;-1:-1:-1;;;1677:150:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1864:62;;;-1:-1:-1;;;;;1864:62:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1864:62:11;1887:22;1864:62;;;1837:90;;1857:5;;1837:19;:90::i;3573:193:0:-;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;;3573:193;;;;;;:::o;20319:1679:8:-;20424:18;20445:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;20445:19:8;;;;;;;;;:26;20501:12;:19;20531:15;20527:450;;20779:9;20774:183;20798:13;20794:1;:17;20774:183;;;20887:14;;;;:8;:14;;;;;;;;:32;;;:29;;:32;;;;;:61;;;;;20828:14;;;:8;:14;;;;;-1:-1:-1;;;;;20828:19:8;;;;;;;;;:37;;;:34;;:37;;;;;:56;;:120;20813:3;20774:183;;;;20964:7;;;;20527:450;20987:9;20982:1012;21006:13;21002:1;:17;20982:1012;;;21034:29;21066:14;;;:8;:14;;;;;;;;:32;;;:29;;:32;;;;;:50;;;;;21160:14;;;:8;:14;;;;;-1:-1:-1;;;;;21160:19:8;;;;;;;;;:37;;;:34;;:37;;;;;;21381:29;;;;21066:50;;21160:37;;3328:4;;21340:72;;21355:56;;21066:50;;21355:25;:56::i;:::-;21340:10;;:14;:72::i;:::-;:92;;;;;21464:26;;21340:92;;;;-1:-1:-1;21451:40:8;;21340:92;;21451:12;:40::i;:::-;21440:51;;21528:13;:28;;21548:8;21528:28;;;21544:1;21528:28;21499:57;;21643:29;;;:53;;;21709:13;:29;;;;;21737:1;21726:8;:12;21709:29;21705:283;;;21750:19;21772:28;21785:11;21797:1;21785:14;;;;;;;;;;;;;;;;21772:8;:12;;:28;;;;:::i;:::-;21750:50;;21810:89;21832:12;21845:1;21832:15;;;;;;;;;;;;;;;;;;;;21868:14;;;:8;:14;;;;;;;:30;;;-1:-1:-1;;;;;21832:15:8;;;;21850:3;;21855:11;;21868:30;;21810:11;:89::i;:::-;21933:12;21946:1;21933:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21933:15:8;;;;21927:4;;21914:65;;;21950:11;21963:15;:13;:15::i;:::-;21914:65;;;;;;;:::i;:::-;;;;;;;;21705:283;;-1:-1:-1;;;21021:3:8;;20982:1012;;;;20319:1679;;;;;:::o;858:203:11:-;985:68;;;-1:-1:-1;;;;;985:68:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;985:68:11;1008:27;985:68;;;958:96;;978:5;;958:19;:96::i;:::-;858:203;;;;:::o;2682:175:12:-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;-1:-1:-1;;;2786:46:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:1;-1:-1:-1;2682:175:12;;;;;:::o;22643:105:8:-;22727:15;22643:105;:::o;19522:708::-;19587:21;19611:14;;;:8;:14;;;;;;;;19655:8;:14;;;;;19670:10;19655:26;;;;;;;;19695:11;;:22;-1:-1:-1;19695:22:8;19687:64;;;;-1:-1:-1;;;19687:64:8;;;;;;;:::i;:::-;19796:23;19814:4;19796:17;:23::i;:::-;19825:41;19843:10;19855:4;19861;19825:17;:41::i;:::-;19887:11;;:24;;19903:7;19887:15;:24::i;:::-;19873:38;;19935:15;;:28;;19955:7;19935:19;:28::i;:::-;19917:46;;19993:19;;;;-1:-1:-1;;;;;19993:19:8;20022:26;;20018:78;;20058:31;;-1:-1:-1;;;20058:31:8;;-1:-1:-1;;;;;20058:10:8;;;;;:31;;20069:10;;20081:7;;20058:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20018:78;20111:15;;;;20101:60;;-1:-1:-1;;;;;20111:15:8;20141:10;20153:7;20101:39;:60::i;:::-;20200:15;:13;:15::i;:::-;20173:52;;20194:4;20182:10;-1:-1:-1;;;;;20173:52:8;;20217:7;20173:52;;;;;;:::i;:::-;;;;;;;;19522:708;;;;;:::o;22752:284::-;22832:4;22844:11;22858:8;:18;22867:5;;22873:1;22867:8;;;;;;;;;;;;;;;;22858:18;;-1:-1:-1;22858:18:8;;;;;;;;-1:-1:-1;22858:18:8;:34;;;;;;-1:-1:-1;22858:34:8;22898:117;22918:16;;;22898:117;;;22991:3;22953:8;:18;22962:5;;22968:1;22962:8;;;;;;;;;;;;;;;;22953:18;;-1:-1:-1;22953:18:8;;;;;;;;-1:-1:-1;22953:18:8;:34;;;;;:41;22949:59;;23003:5;22996:12;;;;;;22949:59;22936:3;;22898:117;;;-1:-1:-1;23027:4:8;;22752:284;-1:-1:-1;;;;22752:284:8:o;4209:150:12:-;4267:7;4298:1;4294;:5;4286:44;;;;;-1:-1:-1;;;4286:44:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;4351:1;4347;:5;;;;;;;4209:150;-1:-1:-1;;;4209:150:12:o;22061:270:8:-;22194:13;-1:-1:-1;;;;;22210:21:8;;;:35;;22244:1;22210:35;;;22234:7;22210:35;22194:51;;22251:12;-1:-1:-1;;;;;22251:17:8;;22276:5;22283;22290:8;22300:7;22309:16;22251:75;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22061:270;;;;;:::o;3128:155:12:-;3186:7;3218:1;3213;:6;;3205:49;;;;;-1:-1:-1;;;3205:49:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3271:5:12;;;3128:155::o;677:175:11:-;786:58;;;-1:-1:-1;;;;;786:58:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;786:58:11;809:23;786:58;;;759:86;;779:5;;759:19;:86::i;3530:215:12:-;3588:7;3611:6;3607:20;;-1:-1:-1;3626:1:12;3619:8;;3607:20;3649:5;;;3653:1;3649;:5;:1;3672:5;;;;;:10;3664:56;;;;-1:-1:-1;;;3664:56:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22451:188:8;22522:13;22552:14;;;:8;:14;;;;;:22;;;-1:-1:-1;;;22552:22:8;;;;22593:15;:13;:15::i;:::-;22584:24;;:6;:24;;;22580:54;;;22619:15;:13;:15::i;:::-;22610:24;;22580:54;22451:188;;;:::o;2940:751:11:-;3359:23;3385:69;3413:4;3385:69;;;;;;;;;;;;;;;;;3393:5;-1:-1:-1;;;;;3385:27:11;;;:69;;;;;:::i;:::-;3468:17;;3359:95;;-1:-1:-1;3468:21:11;3464:221;;3608:10;3597:30;;;;;;;;;;;;;;;-1:-1:-1;3597:30:11;3589:85;;;;-1:-1:-1;;;3589:85:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4600:523:0;4727:12;4784:5;4759:21;:30;;4751:81;;;;-1:-1:-1;;;4751:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4850:18;4861:6;4850:10;:18::i;:::-;4842:60;;;;;-1:-1:-1;;;4842:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4973:12;4987:23;5014:6;-1:-1:-1;;;;;5014:11:0;5034:5;5042:4;5014:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5014:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:0:o;718:413::-;1078:20;1116:8;;;718:413::o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:0;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7574:145;7764:12;7757:20;;-1:-1:-1;;;7757:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;:::o;14:198:13:-;84:20;;-1:-1:-1;;;;;133:54:13;;123:65;;113:2;;202:1;199;192:12;217:400;;;350:3;343:4;335:6;331:17;327:27;317:2;;373:6;365;358:22;317:2;-1:-1:-1;401:20:13;;444:18;433:30;;430:2;;;483:8;473;466:26;430:2;527:4;519:6;515:17;503:29;;590:3;583:4;575;567:6;563:17;555:6;551:30;547:41;544:50;541:2;;;607:1;604;597:12;541:2;307:310;;;;;:::o;622:695::-;;720:3;713:4;705:6;701:17;697:27;687:2;;742:5;735;728:20;687:2;782:6;769:20;808:18;845:2;841;838:10;835:2;;;851:9;835:2;891;885:9;960:2;941:13;;-1:-1:-1;;937:27:13;925:40;;967:4;921:51;987:18;;;1007:22;;;984:46;981:2;;;1033:9;981:2;1060;1053:22;1084:18;;;1121:15;;;1138:4;1117:26;1114:35;-1:-1:-1;1111:2:13;;;1166:5;1159;1152:20;1111:2;1234;1227:4;1219:6;1215:17;1208:4;1200:6;1196:17;1183:54;1257:15;;;1274:4;1253:26;1246:41;;;;1261:6;677:640;-1:-1:-1;;;677:640:13:o;1322:165::-;1391:20;;1451:10;1440:22;;1430:33;;1420:2;;1477:1;1474;1467:12;1492:198;;1604:2;1592:9;1583:7;1579:23;1575:32;1572:2;;;1625:6;1617;1610:22;1572:2;1653:31;1674:9;1653:31;:::i;1695:1210::-;;;;;;;;;1961:3;1949:9;1940:7;1936:23;1932:33;1929:2;;;1983:6;1975;1968:22;1929:2;2011:31;2032:9;2011:31;:::i;:::-;2001:41;;2061:39;2096:2;2085:9;2081:18;2061:39;:::i;:::-;2051:49;;2119:39;2154:2;2143:9;2139:18;2119:39;:::i;:::-;2109:49;;2177:39;2212:2;2201:9;2197:18;2177:39;:::i;:::-;2167:49;;2267:3;2256:9;2252:19;2239:33;2291:18;2332:2;2324:6;2321:14;2318:2;;;2353:6;2345;2338:22;2318:2;2397:76;2465:7;2456:6;2445:9;2441:22;2397:76;:::i;:::-;2492:8;;-1:-1:-1;2371:102:13;-1:-1:-1;2580:3:13;2565:19;;2552:33;;-1:-1:-1;2597:16:13;;;2594:2;;;2631:6;2623;2616:22;2594:2;2659:54;2705:7;2694:8;2683:9;2679:24;2659:54;:::i;:::-;2649:64;;2766:3;2755:9;2751:19;2738:33;2722:49;;2796:2;2786:8;2783:16;2780:2;;;2817:6;2809;2802:22;2780:2;;2845:54;2891:7;2880:8;2869:9;2865:24;2845:54;:::i;:::-;2835:64;;;1919:986;;;;;;;;;;;:::o;2910:463::-;;;3057:2;3045:9;3036:7;3032:23;3028:32;3025:2;;;3078:6;3070;3063:22;3025:2;3123:9;3110:23;3156:18;3148:6;3145:30;3142:2;;;3193:6;3185;3178:22;3142:2;3237:76;3305:7;3296:6;3285:9;3281:22;3237:76;:::i;:::-;3332:8;;3211:102;;-1:-1:-1;3015:358:13;-1:-1:-1;;;;3015:358:13:o;3378:190::-;;3490:2;3478:9;3469:7;3465:23;3461:32;3458:2;;;3511:6;3503;3496:22;3458:2;-1:-1:-1;3539:23:13;;3448:120;-1:-1:-1;3448:120:13:o;3573:266::-;;;3702:2;3690:9;3681:7;3677:23;3673:32;3670:2;;;3723:6;3715;3708:22;3670:2;3764:9;3751:23;3741:33;;3793:40;3829:2;3818:9;3814:18;3793:40;:::i;:::-;3783:50;;3660:179;;;;;:::o;3844:258::-;;;3973:2;3961:9;3952:7;3948:23;3944:32;3941:2;;;3994:6;3986;3979:22;3941:2;-1:-1:-1;;4022:23:13;;;4092:2;4077:18;;;4064:32;;-1:-1:-1;3931:171:13:o;4107:429::-;;;;4250:2;4238:9;4229:7;4225:23;4221:32;4218:2;;;4271:6;4263;4256:22;4218:2;4312:9;4299:23;4289:33;;4369:2;4358:9;4354:18;4341:32;4331:42;;4423:2;4412:9;4408:18;4395:32;4470:5;4463:13;4456:21;4449:5;4446:32;4436:2;;4497:6;4489;4482:22;4436:2;4525:5;4515:15;;;4208:328;;;;;:::o;4541:680::-;;;;;;4737:3;4725:9;4716:7;4712:23;4708:33;4705:2;;;4759:6;4751;4744:22;4705:2;4800:9;4787:23;4777:33;;4829:39;4864:2;4853:9;4849:18;4829:39;:::i;:::-;4819:49;;4887:39;4922:2;4911:9;4907:18;4887:39;:::i;:::-;4877:49;;4977:2;4966:9;4962:18;4949:32;5004:18;4996:6;4993:30;4990:2;;;5041:6;5033;5026:22;4990:2;5085:76;5153:7;5144:6;5133:9;5129:22;5085:76;:::i;:::-;4695:526;;;;-1:-1:-1;4695:526:13;;-1:-1:-1;5180:8:13;;5059:102;4695:526;-1:-1:-1;;;4695:526:13:o;5226:755::-;;;;;;;5438:3;5426:9;5417:7;5413:23;5409:33;5406:2;;;5460:6;5452;5445:22;5406:2;5501:9;5488:23;5478:33;;5530:39;5565:2;5554:9;5550:18;5530:39;:::i;:::-;5520:49;;5588:39;5623:2;5612:9;5608:18;5588:39;:::i;:::-;5578:49;;5646:39;5681:2;5670:9;5666:18;5646:39;:::i;:::-;5636:49;;5736:3;5725:9;5721:19;5708:33;5764:18;5756:6;5753:30;5750:2;;;5801:6;5793;5786:22;5750:2;5845:76;5913:7;5904:6;5893:9;5889:22;5845:76;:::i;:::-;5396:585;;;;-1:-1:-1;5396:585:13;;-1:-1:-1;5396:585:13;;5940:8;;5396:585;-1:-1:-1;;;5396:585:13:o;5986:443::-;;6083:5;6077:12;6110:6;6105:3;6098:19;6136:4;6165:2;6160:3;6156:12;6149:19;;6202:2;6195:5;6191:14;6223:3;6235:169;6249:6;6246:1;6243:13;6235:169;;;6310:13;;6298:26;;6344:12;;;;6379:15;;;;6271:1;6264:9;6235:169;;;-1:-1:-1;6420:3:13;;6053:376;-1:-1:-1;;;;;6053:376:13:o;6434:478::-;;6516:5;6510:12;6543:6;6538:3;6531:19;6568:3;6580:162;6594:6;6591:1;6588:13;6580:162;;;6656:4;6712:13;;;6708:22;;6702:29;6684:11;;;6680:20;;6673:59;6609:12;6580:162;;;6760:6;6757:1;6754:13;6751:2;;;6826:3;6819:4;6810:6;6805:3;6801:16;6797:27;6790:40;6751:2;-1:-1:-1;6894:2:13;6873:15;-1:-1:-1;;6869:29:13;6860:39;;;;6901:4;6856:50;;6486:426;-1:-1:-1;;6486:426:13:o;6917:205::-;7117:3;7108:14::o;7127:226::-;-1:-1:-1;;;;;7291:55:13;;;;7273:74;;7261:2;7246:18;;7228:125::o;7358:305::-;-1:-1:-1;;;;;7558:55:13;;;;7540:74;;7645:2;7630:18;;7623:34;7528:2;7513:18;;7495:168::o;7668:684::-;7839:2;7891:21;;;7961:13;;7864:18;;;7983:22;;;7668:684;;7839:2;8062:15;;;;8036:2;8021:18;;;7668:684;8108:218;8122:6;8119:1;8116:13;8108:218;;;8187:13;;-1:-1:-1;;;;;8183:62:13;8171:75;;8301:15;;;;8266:12;;;;8144:1;8137:9;8108:218;;;-1:-1:-1;8343:3:13;;7819:533;-1:-1:-1;;;;;;7819:533:13:o;8357:267::-;;8536:2;8525:9;8518:21;8556:62;8614:2;8603:9;8599:18;8591:6;8556:62;:::i;8629:187::-;8794:14;;8787:22;8769:41;;8757:2;8742:18;;8724:92::o;8821:502::-;-1:-1:-1;;;;;9146:15:13;;;9128:34;;9198:15;;;;9193:2;9178:18;;9171:43;9245:2;9230:18;;9223:34;9305:10;9293:23;;;9288:2;9273:18;;9266:51;9054:3;9039:19;;9021:302::o;9588:387::-;;9785:2;9774:9;9767:21;9811:47;9854:2;9843:9;9839:18;9831:6;9811:47;:::i;:::-;9906:9;9898:6;9894:22;9889:2;9878:9;9874:18;9867:50;9934:35;9962:6;9954;9934:35;:::i;:::-;9926:43;9757:218;-1:-1:-1;;;;;9757:218:13:o;9980:347::-;10182:2;10164:21;;;10221:2;10201:18;;;10194:30;10260:25;10255:2;10240:18;;10233:53;10318:2;10303:18;;10154:173::o;10332:348::-;10534:2;10516:21;;;10573:2;10553:18;;;10546:30;10612:26;10607:2;10592:18;;10585:54;10671:2;10656:18;;10506:174::o;10685:342::-;10887:2;10869:21;;;10926:2;10906:18;;;10899:30;10965:20;10960:2;10945:18;;10938:48;11018:2;11003:18;;10859:168::o;11032:346::-;11234:2;11216:21;;;11273:2;11253:18;;;11246:30;11312:24;11307:2;11292:18;;11285:52;11369:2;11354:18;;11206:172::o;11383:339::-;11585:2;11567:21;;;11624:2;11604:18;;;11597:30;11663:17;11658:2;11643:18;;11636:45;11713:2;11698:18;;11557:165::o;11727:343::-;11929:2;11911:21;;;11968:2;11948:18;;;11941:30;12007:21;12002:2;11987:18;;11980:49;12061:2;12046:18;;11901:169::o;12075:348::-;12277:2;12259:21;;;12316:2;12296:18;;;12289:30;12355:26;12350:2;12335:18;;12328:54;12414:2;12399:18;;12249:174::o;12428:344::-;12630:2;12612:21;;;12669:2;12649:18;;;12642:30;12708:22;12703:2;12688:18;;12681:50;12763:2;12748:18;;12602:170::o;12777:345::-;12979:2;12961:21;;;13018:2;12998:18;;;12991:30;13057:23;13052:2;13037:18;;13030:51;13113:2;13098:18;;12951:171::o;13127:340::-;13329:2;13311:21;;;13368:2;13348:18;;;13341:30;13407:18;13402:2;13387:18;;13380:46;13458:2;13443:18;;13301:166::o;13472:353::-;13674:2;13656:21;;;13713:2;13693:18;;;13686:30;13752:31;13747:2;13732:18;;13725:59;13816:2;13801:18;;13646:179::o;13830:352::-;14032:2;14014:21;;;14071:2;14051:18;;;14044:30;14110;14105:2;14090:18;;14083:58;14173:2;14158:18;;14004:178::o;14187:344::-;14389:2;14371:21;;;14428:2;14408:18;;;14401:30;14467:22;14462:2;14447:18;;14440:50;14522:2;14507:18;;14361:170::o;14536:398::-;14738:2;14720:21;;;14777:2;14757:18;;;14750:30;14816:34;14811:2;14796:18;;14789:62;14887:4;14882:2;14867:18;;14860:32;14924:3;14909:19;;14710:224::o;14939:350::-;15141:2;15123:21;;;15180:2;15160:18;;;15153:30;15219:28;15214:2;15199:18;;15192:56;15280:2;15265:18;;15113:176::o;15294:177::-;15440:25;;;15428:2;15413:18;;15395:76::o;15476:1348::-;16003:25;;;-1:-1:-1;;;;;16125:15:13;;;16120:2;16105:18;;16098:43;16177:15;;16172:2;16157:18;;16150:43;16212:10;16258:15;;;16253:2;16238:18;;16231:43;16311:15;;;16305:3;16290:19;;16283:44;16364:15;;;16358:3;16343:19;;16336:44;16417:15;;16411:3;16396:19;;16389:44;15991:3;16464;16449:19;;16442:31;;;15476:1348;;16496:62;16539:18;;;16531:6;16496:62;:::i;:::-;16482:76;;16607:9;16599:6;16595:22;16589:3;16578:9;16574:19;16567:51;16641:50;16684:6;16676;16641:50;:::i;:::-;16627:64;;16740:9;16732:6;16728:22;16722:3;16711:9;16707:19;16700:51;16768:50;16811:6;16803;16768:50;:::i;:::-;16760:58;15971:853;-1:-1:-1;;;;;;;;;;;;;15971:853:13:o;16829:548::-;;17114:6;17103:9;17096:25;17157:2;17152;17141:9;17137:18;17130:30;17183:62;17241:2;17230:9;17226:18;17218:6;17183:62;:::i;:::-;17293:9;17285:6;17281:22;17276:2;17265:9;17261:18;17254:50;17321;17364:6;17356;17321:50;:::i;:::-;17313:58;17086:291;-1:-1:-1;;;;;;17086:291:13:o;17382:264::-;17555:25;;;17628:10;17616:23;17611:2;17596:18;;17589:51;17543:2;17528:18;;17510:136::o;17651:192::-;17825:10;17813:23;;;;17795:42;;17783:2;17768:18;;17750:93::o;17848:369::-;18054:10;18091:15;;;18073:34;;18143:15;;;18138:2;18123:18;;18116:43;18195:15;;;18190:2;18175:18;;18168:43;18032:2;18017:18;;17999:218::o
Swarm Source
ipfs://f0867824aabc990139bcc1e46e0f7838ee46bc3873ff85d0a854ec04dbc4a012
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.