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