My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x8c9845213088a824139a0bc237c70a18185e50c8a3f47e970434038d3846afa8 | Add Reward Info | 1485005 | 497 days 3 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 701 GLMR | 0.010379972 | |
0x30c6f0974e09b660f4119c5aba7c144dd85ac7e12c2c15d675cf16430e4c6a18 | Add Reward Info | 1391686 | 510 days 20 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 701 GLMR | 0.010379972 | |
0x3305d9e184f5b167864c941745026d5f97c46e19e79ec87584a919d3a0c861fa | Add Reward Info | 1310023 | 522 days 21 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 1,200 GLMR | 0.01037876 | |
0x7046f5239cbcefa280216669c8dc1398ee2f1ace8e2d4c6ae7fafd42f58c0968 | Add Reward Info | 1243253 | 532 days 21 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 1,000 GLMR | 0.01037876 | |
0x514201ca5fc961545cd21b2faf68e2994d4a0651b41f7daf99a6b2bf4b117a54 | Add Reward Info | 1176346 | 542 days 21 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 1,000 GLMR | 0.01037876 | |
0x46686225efef5196847c62a58417793402eb55b492b2bc868a16d81e9e2bdef7 | Add Reward Info | 971774 | 572 days 17 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 6,001 GLMR | 0.0141459 | |
0xdc15b000be1a137279ea6db371d510c2d856c276b89d2dcc3b5ad9f23856e4ac | Add | 971763 | 572 days 17 hrs ago | StellaSwap: Deployer | IN | StellaSwap: xStella - GLMR Rewarder V1 | 0 GLMR | 0.0163877 | |
0xbb49b52c5bd6e8ad05b36e5d670f274a1a4c1d154d92342de53ef2f0e6196308 | 0x61012060 | 971743 | 572 days 17 hrs ago | StellaSwap: Deployer | IN | Create: ComplexRewarderPerSecV2 | 0 GLMR | 0.3411432675 |
[ Download CSV Export ]
OVERVIEW
Rewarder contract for Dual Farms having GLMR token.
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
ComplexRewarderPerSecV2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-05-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * 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"); (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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.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; } } // File contracts/farms/v2/libraries/IBoringERC20.sol pragma solidity ^0.8.7; interface IBoringERC20 { function mint(address to, uint256 amount) external; function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File contracts/farms/v2/rewarders/IComplexRewarder.sol pragma solidity ^0.8.7; interface IComplexRewarder { function onStellaReward( uint256 pid, address user, uint256 newLpAmount ) external; function pendingTokens(uint256 pid, address user) external view returns (uint256 pending); function rewardToken() external view returns (IBoringERC20); function poolRewardsPerSec(uint256 pid) external view returns (uint256); } // File contracts/farms/v2/IStellaDistributorV2.sol pragma solidity ^0.8.2; interface IStellaDistributorV2 { function totalAllocPoint() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; function poolLength() external view returns (uint256); function poolTotalLp(uint256 pid) external view returns (uint256); } // File contracts/farms/v2/libraries/BoringERC20.sol pragma solidity ^0.8.7; // solhint-disable avoid-low-level-calls library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_SYMBOL) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_NAME) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IBoringERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_DECIMALS) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IBoringERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed" ); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IBoringERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed" ); } } // File contracts/farms/v2/rewarders/ComplexRewarderPerSecV2.sol pragma solidity ^0.8.2; pragma experimental ABIEncoderV2; /** * This is a sample contract to be used in the StellaDistributorV2 contract for partners to reward * stakers with their native token alongside STELLA. * * It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior. * E.g. say you've allocated 100,000 XYZ to the STELLA-XYZ farm over 30 days. Then you would need to transfer * 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days. */ contract ComplexRewarderPerSecV2 is IComplexRewarder, Ownable, ReentrancyGuard { using BoringERC20 for IBoringERC20; IBoringERC20 public immutable override rewardToken; IStellaDistributorV2 public immutable distributorV2; bool public immutable isNative; /// @notice Info of each distributorV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of REWARD entitled to the user. struct UserInfo { uint256 amount; uint256 rewardDebt; } /// @notice Info of each distributorV2 poolInfo. /// `accTokenPerShare` Amount of REWARD each LP token is worth. /// `startTimestamp` The start timestamp of rewards. /// `lastRewardTimestamp` The last timestamp REWARD was rewarded to the poolInfo. /// `allocPoint` The amount of allocation points assigned to the pool. /// `totalRewards` The amount of rewards added to the pool. struct PoolInfo { uint256 accTokenPerShare; uint256 startTimestamp; uint256 lastRewardTimestamp; uint256 allocPoint; uint256 totalRewards; } /// @notice Reward info /// `startTimestamp` The start timestamp of rewards /// `endTimestamp` The end timestamp of rewards /// `rewardPerSec` The amount of rewards per second struct RewardInfo { uint256 startTimestamp; uint256 endTimestamp; uint256 rewardPerSec; } /// @notice Info of each pool. mapping(uint256 => PoolInfo) public poolInfo; /// @dev this is mostly used for extending reward period /// @notice Reward info is a set of {endTimestamp, rewardPerSec} /// indexed by pool id mapping(uint256 => RewardInfo[]) public poolRewardInfo; uint256[] public poolIds; /// @notice Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; /// @notice limit length of reward info /// how many phases are allowed uint256 public immutable rewardInfoLimit = 52; //1y // The precision factor uint256 private immutable ACC_TOKEN_PRECISION; event OnReward(address indexed user, uint256 amount); event RewardRateUpdated(uint256 oldRate, uint256 newRate); event AddPool(uint256 indexed pid, uint256 allocPoint); event SetPool(uint256 indexed pid, uint256 allocPoint); event UpdatePool( uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accTokenPerShare ); event AddRewardInfo( uint256 indexed pid, uint256 indexed phase, uint256 endTimestamp, uint256 rewardPerSec ); modifier onlyDistributorV2() { require( msg.sender == address(distributorV2), "onlyDistributorV2: only StellaDistributorV2 can call this function" ); _; } constructor( IBoringERC20 _rewardToken, IStellaDistributorV2 _distributorV2, bool _isNative ) { require( Address.isContract(address(_rewardToken)), "constructor: reward token must be a valid contract" ); require( Address.isContract(address(_distributorV2)), "constructor: StellaDistributorV2 must be a valid contract" ); rewardToken = _rewardToken; distributorV2 = _distributorV2; isNative = _isNative; uint256 decimalsRewardToken = uint256( _isNative ? 18 : _rewardToken.safeDecimals() ); require( decimalsRewardToken < 30, "constructor: reward token decimals must be inferior to 30" ); ACC_TOKEN_PRECISION = uint256( 10**(uint256(30) - (decimalsRewardToken)) ); } /// @notice Add a new pool. Can only be called by the owner. /// @param _pid pool id on DistributorV2 /// @param _allocPoint allocation of the new pool. function add( uint256 _pid, uint256 _allocPoint, uint256 _startTimestamp ) public onlyOwner { require(poolInfo[_pid].lastRewardTimestamp == 0, "pool already exists"); totalAllocPoint += _allocPoint; poolInfo[_pid] = PoolInfo({ allocPoint: _allocPoint, startTimestamp: _startTimestamp, lastRewardTimestamp: _startTimestamp, accTokenPerShare: 0, totalRewards: 0 }); poolIds.push(_pid); emit AddPool(_pid, _allocPoint); } /// @notice if the new reward info is added, the reward & its end timestamp will be extended by the newly pushed reward info. function addRewardInfo( uint256 _pid, uint256 _endTimestamp, uint256 _rewardPerSec ) external payable onlyOwner { RewardInfo[] storage rewardInfo = poolRewardInfo[_pid]; PoolInfo storage pool = poolInfo[_pid]; require( rewardInfo.length < rewardInfoLimit, "add reward info: reward info length exceeds the limit" ); require( rewardInfo.length == 0 || rewardInfo[rewardInfo.length - 1].endTimestamp < _endTimestamp, "add reward info: bad new endTimestamp" ); uint256 startTimestamp = rewardInfo.length == 0 ? pool.startTimestamp : rewardInfo[rewardInfo.length - 1].endTimestamp; uint256 timeRange = _endTimestamp - startTimestamp; uint256 totalRewards = timeRange * _rewardPerSec; if (!isNative) { rewardToken.safeTransferFrom( msg.sender, address(this), totalRewards ); } else { require( msg.value >= totalRewards, "add reward info: not enough funds to transfer" ); } pool.totalRewards += totalRewards; rewardInfo.push( RewardInfo({ startTimestamp: startTimestamp, endTimestamp: _endTimestamp, rewardPerSec: _rewardPerSec }) ); emit AddRewardInfo( _pid, rewardInfo.length - 1, _endTimestamp, _rewardPerSec ); } function _endTimestampOf(uint256 _pid, uint256 _timestamp) internal view returns (uint256) { RewardInfo[] memory rewardInfo = poolRewardInfo[_pid]; uint256 len = rewardInfo.length; if (len == 0) { return 0; } for (uint256 i = 0; i < len; ++i) { if (_timestamp <= rewardInfo[i].endTimestamp) return rewardInfo[i].endTimestamp; } /// @dev when couldn't find any reward info, it means that _timestamp exceed endTimestamp /// so return the latest reward info. return rewardInfo[len - 1].endTimestamp; } /// @notice this will return end timestamp based on the current block timestamp. function currentEndTimestamp(uint256 _pid) external view returns (uint256) { return _endTimestampOf(_pid, block.timestamp); } /// @notice Return reward multiplier over the given _from to _to timestamp. function _getTimeElapsed( uint256 _from, uint256 _to, uint256 _endTimestamp ) public pure returns (uint256) { if ((_from >= _endTimestamp) || (_from > _to)) { return 0; } if (_to <= _endTimestamp) { return _to - _from; } return _endTimestamp - _from; } /// @notice Update reward variables of the given pool. /// @param _pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 _pid) external nonReentrant returns (PoolInfo memory pool) { return _updatePool(_pid); } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function _updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; RewardInfo[] memory rewardInfo = poolRewardInfo[pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return pool; } uint256 lpSupply = distributorV2.poolTotalLp(pid); if (lpSupply == 0) { // if there is no total supply, return and use the pool's start timestamp as the last reward timestamp // so that ALL reward will be distributed. // however, if the first deposit is out of reward period, last reward timestamp will be its timestamp // in order to keep the multiplier = 0 if (block.timestamp > _endTimestampOf(pid, block.timestamp)) { pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( pid, pool.lastRewardTimestamp, lpSupply, pool.accTokenPerShare ); } return pool; } /// @dev for each reward info for (uint256 i = 0; i < rewardInfo.length; ++i) { // @dev get multiplier based on current timestamp and rewardInfo's end timestamp // multiplier will be a range of either (current timestamp - pool.timestamp) // or (reward info's endtimestamp - pool.timestamp) or 0 uint256 timeElapsed = _getTimeElapsed( pool.lastRewardTimestamp, block.timestamp, rewardInfo[i].endTimestamp ); if (timeElapsed == 0) continue; // @dev if currentTimestamp exceed end timestamp, use end timestamp as the last reward timestamp // so that for the next iteration, previous endTimestamp will be used as the last reward timestamp if (block.timestamp > rewardInfo[i].endTimestamp) { pool.lastRewardTimestamp = rewardInfo[i].endTimestamp; } else { pool.lastRewardTimestamp = block.timestamp; } uint256 tokenReward = (timeElapsed * rewardInfo[i].rewardPerSec * pool.allocPoint) / totalAllocPoint; pool.accTokenPerShare += ((tokenReward * ACC_TOKEN_PRECISION) / lpSupply); } poolInfo[pid] = pool; emit UpdatePool( pid, pool.lastRewardTimestamp, lpSupply, pool.accTokenPerShare ); return pool; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public nonReentrant { _massUpdatePools(); } // Update reward vairables for all pools. Be careful of gas spending! function _massUpdatePools() internal { uint256 length = poolIds.length; for (uint256 pid = 0; pid < length; ++pid) { _updatePool(poolIds[pid]); } } /// @notice Function called by StellaDistributorV2 whenever staker claims STELLA harvest. Allows staker to also receive a 2nd reward token. /// @param _user Address of user /// @param _amount Number of LP tokens the user has function onStellaReward( uint256 _pid, address _user, uint256 _amount ) external override onlyDistributorV2 nonReentrant { PoolInfo memory pool = _updatePool(_pid); UserInfo storage user = userInfo[_pid][_user]; uint256 pending = 0; uint256 rewardBalance = 0; if (isNative) { rewardBalance = address(this).balance; } else { rewardBalance = rewardToken.balanceOf(address(this)); } if (user.amount > 0) { pending = (((user.amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt); if (pending > 0) { if (isNative) { if (pending > rewardBalance) { (bool success, ) = _user.call{value: rewardBalance}(""); require(success, "Transfer failed"); } else { (bool success, ) = _user.call{value: pending}(""); require(success, "Transfer failed"); } } else { if (pending > rewardBalance) { rewardToken.safeTransfer(_user, rewardBalance); } else { rewardToken.safeTransfer(_user, pending); } } } } user.amount = _amount; user.rewardDebt = (user.amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION; emit OnReward(_user, pending); } /// @notice View function to see pending Reward on frontend. function pendingTokens(uint256 _pid, address _user) external view override returns (uint256) { return _pendingTokens( _pid, userInfo[_pid][_user].amount, userInfo[_pid][_user].rewardDebt ); } function _pendingTokens( uint256 _pid, uint256 _amount, uint256 _rewardDebt ) internal view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; RewardInfo[] memory rewardInfo = poolRewardInfo[_pid]; uint256 accTokenPerShare = pool.accTokenPerShare; uint256 lpSupply = distributorV2.poolTotalLp(_pid); if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 cursor = pool.lastRewardTimestamp; for (uint256 i = 0; i < rewardInfo.length; ++i) { uint256 timeElapsed = _getTimeElapsed( cursor, block.timestamp, rewardInfo[i].endTimestamp ); if (timeElapsed == 0) continue; cursor = rewardInfo[i].endTimestamp; uint256 tokenReward = (timeElapsed * rewardInfo[i].rewardPerSec * pool.allocPoint) / totalAllocPoint; accTokenPerShare += (tokenReward * ACC_TOKEN_PRECISION) / lpSupply; } } pending = (((_amount * accTokenPerShare) / ACC_TOKEN_PRECISION) - _rewardDebt); } function _rewardPerSecOf(uint256 _pid, uint256 _blockTimestamp) internal view returns (uint256) { RewardInfo[] memory rewardInfo = poolRewardInfo[_pid]; PoolInfo storage pool = poolInfo[_pid]; uint256 len = rewardInfo.length; if (len == 0) { return 0; } for (uint256 i = 0; i < len; ++i) { if (_blockTimestamp <= rewardInfo[i].endTimestamp) return (rewardInfo[i].rewardPerSec * pool.allocPoint) / totalAllocPoint; } /// @dev when couldn't find any reward info, it means that timestamp exceed endblock /// so return 0 return 0; } /// @notice View function to see pool rewards per sec function poolRewardsPerSec(uint256 _pid) external view override returns (uint256) { return _rewardPerSecOf(_pid, block.timestamp); } /// @notice Withdraw reward. EMERGENCY ONLY. function emergencyRewardWithdraw( uint256 _pid, uint256 _amount, address _beneficiary ) external onlyOwner nonReentrant { PoolInfo storage pool = poolInfo[_pid]; uint256 lpSupply = distributorV2.poolTotalLp(_pid); uint256 currentStakingPendingReward = _pendingTokens(_pid, lpSupply, 0); require( currentStakingPendingReward + _amount <= pool.totalRewards, "emergency reward withdraw: not enough reward token" ); pool.totalRewards -= _amount; if (!isNative) { rewardToken.safeTransfer(_beneficiary, _amount); } else { (bool sent, ) = _beneficiary.call{value: _amount}(""); require(sent, "emergency reward withdraw: failed to send"); } } // INCASE SOMETHING WRONG HAPPENS uint256 public stuckTimeLock = 0; function inCaseTokensGetStuck(address _token, uint256 _amount) external onlyOwner { if (stuckTimeLock == 0) { stuckTimeLock = block.timestamp + 86400; } if(stuckTimeLock <= block.timestamp) { if (!isNative) { IBoringERC20(_token).safeTransfer(msg.sender, _amount); } else { (bool sent, ) = msg.sender.call{value: _amount}(""); require(sent, "emergency reward withdraw: failed to send"); } stuckTimeLock = 0; } } }
[{"inputs":[{"internalType":"contract IBoringERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IStellaDistributorV2","name":"_distributorV2","type":"address"},{"internalType":"bool","name":"_isNative","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"phase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"name":"AddRewardInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accTokenPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"_getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"_updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct ComplexRewarderPerSecV2.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_rewardPerSec","type":"uint256"}],"name":"addRewardInfo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"currentEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorV2","outputs":[{"internalType":"contract IStellaDistributorV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onStellaReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRewardInfo","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardInfoLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stuckTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct ComplexRewarderPerSecV2.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101206040526000600655603460e09081525060006007553480156200002457600080fd5b50604051620045463803806200454683398181016040528101906200004a9190620004a9565b6200006a6200005e6200025560201b60201c565b6200025d60201b60201c565b6001808190555062000087836200032160201b62001edd1760201c565b620000c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c0906200061e565b60405180910390fd5b620000df826200032160201b62001edd1760201c565b62000121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001189062000640565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080151560c081151560f81b81525050600081620001d857620001d28473ffffffffffffffffffffffffffffffffffffffff166200033460201b62001ef01760201c565b620001db565b60125b60ff169050601e811062000226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021d90620005fc565b60405180910390fd5b80601e62000235919062000821565b600a620002439190620006e4565b61010081815250505050505062000aa7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1663313ce56760e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620003ca9190620005e3565b600060405180830381855afa9150503d806000811462000407576040519150601f19603f3d011682016040523d82523d6000602084013e6200040c565b606091505b509150915081801562000420575060208151145b6200042d57601262000444565b8080602001905181019062000443919062000505565b5b92505050919050565b6000815190506200045e8162000a3f565b92915050565b600081519050620004758162000a59565b92915050565b6000815190506200048c8162000a73565b92915050565b600081519050620004a38162000a8d565b92915050565b600080600060608486031215620004c557620004c462000940565b5b6000620004d58682870162000464565b9350506020620004e8868287016200047b565b9250506040620004fb868287016200044d565b9150509250925092565b6000602082840312156200051e576200051d62000940565b5b60006200052e8482850162000492565b91505092915050565b6000620005448262000662565b6200055081856200066d565b935062000562818560208601620008db565b80840191505092915050565b60006200057d60398362000678565b91506200058a8262000952565b604082019050919050565b6000620005a460328362000678565b9150620005b182620009a1565b604082019050919050565b6000620005cb60398362000678565b9150620005d882620009f0565b604082019050919050565b6000620005f1828462000537565b915081905092915050565b6000602082019050818103600083015262000617816200056e565b9050919050565b60006020820190508181036000830152620006398162000595565b9050919050565b600060208201905081810360008301526200065b81620005bc565b9050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000808291508390505b6001851115620006db57808604811115620006b357620006b262000911565b5b6001851615620006c35780820291505b8081029050620006d38562000945565b945062000693565b94509492505050565b6000620006f182620008c4565b9150620006fe83620008c4565b92506200072d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000735565b905092915050565b6000826200074757600190506200081a565b816200075757600090506200081a565b81600181146200077057600281146200077b57620007b1565b60019150506200081a565b60ff84111562000790576200078f62000911565b5b8360020a915084821115620007aa57620007a962000911565b5b506200081a565b5060208310610133831016604e8410600b8410161715620007eb5782820a905083811115620007e557620007e462000911565b5b6200081a565b620007fa848484600162000689565b9250905081840481111562000814576200081362000911565b5b81810290505b9392505050565b60006200082e82620008c4565b91506200083b83620008c4565b92508282101562000851576200085062000911565b5b828203905092915050565b60006200086982620008a4565b9050919050565b60008115159050919050565b600062000889826200085c565b9050919050565b60006200089d826200085c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620008fb578082015181840152602081019050620008de565b838111156200090b576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b60008160011c9050919050565b7f636f6e7374727563746f723a2072657761726420746f6b656e20646563696d6160008201527f6c73206d75737420626520696e666572696f7220746f20333000000000000000602082015250565b7f636f6e7374727563746f723a2072657761726420746f6b656e206d757374206260008201527f6520612076616c696420636f6e74726163740000000000000000000000000000602082015250565b7f636f6e7374727563746f723a205374656c6c614469737472696275746f72563260008201527f206d75737420626520612076616c696420636f6e747261637400000000000000602082015250565b62000a4a8162000870565b811462000a5657600080fd5b50565b62000a64816200087c565b811462000a7057600080fd5b50565b62000a7e8162000890565b811462000a8a57600080fd5b50565b62000a9881620008ce565b811462000aa457600080fd5b50565b60805160601c60a05160601c60c05160f81c60e051610100516139cc62000b7a600039600081816115c60152818161185d01528181611c0a0152818161227601526122d10152600081816106190152610aa70152600081816108cb01528181610c010152818161112f0152818161128a015281816114da015261161a0152600081816107a3015281816111530152818161139a015281816119fa01526120f50152600081816108f501528181610c2c01528181611508015281816117ba0152818161180a0152611dfa01526139cc6000f3fe6080604052600436106101655760003560e01c806372333631116100d1578063c6d758cb1161008a578063f2fde38b11610064578063f2fde38b1461055b578063f7c618c114610584578063f98b03ca146105af578063ffcd4263146105da57610165565b8063c6d758cb146104cc578063cea2ba8b146104f5578063d4aa89b51461051e57610165565b8063723336311461039357806373cfc6b2146103d05780637d0d9d5f146103fb5780638da5cb5b1461042657806393f1a40b146104515780639e494bee1461048f57610165565b8063465e81ec11610123578063465e81ec14610285578063505fb46c146102c257806351eb05a6146102eb578063630b5ba11461032857806369883b4e1461033f578063715018a61461037c57610165565b8062d748501461016a5780630832cfbf146101955780631526fe27146101d457806317caf6f1146102155780631d123131146102405780632ea807c514610269575b600080fd5b34801561017657600080fd5b5061017f610617565b60405161018c919061323d565b60405180910390f35b3480156101a157600080fd5b506101bc60048036038101906101b79190612b9a565b61063b565b6040516101cb93929190613281565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612aad565b610682565b60405161020c9594939291906132b8565b60405180910390f35b34801561022157600080fd5b5061022a6106b8565b604051610237919061323d565b60405180910390f35b34801561024c57600080fd5b5061026760048036038101906102629190612bda565b6106be565b005b610283600480360381019061027e9190612c2d565b6109fb565b005b34801561029157600080fd5b506102ac60048036038101906102a79190612aad565b610d8f565b6040516102b9919061323d565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190612c2d565b610da2565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612aad565b610f67565b60405161031f9190613222565b60405180910390f35b34801561033457600080fd5b5061033d610fd4565b005b34801561034b57600080fd5b5061036660048036038101906103619190612aad565b611033565b604051610373919061323d565b60405180910390f35b34801561038857600080fd5b50610391611057565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190612c2d565b6110df565b6040516103c7919061323d565b60405180910390f35b3480156103dc57600080fd5b506103e561112d565b6040516103f29190613031565b60405180910390f35b34801561040757600080fd5b50610410611151565b60405161041d9190613067565b60405180910390f35b34801561043257600080fd5b5061043b611175565b6040516104489190612fb6565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190612b07565b61119e565b604051610486929190613258565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612aad565b6111cf565b6040516104c3919061323d565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190612a40565b6111e2565b005b34801561050157600080fd5b5061051c60048036038101906105179190612b47565b611398565b005b34801561052a57600080fd5b5061054560048036038101906105409190612aad565b611900565b6040516105529190613222565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190612a13565b611d00565b005b34801561059057600080fd5b50610599611df8565b6040516105a6919061304c565b60405180910390f35b3480156105bb57600080fd5b506105c4611e1c565b6040516105d1919061323d565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190612b07565b611e22565b60405161060e919061323d565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052816000526040600020818154811061065757600080fd5b9060005260206000209060030201600091509150508060000154908060010154908060020154905083565b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b60065481565b6106c6612000565b73ffffffffffffffffffffffffffffffffffffffff166106e4611175565b73ffffffffffffffffffffffffffffffffffffffff161461073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073190613142565b60405180910390fd5b60026001541415610780576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610777906131e2565b60405180910390fd5b6002600181905550600060026000858152602001908152602001600020905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663654c9ece866040518263ffffffff1660e01b81526004016107fa919061323d565b60206040518083038186803b15801561081257600080fd5b505afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a9190612ada565b9050600061085a86836000612008565b90508260040154858261086d9190613332565b11156108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a590613122565b60405180910390fd5b848360040160008282546108c29190613413565b925050819055507f000000000000000000000000000000000000000000000000000000000000000061093e5761093984867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661231d9092919063ffffffff16565b6109ec565b60008473ffffffffffffffffffffffffffffffffffffffff168660405161096490612fa1565b60006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b50509050806109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613102565b60405180910390fd5b505b50505060018081905550505050565b610a03612000565b73ffffffffffffffffffffffffffffffffffffffff16610a21611175565b73ffffffffffffffffffffffffffffffffffffffff1614610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90613142565b60405180910390fd5b600060036000858152602001908152602001600020905060006002600086815260200190815260200160002090507f0000000000000000000000000000000000000000000000000000000000000000828054905010610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b02906131a2565b60405180910390fd5b600082805490501480610b515750838260018480549050610b2c9190613413565b81548110610b3d57610b3c6135be565b5b906000526020600020906003020160010154105b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613182565b60405180910390fd5b600080838054905014610bd7578260018480549050610baf9190613413565b81548110610bc057610bbf6135be565b5b906000526020600020906003020160010154610bdd565b81600101545b905060008186610bed9190613413565b905060008582610bfd91906133b9565b90507f0000000000000000000000000000000000000000000000000000000000000000610c7657610c713330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612472909392919063ffffffff16565b610cba565b80341015610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613202565b60405180910390fd5b5b80846004016000828254610cce9190613332565b92505081905550846040518060600160405280858152602001898152602001888152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020155505060018580549050610d4b9190613413565b887fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc28989604051610d7d929190613258565b60405180910390a35050505050505050565b6000610d9b82426125ca565b9050919050565b610daa612000565b73ffffffffffffffffffffffffffffffffffffffff16610dc8611175565b73ffffffffffffffffffffffffffffffffffffffff1614610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613142565b60405180910390fd5b6000600260008581526020019081526020016000206002015414610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613162565b60405180910390fd5b8160066000828254610e899190613332565b925050819055506040518060a001604052806000815260200182815260200182815260200183815260200160008152506002600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050506004839080600181540180825580915050600190039060005260206000200160009091909190915055827fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced83604051610f5a919061323d565b60405180910390a2505050565b610f6f61297b565b60026001541415610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906131e2565b60405180910390fd5b6002600181905550610fc682611900565b905060018081905550919050565b6002600154141561101a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611011906131e2565b60405180910390fd5b600260018190555061102a61271e565b60018081905550565b6004818154811061104357600080fd5b906000526020600020016000915090505481565b61105f612000565b73ffffffffffffffffffffffffffffffffffffffff1661107d611175565b73ffffffffffffffffffffffffffffffffffffffff16146110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613142565b60405180910390fd5b6110dd6000612770565b565b600081841015806110ef57508284115b156110fd5760009050611126565b8183116111175783836111109190613413565b9050611126565b83826111239190613413565b90505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60006111db8242612834565b9050919050565b6111ea612000565b73ffffffffffffffffffffffffffffffffffffffff16611208611175565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613142565b60405180910390fd5b6000600754141561127f5762015180426112789190613332565b6007819055505b4260075411611394577f00000000000000000000000000000000000000000000000000000000000000006112dd576112d833828473ffffffffffffffffffffffffffffffffffffffff1661231d9092919063ffffffff16565b61138b565b60003373ffffffffffffffffffffffffffffffffffffffff168260405161130390612fa1565b60006040518083038185875af1925050503d8060008114611340576040519150601f19603f3d011682016040523d82523d6000602084013e611345565b606091505b5050905080611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090613102565b60405180910390fd5b505b60006007819055505b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d906130e2565b60405180910390fd5b6002600154141561146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906131e2565b60405180910390fd5b6002600181905550600061147f84611900565b905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000807f000000000000000000000000000000000000000000000000000000000000000015611506574790506115b2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161155f9190612fb6565b60206040518083038186803b15801561157757600080fd5b505afa15801561158b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115af9190612ada565b90505b6000836000015411156118525782600101547f0000000000000000000000000000000000000000000000000000000000000000856000015185600001546115f991906133b9565b6116039190613388565b61160d9190613413565b91506000821115611851577f0000000000000000000000000000000000000000000000000000000000000000156117ab57808211156116f85760008673ffffffffffffffffffffffffffffffffffffffff168260405161166c90612fa1565b60006040518083038185875af1925050503d80600081146116a9576040519150601f19603f3d011682016040523d82523d6000602084013e6116ae565b606091505b50509050806116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906130c2565b60405180910390fd5b506117a6565b60008673ffffffffffffffffffffffffffffffffffffffff168360405161171e90612fa1565b60006040518083038185875af1925050503d806000811461175b576040519150601f19603f3d011682016040523d82523d6000602084013e611760565b606091505b50509050806117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b906130c2565b60405180910390fd5b505b611850565b80821115611803576117fe86827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661231d9092919063ffffffff16565b61184f565b61184e86837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661231d9092919063ffffffff16565b5b5b5b5b8483600001819055507f00000000000000000000000000000000000000000000000000000000000000008460000151846000015461189091906133b9565b61189a9190613388565b83600101819055508573ffffffffffffffffffffffffffffffffffffffff167fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b4836040516118e8919061323d565b60405180910390a25050505060018081905550505050565b61190861297b565b600260008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600060036000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156119df578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061198f565b505050509050816040015142116119f65750611cfb565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663654c9ece856040518263ffffffff1660e01b8152600401611a51919061323d565b60206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa19190612ada565b90506000811415611b1357611ab68442612834565b421115611b0c5742836040018181525050837f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f468460400151838660000151604051611b0393929190613281565b60405180910390a25b5050611cfb565b60005b8251811015611c6a576000611b4e856040015142868581518110611b3d57611b3c6135be565b5b6020026020010151602001516110df565b90506000811415611b5f5750611c59565b838281518110611b7257611b716135be565b5b602002602001015160200151421115611bb257838281518110611b9857611b976135be565b5b602002602001015160200151856040018181525050611bbd565b428560400181815250505b60006006548660600151868581518110611bda57611bd96135be565b5b60200260200101516040015184611bf191906133b9565b611bfb91906133b9565b611c059190613388565b9050837f000000000000000000000000000000000000000000000000000000000000000082611c3491906133b9565b611c3e9190613388565b86600001818151611c4f9190613332565b9150818152505050505b80611c6390613517565b9050611b16565b5082600260008681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050837f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f468460400151838660000151604051611cf093929190613281565b60405180910390a250505b919050565b611d08612000565b73ffffffffffffffffffffffffffffffffffffffff16611d26611175565b73ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613142565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de3906130a2565b60405180910390fd5b611df581612770565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60075481565b6000611ed5836005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546005600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612008565b905092915050565b600080823b905060008111915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1663313ce56760e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611f849190612f8a565b600060405180830381855afa9150503d8060008114611fbf576040519150601f19603f3d011682016040523d82523d6000602084013e611fc4565b606091505b5091509150818015611fd7575060208151145b611fe2576012611ff7565b80806020019051810190611ff69190612c80565b5b92505050919050565b600033905090565b600080600260008681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600060036000878152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156120e25783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612092565b50505050905060008260000151905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663654c9ece896040518263ffffffff1660e01b815260040161214c919061323d565b60206040518083038186803b15801561216457600080fd5b505afa158015612178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219c9190612ada565b90508360400151421180156121b2575060008114155b156122ce5760008460400151905060005b84518110156122cb5760006121f783428885815181106121e6576121e56135be565b5b6020026020010151602001516110df565b9050600081141561220857506122ba565b85828151811061221b5761221a6135be565b5b602002602001015160200151925060006006548860600151888581518110612246576122456135be565b5b6020026020010151604001518461225d91906133b9565b61226791906133b9565b6122719190613388565b9050847f0000000000000000000000000000000000000000000000000000000000000000826122a091906133b9565b6122aa9190613388565b866122b59190613332565b955050505b806122c490613517565b90506121c3565b50505b857f000000000000000000000000000000000000000000000000000000000000000083896122fc91906133b9565b6123069190613388565b6123109190613413565b9450505050509392505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401612352929190613008565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123bc9190612f8a565b6000604051808303816000865af19150503d80600081146123f9576040519150601f19603f3d011682016040523d82523d6000602084013e6123fe565b606091505b509150915081801561242c575060008151148061242b57508080602001905181019061242a9190612a80565b5b5b61246b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246290613082565b60405180910390fd5b5050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016124a993929190612fd1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516125139190612f8a565b6000604051808303816000865af19150503d8060008114612550576040519150601f19603f3d011682016040523d82523d6000602084013e612555565b606091505b509150915081801561258357506000815114806125825750808060200190518101906125819190612a80565b5b5b6125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b9906131c2565b60405180910390fd5b505050505050565b60008060036000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156126505783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612600565b505050509050600060026000868152602001908152602001600020905060008251905060008114156126885760009350505050612718565b60005b8181101561270f578381815181106126a6576126a56135be565b5b60200260200101516020015186116126fe5760065483600301548583815181106126d3576126d26135be565b5b6020026020010151604001516126e991906133b9565b6126f39190613388565b945050505050612718565b8061270890613517565b905061268b565b50600093505050505b92915050565b6000600480549050905060005b8181101561276c5761275a6004828154811061274a576127496135be565b5b9060005260206000200154611900565b508061276590613517565b905061272b565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060036000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156128ba578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061286a565b50505050905060008151905060008114156128da57600092505050612975565b60005b81811015612944578281815181106128f8576128f76135be565b5b60200260200101516020015185116129335782818151811061291d5761291c6135be565b5b6020026020010151602001519350505050612975565b8061293d90613517565b90506128dd565b50816001826129539190613413565b81518110612964576129636135be565b5b602002602001015160200151925050505b92915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000813590506129b98161393a565b92915050565b6000815190506129ce81613951565b92915050565b6000813590506129e381613968565b92915050565b6000815190506129f881613968565b92915050565b600081519050612a0d8161397f565b92915050565b600060208284031215612a2957612a286135ed565b5b6000612a37848285016129aa565b91505092915050565b60008060408385031215612a5757612a566135ed565b5b6000612a65858286016129aa565b9250506020612a76858286016129d4565b9150509250929050565b600060208284031215612a9657612a956135ed565b5b6000612aa4848285016129bf565b91505092915050565b600060208284031215612ac357612ac26135ed565b5b6000612ad1848285016129d4565b91505092915050565b600060208284031215612af057612aef6135ed565b5b6000612afe848285016129e9565b91505092915050565b60008060408385031215612b1e57612b1d6135ed565b5b6000612b2c858286016129d4565b9250506020612b3d858286016129aa565b9150509250929050565b600080600060608486031215612b6057612b5f6135ed565b5b6000612b6e868287016129d4565b9350506020612b7f868287016129aa565b9250506040612b90868287016129d4565b9150509250925092565b60008060408385031215612bb157612bb06135ed565b5b6000612bbf858286016129d4565b9250506020612bd0858286016129d4565b9150509250929050565b600080600060608486031215612bf357612bf26135ed565b5b6000612c01868287016129d4565b9350506020612c12868287016129d4565b9250506040612c23868287016129aa565b9150509250925092565b600080600060608486031215612c4657612c456135ed565b5b6000612c54868287016129d4565b9350506020612c65868287016129d4565b9250506040612c76868287016129d4565b9150509250925092565b600060208284031215612c9657612c956135ed565b5b6000612ca4848285016129fe565b91505092915050565b612cb681613447565b82525050565b612cc581613459565b82525050565b6000612cd68261330b565b612ce08185613316565b9350612cf08185602086016134e4565b80840191505092915050565b612d058161349c565b82525050565b612d14816134ae565b82525050565b6000612d27601c83613321565b9150612d32826135f2565b602082019050919050565b6000612d4a602683613321565b9150612d558261361b565b604082019050919050565b6000612d6d600f83613321565b9150612d788261366a565b602082019050919050565b6000612d90604283613321565b9150612d9b82613693565b606082019050919050565b6000612db3602983613321565b9150612dbe82613708565b604082019050919050565b6000612dd6603283613321565b9150612de182613757565b604082019050919050565b6000612df9602083613321565b9150612e04826137a6565b602082019050919050565b6000612e1c601383613321565b9150612e27826137cf565b602082019050919050565b6000612e3f602583613321565b9150612e4a826137f8565b604082019050919050565b6000612e62600083613316565b9150612e6d82613847565b600082019050919050565b6000612e85603583613321565b9150612e908261384a565b604082019050919050565b6000612ea8602083613321565b9150612eb382613899565b602082019050919050565b6000612ecb601f83613321565b9150612ed6826138c2565b602082019050919050565b6000612eee602d83613321565b9150612ef9826138eb565b604082019050919050565b60a082016000820151612f1a6000850182612f6c565b506020820151612f2d6020850182612f6c565b506040820151612f406040850182612f6c565b506060820151612f536060850182612f6c565b506080820151612f666080850182612f6c565b50505050565b612f7581613485565b82525050565b612f8481613485565b82525050565b6000612f968284612ccb565b915081905092915050565b6000612fac82612e55565b9150819050919050565b6000602082019050612fcb6000830184612cad565b92915050565b6000606082019050612fe66000830186612cad565b612ff36020830185612cad565b6130006040830184612f7b565b949350505050565b600060408201905061301d6000830185612cad565b61302a6020830184612f7b565b9392505050565b60006020820190506130466000830184612cbc565b92915050565b60006020820190506130616000830184612cfc565b92915050565b600060208201905061307c6000830184612d0b565b92915050565b6000602082019050818103600083015261309b81612d1a565b9050919050565b600060208201905081810360008301526130bb81612d3d565b9050919050565b600060208201905081810360008301526130db81612d60565b9050919050565b600060208201905081810360008301526130fb81612d83565b9050919050565b6000602082019050818103600083015261311b81612da6565b9050919050565b6000602082019050818103600083015261313b81612dc9565b9050919050565b6000602082019050818103600083015261315b81612dec565b9050919050565b6000602082019050818103600083015261317b81612e0f565b9050919050565b6000602082019050818103600083015261319b81612e32565b9050919050565b600060208201905081810360008301526131bb81612e78565b9050919050565b600060208201905081810360008301526131db81612e9b565b9050919050565b600060208201905081810360008301526131fb81612ebe565b9050919050565b6000602082019050818103600083015261321b81612ee1565b9050919050565b600060a0820190506132376000830184612f04565b92915050565b60006020820190506132526000830184612f7b565b92915050565b600060408201905061326d6000830185612f7b565b61327a6020830184612f7b565b9392505050565b60006060820190506132966000830186612f7b565b6132a36020830185612f7b565b6132b06040830184612f7b565b949350505050565b600060a0820190506132cd6000830188612f7b565b6132da6020830187612f7b565b6132e76040830186612f7b565b6132f46060830185612f7b565b6133016080830184612f7b565b9695505050505050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061333d82613485565b915061334883613485565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561337d5761337c613560565b5b828201905092915050565b600061339382613485565b915061339e83613485565b9250826133ae576133ad61358f565b5b828204905092915050565b60006133c482613485565b91506133cf83613485565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561340857613407613560565b5b828202905092915050565b600061341e82613485565b915061342983613485565b92508282101561343c5761343b613560565b5b828203905092915050565b600061345282613465565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006134a7826134c0565b9050919050565b60006134b9826134c0565b9050919050565b60006134cb826134d2565b9050919050565b60006134dd82613465565b9050919050565b60005b838110156135025780820151818401526020810190506134e7565b83811115613511576000848401525b50505050565b600061352282613485565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561355557613554613560565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b7f426f72696e6745524332303a205472616e73666572206661696c656400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f6f6e6c794469737472696275746f7256323a206f6e6c79205374656c6c61446960008201527f737472696275746f7256322063616e2063616c6c20746869732066756e63746960208201527f6f6e000000000000000000000000000000000000000000000000000000000000604082015250565b7f656d657267656e6379207265776172642077697468647261773a206661696c6560008201527f6420746f2073656e640000000000000000000000000000000000000000000000602082015250565b7f656d657267656e6379207265776172642077697468647261773a206e6f74206560008201527f6e6f7567682072657761726420746f6b656e0000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f706f6f6c20616c72656164792065786973747300000000000000000000000000600082015250565b7f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560008201527f7374616d70000000000000000000000000000000000000000000000000000000602082015250565b50565b7f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60008201527f677468206578636565647320746865206c696d69740000000000000000000000602082015250565b7f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460008201527f7320746f207472616e7366657200000000000000000000000000000000000000602082015250565b61394381613447565b811461394e57600080fd5b50565b61395a81613459565b811461396557600080fd5b50565b61397181613485565b811461397c57600080fd5b50565b6139888161348f565b811461399357600080fd5b5056fea264697066735822122017b316746d903c1d272a47930b2a3b3772af7490ec34f4088832a508604851f964736f6c63430008070033000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf03880000000000000000000000000000000000000000000000000000000000000001
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf03880000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0xacc15dc74880c9944775448304b263d191c6077f
Arg [1] : _distributorV2 (address): 0xf3a5454496e26ac57da879bf3285fa85debf0388
Arg [2] : _isNative (bool): True
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [1] : 000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf0388
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed ByteCode Sourcemap
20537:17672:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22705:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22259:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;22046:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;22580:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36725:824;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25453:1672;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36480:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24736:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28661:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31716:84;;;;;;;;;;;;;:::i;:::-;;22322:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10576:94;;;;;;;;;;;;;:::i;:::-;;28116:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20781:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20723:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9925:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22413:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27888:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37635:571;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32323:1630;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29007:2626;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10825:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20666:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37596:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34027:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22705:45;;;:::o;22259:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22046:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22580:34::-;;;;:::o;36725:824::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1:::1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;36888:21:::2;36912:8;:14;36921:4;36912:14;;;;;;;;;;;36888:38;;36937:16;36956:13;:25;;;36982:4;36956:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36937:50;;37000:35;37038:33;37053:4;37059:8;37069:1;37038:14;:33::i;:::-;37000:71;;37147:4;:17;;;37136:7;37106:27;:37;;;;:::i;:::-;:58;;37084:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;37274:7;37253:4;:17;;;:28;;;;;;;:::i;:::-;;;;;;;;37299:8;37294:248;;37324:47;37349:12;37363:7;37324:11;:24;;;;:47;;;;;:::i;:::-;37294:248;;;37405:9;37420:12;:17;;37445:7;37420:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37404:53;;;37480:4;37472:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37389:153;37294:248;36877:672;;;12916:1:::1;13868:7:::0;:22:::1;;;;36725:824:::0;;;:::o;25453:1672::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25608:31:::1;25642:14;:20;25657:4;25642:20;;;;;;;;;;;25608:54;;25673:21;25697:8;:14;25706:4;25697:14;;;;;;;;;;;25673:38;;25764:15;25744:10;:17;;;;:35;25722:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;25914:1;25893:10;:17;;;;:22;:105;;;;25985:13;25936:10;25967:1;25947:10;:17;;;;:21;;;;:::i;:::-;25936:33;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;:62;25893:105;25871:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;26076:22;26122:1:::0;26101:10:::1;:17;;;;:22;:119;;26174:10;26205:1;26185:10;:17;;;;:21;;;;:::i;:::-;26174:33;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;26101:119;;;26139:4;:19;;;26101:119;26076:144;;26233:17;26269:14;26253:13;:30;;;;:::i;:::-;26233:50;;26294:20;26329:13;26317:9;:25;;;;:::i;:::-;26294:48;;26360:8;26355:342;;26385:135;26432:10;26469:4;26493:12;26385:11;:28;;;;:135;;;;;;:::i;:::-;26355:342;;;26592:12;26579:9;:25;;26553:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;26355:342;26730:12;26709:4;:17;;;:33;;;;;;;:::i;:::-;;;;;;;;26755:10;26785:168;;;;;;;;26831:14;26785:168;;;;26878:13;26785:168;;;;26924:13;26785:168;;::::0;26755:209:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27049:1;27029:10;:17;;;;:21;;;;:::i;:::-;27010:4;26982:135;27065:13;27093;26982:135;;;;;;;:::i;:::-;;;;;;;;25597:1528;;;;;25453:1672:::0;;;:::o;36480:187::-;36589:7;36621:38;36637:4;36643:15;36621;:38::i;:::-;36614:45;;36480:187;;;:::o;24736:578::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24917:1:::1;24879:8;:14;24888:4;24879:14;;;;;;;;;;;:34;;;:39;24871:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24972:11;24953:15;;:30;;;;;;;:::i;:::-;;;;;;;;25013:220;;;;;;;;25190:1;25013:220;;;;25091:15;25013:220;;;;25142:15;25013:220;;;;25049:11;25013:220;;;;25220:1;25013:220;;::::0;24996:8:::1;:14;25005:4;24996:14;;;;;;;;;;;:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25246:7;25259:4;25246:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25288:4;25280:26;25294:11;25280:26;;;;;;:::i;:::-;;;;;;;;24736:578:::0;;;:::o;28661:162::-;28753:20;;:::i;:::-;12960:1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;28798:17:::1;28810:4;28798:11;:17::i;:::-;28791:24;;12916:1:::0;13868:7;:22;;;;28661:162;;;:::o;31716:84::-;12960:1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;31774::::1;:16;:18::i;:::-;12916:1:::0;13868:7;:22;;;;31716:84::o;22322:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10576:94::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10641:21:::1;10659:1;10641:9;:21::i;:::-;10576:94::o:0;28116:360::-;28247:7;28281:13;28272:5;:22;;28271:41;;;;28308:3;28300:5;:11;28271:41;28267:82;;;28336:1;28329:8;;;;28267:82;28370:13;28363:3;:20;28359:71;;28413:5;28407:3;:11;;;;:::i;:::-;28400:18;;;;28359:71;28463:5;28447:13;:21;;;;:::i;:::-;28440:28;;28116:360;;;;;;:::o;20781:30::-;;;:::o;20723:51::-;;;:::o;9925:87::-;9971:7;9998:6;;;;;;;;;;;9991:13;;9925:87;:::o;22413:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27888:139::-;27954:7;27981:38;27997:4;28003:15;27981;:38::i;:::-;27974:45;;27888:139;;;:::o;37635:571::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37749:1:::1;37732:13;;:18;37728:90;;;37801:5;37783:15;:23;;;;:::i;:::-;37767:13;:39;;;;37728:90;37851:15;37834:13;;:32;37831:368;;37888:8;37883:273;;37917:54;37951:10;37963:7;37930:6;37917:33;;;;:54;;;;;:::i;:::-;37883:273;;;38013:9;38028:10;:15;;38051:7;38028:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38012:51;;;38090:4;38082:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37993:163;37883:273;38186:1;38170:13;:17;;;;37831:368;37635:571:::0;;:::o;32323:1630::-;23497:13;23475:36;;:10;:36;;;23453:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1:::1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;32487:20:::2;32510:17;32522:4;32510:11;:17::i;:::-;32487:40;;32538:21;32562:8;:14;32571:4;32562:14;;;;;;;;;;;:21;32577:5;32562:21;;;;;;;;;;;;;;;32538:45;;32596:15;32626:21:::0;32668:8:::2;32664:163;;;32709:21;32693:37;;32664:163;;;32779:11;:21;;;32809:4;32779:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32763:52;;32664:163;32857:1;32843:4;:11;;;:15;32839:915;;;32967:4;:15;;;32944:19;32902:4;:21;;;32888:4;:11;;;:35;;;;:::i;:::-;32887:76;;;;:::i;:::-;32886:96;;;;:::i;:::-;32875:108;;33014:1;33004:7;:11;33000:743;;;33040:8;33036:692;;;33087:13;33077:7;:23;33073:365;;;33130:12;33148:5;:10;;33166:13;33148:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33129:55;;;33219:7;33211:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;33102:168;33073:365;;;33304:12;33322:5;:10;;33340:7;33322:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33303:49;;;33387:7;33379:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;33276:162;33073:365;33036:692;;;33500:13;33490:7;:23;33486:223;;;33542:46;33567:5;33574:13;33542:11;:24;;;;:46;;;;;:::i;:::-;33486:223;;;33645:40;33670:5;33677:7;33645:11;:24;;;;:40;;;;;:::i;:::-;33486:223;33036:692;33000:743;32839:915;33780:7;33766:4;:11;;:21;;;;33884:19;33846:4;:21;;;33832:4;:11;;;:35;;;;:::i;:::-;33831:72;;;;:::i;:::-;33800:4;:15;;:103;;;;33930:5;33921:24;;;33937:7;33921:24;;;;;;:::i;:::-;;;;;;;;32476:1477;;;;12916:1:::1;13868:7:::0;:22:::1;;;;32323:1630:::0;;;:::o;29007:2626::-;29057:20;;:::i;:::-;29097:8;:13;29106:3;29097:13;;;;;;;;;;;29090:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29121:30;29154:14;:19;29169:3;29154:19;;;;;;;;;;;29121:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29209:4;:24;;;29190:15;:43;29186:87;;29250:11;;;29186:87;29285:16;29304:13;:25;;;29330:3;29304:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29285:49;;29363:1;29351:8;:13;29347:751;;;29742:37;29758:3;29763:15;29742;:37::i;:::-;29724:15;:55;29720:339;;;29827:15;29800:4;:24;;:42;;;;;29899:3;29866:177;29925:4;:24;;;29972:8;30003:4;:21;;;29866:177;;;;;;;;:::i;:::-;;;;;;;;29720:339;30075:11;;;;29347:751;30154:9;30149:1265;30173:10;:17;30169:1;:21;30149:1265;;;30466:19;30488:152;30522:4;:24;;;30565:15;30599:10;30610:1;30599:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;30488:15;:152::i;:::-;30466:174;;30674:1;30659:11;:16;30655:30;;;30677:8;;;30655:30;30946:10;30957:1;30946:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;30928:15;:44;30924:221;;;31020:10;31031:1;31020:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;30993:4;:24;;:53;;;;;30924:221;;;31114:15;31087:4;:24;;:42;;;;;30924:221;31161:19;31280:15;;31261:4;:15;;;31215:10;31226:1;31215:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;31184:11;:57;;;;:::i;:::-;:92;;;;:::i;:::-;31183:112;;;;:::i;:::-;31161:134;;31393:8;31353:19;31339:11;:33;;;;:::i;:::-;31338:63;;;;:::i;:::-;31312:4;:21;;:90;;;;;;;:::i;:::-;;;;;;;;30197:1217;;30149:1265;30192:3;;;;:::i;:::-;;;30149:1265;;;;31442:4;31426:8;:13;31435:3;31426:13;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31489:3;31464:137;31507:4;:24;;;31546:8;31569:4;:21;;;31464:137;;;;;;;;:::i;:::-;;;;;;;;31614:11;;29007:2626;;;;:::o;10825:192::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10934:1:::1;10914:22;;:8;:22;;;;10906:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10990:19;11000:8;10990:9;:19::i;:::-;10825:192:::0;:::o;20666:50::-;;;:::o;37596:32::-;;;;:::o;34027:323::-;34147:7;34192:150;34225:4;34248:8;:14;34257:4;34248:14;;;;;;;;;;;:21;34263:5;34248:21;;;;;;;;;;;;;;;:28;;;34295:8;:14;34304:4;34295:14;;;;;;;;;;;:21;34310:5;34295:21;;;;;;;;;;;;;;;:32;;;34192:14;:150::i;:::-;34172:170;;34027:323;;;;:::o;743:387::-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;18150:293::-;18215:5;18234:12;18248:17;18277:5;18269:25;;16080:10;18332:12;;18309:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18269:87;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18233:123;;;;18374:7;:28;;;;;18400:2;18385:4;:11;:17;18374:28;:61;;18433:2;18374:61;;;18416:4;18405:25;;;;;;;;;;;;:::i;:::-;18374:61;18367:68;;;;18150:293;;;:::o;8707:98::-;8760:7;8787:10;8780:17;;8707:98;:::o;34358:1307::-;34491:15;34519:20;34542:8;:14;34551:4;34542:14;;;;;;;;;;;34519:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34567:30;34600:14;:20;34615:4;34600:20;;;;;;;;;;;34567:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34633:24;34660:4;:21;;;34633:48;;34692:16;34711:13;:25;;;34737:4;34711:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34692:50;;34777:4;:24;;;34759:15;:42;:59;;;;;34817:1;34805:8;:13;;34759:59;34755:799;;;34835:14;34852:4;:24;;;34835:41;;34898:9;34893:650;34917:10;:17;34913:1;:21;34893:650;;;34960:19;34982:150;35020:6;35049:15;35087:10;35098:1;35087:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;34982:15;:150::i;:::-;34960:172;;35170:1;35155:11;:16;35151:30;;;35173:8;;;35151:30;35209:10;35220:1;35209:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;35200:35;;35256:19;35383:15;;35364:4;:15;;;35314:10;35325:1;35314:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;35279:11;:61;;;;:::i;:::-;:100;;;;:::i;:::-;35278:120;;;;:::i;:::-;35256:142;;35519:8;35475:19;35461:11;:33;;;;:::i;:::-;35460:67;;;;:::i;:::-;35419:108;;;;;:::i;:::-;;;34941:602;;34893:650;34936:3;;;;:::i;:::-;;;34893:650;;;;34820:734;34755:799;35645:11;35609:19;35589:16;35579:7;:26;;;;:::i;:::-;35578:50;;;;:::i;:::-;35577:79;;;;:::i;:::-;35566:91;;34508:1157;;;;34358:1307;;;;;:::o;18719:407::-;18844:12;18858:17;18887:5;18879:19;;16150:10;18936:12;;18950:2;18954:6;18913:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18879:93;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18843:129;;;;19005:7;:57;;;;;19032:1;19017:4;:11;:16;:44;;;;19048:4;19037:24;;;;;;;;;;;;:::i;:::-;19017:44;19005:57;18983:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;18832:294;;18719:407;;;:::o;19449:449::-;19601:12;19615:17;19644:5;19636:19;;16240:10;19693:17;;19712:4;19718:2;19722:6;19670:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19636:104;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19600:140;;;;19773:7;:57;;;;;19800:1;19785:4;:11;:16;:44;;;;19816:4;19805:24;;;;;;;;;;;;:::i;:::-;19785:44;19773:57;19751:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;19589:309;;19449:449;;;;:::o;35673:740::-;35787:7;35812:30;35845:14;:20;35860:4;35845:20;;;;;;;;;;;35812:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35876:21;35900:8;:14;35909:4;35900:14;;;;;;;;;;;35876:38;;35925:11;35939:10;:17;35925:31;;35978:1;35971:3;:8;35967:49;;;36003:1;35996:8;;;;;;;35967:49;36031:9;36026:242;36050:3;36046:1;:7;36026:242;;;36098:10;36109:1;36098:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;36079:15;:45;36075:181;;36241:15;;36201:4;:15;;;36172:10;36183:1;36172:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;:44;;;;:::i;:::-;36171:85;;;;:::i;:::-;36143:113;;;;;;;;36075:181;36055:3;;;;:::i;:::-;;;36026:242;;;;36404:1;36397:8;;;;;35673:740;;;;;:::o;31883:192::-;31931:14;31948:7;:14;;;;31931:31;;31978:11;31973:95;32001:6;31995:3;:12;31973:95;;;32031:25;32043:7;32051:3;32043:12;;;;;;;;:::i;:::-;;;;;;;;;;32031:11;:25::i;:::-;;32009:5;;;;:::i;:::-;;;31973:95;;;;31920:155;31883:192::o;11025:173::-;11081:16;11100:6;;;;;;;;;;;11081:25;;11126:8;11117:6;;:17;;;;;;;;;;;;;;;;;;11181:8;11150:40;;11171:8;11150:40;;;;;;;;;;;;11070:128;11025:173;:::o;27133:661::-;27242:7;27267:30;27300:14;:20;27315:4;27300:20;;;;;;;;;;;27267:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27331:11;27345:10;:17;27331:31;;27384:1;27377:3;:8;27373:49;;;27409:1;27402:8;;;;;;27373:49;27437:9;27432:157;27456:3;27452:1;:7;27432:157;;;27499:10;27510:1;27499:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;27485:10;:40;27481:96;;27551:10;27562:1;27551:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;27544:33;;;;;;;27481:96;27461:3;;;;:::i;:::-;;;27432:157;;;;27754:10;27771:1;27765:3;:7;;;;:::i;:::-;27754:19;;;;;;;;:::i;:::-;;;;;;;;:32;;;27747:39;;;;27133:661;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:137::-;206:5;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;152:137;;;;:::o;295:139::-;341:5;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;295:139;;;;:::o;440:143::-;497:5;528:6;522:13;513:22;;544:33;571:5;544:33;:::i;:::-;440:143;;;;:::o;589:139::-;644:5;675:6;669:13;660:22;;691:31;716:5;691:31;:::i;:::-;589:139;;;;:::o;734:329::-;793:6;842:2;830:9;821:7;817:23;813:32;810:119;;;848:79;;:::i;:::-;810:119;968:1;993:53;1038:7;1029:6;1018:9;1014:22;993:53;:::i;:::-;983:63;;939:117;734:329;;;;:::o;1069:474::-;1137:6;1145;1194:2;1182:9;1173:7;1169:23;1165:32;1162:119;;;1200:79;;:::i;:::-;1162:119;1320:1;1345:53;1390:7;1381:6;1370:9;1366:22;1345:53;:::i;:::-;1335:63;;1291:117;1447:2;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1418:118;1069:474;;;;;:::o;1549:345::-;1616:6;1665:2;1653:9;1644:7;1640:23;1636:32;1633:119;;;1671:79;;:::i;:::-;1633:119;1791:1;1816:61;1869:7;1860:6;1849:9;1845:22;1816:61;:::i;:::-;1806:71;;1762:125;1549:345;;;;:::o;1900:329::-;1959:6;2008:2;1996:9;1987:7;1983:23;1979:32;1976:119;;;2014:79;;:::i;:::-;1976:119;2134:1;2159:53;2204:7;2195:6;2184:9;2180:22;2159:53;:::i;:::-;2149:63;;2105:117;1900:329;;;;:::o;2235:351::-;2305:6;2354:2;2342:9;2333:7;2329:23;2325:32;2322:119;;;2360:79;;:::i;:::-;2322:119;2480:1;2505:64;2561:7;2552:6;2541:9;2537:22;2505:64;:::i;:::-;2495:74;;2451:128;2235:351;;;;:::o;2592:474::-;2660:6;2668;2717:2;2705:9;2696:7;2692:23;2688:32;2685:119;;;2723:79;;:::i;:::-;2685:119;2843:1;2868:53;2913:7;2904:6;2893:9;2889:22;2868:53;:::i;:::-;2858:63;;2814:117;2970:2;2996:53;3041:7;3032:6;3021:9;3017:22;2996:53;:::i;:::-;2986:63;;2941:118;2592:474;;;;;:::o;3072:619::-;3149:6;3157;3165;3214:2;3202:9;3193:7;3189:23;3185:32;3182:119;;;3220:79;;:::i;:::-;3182:119;3340:1;3365:53;3410:7;3401:6;3390:9;3386:22;3365:53;:::i;:::-;3355:63;;3311:117;3467:2;3493:53;3538:7;3529:6;3518:9;3514:22;3493:53;:::i;:::-;3483:63;;3438:118;3595:2;3621:53;3666:7;3657:6;3646:9;3642:22;3621:53;:::i;:::-;3611:63;;3566:118;3072:619;;;;;:::o;3697:474::-;3765:6;3773;3822:2;3810:9;3801:7;3797:23;3793:32;3790:119;;;3828:79;;:::i;:::-;3790:119;3948:1;3973:53;4018:7;4009:6;3998:9;3994:22;3973:53;:::i;:::-;3963:63;;3919:117;4075:2;4101:53;4146:7;4137:6;4126:9;4122:22;4101:53;:::i;:::-;4091:63;;4046:118;3697:474;;;;;:::o;4177:619::-;4254:6;4262;4270;4319:2;4307:9;4298:7;4294:23;4290:32;4287:119;;;4325:79;;:::i;:::-;4287:119;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4177:619;;;;;:::o;4802:::-;4879:6;4887;4895;4944:2;4932:9;4923:7;4919:23;4915:32;4912:119;;;4950:79;;:::i;:::-;4912:119;5070:1;5095:53;5140:7;5131:6;5120:9;5116:22;5095:53;:::i;:::-;5085:63;;5041:117;5197:2;5223:53;5268:7;5259:6;5248:9;5244:22;5223:53;:::i;:::-;5213:63;;5168:118;5325:2;5351:53;5396:7;5387:6;5376:9;5372:22;5351:53;:::i;:::-;5341:63;;5296:118;4802:619;;;;;:::o;5427:347::-;5495:6;5544:2;5532:9;5523:7;5519:23;5515:32;5512:119;;;5550:79;;:::i;:::-;5512:119;5670:1;5695:62;5749:7;5740:6;5729:9;5725:22;5695:62;:::i;:::-;5685:72;;5641:126;5427:347;;;;:::o;5780:118::-;5867:24;5885:5;5867:24;:::i;:::-;5862:3;5855:37;5780:118;;:::o;5904:109::-;5985:21;6000:5;5985:21;:::i;:::-;5980:3;5973:34;5904:109;;:::o;6019:373::-;6123:3;6151:38;6183:5;6151:38;:::i;:::-;6205:88;6286:6;6281:3;6205:88;:::i;:::-;6198:95;;6302:52;6347:6;6342:3;6335:4;6328:5;6324:16;6302:52;:::i;:::-;6379:6;6374:3;6370:16;6363:23;;6127:265;6019:373;;;;:::o;6398:171::-;6505:57;6556:5;6505:57;:::i;:::-;6500:3;6493:70;6398:171;;:::o;6575:187::-;6690:65;6749:5;6690:65;:::i;:::-;6685:3;6678:78;6575:187;;:::o;6768:366::-;6910:3;6931:67;6995:2;6990:3;6931:67;:::i;:::-;6924:74;;7007:93;7096:3;7007:93;:::i;:::-;7125:2;7120:3;7116:12;7109:19;;6768:366;;;:::o;7140:::-;7282:3;7303:67;7367:2;7362:3;7303:67;:::i;:::-;7296:74;;7379:93;7468:3;7379:93;:::i;:::-;7497:2;7492:3;7488:12;7481:19;;7140:366;;;:::o;7512:::-;7654:3;7675:67;7739:2;7734:3;7675:67;:::i;:::-;7668:74;;7751:93;7840:3;7751:93;:::i;:::-;7869:2;7864:3;7860:12;7853:19;;7512:366;;;:::o;7884:::-;8026:3;8047:67;8111:2;8106:3;8047:67;:::i;:::-;8040:74;;8123:93;8212:3;8123:93;:::i;:::-;8241:2;8236:3;8232:12;8225:19;;7884:366;;;:::o;8256:::-;8398:3;8419:67;8483:2;8478:3;8419:67;:::i;:::-;8412:74;;8495:93;8584:3;8495:93;:::i;:::-;8613:2;8608:3;8604:12;8597:19;;8256:366;;;:::o;8628:::-;8770:3;8791:67;8855:2;8850:3;8791:67;:::i;:::-;8784:74;;8867:93;8956:3;8867:93;:::i;:::-;8985:2;8980:3;8976:12;8969:19;;8628:366;;;:::o;9000:::-;9142:3;9163:67;9227:2;9222:3;9163:67;:::i;:::-;9156:74;;9239:93;9328:3;9239:93;:::i;:::-;9357:2;9352:3;9348:12;9341:19;;9000:366;;;:::o;9372:::-;9514:3;9535:67;9599:2;9594:3;9535:67;:::i;:::-;9528:74;;9611:93;9700:3;9611:93;:::i;:::-;9729:2;9724:3;9720:12;9713:19;;9372:366;;;:::o;9744:::-;9886:3;9907:67;9971:2;9966:3;9907:67;:::i;:::-;9900:74;;9983:93;10072:3;9983:93;:::i;:::-;10101:2;10096:3;10092:12;10085:19;;9744:366;;;:::o;10116:398::-;10275:3;10296:83;10377:1;10372:3;10296:83;:::i;:::-;10289:90;;10388:93;10477:3;10388:93;:::i;:::-;10506:1;10501:3;10497:11;10490:18;;10116:398;;;:::o;10520:366::-;10662:3;10683:67;10747:2;10742:3;10683:67;:::i;:::-;10676:74;;10759:93;10848:3;10759:93;:::i;:::-;10877:2;10872:3;10868:12;10861:19;;10520:366;;;:::o;10892:::-;11034:3;11055:67;11119:2;11114:3;11055:67;:::i;:::-;11048:74;;11131:93;11220:3;11131:93;:::i;:::-;11249:2;11244:3;11240:12;11233:19;;10892:366;;;:::o;11264:::-;11406:3;11427:67;11491:2;11486:3;11427:67;:::i;:::-;11420:74;;11503:93;11592:3;11503:93;:::i;:::-;11621:2;11616:3;11612:12;11605:19;;11264:366;;;:::o;11636:::-;11778:3;11799:67;11863:2;11858:3;11799:67;:::i;:::-;11792:74;;11875:93;11964:3;11875:93;:::i;:::-;11993:2;11988:3;11984:12;11977:19;;11636:366;;;:::o;12098:1080::-;12245:4;12240:3;12236:14;12344:4;12337:5;12333:16;12327:23;12363:63;12420:4;12415:3;12411:14;12397:12;12363:63;:::i;:::-;12260:176;12528:4;12521:5;12517:16;12511:23;12547:63;12604:4;12599:3;12595:14;12581:12;12547:63;:::i;:::-;12446:174;12717:4;12710:5;12706:16;12700:23;12736:63;12793:4;12788:3;12784:14;12770:12;12736:63;:::i;:::-;12630:179;12897:4;12890:5;12886:16;12880:23;12916:63;12973:4;12968:3;12964:14;12950:12;12916:63;:::i;:::-;12819:170;13079:4;13072:5;13068:16;13062:23;13098:63;13155:4;13150:3;13146:14;13132:12;13098:63;:::i;:::-;12999:172;12214:964;12098:1080;;:::o;13184:108::-;13261:24;13279:5;13261:24;:::i;:::-;13256:3;13249:37;13184:108;;:::o;13298:118::-;13385:24;13403:5;13385:24;:::i;:::-;13380:3;13373:37;13298:118;;:::o;13422:271::-;13552:3;13574:93;13663:3;13654:6;13574:93;:::i;:::-;13567:100;;13684:3;13677:10;;13422:271;;;;:::o;13699:379::-;13883:3;13905:147;14048:3;13905:147;:::i;:::-;13898:154;;14069:3;14062:10;;13699:379;;;:::o;14084:222::-;14177:4;14215:2;14204:9;14200:18;14192:26;;14228:71;14296:1;14285:9;14281:17;14272:6;14228:71;:::i;:::-;14084:222;;;;:::o;14312:442::-;14461:4;14499:2;14488:9;14484:18;14476:26;;14512:71;14580:1;14569:9;14565:17;14556:6;14512:71;:::i;:::-;14593:72;14661:2;14650:9;14646:18;14637:6;14593:72;:::i;:::-;14675;14743:2;14732:9;14728:18;14719:6;14675:72;:::i;:::-;14312:442;;;;;;:::o;14760:332::-;14881:4;14919:2;14908:9;14904:18;14896:26;;14932:71;15000:1;14989:9;14985:17;14976:6;14932:71;:::i;:::-;15013:72;15081:2;15070:9;15066:18;15057:6;15013:72;:::i;:::-;14760:332;;;;;:::o;15098:210::-;15185:4;15223:2;15212:9;15208:18;15200:26;;15236:65;15298:1;15287:9;15283:17;15274:6;15236:65;:::i;:::-;15098:210;;;;:::o;15314:262::-;15427:4;15465:2;15454:9;15450:18;15442:26;;15478:91;15566:1;15555:9;15551:17;15542:6;15478:91;:::i;:::-;15314:262;;;;:::o;15582:278::-;15703:4;15741:2;15730:9;15726:18;15718:26;;15754:99;15850:1;15839:9;15835:17;15826:6;15754:99;:::i;:::-;15582:278;;;;:::o;15866:419::-;16032:4;16070:2;16059:9;16055:18;16047:26;;16119:9;16113:4;16109:20;16105:1;16094:9;16090:17;16083:47;16147:131;16273:4;16147:131;:::i;:::-;16139:139;;15866:419;;;:::o;16291:::-;16457:4;16495:2;16484:9;16480:18;16472:26;;16544:9;16538:4;16534:20;16530:1;16519:9;16515:17;16508:47;16572:131;16698:4;16572:131;:::i;:::-;16564:139;;16291:419;;;:::o;16716:::-;16882:4;16920:2;16909:9;16905:18;16897:26;;16969:9;16963:4;16959:20;16955:1;16944:9;16940:17;16933:47;16997:131;17123:4;16997:131;:::i;:::-;16989:139;;16716:419;;;:::o;17141:::-;17307:4;17345:2;17334:9;17330:18;17322:26;;17394:9;17388:4;17384:20;17380:1;17369:9;17365:17;17358:47;17422:131;17548:4;17422:131;:::i;:::-;17414:139;;17141:419;;;:::o;17566:::-;17732:4;17770:2;17759:9;17755:18;17747:26;;17819:9;17813:4;17809:20;17805:1;17794:9;17790:17;17783:47;17847:131;17973:4;17847:131;:::i;:::-;17839:139;;17566:419;;;:::o;17991:::-;18157:4;18195:2;18184:9;18180:18;18172:26;;18244:9;18238:4;18234:20;18230:1;18219:9;18215:17;18208:47;18272:131;18398:4;18272:131;:::i;:::-;18264:139;;17991:419;;;:::o;18416:::-;18582:4;18620:2;18609:9;18605:18;18597:26;;18669:9;18663:4;18659:20;18655:1;18644:9;18640:17;18633:47;18697:131;18823:4;18697:131;:::i;:::-;18689:139;;18416:419;;;:::o;18841:::-;19007:4;19045:2;19034:9;19030:18;19022:26;;19094:9;19088:4;19084:20;19080:1;19069:9;19065:17;19058:47;19122:131;19248:4;19122:131;:::i;:::-;19114:139;;18841:419;;;:::o;19266:::-;19432:4;19470:2;19459:9;19455:18;19447:26;;19519:9;19513:4;19509:20;19505:1;19494:9;19490:17;19483:47;19547:131;19673:4;19547:131;:::i;:::-;19539:139;;19266:419;;;:::o;19691:::-;19857:4;19895:2;19884:9;19880:18;19872:26;;19944:9;19938:4;19934:20;19930:1;19919:9;19915:17;19908:47;19972:131;20098:4;19972:131;:::i;:::-;19964:139;;19691:419;;;:::o;20116:::-;20282:4;20320:2;20309:9;20305:18;20297:26;;20369:9;20363:4;20359:20;20355:1;20344:9;20340:17;20333:47;20397:131;20523:4;20397:131;:::i;:::-;20389:139;;20116:419;;;:::o;20541:::-;20707:4;20745:2;20734:9;20730:18;20722:26;;20794:9;20788:4;20784:20;20780:1;20769:9;20765:17;20758:47;20822:131;20948:4;20822:131;:::i;:::-;20814:139;;20541:419;;;:::o;20966:::-;21132:4;21170:2;21159:9;21155:18;21147:26;;21219:9;21213:4;21209:20;21205:1;21194:9;21190:17;21183:47;21247:131;21373:4;21247:131;:::i;:::-;21239:139;;20966:419;;;:::o;21391:323::-;21534:4;21572:3;21561:9;21557:19;21549:27;;21586:121;21704:1;21693:9;21689:17;21680:6;21586:121;:::i;:::-;21391:323;;;;:::o;21720:222::-;21813:4;21851:2;21840:9;21836:18;21828:26;;21864:71;21932:1;21921:9;21917:17;21908:6;21864:71;:::i;:::-;21720:222;;;;:::o;21948:332::-;22069:4;22107:2;22096:9;22092:18;22084:26;;22120:71;22188:1;22177:9;22173:17;22164:6;22120:71;:::i;:::-;22201:72;22269:2;22258:9;22254:18;22245:6;22201:72;:::i;:::-;21948:332;;;;;:::o;22286:442::-;22435:4;22473:2;22462:9;22458:18;22450:26;;22486:71;22554:1;22543:9;22539:17;22530:6;22486:71;:::i;:::-;22567:72;22635:2;22624:9;22620:18;22611:6;22567:72;:::i;:::-;22649;22717:2;22706:9;22702:18;22693:6;22649:72;:::i;:::-;22286:442;;;;;;:::o;22734:664::-;22939:4;22977:3;22966:9;22962:19;22954:27;;22991:71;23059:1;23048:9;23044:17;23035:6;22991:71;:::i;:::-;23072:72;23140:2;23129:9;23125:18;23116:6;23072:72;:::i;:::-;23154;23222:2;23211:9;23207:18;23198:6;23154:72;:::i;:::-;23236;23304:2;23293:9;23289:18;23280:6;23236:72;:::i;:::-;23318:73;23386:3;23375:9;23371:19;23362:6;23318:73;:::i;:::-;22734:664;;;;;;;;:::o;23485:98::-;23536:6;23570:5;23564:12;23554:22;;23485:98;;;:::o;23589:147::-;23690:11;23727:3;23712:18;;23589:147;;;;:::o;23742:169::-;23826:11;23860:6;23855:3;23848:19;23900:4;23895:3;23891:14;23876:29;;23742:169;;;;:::o;23917:305::-;23957:3;23976:20;23994:1;23976:20;:::i;:::-;23971:25;;24010:20;24028:1;24010:20;:::i;:::-;24005:25;;24164:1;24096:66;24092:74;24089:1;24086:81;24083:107;;;24170:18;;:::i;:::-;24083:107;24214:1;24211;24207:9;24200:16;;23917:305;;;;:::o;24228:185::-;24268:1;24285:20;24303:1;24285:20;:::i;:::-;24280:25;;24319:20;24337:1;24319:20;:::i;:::-;24314:25;;24358:1;24348:35;;24363:18;;:::i;:::-;24348:35;24405:1;24402;24398:9;24393:14;;24228:185;;;;:::o;24419:348::-;24459:7;24482:20;24500:1;24482:20;:::i;:::-;24477:25;;24516:20;24534:1;24516:20;:::i;:::-;24511:25;;24704:1;24636:66;24632:74;24629:1;24626:81;24621:1;24614:9;24607:17;24603:105;24600:131;;;24711:18;;:::i;:::-;24600:131;24759:1;24756;24752:9;24741:20;;24419:348;;;;:::o;24773:191::-;24813:4;24833:20;24851:1;24833:20;:::i;:::-;24828:25;;24867:20;24885:1;24867:20;:::i;:::-;24862:25;;24906:1;24903;24900:8;24897:34;;;24911:18;;:::i;:::-;24897:34;24956:1;24953;24949:9;24941:17;;24773:191;;;;:::o;24970:96::-;25007:7;25036:24;25054:5;25036:24;:::i;:::-;25025:35;;24970:96;;;:::o;25072:90::-;25106:7;25149:5;25142:13;25135:21;25124:32;;25072:90;;;:::o;25168:126::-;25205:7;25245:42;25238:5;25234:54;25223:65;;25168:126;;;:::o;25300:77::-;25337:7;25366:5;25355:16;;25300:77;;;:::o;25383:86::-;25418:7;25458:4;25451:5;25447:16;25436:27;;25383:86;;;:::o;25475:146::-;25545:9;25578:37;25609:5;25578:37;:::i;:::-;25565:50;;25475:146;;;:::o;25627:154::-;25705:9;25738:37;25769:5;25738:37;:::i;:::-;25725:50;;25627:154;;;:::o;25787:126::-;25837:9;25870:37;25901:5;25870:37;:::i;:::-;25857:50;;25787:126;;;:::o;25919:113::-;25969:9;26002:24;26020:5;26002:24;:::i;:::-;25989:37;;25919:113;;;:::o;26038:307::-;26106:1;26116:113;26130:6;26127:1;26124:13;26116:113;;;26215:1;26210:3;26206:11;26200:18;26196:1;26191:3;26187:11;26180:39;26152:2;26149:1;26145:10;26140:15;;26116:113;;;26247:6;26244:1;26241:13;26238:101;;;26327:1;26318:6;26313:3;26309:16;26302:27;26238:101;26087:258;26038:307;;;:::o;26351:233::-;26390:3;26413:24;26431:5;26413:24;:::i;:::-;26404:33;;26459:66;26452:5;26449:77;26446:103;;;26529:18;;:::i;:::-;26446:103;26576:1;26569:5;26565:13;26558:20;;26351:233;;;:::o;26590:180::-;26638:77;26635:1;26628:88;26735:4;26732:1;26725:15;26759:4;26756:1;26749:15;26776:180;26824:77;26821:1;26814:88;26921:4;26918:1;26911:15;26945:4;26942:1;26935:15;26962:180;27010:77;27007:1;27000:88;27107:4;27104:1;27097:15;27131:4;27128:1;27121:15;27271:117;27380:1;27377;27370:12;27394:178;27534:30;27530:1;27522:6;27518:14;27511:54;27394:178;:::o;27578:225::-;27718:34;27714:1;27706:6;27702:14;27695:58;27787:8;27782:2;27774:6;27770:15;27763:33;27578:225;:::o;27809:165::-;27949:17;27945:1;27937:6;27933:14;27926:41;27809:165;:::o;27980:290::-;28120:34;28116:1;28108:6;28104:14;28097:58;28189:34;28184:2;28176:6;28172:15;28165:59;28258:4;28253:2;28245:6;28241:15;28234:29;27980:290;:::o;28276:228::-;28416:34;28412:1;28404:6;28400:14;28393:58;28485:11;28480:2;28472:6;28468:15;28461:36;28276:228;:::o;28510:237::-;28650:34;28646:1;28638:6;28634:14;28627:58;28719:20;28714:2;28706:6;28702:15;28695:45;28510:237;:::o;28753:182::-;28893:34;28889:1;28881:6;28877:14;28870:58;28753:182;:::o;28941:169::-;29081:21;29077:1;29069:6;29065:14;29058:45;28941:169;:::o;29116:224::-;29256:34;29252:1;29244:6;29240:14;29233:58;29325:7;29320:2;29312:6;29308:15;29301:32;29116:224;:::o;29346:114::-;;:::o;29466:240::-;29606:34;29602:1;29594:6;29590:14;29583:58;29675:23;29670:2;29662:6;29658:15;29651:48;29466:240;:::o;29712:182::-;29852:34;29848:1;29840:6;29836:14;29829:58;29712:182;:::o;29900:181::-;30040:33;30036:1;30028:6;30024:14;30017:57;29900:181;:::o;30087:232::-;30227:34;30223:1;30215:6;30211:14;30204:58;30296:15;30291:2;30283:6;30279:15;30272:40;30087:232;:::o;30325:122::-;30398:24;30416:5;30398:24;:::i;:::-;30391:5;30388:35;30378:63;;30437:1;30434;30427:12;30378:63;30325:122;:::o;30453:116::-;30523:21;30538:5;30523:21;:::i;:::-;30516:5;30513:32;30503:60;;30559:1;30556;30549:12;30503:60;30453:116;:::o;30575:122::-;30648:24;30666:5;30648:24;:::i;:::-;30641:5;30638:35;30628:63;;30687:1;30684;30677:12;30628:63;30575:122;:::o;30703:118::-;30774:22;30790:5;30774:22;:::i;:::-;30767:5;30764:33;30754:61;;30811:1;30808;30801:12;30754:61;30703:118;:::o
Swarm Source
ipfs://17b316746d903c1d272a47930b2a3b3772af7490ec34f4088832a508604851f9
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.