My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x44df164cff5d2ee578519e190e2874e3242f07f9432692f497fe5c7442314f20 | Add Reward Info | 758932 | 354 days 23 hrs ago | StellaSwap: Deployer | IN | StellaSwap: USDC Rewarder V1 | 0 GLMR | 0.0239626 | |
0xa11a9dcea51d45330fd39c87e6c88bee0351fe17de9243bbdc2518d3b880aecd | Add Reward Info | 549625 | 384 days 23 hrs ago | StellaSwap: Deployer | IN | StellaSwap: USDC Rewarder V1 | 0 GLMR | 0.0355612 | |
0xf549dcd3a1b4f3e06a46e27a8edd267d3284a1214df88028bec2fb7806fd17c6 | Add | 549621 | 384 days 23 hrs ago | StellaSwap: Deployer | IN | StellaSwap: USDC Rewarder V1 | 0 GLMR | 0.0327754 | |
0xdc16d34538a578cc3b70f4b94eaec8cb343daf62db1b375f817ebe7602ff5d57 | 0x61012060 | 549610 | 384 days 23 hrs ago | StellaSwap: Deployer | IN | Contract Creation | 0 GLMR | 0.3474183175 |
[ Download CSV Export ]
OVERVIEW
Rewarder contract for Dual Farms having USDC token.
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x1fa0dfe6fd68cae0cb0a769a52c7278becd44f0a
Contract Name:
ComplexRewarderPerSecV2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-03-07 */ // 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 >= block.timestamp, "add reward info: reward period ended" ); 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
6101206040526000600655603460e09081525060006007553480156200002457600080fd5b506040516200465d3803806200465d83398181016040528101906200004a9190620004a9565b6200006a6200005e6200025560201b60201c565b6200025d60201b60201c565b6001808190555062000087836200032160201b62001f621760201c565b620000c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c0906200061e565b60405180910390fd5b620000df826200032160201b62001f621760201c565b62000121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001189062000640565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080151560c081151560f81b81525050600081620001d857620001d28473ffffffffffffffffffffffffffffffffffffffff166200033460201b62001f751760201c565b620001db565b60125b60ff169050601e811062000226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021d90620005fc565b60405180910390fd5b80601e62000235919062000821565b600a620002439190620006e4565b61010081815250505050505062000aa7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1663313ce56760e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620003ca9190620005e3565b600060405180830381855afa9150503d806000811462000407576040519150601f19603f3d011682016040523d82523d6000602084013e6200040c565b606091505b509150915081801562000420575060208151145b6200042d57601262000444565b8080602001905181019062000443919062000505565b5b92505050919050565b6000815190506200045e8162000a3f565b92915050565b600081519050620004758162000a59565b92915050565b6000815190506200048c8162000a73565b92915050565b600081519050620004a38162000a8d565b92915050565b600080600060608486031215620004c557620004c462000940565b5b6000620004d58682870162000464565b9350506020620004e8868287016200047b565b9250506040620004fb868287016200044d565b9150509250925092565b6000602082840312156200051e576200051d62000940565b5b60006200052e8482850162000492565b91505092915050565b6000620005448262000662565b6200055081856200066d565b935062000562818560208601620008db565b80840191505092915050565b60006200057d60398362000678565b91506200058a8262000952565b604082019050919050565b6000620005a460328362000678565b9150620005b182620009a1565b604082019050919050565b6000620005cb60398362000678565b9150620005d882620009f0565b604082019050919050565b6000620005f1828462000537565b915081905092915050565b6000602082019050818103600083015262000617816200056e565b9050919050565b60006020820190508181036000830152620006398162000595565b9050919050565b600060208201905081810360008301526200065b81620005bc565b9050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000808291508390505b6001851115620006db57808604811115620006b357620006b262000911565b5b6001851615620006c35780820291505b8081029050620006d38562000945565b945062000693565b94509492505050565b6000620006f182620008c4565b9150620006fe83620008c4565b92506200072d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000735565b905092915050565b6000826200074757600190506200081a565b816200075757600090506200081a565b81600181146200077057600281146200077b57620007b1565b60019150506200081a565b60ff84111562000790576200078f62000911565b5b8360020a915084821115620007aa57620007a962000911565b5b506200081a565b5060208310610133831016604e8410600b8410161715620007eb5782820a905083811115620007e557620007e462000911565b5b6200081a565b620007fa848484600162000689565b9250905081840481111562000814576200081362000911565b5b81810290505b9392505050565b60006200082e82620008c4565b91506200083b83620008c4565b92508282101562000851576200085062000911565b5b828203905092915050565b60006200086982620008a4565b9050919050565b60008115159050919050565b600062000889826200085c565b9050919050565b60006200089d826200085c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620008fb578082015181840152602081019050620008de565b838111156200090b576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b60008160011c9050919050565b7f636f6e7374727563746f723a2072657761726420746f6b656e20646563696d6160008201527f6c73206d75737420626520696e666572696f7220746f20333000000000000000602082015250565b7f636f6e7374727563746f723a2072657761726420746f6b656e206d757374206260008201527f6520612076616c696420636f6e74726163740000000000000000000000000000602082015250565b7f636f6e7374727563746f723a205374656c6c614469737472696275746f72563260008201527f206d75737420626520612076616c696420636f6e747261637400000000000000602082015250565b62000a4a8162000870565b811462000a5657600080fd5b50565b62000a64816200087c565b811462000a7057600080fd5b50565b62000a7e8162000890565b811462000a8a57600080fd5b50565b62000a9881620008ce565b811462000aa457600080fd5b50565b60805160601c60a05160601c60c05160f81c60e05161010051613ae362000b7a6000396000818161164b015281816118e201528181611c8f015281816122fb01526123560152600081816106190152610aa70152600081816108cb01528181610c87015281816111b40152818161130f0152818161155f015261169f0152600081816107a3015281816111d80152818161141f01528181611a7f015261217a0152600081816108f501528181610cb20152818161158d0152818161183f0152818161188f0152611e7f0152613ae36000f3fe6080604052600436106101655760003560e01c806372333631116100d1578063c6d758cb1161008a578063f2fde38b11610064578063f2fde38b1461055b578063f7c618c114610584578063f98b03ca146105af578063ffcd4263146105da57610165565b8063c6d758cb146104cc578063cea2ba8b146104f5578063d4aa89b51461051e57610165565b8063723336311461039357806373cfc6b2146103d05780637d0d9d5f146103fb5780638da5cb5b1461042657806393f1a40b146104515780639e494bee1461048f57610165565b8063465e81ec11610123578063465e81ec14610285578063505fb46c146102c257806351eb05a6146102eb578063630b5ba11461032857806369883b4e1461033f578063715018a61461037c57610165565b8062d748501461016a5780630832cfbf146101955780631526fe27146101d457806317caf6f1146102155780631d123131146102405780632ea807c514610269575b600080fd5b34801561017657600080fd5b5061017f610617565b60405161018c9190613305565b60405180910390f35b3480156101a157600080fd5b506101bc60048036038101906101b79190612c1f565b61063b565b6040516101cb93929190613349565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612b32565b610682565b60405161020c959493929190613380565b60405180910390f35b34801561022157600080fd5b5061022a6106b8565b6040516102379190613305565b60405180910390f35b34801561024c57600080fd5b5061026760048036038101906102629190612c5f565b6106be565b005b610283600480360381019061027e9190612cb2565b6109fb565b005b34801561029157600080fd5b506102ac60048036038101906102a79190612b32565b610e14565b6040516102b99190613305565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190612cb2565b610e27565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612b32565b610fec565b60405161031f91906132ea565b60405180910390f35b34801561033457600080fd5b5061033d611059565b005b34801561034b57600080fd5b5061036660048036038101906103619190612b32565b6110b8565b6040516103739190613305565b60405180910390f35b34801561038857600080fd5b506103916110dc565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190612cb2565b611164565b6040516103c79190613305565b60405180910390f35b3480156103dc57600080fd5b506103e56111b2565b6040516103f291906130d9565b60405180910390f35b34801561040757600080fd5b506104106111d6565b60405161041d919061310f565b60405180910390f35b34801561043257600080fd5b5061043b6111fa565b604051610448919061305e565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190612b8c565b611223565b604051610486929190613320565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612b32565b611254565b6040516104c39190613305565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190612ac5565b611267565b005b34801561050157600080fd5b5061051c60048036038101906105179190612bcc565b61141d565b005b34801561052a57600080fd5b5061054560048036038101906105409190612b32565b611985565b60405161055291906132ea565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d9190612a98565b611d85565b005b34801561059057600080fd5b50610599611e7d565b6040516105a691906130f4565b60405180910390f35b3480156105bb57600080fd5b506105c4611ea1565b6040516105d19190613305565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190612b8c565b611ea7565b60405161060e9190613305565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052816000526040600020818154811061065757600080fd5b9060005260206000209060030201600091509150508060000154908060010154908060020154905083565b60026020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b60065481565b6106c6612085565b73ffffffffffffffffffffffffffffffffffffffff166106e46111fa565b73ffffffffffffffffffffffffffffffffffffffff161461073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906131ea565b60405180910390fd5b60026001541415610780576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610777906132aa565b60405180910390fd5b6002600181905550600060026000858152602001908152602001600020905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663654c9ece866040518263ffffffff1660e01b81526004016107fa9190613305565b60206040518083038186803b15801561081257600080fd5b505afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a9190612b5f565b9050600061085a8683600061208d565b90508260040154858261086d91906133fa565b11156108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a5906131ca565b60405180910390fd5b848360040160008282546108c291906134db565b925050819055507f000000000000000000000000000000000000000000000000000000000000000061093e5761093984867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123a29092919063ffffffff16565b6109ec565b60008473ffffffffffffffffffffffffffffffffffffffff168660405161096490613049565b60006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b50509050806109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e1906131aa565b60405180910390fd5b505b50505060018081905550505050565b610a03612085565b73ffffffffffffffffffffffffffffffffffffffff16610a216111fa565b73ffffffffffffffffffffffffffffffffffffffff1614610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e906131ea565b60405180910390fd5b600060036000858152602001908152602001600020905060006002600086815260200190815260200160002090507f0000000000000000000000000000000000000000000000000000000000000000828054905010610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b029061326a565b60405180910390fd5b600082805490501480610b525750428260018480549050610b2c91906134db565b81548110610b3d57610b3c613686565b5b90600052602060002090600302016001015410155b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b889061320a565b60405180910390fd5b600082805490501480610bd75750838260018480549050610bb291906134db565b81548110610bc357610bc2613686565b5b906000526020600020906003020160010154105b610c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d9061324a565b60405180910390fd5b600080838054905014610c5d578260018480549050610c3591906134db565b81548110610c4657610c45613686565b5b906000526020600020906003020160010154610c63565b81600101545b905060008186610c7391906134db565b905060008582610c839190613481565b90507f0000000000000000000000000000000000000000000000000000000000000000610cfc57610cf73330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166124f7909392919063ffffffff16565b610d3f565b803414610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906132ca565b60405180910390fd5b5b80846004016000828254610d5391906133fa565b92505081905550846040518060600160405280858152602001898152602001888152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020155505060018580549050610dd091906134db565b887fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc28989604051610e02929190613320565b60405180910390a35050505050505050565b6000610e20824261264f565b9050919050565b610e2f612085565b73ffffffffffffffffffffffffffffffffffffffff16610e4d6111fa565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a906131ea565b60405180910390fd5b6000600260008581526020019081526020016000206002015414610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061322a565b60405180910390fd5b8160066000828254610f0e91906133fa565b925050819055506040518060a001604052806000815260200182815260200182815260200183815260200160008152506002600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050506004839080600181540180825580915050600190039060005260206000200160009091909190915055827fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced83604051610fdf9190613305565b60405180910390a2505050565b610ff4612a00565b6002600154141561103a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611031906132aa565b60405180910390fd5b600260018190555061104b82611985565b905060018081905550919050565b6002600154141561109f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611096906132aa565b60405180910390fd5b60026001819055506110af6127a3565b60018081905550565b600481815481106110c857600080fd5b906000526020600020016000915090505481565b6110e4612085565b73ffffffffffffffffffffffffffffffffffffffff166111026111fa565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906131ea565b60405180910390fd5b61116260006127f5565b565b6000818410158061117457508284115b1561118257600090506111ab565b81831161119c57838361119591906134db565b90506111ab565b83826111a891906134db565b90505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b600061126082426128b9565b9050919050565b61126f612085565b73ffffffffffffffffffffffffffffffffffffffff1661128d6111fa565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da906131ea565b60405180910390fd5b600060075414156113045762015180426112fd91906133fa565b6007819055505b4260075411611419577f00000000000000000000000000000000000000000000000000000000000000006113625761135d33828473ffffffffffffffffffffffffffffffffffffffff166123a29092919063ffffffff16565b611410565b60003373ffffffffffffffffffffffffffffffffffffffff168260405161138890613049565b60006040518083038185875af1925050503d80600081146113c5576040519150601f19603f3d011682016040523d82523d6000602084013e6113ca565b606091505b505090508061140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906131aa565b60405180910390fd5b505b60006007819055505b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a29061318a565b60405180910390fd5b600260015414156114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e8906132aa565b60405180910390fd5b6002600181905550600061150484611985565b905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000807f00000000000000000000000000000000000000000000000000000000000000001561158b57479050611637565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115e4919061305e565b60206040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116349190612b5f565b90505b6000836000015411156118d75782600101547f00000000000000000000000000000000000000000000000000000000000000008560000151856000015461167e9190613481565b6116889190613450565b61169291906134db565b915060008211156118d6577f000000000000000000000000000000000000000000000000000000000000000015611830578082111561177d5760008673ffffffffffffffffffffffffffffffffffffffff16826040516116f190613049565b60006040518083038185875af1925050503d806000811461172e576040519150601f19603f3d011682016040523d82523d6000602084013e611733565b606091505b5050905080611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e9061316a565b60405180910390fd5b5061182b565b60008673ffffffffffffffffffffffffffffffffffffffff16836040516117a390613049565b60006040518083038185875af1925050503d80600081146117e0576040519150601f19603f3d011682016040523d82523d6000602084013e6117e5565b606091505b5050905080611829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118209061316a565b60405180910390fd5b505b6118d5565b808211156118885761188386827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123a29092919063ffffffff16565b6118d4565b6118d386837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123a29092919063ffffffff16565b5b5b5b5b8483600001819055507f0000000000000000000000000000000000000000000000000000000000000000846000015184600001546119159190613481565b61191f9190613450565b83600101819055508573ffffffffffffffffffffffffffffffffffffffff167fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b48360405161196d9190613305565b60405180910390a25050505060018081905550505050565b61198d612a00565b600260008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600060036000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611a645783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611a14565b50505050905081604001514211611a7b5750611d80565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663654c9ece856040518263ffffffff1660e01b8152600401611ad69190613305565b60206040518083038186803b158015611aee57600080fd5b505afa158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190612b5f565b90506000811415611b9857611b3b84426128b9565b421115611b915742836040018181525050837f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f468460400151838660000151604051611b8893929190613349565b60405180910390a25b5050611d80565b60005b8251811015611cef576000611bd3856040015142868581518110611bc257611bc1613686565b5b602002602001015160200151611164565b90506000811415611be45750611cde565b838281518110611bf757611bf6613686565b5b602002602001015160200151421115611c3757838281518110611c1d57611c1c613686565b5b602002602001015160200151856040018181525050611c42565b428560400181815250505b60006006548660600151868581518110611c5f57611c5e613686565b5b60200260200101516040015184611c769190613481565b611c809190613481565b611c8a9190613450565b9050837f000000000000000000000000000000000000000000000000000000000000000082611cb99190613481565b611cc39190613450565b86600001818151611cd491906133fa565b9150818152505050505b80611ce8906135df565b9050611b9b565b5082600260008681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050837f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f468460400151838660000151604051611d7593929190613349565b60405180910390a250505b919050565b611d8d612085565b73ffffffffffffffffffffffffffffffffffffffff16611dab6111fa565b73ffffffffffffffffffffffffffffffffffffffff1614611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df8906131ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e689061314a565b60405180910390fd5b611e7a816127f5565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60075481565b6000611f5a836005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546005600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461208d565b905092915050565b600080823b905060008111915050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1663313ce56760e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516120099190613032565b600060405180830381855afa9150503d8060008114612044576040519150601f19603f3d011682016040523d82523d6000602084013e612049565b606091505b509150915081801561205c575060208151145b61206757601261207c565b8080602001905181019061207b9190612d05565b5b92505050919050565b600033905090565b600080600260008681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600060036000878152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156121675783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612117565b50505050905060008260000151905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663654c9ece896040518263ffffffff1660e01b81526004016121d19190613305565b60206040518083038186803b1580156121e957600080fd5b505afa1580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122219190612b5f565b9050836040015142118015612237575060008114155b156123535760008460400151905060005b845181101561235057600061227c834288858151811061226b5761226a613686565b5b602002602001015160200151611164565b9050600081141561228d575061233f565b8582815181106122a05761229f613686565b5b6020026020010151602001519250600060065488606001518885815181106122cb576122ca613686565b5b602002602001015160400151846122e29190613481565b6122ec9190613481565b6122f69190613450565b9050847f0000000000000000000000000000000000000000000000000000000000000000826123259190613481565b61232f9190613450565b8661233a91906133fa565b955050505b80612349906135df565b9050612248565b50505b857f000000000000000000000000000000000000000000000000000000000000000083896123819190613481565b61238b9190613450565b61239591906134db565b9450505050509392505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016123d79291906130b0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124419190613032565b6000604051808303816000865af19150503d806000811461247e576040519150601f19603f3d011682016040523d82523d6000602084013e612483565b606091505b50915091508180156124b157506000815114806124b05750808060200190518101906124af9190612b05565b5b5b6124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e79061312a565b60405180910390fd5b5050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b86868660405160240161252e93929190613079565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516125989190613032565b6000604051808303816000865af19150503d80600081146125d5576040519150601f19603f3d011682016040523d82523d6000602084013e6125da565b606091505b509150915081801561260857506000815114806126075750808060200190518101906126069190612b05565b5b5b612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e9061328a565b60405180910390fd5b505050505050565b60008060036000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156126d55783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612685565b5050505090506000600260008681526020019081526020016000209050600082519050600081141561270d576000935050505061279d565b60005b818110156127945783818151811061272b5761272a613686565b5b602002602001015160200151861161278357600654836003015485838151811061275857612757613686565b5b60200260200101516040015161276e9190613481565b6127789190613450565b94505050505061279d565b8061278d906135df565b9050612710565b50600093505050505b92915050565b6000600480549050905060005b818110156127f1576127df600482815481106127cf576127ce613686565b5b9060005260206000200154611985565b50806127ea906135df565b90506127b0565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060036000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561293f57838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906128ef565b505050509050600081519050600081141561295f576000925050506129fa565b60005b818110156129c95782818151811061297d5761297c613686565b5b60200260200101516020015185116129b8578281815181106129a2576129a1613686565b5b60200260200101516020015193505050506129fa565b806129c2906135df565b9050612962565b50816001826129d891906134db565b815181106129e9576129e8613686565b5b602002602001015160200151925050505b92915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b600081359050612a3e81613a51565b92915050565b600081519050612a5381613a68565b92915050565b600081359050612a6881613a7f565b92915050565b600081519050612a7d81613a7f565b92915050565b600081519050612a9281613a96565b92915050565b600060208284031215612aae57612aad6136b5565b5b6000612abc84828501612a2f565b91505092915050565b60008060408385031215612adc57612adb6136b5565b5b6000612aea85828601612a2f565b9250506020612afb85828601612a59565b9150509250929050565b600060208284031215612b1b57612b1a6136b5565b5b6000612b2984828501612a44565b91505092915050565b600060208284031215612b4857612b476136b5565b5b6000612b5684828501612a59565b91505092915050565b600060208284031215612b7557612b746136b5565b5b6000612b8384828501612a6e565b91505092915050565b60008060408385031215612ba357612ba26136b5565b5b6000612bb185828601612a59565b9250506020612bc285828601612a2f565b9150509250929050565b600080600060608486031215612be557612be46136b5565b5b6000612bf386828701612a59565b9350506020612c0486828701612a2f565b9250506040612c1586828701612a59565b9150509250925092565b60008060408385031215612c3657612c356136b5565b5b6000612c4485828601612a59565b9250506020612c5585828601612a59565b9150509250929050565b600080600060608486031215612c7857612c776136b5565b5b6000612c8686828701612a59565b9350506020612c9786828701612a59565b9250506040612ca886828701612a2f565b9150509250925092565b600080600060608486031215612ccb57612cca6136b5565b5b6000612cd986828701612a59565b9350506020612cea86828701612a59565b9250506040612cfb86828701612a59565b9150509250925092565b600060208284031215612d1b57612d1a6136b5565b5b6000612d2984828501612a83565b91505092915050565b612d3b8161350f565b82525050565b612d4a81613521565b82525050565b6000612d5b826133d3565b612d6581856133de565b9350612d758185602086016135ac565b80840191505092915050565b612d8a81613564565b82525050565b612d9981613576565b82525050565b6000612dac601c836133e9565b9150612db7826136ba565b602082019050919050565b6000612dcf6026836133e9565b9150612dda826136e3565b604082019050919050565b6000612df2600f836133e9565b9150612dfd82613732565b602082019050919050565b6000612e156042836133e9565b9150612e208261375b565b606082019050919050565b6000612e386029836133e9565b9150612e43826137d0565b604082019050919050565b6000612e5b6032836133e9565b9150612e668261381f565b604082019050919050565b6000612e7e6020836133e9565b9150612e898261386e565b602082019050919050565b6000612ea16024836133e9565b9150612eac82613897565b604082019050919050565b6000612ec46013836133e9565b9150612ecf826138e6565b602082019050919050565b6000612ee76025836133e9565b9150612ef28261390f565b604082019050919050565b6000612f0a6000836133de565b9150612f158261395e565b600082019050919050565b6000612f2d6035836133e9565b9150612f3882613961565b604082019050919050565b6000612f506020836133e9565b9150612f5b826139b0565b602082019050919050565b6000612f73601f836133e9565b9150612f7e826139d9565b602082019050919050565b6000612f96602d836133e9565b9150612fa182613a02565b604082019050919050565b60a082016000820151612fc26000850182613014565b506020820151612fd56020850182613014565b506040820151612fe86040850182613014565b506060820151612ffb6060850182613014565b50608082015161300e6080850182613014565b50505050565b61301d8161354d565b82525050565b61302c8161354d565b82525050565b600061303e8284612d50565b915081905092915050565b600061305482612efd565b9150819050919050565b60006020820190506130736000830184612d32565b92915050565b600060608201905061308e6000830186612d32565b61309b6020830185612d32565b6130a86040830184613023565b949350505050565b60006040820190506130c56000830185612d32565b6130d26020830184613023565b9392505050565b60006020820190506130ee6000830184612d41565b92915050565b60006020820190506131096000830184612d81565b92915050565b60006020820190506131246000830184612d90565b92915050565b6000602082019050818103600083015261314381612d9f565b9050919050565b6000602082019050818103600083015261316381612dc2565b9050919050565b6000602082019050818103600083015261318381612de5565b9050919050565b600060208201905081810360008301526131a381612e08565b9050919050565b600060208201905081810360008301526131c381612e2b565b9050919050565b600060208201905081810360008301526131e381612e4e565b9050919050565b6000602082019050818103600083015261320381612e71565b9050919050565b6000602082019050818103600083015261322381612e94565b9050919050565b6000602082019050818103600083015261324381612eb7565b9050919050565b6000602082019050818103600083015261326381612eda565b9050919050565b6000602082019050818103600083015261328381612f20565b9050919050565b600060208201905081810360008301526132a381612f43565b9050919050565b600060208201905081810360008301526132c381612f66565b9050919050565b600060208201905081810360008301526132e381612f89565b9050919050565b600060a0820190506132ff6000830184612fac565b92915050565b600060208201905061331a6000830184613023565b92915050565b60006040820190506133356000830185613023565b6133426020830184613023565b9392505050565b600060608201905061335e6000830186613023565b61336b6020830185613023565b6133786040830184613023565b949350505050565b600060a0820190506133956000830188613023565b6133a26020830187613023565b6133af6040830186613023565b6133bc6060830185613023565b6133c96080830184613023565b9695505050505050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006134058261354d565b91506134108361354d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561344557613444613628565b5b828201905092915050565b600061345b8261354d565b91506134668361354d565b92508261347657613475613657565b5b828204905092915050565b600061348c8261354d565b91506134978361354d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134d0576134cf613628565b5b828202905092915050565b60006134e68261354d565b91506134f18361354d565b92508282101561350457613503613628565b5b828203905092915050565b600061351a8261352d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061356f82613588565b9050919050565b600061358182613588565b9050919050565b60006135938261359a565b9050919050565b60006135a58261352d565b9050919050565b60005b838110156135ca5780820151818401526020810190506135af565b838111156135d9576000848401525b50505050565b60006135ea8261354d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561361d5761361c613628565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b7f426f72696e6745524332303a205472616e73666572206661696c656400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f6f6e6c794469737472696275746f7256323a206f6e6c79205374656c6c61446960008201527f737472696275746f7256322063616e2063616c6c20746869732066756e63746960208201527f6f6e000000000000000000000000000000000000000000000000000000000000604082015250565b7f656d657267656e6379207265776172642077697468647261773a206661696c6560008201527f6420746f2073656e640000000000000000000000000000000000000000000000602082015250565b7f656d657267656e6379207265776172642077697468647261773a206e6f74206560008201527f6e6f7567682072657761726420746f6b656e0000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6164642072657761726420696e666f3a2072657761726420706572696f64206560008201527f6e64656400000000000000000000000000000000000000000000000000000000602082015250565b7f706f6f6c20616c72656164792065786973747300000000000000000000000000600082015250565b7f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560008201527f7374616d70000000000000000000000000000000000000000000000000000000602082015250565b50565b7f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60008201527f677468206578636565647320746865206c696d69740000000000000000000000602082015250565b7f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460008201527f7320746f207472616e7366657200000000000000000000000000000000000000602082015250565b613a5a8161350f565b8114613a6557600080fd5b50565b613a7181613521565b8114613a7c57600080fd5b50565b613a888161354d565b8114613a9357600080fd5b50565b613a9f81613557565b8114613aaa57600080fd5b5056fea26469706673582212205dc87f858becc6ee2194d75712679aa4c8737908f2e5c5744424a7aace82347a64736f6c63430008070033000000000000000000000000818ec0a7fe18ff94269904fced6ae3dae6d6dc0b000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf03880000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
20537:17894:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22705:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22259:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;22046:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;22580:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36947:824;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25453:1894;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36702:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24736:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28883:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31938:84;;;;;;;;;;;;;:::i;:::-;;22322:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10576:94;;;;;;;;;;;;;:::i;:::-;;28338:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20781:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20723:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9925:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22413:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;28110:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37857:571;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32545:1630;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29229:2626;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10825:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20666:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37818:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34249:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22705:45;;;:::o;22259:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22046:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22580:34::-;;;;:::o;36947: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;;;;37110:21:::2;37134:8;:14;37143:4;37134:14;;;;;;;;;;;37110:38;;37159:16;37178:13;:25;;;37204:4;37178:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37159:50;;37222:35;37260:33;37275:4;37281:8;37291:1;37260:14;:33::i;:::-;37222:71;;37369:4;:17;;;37358:7;37328:27;:37;;;;:::i;:::-;:58;;37306:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;37496:7;37475:4;:17;;;:28;;;;;;;:::i;:::-;;;;;;;;37521:8;37516:248;;37546:47;37571:12;37585:7;37546:11;:24;;;;:47;;;;;:::i;:::-;37516:248;;;37627:9;37642:12;:17;;37667:7;37642:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37626:53;;;37702:4;37694:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37611:153;37516:248;37099:672;;;12916:1:::1;13868:7:::0;:22:::1;;;;36947:824:::0;;;:::o;25453:1894::-;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;:125;;;;26003:15;25936:10;25967:1;25947:10;:17;;;;:21;;;;:::i;:::-;25936:33;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;:82;;25893:125;25871:211;;;;;;;;;;;;:::i;:::-;;;;;;;;;26136:1;26115:10;:17;;;;:22;:105;;;;26207:13;26158:10;26189:1;26169:10;:17;;;;:21;;;;:::i;:::-;26158:33;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;:62;26115:105;26093:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;26298:22;26344:1:::0;26323:10:::1;:17;;;;:22;:119;;26396:10;26427:1;26407:10;:17;;;;:21;;;;:::i;:::-;26396:33;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;26323:119;;;26361:4;:19;;;26323:119;26298:144;;26455:17;26491:14;26475:13;:30;;;;:::i;:::-;26455:50;;26516:20;26551:13;26539:9;:25;;;;:::i;:::-;26516:48;;26582:8;26577:342;;26607:135;26654:10;26691:4;26715:12;26607:11;:28;;;;:135;;;;;;:::i;:::-;26577:342;;;26814:12;26801:9;:25;26775:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;26577:342;26952:12;26931:4;:17;;;:33;;;;;;;:::i;:::-;;;;;;;;26977:10;27007:168;;;;;;;;27053:14;27007:168;;;;27100:13;27007:168;;;;27146:13;27007:168;;::::0;26977:209:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27271:1;27251:10;:17;;;;:21;;;;:::i;:::-;27232:4;27204:135;27287:13;27315;27204:135;;;;;;;:::i;:::-;;;;;;;;25597:1750;;;;;25453:1894:::0;;;:::o;36702:187::-;36811:7;36843:38;36859:4;36865:15;36843;:38::i;:::-;36836:45;;36702: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;28883:162::-;28975:20;;:::i;:::-;12960:1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;29020:17:::1;29032:4;29020:11;:17::i;:::-;29013:24;;12916:1:::0;13868:7;:22;;;;28883:162;;;:::o;31938:84::-;12960:1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;31996::::1;:16;:18::i;:::-;12916:1:::0;13868:7;:22;;;;31938: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;28338:360::-;28469:7;28503:13;28494:5;:22;;28493:41;;;;28530:3;28522:5;:11;28493:41;28489:82;;;28558:1;28551:8;;;;28489:82;28592:13;28585:3;:20;28581:71;;28635:5;28629:3;:11;;;;:::i;:::-;28622:18;;;;28581:71;28685:5;28669:13;:21;;;;:::i;:::-;28662:28;;28338:360;;;;;;:::o;20781:30::-;;;:::o;20723:51::-;;;:::o;9925:87::-;9971:7;9998:6;;;;;;;;;;;9991:13;;9925:87;:::o;22413:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28110:139::-;28176:7;28203:38;28219:4;28225:15;28203;:38::i;:::-;28196:45;;28110:139;;;:::o;37857:571::-;10156:12;:10;:12::i;:::-;10145:23;;:7;:5;:7::i;:::-;:23;;;10137:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37971:1:::1;37954:13;;:18;37950:90;;;38023:5;38005:15;:23;;;;:::i;:::-;37989:13;:39;;;;37950:90;38073:15;38056:13;;:32;38053:368;;38110:8;38105:273;;38139:54;38173:10;38185:7;38152:6;38139:33;;;;:54;;;;;:::i;:::-;38105:273;;;38235:9;38250:10;:15;;38273:7;38250:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38234:51;;;38312:4;38304:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38215:163;38105:273;38408:1;38392:13;:17;;;;38053:368;37857:571:::0;;:::o;32545:1630::-;23497:13;23475:36;;:10;:36;;;23453:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1:::1;13556:7;;:19;;13548:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12960:1;13689:7;:18;;;;32709:20:::2;32732:17;32744:4;32732:11;:17::i;:::-;32709:40;;32760:21;32784:8;:14;32793:4;32784:14;;;;;;;;;;;:21;32799:5;32784:21;;;;;;;;;;;;;;;32760:45;;32818:15;32848:21:::0;32890:8:::2;32886:163;;;32931:21;32915:37;;32886:163;;;33001:11;:21;;;33031:4;33001:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32985:52;;32886:163;33079:1;33065:4;:11;;;:15;33061:915;;;33189:4;:15;;;33166:19;33124:4;:21;;;33110:4;:11;;;:35;;;;:::i;:::-;33109:76;;;;:::i;:::-;33108:96;;;;:::i;:::-;33097:108;;33236:1;33226:7;:11;33222:743;;;33262:8;33258:692;;;33309:13;33299:7;:23;33295:365;;;33352:12;33370:5;:10;;33388:13;33370:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33351:55;;;33441:7;33433:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;33324:168;33295:365;;;33526:12;33544:5;:10;;33562:7;33544:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33525:49;;;33609:7;33601:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;33498:162;33295:365;33258:692;;;33722:13;33712:7;:23;33708:223;;;33764:46;33789:5;33796:13;33764:11;:24;;;;:46;;;;;:::i;:::-;33708:223;;;33867:40;33892:5;33899:7;33867:11;:24;;;;:40;;;;;:::i;:::-;33708:223;33258:692;33222:743;33061:915;34002:7;33988:4;:11;;:21;;;;34106:19;34068:4;:21;;;34054:4;:11;;;:35;;;;:::i;:::-;34053:72;;;;:::i;:::-;34022:4;:15;;:103;;;;34152:5;34143:24;;;34159:7;34143:24;;;;;;:::i;:::-;;;;;;;;32698:1477;;;;12916:1:::1;13868:7:::0;:22:::1;;;;32545:1630:::0;;;:::o;29229:2626::-;29279:20;;:::i;:::-;29319:8;:13;29328:3;29319:13;;;;;;;;;;;29312:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29343:30;29376:14;:19;29391:3;29376:19;;;;;;;;;;;29343:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29431:4;:24;;;29412:15;:43;29408:87;;29472:11;;;29408:87;29507:16;29526:13;:25;;;29552:3;29526:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29507:49;;29585:1;29573:8;:13;29569:751;;;29964:37;29980:3;29985:15;29964;:37::i;:::-;29946:15;:55;29942:339;;;30049:15;30022:4;:24;;:42;;;;;30121:3;30088:177;30147:4;:24;;;30194:8;30225:4;:21;;;30088:177;;;;;;;;:::i;:::-;;;;;;;;29942:339;30297:11;;;;29569:751;30376:9;30371:1265;30395:10;:17;30391:1;:21;30371:1265;;;30688:19;30710:152;30744:4;:24;;;30787:15;30821:10;30832:1;30821:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;30710:15;:152::i;:::-;30688:174;;30896:1;30881:11;:16;30877:30;;;30899:8;;;30877:30;31168:10;31179:1;31168:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;31150:15;:44;31146:221;;;31242:10;31253:1;31242:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;31215:4;:24;;:53;;;;;31146:221;;;31336:15;31309:4;:24;;:42;;;;;31146:221;31383:19;31502:15;;31483:4;:15;;;31437:10;31448:1;31437:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;31406:11;:57;;;;:::i;:::-;:92;;;;:::i;:::-;31405:112;;;;:::i;:::-;31383:134;;31615:8;31575:19;31561:11;:33;;;;:::i;:::-;31560:63;;;;:::i;:::-;31534:4;:21;;:90;;;;;;;:::i;:::-;;;;;;;;30419:1217;;30371:1265;30414:3;;;;:::i;:::-;;;30371:1265;;;;31664:4;31648:8;:13;31657:3;31648:13;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31711:3;31686:137;31729:4;:24;;;31768:8;31791:4;:21;;;31686:137;;;;;;;;:::i;:::-;;;;;;;;31836:11;;29229: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;37818:32::-;;;;:::o;34249:323::-;34369:7;34414:150;34447:4;34470:8;:14;34479:4;34470:14;;;;;;;;;;;:21;34485:5;34470:21;;;;;;;;;;;;;;;:28;;;34517:8;:14;34526:4;34517:14;;;;;;;;;;;:21;34532:5;34517:21;;;;;;;;;;;;;;;:32;;;34414:14;:150::i;:::-;34394:170;;34249: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;34580:1307::-;34713:15;34741:20;34764:8;:14;34773:4;34764:14;;;;;;;;;;;34741:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34789:30;34822:14;:20;34837:4;34822:20;;;;;;;;;;;34789:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34855:24;34882:4;:21;;;34855:48;;34914:16;34933:13;:25;;;34959:4;34933:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34914:50;;34999:4;:24;;;34981:15;:42;:59;;;;;35039:1;35027:8;:13;;34981:59;34977:799;;;35057:14;35074:4;:24;;;35057:41;;35120:9;35115:650;35139:10;:17;35135:1;:21;35115:650;;;35182:19;35204:150;35242:6;35271:15;35309:10;35320:1;35309:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;35204:15;:150::i;:::-;35182:172;;35392:1;35377:11;:16;35373:30;;;35395:8;;;35373:30;35431:10;35442:1;35431:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;35422:35;;35478:19;35605:15;;35586:4;:15;;;35536:10;35547:1;35536:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;35501:11;:61;;;;:::i;:::-;:100;;;;:::i;:::-;35500:120;;;;:::i;:::-;35478:142;;35741:8;35697:19;35683:11;:33;;;;:::i;:::-;35682:67;;;;:::i;:::-;35641:108;;;;;:::i;:::-;;;35163:602;;35115:650;35158:3;;;;:::i;:::-;;;35115:650;;;;35042:734;34977:799;35867:11;35831:19;35811:16;35801:7;:26;;;;:::i;:::-;35800:50;;;;:::i;:::-;35799:79;;;;:::i;:::-;35788:91;;34730:1157;;;;34580: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;35895:740::-;36009:7;36034:30;36067:14;:20;36082:4;36067:20;;;;;;;;;;;36034:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36098:21;36122:8;:14;36131:4;36122:14;;;;;;;;;;;36098:38;;36147:11;36161:10;:17;36147:31;;36200:1;36193:3;:8;36189:49;;;36225:1;36218:8;;;;;;;36189:49;36253:9;36248:242;36272:3;36268:1;:7;36248:242;;;36320:10;36331:1;36320:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;36301:15;:45;36297:181;;36463:15;;36423:4;:15;;;36394:10;36405:1;36394:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;:44;;;;:::i;:::-;36393:85;;;;:::i;:::-;36365:113;;;;;;;;36297:181;36277:3;;;;:::i;:::-;;;36248:242;;;;36626:1;36619:8;;;;;35895:740;;;;;:::o;32105:192::-;32153:14;32170:7;:14;;;;32153:31;;32200:11;32195:95;32223:6;32217:3;:12;32195:95;;;32253:25;32265:7;32273:3;32265:12;;;;;;;;:::i;:::-;;;;;;;;;;32253:11;:25::i;:::-;;32231:5;;;;:::i;:::-;;;32195:95;;;;32142:155;32105: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;27355:661::-;27464:7;27489:30;27522:14;:20;27537:4;27522:20;;;;;;;;;;;27489:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27553:11;27567:10;:17;27553:31;;27606:1;27599:3;:8;27595:49;;;27631:1;27624:8;;;;;;27595:49;27659:9;27654:157;27678:3;27674:1;:7;27654:157;;;27721:10;27732:1;27721:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;27707:10;:40;27703:96;;27773:10;27784:1;27773:13;;;;;;;;:::i;:::-;;;;;;;;:26;;;27766:33;;;;;;;27703:96;27683:3;;;;:::i;:::-;;;27654:157;;;;27976:10;27993:1;27987:3;:7;;;;:::i;:::-;27976:19;;;;;;;;:::i;:::-;;;;;;;;:32;;;27969:39;;;;27355: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:::-;10258:3;10279:67;10343:2;10338:3;10279:67;:::i;:::-;10272:74;;10355:93;10444:3;10355:93;:::i;:::-;10473:2;10468:3;10464:12;10457:19;;10116:366;;;:::o;10488:398::-;10647:3;10668:83;10749:1;10744:3;10668:83;:::i;:::-;10661:90;;10760:93;10849:3;10760:93;:::i;:::-;10878:1;10873:3;10869:11;10862:18;;10488:398;;;:::o;10892:366::-;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;12008:::-;12150:3;12171:67;12235:2;12230:3;12171:67;:::i;:::-;12164:74;;12247:93;12336:3;12247:93;:::i;:::-;12365:2;12360:3;12356:12;12349:19;;12008:366;;;:::o;12470:1080::-;12617:4;12612:3;12608:14;12716:4;12709:5;12705:16;12699:23;12735:63;12792:4;12787:3;12783:14;12769:12;12735:63;:::i;:::-;12632:176;12900:4;12893:5;12889:16;12883:23;12919:63;12976:4;12971:3;12967:14;12953:12;12919:63;:::i;:::-;12818:174;13089:4;13082:5;13078:16;13072:23;13108:63;13165:4;13160:3;13156:14;13142:12;13108:63;:::i;:::-;13002:179;13269:4;13262:5;13258:16;13252:23;13288:63;13345:4;13340:3;13336:14;13322:12;13288:63;:::i;:::-;13191:170;13451:4;13444:5;13440:16;13434:23;13470:63;13527:4;13522:3;13518:14;13504:12;13470:63;:::i;:::-;13371:172;12586:964;12470:1080;;:::o;13556:108::-;13633:24;13651:5;13633:24;:::i;:::-;13628:3;13621:37;13556:108;;:::o;13670:118::-;13757:24;13775:5;13757:24;:::i;:::-;13752:3;13745:37;13670:118;;:::o;13794:271::-;13924:3;13946:93;14035:3;14026:6;13946:93;:::i;:::-;13939:100;;14056:3;14049:10;;13794:271;;;;:::o;14071:379::-;14255:3;14277:147;14420:3;14277:147;:::i;:::-;14270:154;;14441:3;14434:10;;14071:379;;;:::o;14456:222::-;14549:4;14587:2;14576:9;14572:18;14564:26;;14600:71;14668:1;14657:9;14653:17;14644:6;14600:71;:::i;:::-;14456:222;;;;:::o;14684:442::-;14833:4;14871:2;14860:9;14856:18;14848:26;;14884:71;14952:1;14941:9;14937:17;14928:6;14884:71;:::i;:::-;14965:72;15033:2;15022:9;15018:18;15009:6;14965:72;:::i;:::-;15047;15115:2;15104:9;15100:18;15091:6;15047:72;:::i;:::-;14684:442;;;;;;:::o;15132:332::-;15253:4;15291:2;15280:9;15276:18;15268:26;;15304:71;15372:1;15361:9;15357:17;15348:6;15304:71;:::i;:::-;15385:72;15453:2;15442:9;15438:18;15429:6;15385:72;:::i;:::-;15132:332;;;;;:::o;15470:210::-;15557:4;15595:2;15584:9;15580:18;15572:26;;15608:65;15670:1;15659:9;15655:17;15646:6;15608:65;:::i;:::-;15470:210;;;;:::o;15686:262::-;15799:4;15837:2;15826:9;15822:18;15814:26;;15850:91;15938:1;15927:9;15923:17;15914:6;15850:91;:::i;:::-;15686:262;;;;:::o;15954:278::-;16075:4;16113:2;16102:9;16098:18;16090:26;;16126:99;16222:1;16211:9;16207:17;16198:6;16126:99;:::i;:::-;15954:278;;;;:::o;16238:419::-;16404:4;16442:2;16431:9;16427:18;16419:26;;16491:9;16485:4;16481:20;16477:1;16466:9;16462:17;16455:47;16519:131;16645:4;16519:131;:::i;:::-;16511:139;;16238:419;;;:::o;16663:::-;16829:4;16867:2;16856:9;16852:18;16844:26;;16916:9;16910:4;16906:20;16902:1;16891:9;16887:17;16880:47;16944:131;17070:4;16944:131;:::i;:::-;16936:139;;16663:419;;;:::o;17088:::-;17254:4;17292:2;17281:9;17277:18;17269:26;;17341:9;17335:4;17331:20;17327:1;17316:9;17312:17;17305:47;17369:131;17495:4;17369:131;:::i;:::-;17361:139;;17088:419;;;:::o;17513:::-;17679:4;17717:2;17706:9;17702:18;17694:26;;17766:9;17760:4;17756:20;17752:1;17741:9;17737:17;17730:47;17794:131;17920:4;17794:131;:::i;:::-;17786:139;;17513:419;;;:::o;17938:::-;18104:4;18142:2;18131:9;18127:18;18119:26;;18191:9;18185:4;18181:20;18177:1;18166:9;18162:17;18155:47;18219:131;18345:4;18219:131;:::i;:::-;18211:139;;17938:419;;;:::o;18363:::-;18529:4;18567:2;18556:9;18552:18;18544:26;;18616:9;18610:4;18606:20;18602:1;18591:9;18587:17;18580:47;18644:131;18770:4;18644:131;:::i;:::-;18636:139;;18363:419;;;:::o;18788:::-;18954:4;18992:2;18981:9;18977:18;18969:26;;19041:9;19035:4;19031:20;19027:1;19016:9;19012:17;19005:47;19069:131;19195:4;19069:131;:::i;:::-;19061:139;;18788:419;;;:::o;19213:::-;19379:4;19417:2;19406:9;19402:18;19394:26;;19466:9;19460:4;19456:20;19452:1;19441:9;19437:17;19430:47;19494:131;19620:4;19494:131;:::i;:::-;19486:139;;19213:419;;;:::o;19638:::-;19804:4;19842:2;19831:9;19827:18;19819:26;;19891:9;19885:4;19881:20;19877:1;19866:9;19862:17;19855:47;19919:131;20045:4;19919:131;:::i;:::-;19911:139;;19638:419;;;:::o;20063:::-;20229:4;20267:2;20256:9;20252:18;20244:26;;20316:9;20310:4;20306:20;20302:1;20291:9;20287:17;20280:47;20344:131;20470:4;20344:131;:::i;:::-;20336:139;;20063:419;;;:::o;20488:::-;20654:4;20692:2;20681:9;20677:18;20669:26;;20741:9;20735:4;20731:20;20727:1;20716:9;20712:17;20705:47;20769:131;20895:4;20769:131;:::i;:::-;20761:139;;20488:419;;;:::o;20913:::-;21079:4;21117:2;21106:9;21102:18;21094:26;;21166:9;21160:4;21156:20;21152:1;21141:9;21137:17;21130:47;21194:131;21320:4;21194:131;:::i;:::-;21186:139;;20913:419;;;:::o;21338:::-;21504:4;21542:2;21531:9;21527:18;21519:26;;21591:9;21585:4;21581:20;21577:1;21566:9;21562:17;21555:47;21619:131;21745:4;21619:131;:::i;:::-;21611:139;;21338:419;;;:::o;21763:::-;21929:4;21967:2;21956:9;21952:18;21944:26;;22016:9;22010:4;22006:20;22002:1;21991:9;21987:17;21980:47;22044:131;22170:4;22044:131;:::i;:::-;22036:139;;21763:419;;;:::o;22188:323::-;22331:4;22369:3;22358:9;22354:19;22346:27;;22383:121;22501:1;22490:9;22486:17;22477:6;22383:121;:::i;:::-;22188:323;;;;:::o;22517:222::-;22610:4;22648:2;22637:9;22633:18;22625:26;;22661:71;22729:1;22718:9;22714:17;22705:6;22661:71;:::i;:::-;22517:222;;;;:::o;22745:332::-;22866:4;22904:2;22893:9;22889:18;22881:26;;22917:71;22985:1;22974:9;22970:17;22961:6;22917:71;:::i;:::-;22998:72;23066:2;23055:9;23051:18;23042:6;22998:72;:::i;:::-;22745:332;;;;;:::o;23083:442::-;23232:4;23270:2;23259:9;23255:18;23247:26;;23283:71;23351:1;23340:9;23336:17;23327:6;23283:71;:::i;:::-;23364:72;23432:2;23421:9;23417:18;23408:6;23364:72;:::i;:::-;23446;23514:2;23503:9;23499:18;23490:6;23446:72;:::i;:::-;23083:442;;;;;;:::o;23531:664::-;23736:4;23774:3;23763:9;23759:19;23751:27;;23788:71;23856:1;23845:9;23841:17;23832:6;23788:71;:::i;:::-;23869:72;23937:2;23926:9;23922:18;23913:6;23869:72;:::i;:::-;23951;24019:2;24008:9;24004:18;23995:6;23951:72;:::i;:::-;24033;24101:2;24090:9;24086:18;24077:6;24033:72;:::i;:::-;24115:73;24183:3;24172:9;24168:19;24159:6;24115:73;:::i;:::-;23531:664;;;;;;;;:::o;24282:98::-;24333:6;24367:5;24361:12;24351:22;;24282:98;;;:::o;24386:147::-;24487:11;24524:3;24509:18;;24386:147;;;;:::o;24539:169::-;24623:11;24657:6;24652:3;24645:19;24697:4;24692:3;24688:14;24673:29;;24539:169;;;;:::o;24714:305::-;24754:3;24773:20;24791:1;24773:20;:::i;:::-;24768:25;;24807:20;24825:1;24807:20;:::i;:::-;24802:25;;24961:1;24893:66;24889:74;24886:1;24883:81;24880:107;;;24967:18;;:::i;:::-;24880:107;25011:1;25008;25004:9;24997:16;;24714:305;;;;:::o;25025:185::-;25065:1;25082:20;25100:1;25082:20;:::i;:::-;25077:25;;25116:20;25134:1;25116:20;:::i;:::-;25111:25;;25155:1;25145:35;;25160:18;;:::i;:::-;25145:35;25202:1;25199;25195:9;25190:14;;25025:185;;;;:::o;25216:348::-;25256:7;25279:20;25297:1;25279:20;:::i;:::-;25274:25;;25313:20;25331:1;25313:20;:::i;:::-;25308:25;;25501:1;25433:66;25429:74;25426:1;25423:81;25418:1;25411:9;25404:17;25400:105;25397:131;;;25508:18;;:::i;:::-;25397:131;25556:1;25553;25549:9;25538:20;;25216:348;;;;:::o;25570:191::-;25610:4;25630:20;25648:1;25630:20;:::i;:::-;25625:25;;25664:20;25682:1;25664:20;:::i;:::-;25659:25;;25703:1;25700;25697:8;25694:34;;;25708:18;;:::i;:::-;25694:34;25753:1;25750;25746:9;25738:17;;25570:191;;;;:::o;25767:96::-;25804:7;25833:24;25851:5;25833:24;:::i;:::-;25822:35;;25767:96;;;:::o;25869:90::-;25903:7;25946:5;25939:13;25932:21;25921:32;;25869:90;;;:::o;25965:126::-;26002:7;26042:42;26035:5;26031:54;26020:65;;25965:126;;;:::o;26097:77::-;26134:7;26163:5;26152:16;;26097:77;;;:::o;26180:86::-;26215:7;26255:4;26248:5;26244:16;26233:27;;26180:86;;;:::o;26272:146::-;26342:9;26375:37;26406:5;26375:37;:::i;:::-;26362:50;;26272:146;;;:::o;26424:154::-;26502:9;26535:37;26566:5;26535:37;:::i;:::-;26522:50;;26424:154;;;:::o;26584:126::-;26634:9;26667:37;26698:5;26667:37;:::i;:::-;26654:50;;26584:126;;;:::o;26716:113::-;26766:9;26799:24;26817:5;26799:24;:::i;:::-;26786:37;;26716:113;;;:::o;26835:307::-;26903:1;26913:113;26927:6;26924:1;26921:13;26913:113;;;27012:1;27007:3;27003:11;26997:18;26993:1;26988:3;26984:11;26977:39;26949:2;26946:1;26942:10;26937:15;;26913:113;;;27044:6;27041:1;27038:13;27035:101;;;27124:1;27115:6;27110:3;27106:16;27099:27;27035:101;26884:258;26835:307;;;:::o;27148:233::-;27187:3;27210:24;27228:5;27210:24;:::i;:::-;27201:33;;27256:66;27249:5;27246:77;27243:103;;;27326:18;;:::i;:::-;27243:103;27373:1;27366:5;27362:13;27355:20;;27148:233;;;:::o;27387:180::-;27435:77;27432:1;27425:88;27532:4;27529:1;27522:15;27556:4;27553:1;27546:15;27573:180;27621:77;27618:1;27611:88;27718:4;27715:1;27708:15;27742:4;27739:1;27732:15;27759:180;27807:77;27804:1;27797:88;27904:4;27901:1;27894:15;27928:4;27925:1;27918:15;28068:117;28177:1;28174;28167:12;28191:178;28331:30;28327:1;28319:6;28315:14;28308:54;28191:178;:::o;28375:225::-;28515:34;28511:1;28503:6;28499:14;28492:58;28584:8;28579:2;28571:6;28567:15;28560:33;28375:225;:::o;28606:165::-;28746:17;28742:1;28734:6;28730:14;28723:41;28606:165;:::o;28777:290::-;28917:34;28913:1;28905:6;28901:14;28894:58;28986:34;28981:2;28973:6;28969:15;28962:59;29055:4;29050:2;29042:6;29038:15;29031:29;28777:290;:::o;29073:228::-;29213:34;29209:1;29201:6;29197:14;29190:58;29282:11;29277:2;29269:6;29265:15;29258:36;29073:228;:::o;29307:237::-;29447:34;29443:1;29435:6;29431:14;29424:58;29516:20;29511:2;29503:6;29499:15;29492:45;29307:237;:::o;29550:182::-;29690:34;29686:1;29678:6;29674:14;29667:58;29550:182;:::o;29738:223::-;29878:34;29874:1;29866:6;29862:14;29855:58;29947:6;29942:2;29934:6;29930:15;29923:31;29738:223;:::o;29967:169::-;30107:21;30103:1;30095:6;30091:14;30084:45;29967:169;:::o;30142:224::-;30282:34;30278:1;30270:6;30266:14;30259:58;30351:7;30346:2;30338:6;30334:15;30327:32;30142:224;:::o;30372:114::-;;:::o;30492:240::-;30632:34;30628:1;30620:6;30616:14;30609:58;30701:23;30696:2;30688:6;30684:15;30677:48;30492:240;:::o;30738:182::-;30878:34;30874:1;30866:6;30862:14;30855:58;30738:182;:::o;30926:181::-;31066:33;31062:1;31054:6;31050:14;31043:57;30926:181;:::o;31113:232::-;31253:34;31249:1;31241:6;31237:14;31230:58;31322:15;31317:2;31309:6;31305:15;31298:40;31113:232;:::o;31351:122::-;31424:24;31442:5;31424:24;:::i;:::-;31417:5;31414:35;31404:63;;31463:1;31460;31453:12;31404:63;31351:122;:::o;31479:116::-;31549:21;31564:5;31549:21;:::i;:::-;31542:5;31539:32;31529:60;;31585:1;31582;31575:12;31529:60;31479:116;:::o;31601:122::-;31674:24;31692:5;31674:24;:::i;:::-;31667:5;31664:35;31654:63;;31713:1;31710;31703:12;31654:63;31601:122;:::o;31729:118::-;31800:22;31816:5;31800:22;:::i;:::-;31793:5;31790:33;31780:61;;31837:1;31834;31827:12;31780:61;31729:118;:::o
Swarm Source
ipfs://5dc87f858becc6ee2194d75712679aa4c8737908f2e5c5744424a7aace82347a
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.