Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (6)15,000 WLD [ WWW.GET-WLD.ORG ] Visit to claim reward! (WLD [ ...)43,767 BRC-20.WS! BRC-20.WS (BRC-20...)1 claim rewards on debridgether.comAcces debrid... (claim ...)330 TRBTellor$21,096.90@63.9343,767 TokenERC-20 TOKEN*[Spam]100 TokenERC-20 TOKEN*[Spam]NFT Tokens (20)Events+ $50 000 (BONUS-ETH.NET)ERC-1155Airdrop$50 000 FOR FREEERC-1155EventEthereumERC-1155EventEthereumERC-1155EthereumEthereumERC-1155ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]
More Info
Private Name Tags
ContractCreator
Multichain Info
3 addresses found viaLatest 25 from a total of 467 transactions
Transaction Hash MethodBlockFromToSubmit Value 126550316 2024-10-12 2:16:49 1 hr ago 1728699409 IN 0 ETH$0.00 0.000000320494 0.001 Submit Value 126508912 2024-10-11 3:16:41 24 hrs ago 1728616601 IN 0 ETH$0.00 0.000000847417 0.001 Submit Value 126467508 2024-10-10 4:16:33 47 hrs ago 1728533793 IN 0 ETH$0.00 0.000000489769 0.00195694 Submit Value 126426104 2024-10-09 5:16:25 2 days ago 1728450985 IN 0 ETH$0.00 0.000000306099 0.001 Submit Value 126384700 2024-10-08 6:16:17 3 days ago 1728368177 IN 0 ETH$0.00 0.000000323031 0.001 Submit Value 126343296 2024-10-07 7:16:09 4 days ago 1728285369 IN 0 ETH$0.00 0.000000281962 0.001 Submit Value 126301892 2024-10-06 8:16:01 5 days ago 1728202561 IN 0 ETH$0.00 0.000000248704 0.001 Submit Value 126260488 2024-10-05 9:15:53 6 days ago 1728119753 IN 0 ETH$0.00 0.000000235709 0.001 Submit Value 126219084 2024-10-04 10:15:45 7 days ago 1728036945 IN 0 ETH$0.00 0.000000242752 0.001 Submit Value 126177680 2024-10-03 11:15:37 8 days ago 1727954137 IN 0 ETH$0.00 0.000000228993 0.001 Submit Value 126136276 2024-10-02 12:15:29 9 days ago 1727871329 IN 0 ETH$0.00 0.000000681459 0.00304439 Submit Value 126094872 2024-10-01 13:15:21 10 days ago 1727788521 IN 0 ETH$0.00 0.000000416902 0.001 Submit Value 126053468 2024-09-30 14:15:13 11 days ago 1727705713 IN 0 ETH$0.00 0.000000468393 0.001 Submit Value 126044412 2024-09-30 9:13:21 11 days ago 1727687601 IN 0 ETH$0.00 0.000000297323 0.001 Submit Value 126003009 2024-09-29 10:13:15 12 days ago 1727604795 IN 0 ETH$0.00 0.000000258064 0.001 Submit Value 125961606 2024-09-28 11:13:09 13 days ago 1727521989 IN 0 ETH$0.00 0.00000090932 0.00449408 Submit Value 125920203 2024-09-27 12:13:03 14 days ago 1727439183 IN 0 ETH$0.00 0.000000599703 0.00245217 Submit Value 125878800 2024-09-26 13:12:57 15 days ago 1727356377 IN 0 ETH$0.00 0.000000583299 0.001 Submit Value 125837397 2024-09-25 14:12:51 16 days ago 1727273571 IN 0 ETH$0.00 0.00000091813 0.0019773 Submit Value 125795994 2024-09-24 15:12:45 17 days ago 1727190765 IN 0 ETH$0.00 0.000001809117 0.00788074 Submit Value 125754591 2024-09-23 16:12:39 18 days ago 1727107959 IN 0 ETH$0.00 0.000010926816 0.05691876 Submit Value 125713188 2024-09-22 17:12:33 19 days ago 1727025153 IN 0 ETH$0.00 0.000009864018 0.05328241 Submit Value 125671785 2024-09-21 18:12:27 20 days ago 1726942347 IN 0 ETH$0.00 0.000006608439 0.03542494 Submit Value 125630382 2024-09-20 19:12:21 21 days ago 1726859541 IN 0 ETH$0.00 0.000005659699 0.03026547 Submit Value 125588910 2024-09-19 20:09:57 22 days ago 1726776597 IN 0 ETH$0.00 0.000001380073 0.0067072 View more zero value Internal Transactions in Advanced View mode
Advanced mode:Loading...LoadingContract Name:TellorFlex
Compiler Versionv0.8.3+commit.8d00100c
Contract Source Code (Solidity)
- interface IERC20
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function transferFrom(
- contract TellorFlex *
- - function init(address _governanceAddr ...
- - function addStakingRewards(uint256 _a ...
- - function depositStake(uint256 _amount ...
- - function removeValue(bytes32 _queryId ...
- - function requestStakingWithdraw(uint2 ...
- - function slashReporter(address _repor ...
- - function submitValue(
- - function updateStakeAmount()
- - function withdrawStake()
- - function getCurrentValue(bytes32 _que ...
- - function getDataBefore(bytes32 _query ...
- - function getGovernanceAddress()
- - function getNewValueCountbyQueryId(by ...
- - function getPendingRewardByStaker(add ...
- - function getRealStakingRewardsBalance ...
- - function getReportDetails(bytes32 _qu ...
- - function getReporterByTimestamp(bytes ...
- - function getReporterLastTimestamp(add ...
- - function getReportingLock()
- - function getReportsSubmittedByAddress ...
- - function getStakeAmount()
- - function getStakerInfo(address _stake ...
- - function getTimeOfLastNewValue()
- - function getTimestampbyQueryIdandInde ...
- - function getIndexForDataBefore(bytes3 ...
- - function getTimestampIndexByTimestamp ...
- - function getTokenAddress()
- - function getTotalStakeAmount()
- - function getTotalStakers()
- - function getTotalTimeBasedRewardsBala ...
- - function isInDispute(bytes32 _queryId ...
- - function retrieveData(bytes32 _queryI ...
- - function verify()
- - function _updateRewards()
- - function _updateStakeAndPayRewards(
- - function _getUpdatedAccumulatedReward ...
/** *Submitted for verification at optimistic.etherscan.io on 2023-10-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.3; interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } /** @author Tellor Inc. @title TellorFlex @dev This is a streamlined Tellor oracle system which handles staking, reporting, * slashing, and user data getters in one contract. This contract is controlled * by a single address known as 'governance', which could be an externally owned * account or a contract, allowing for a flexible, modular design. */ contract TellorFlex { // Storage IERC20 public immutable token; // token used for staking and rewards address public governance; // address with ability to remove values and slash reporters address public immutable owner; // contract deployer, can call init function once uint256 public accumulatedRewardPerShare; // accumulated staking reward per staked token uint256 public immutable minimumStakeAmount; // minimum amount of tokens required to stake uint256 public immutable reportingLock; // base amount of time before a reporter is able to submit a value again uint256 public rewardRate; // total staking rewards released per second uint256 public stakeAmount; // minimum amount required to be a staker uint256 public immutable stakeAmountDollarTarget; // amount of US dollars required to be a staker uint256 public stakingRewardsBalance; // total amount of staking rewards bytes32 public immutable stakingTokenPriceQueryId; // staking token SpotPrice queryId, used for updating stakeAmount uint256 public constant timeBasedReward = 5e17; // amount of TB rewards released per 5 minutes uint256 public timeOfLastAllocation; // time of last update to accumulatedRewardPerShare uint256 public timeOfLastNewValue = block.timestamp; // time of the last new submitted value, originally set to the block timestamp uint256 public totalRewardDebt; // staking reward debt, used to calculate real staking rewards balance uint256 public totalStakeAmount; // total amount of tokens locked in contract (via stake) uint256 public totalStakers; // total number of stakers with at least stakeAmount staked, not exact uint256 public toWithdraw; //amountLockedForWithdrawal mapping(bytes32 => Report) private reports; // mapping of query IDs to a report mapping(address => StakeInfo) private stakerDetails; // mapping from a persons address to their staking info // Structs struct Report { uint256[] timestamps; // array of all newValueTimestamps reported mapping(uint256 => uint256) timestampIndex; // mapping of timestamps to respective indices mapping(uint256 => bytes) valueByTimestamp; // mapping of timestamps to values mapping(uint256 => address) reporterByTimestamp; // mapping of timestamps to reporters mapping(uint256 => bool) isDisputed; } struct StakeInfo { uint256 startDate; // stake or withdrawal request start date uint256 stakedBalance; // staked token balance uint256 lockedBalance; // amount locked for withdrawal uint256 rewardDebt; // used for staking reward calculation uint256 reporterLastTimestamp; // timestamp of reporter's last reported value uint256 reportsSubmitted; // total number of reports submitted by reporter uint256 startVoteCount; // total number of governance votes when stake deposited uint256 startVoteTally; // staker vote tally when stake deposited bool staked; // used to keep track of total stakers } // Events event NewReport( bytes32 indexed _queryId, uint256 indexed _time, bytes _value, uint256 _nonce, bytes _queryData, address indexed _reporter ); event NewStakeAmount(uint256 _newStakeAmount); event NewStaker(address indexed _staker, uint256 indexed _amount); event ReporterSlashed( address indexed _reporter, address _recipient, uint256 _slashAmount ); event StakeWithdrawn(address _staker); event StakeWithdrawRequested(address _staker, uint256 _amount); event ValueRemoved(bytes32 _queryId, uint256 _timestamp); // Functions /** * @dev Initializes system parameters * @param _token address of token used for staking and rewards * @param _reportingLock base amount of time (seconds) before reporter is able to report again * @param _stakeAmountDollarTarget fixed USD amount that stakeAmount targets on updateStakeAmount * @param _stakingTokenPrice current price of staking token in USD (18 decimals) * @param _stakingTokenPriceQueryId queryId where staking token price is reported */ constructor( address _token, uint256 _reportingLock, uint256 _stakeAmountDollarTarget, uint256 _stakingTokenPrice, uint256 _minimumStakeAmount, bytes32 _stakingTokenPriceQueryId ) { require(_token != address(0), "must set token address"); require(_stakingTokenPrice > 0, "must set staking token price"); require(_reportingLock > 0, "must set reporting lock"); require(_stakingTokenPriceQueryId != bytes32(0), "must set staking token price queryId"); token = IERC20(_token); owner = msg.sender; reportingLock = _reportingLock; stakeAmountDollarTarget = _stakeAmountDollarTarget; minimumStakeAmount = _minimumStakeAmount; uint256 _potentialStakeAmount = (_stakeAmountDollarTarget * 1e18) / _stakingTokenPrice; if(_potentialStakeAmount < _minimumStakeAmount) { stakeAmount = _minimumStakeAmount; } else { stakeAmount = _potentialStakeAmount; } stakingTokenPriceQueryId = _stakingTokenPriceQueryId; } /** * @dev Allows the owner to initialize the governance (flex addy needed for governance deployment) * @param _governanceAddress address of governance contract (github.com/tellor-io/governance) */ function init(address _governanceAddress) external { require(msg.sender == owner, "only owner can set governance address"); require(governance == address(0), "governance address already set"); require( _governanceAddress != address(0), "governance address can't be zero address" ); governance = _governanceAddress; } /** * @dev Funds the Flex contract with staking rewards (paid by autopay and minting) * @param _amount amount of tokens to fund contract with */ function addStakingRewards(uint256 _amount) external { require(token.transferFrom(msg.sender, address(this), _amount)); _updateRewards(); stakingRewardsBalance += _amount; // update reward rate = real staking rewards balance / 30 days rewardRate = (stakingRewardsBalance - ((accumulatedRewardPerShare * totalStakeAmount) / 1e18 - totalRewardDebt)) / 30 days; } /** * @dev Allows a reporter to submit stake * @param _amount amount of tokens to stake */ function depositStake(uint256 _amount) external { require(governance != address(0), "governance address not set"); StakeInfo storage _staker = stakerDetails[msg.sender]; uint256 _stakedBalance = _staker.stakedBalance; uint256 _lockedBalance = _staker.lockedBalance; if (_lockedBalance > 0) { if (_lockedBalance >= _amount) { // if staker's locked balance covers full _amount, use that _staker.lockedBalance -= _amount; toWithdraw -= _amount; } else { // otherwise, stake the whole locked balance and transfer the // remaining amount from the staker's address require( token.transferFrom( msg.sender, address(this), _amount - _lockedBalance ) ); toWithdraw -= _staker.lockedBalance; _staker.lockedBalance = 0; } } else { if (_stakedBalance == 0) { // if staked balance and locked balance equal 0, save current vote tally. // voting participation used for calculating rewards (bool _success, bytes memory _returnData) = governance.call( abi.encodeWithSignature("getVoteCount()") ); if (_success) { _staker.startVoteCount = uint256(abi.decode(_returnData, (uint256))); } (_success,_returnData) = governance.call( abi.encodeWithSignature("getVoteTallyByAddress(address)",msg.sender) ); if(_success){ _staker.startVoteTally = abi.decode(_returnData,(uint256)); } } require(token.transferFrom(msg.sender, address(this), _amount)); } _updateStakeAndPayRewards(msg.sender, _stakedBalance + _amount); _staker.startDate = block.timestamp; // This resets the staker start date to now emit NewStaker(msg.sender, _amount); } /** * @dev Removes a value from the oracle. * Note: this function is only callable by the Governance contract. * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp of the data value to remove */ function removeValue(bytes32 _queryId, uint256 _timestamp) external { require(msg.sender == governance, "caller must be governance address"); Report storage _report = reports[_queryId]; require(!_report.isDisputed[_timestamp], "value already disputed"); uint256 _index = _report.timestampIndex[_timestamp]; require(_timestamp == _report.timestamps[_index], "invalid timestamp"); _report.valueByTimestamp[_timestamp] = ""; _report.isDisputed[_timestamp] = true; emit ValueRemoved(_queryId, _timestamp); } /** * @dev Allows a reporter to request to withdraw their stake * @param _amount amount of staked tokens requesting to withdraw */ function requestStakingWithdraw(uint256 _amount) external { StakeInfo storage _staker = stakerDetails[msg.sender]; require( _staker.stakedBalance >= _amount, "insufficient staked balance" ); _updateStakeAndPayRewards(msg.sender, _staker.stakedBalance - _amount); _staker.startDate = block.timestamp; _staker.lockedBalance += _amount; toWithdraw += _amount; emit StakeWithdrawRequested(msg.sender, _amount); } /** * @dev Slashes a reporter and transfers their stake amount to the given recipient * Note: this function is only callable by the governance address. * @param _reporter is the address of the reporter being slashed * @param _recipient is the address receiving the reporter's stake * @return _slashAmount uint256 amount of token slashed and sent to recipient address */ function slashReporter(address _reporter, address _recipient) external returns (uint256 _slashAmount) { require(msg.sender == governance, "only governance can slash reporter"); StakeInfo storage _staker = stakerDetails[_reporter]; uint256 _stakedBalance = _staker.stakedBalance; uint256 _lockedBalance = _staker.lockedBalance; require(_stakedBalance + _lockedBalance > 0, "zero staker balance"); if (_lockedBalance >= stakeAmount) { // if locked balance is at least stakeAmount, slash from locked balance _slashAmount = stakeAmount; _staker.lockedBalance -= stakeAmount; toWithdraw -= stakeAmount; } else if (_lockedBalance + _stakedBalance >= stakeAmount) { // if locked balance + staked balance is at least stakeAmount, // slash from locked balance and slash remainder from staked balance _slashAmount = stakeAmount; _updateStakeAndPayRewards( _reporter, _stakedBalance - (stakeAmount - _lockedBalance) ); toWithdraw -= _lockedBalance; _staker.lockedBalance = 0; } else { // if sum(locked balance + staked balance) is less than stakeAmount, // slash sum _slashAmount = _stakedBalance + _lockedBalance; toWithdraw -= _lockedBalance; _updateStakeAndPayRewards(_reporter, 0); _staker.lockedBalance = 0; } require(token.transfer(_recipient, _slashAmount)); emit ReporterSlashed(_reporter, _recipient, _slashAmount); } /** * @dev Allows a reporter to submit a value to the oracle * @param _queryId is ID of the specific data feed. Equals keccak256(_queryData) for non-legacy IDs * @param _value is the value the user submits to the oracle * @param _nonce is the current value count for the query id * @param _queryData is the data used to fulfill the data query */ function submitValue( bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes calldata _queryData ) external { require(keccak256(_value) != keccak256(""), "value must be submitted"); Report storage _report = reports[_queryId]; require( _nonce == _report.timestamps.length || _nonce == 0, "nonce must match timestamp index" ); StakeInfo storage _staker = stakerDetails[msg.sender]; require( _staker.stakedBalance >= stakeAmount, "balance must be greater than stake amount" ); // Require reporter to abide by given reporting lock require( (block.timestamp - _staker.reporterLastTimestamp) * 1000 > (reportingLock * 1000) / (_staker.stakedBalance / stakeAmount), "still in reporter time lock, please wait!" ); require( _queryId == keccak256(_queryData), "query id must be hash of query data" ); _staker.reporterLastTimestamp = block.timestamp; // Checks for no double reporting of timestamps require( _report.reporterByTimestamp[block.timestamp] == address(0), "timestamp already reported for" ); // Update number of timestamps, value for given timestamp, and reporter for timestamp _report.timestampIndex[block.timestamp] = _report.timestamps.length; _report.timestamps.push(block.timestamp); _report.valueByTimestamp[block.timestamp] = _value; _report.reporterByTimestamp[block.timestamp] = msg.sender; // Disperse Time Based Reward uint256 _reward = ((block.timestamp - timeOfLastNewValue) * timeBasedReward) / 300; //.5 TRB per 5 minutes uint256 _totalTimeBasedRewardsBalance = token.balanceOf(address(this)) - (totalStakeAmount + stakingRewardsBalance + toWithdraw); if (_totalTimeBasedRewardsBalance > 0 && _reward > 0) { if (_totalTimeBasedRewardsBalance < _reward) { token.transfer(msg.sender, _totalTimeBasedRewardsBalance); } else { token.transfer(msg.sender, _reward); } } // Update last oracle value and number of values submitted by a reporter timeOfLastNewValue = block.timestamp; unchecked{ _staker.reportsSubmitted++; } emit NewReport( _queryId, block.timestamp, _value, _nonce, _queryData, msg.sender ); } /** * @dev Updates the stake amount after retrieving the latest * 12+-hour-old staking token price from the oracle */ function updateStakeAmount() external { // get staking token price (bool _valFound, bytes memory _val, ) = getDataBefore( stakingTokenPriceQueryId, block.timestamp - 12 hours ); if (_valFound) { uint256 _stakingTokenPrice = abi.decode(_val, (uint256)); require( _stakingTokenPrice >= 0.01 ether && _stakingTokenPrice < 1000000 ether, "invalid staking token price" ); uint256 _adjustedStakeAmount = (stakeAmountDollarTarget * 1e18) / _stakingTokenPrice; if(_adjustedStakeAmount < minimumStakeAmount) { stakeAmount = minimumStakeAmount; } else { stakeAmount = _adjustedStakeAmount; } emit NewStakeAmount(stakeAmount); } } /** * @dev Withdraws a reporter's stake after the lock period expires */ function withdrawStake() external { StakeInfo storage _staker = stakerDetails[msg.sender]; // Ensure reporter is locked and that enough time has passed require( block.timestamp - _staker.startDate >= 7 days, "7 days didn't pass" ); require( _staker.lockedBalance > 0, "reporter not locked for withdrawal" ); require(token.transfer(msg.sender, _staker.lockedBalance)); toWithdraw -= _staker.lockedBalance; _staker.lockedBalance = 0; emit StakeWithdrawn(msg.sender); } // ***************************************************************************** // * * // * Getters * // * * // ***************************************************************************** /** * @dev Returns the current value of a data feed given a specific ID * @param _queryId is the ID of the specific data feed * @return _value the latest submitted value for the given queryId */ function getCurrentValue(bytes32 _queryId) external view returns (bytes memory _value) { bool _didGet; (_didGet, _value, ) = getDataBefore(_queryId, block.timestamp + 1); if(!_didGet){revert();} } /** * @dev Retrieves the latest value for the queryId before the specified timestamp * @param _queryId is the queryId to look up the value for * @param _timestamp before which to search for latest value * @return _ifRetrieve bool true if able to retrieve a non-zero value * @return _value the value retrieved * @return _timestampRetrieved the value's timestamp */ function getDataBefore(bytes32 _queryId, uint256 _timestamp) public view returns ( bool _ifRetrieve, bytes memory _value, uint256 _timestampRetrieved ) { (bool _found, uint256 _index) = getIndexForDataBefore( _queryId, _timestamp ); if (!_found) return (false, bytes(""), 0); _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index); _value = retrieveData(_queryId, _timestampRetrieved); return (true, _value, _timestampRetrieved); } /** * @dev Returns governance address * @return address governance */ function getGovernanceAddress() external view returns (address) { return governance; } /** * @dev Counts the number of values that have been submitted for the request. * @param _queryId the id to look up * @return uint256 count of the number of values received for the id */ function getNewValueCountbyQueryId(bytes32 _queryId) public view returns (uint256) { return reports[_queryId].timestamps.length; } /** * @dev Returns the pending staking reward for a given address * @param _stakerAddress staker address to look up * @return _pendingReward - pending reward for given staker */ function getPendingRewardByStaker(address _stakerAddress) external returns (uint256 _pendingReward) { StakeInfo storage _staker = stakerDetails[_stakerAddress]; _pendingReward = (_staker.stakedBalance * _getUpdatedAccumulatedRewardPerShare()) / 1e18 - _staker.rewardDebt; (bool _success, bytes memory _returnData) = governance.call( abi.encodeWithSignature("getVoteCount()") ); uint256 _numberOfVotes; if (_success) { _numberOfVotes = uint256(abi.decode(_returnData, (uint256))) - _staker.startVoteCount; } if (_numberOfVotes > 0) { (_success,_returnData) = governance.call( abi.encodeWithSignature("getVoteTallyByAddress(address)",_stakerAddress) ); if(_success){ _pendingReward = (_pendingReward * (abi.decode(_returnData,(uint256)) - _staker.startVoteTally)) / _numberOfVotes; } } } /** * @dev Returns the real staking rewards balance after accounting for unclaimed rewards * @return uint256 real staking rewards balance */ function getRealStakingRewardsBalance() external view returns (uint256) { uint256 _pendingRewards = (_getUpdatedAccumulatedRewardPerShare() * totalStakeAmount) / 1e18 - totalRewardDebt; return (stakingRewardsBalance - _pendingRewards); } /** * @dev Returns reporter address and whether a value was removed for a given queryId and timestamp * @param _queryId the id to look up * @param _timestamp is the timestamp of the value to look up * @return address reporter who submitted the value * @return bool true if the value was removed */ function getReportDetails(bytes32 _queryId, uint256 _timestamp) external view returns (address, bool) { return (reports[_queryId].reporterByTimestamp[_timestamp], reports[_queryId].isDisputed[_timestamp]); } /** * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp to find a corresponding reporter for * @return address of the reporter who reported the value for the data ID at the given timestamp */ function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (address) { return reports[_queryId].reporterByTimestamp[_timestamp]; } /** * @dev Returns the timestamp of the reporter's last submission * @param _reporter is address of the reporter * @return uint256 timestamp of the reporter's last submission */ function getReporterLastTimestamp(address _reporter) external view returns (uint256) { return stakerDetails[_reporter].reporterLastTimestamp; } /** * @dev Returns the reporting lock time, the amount of time a reporter must wait to submit again * @return uint256 reporting lock time */ function getReportingLock() external view returns (uint256) { return reportingLock; } /** * @dev Returns the number of values submitted by a specific reporter address * @param _reporter is the address of a reporter * @return uint256 the number of values submitted by the given reporter */ function getReportsSubmittedByAddress(address _reporter) external view returns (uint256) { return stakerDetails[_reporter].reportsSubmitted; } /** * @dev Returns amount required to report oracle values * @return uint256 stake amount */ function getStakeAmount() external view returns (uint256) { return stakeAmount; } /** * @dev Returns all information about a staker * @param _stakerAddress address of staker inquiring about * @return uint startDate of staking * @return uint current amount staked * @return uint current amount locked for withdrawal * @return uint reward debt used to calculate staking rewards * @return uint reporter's last reported timestamp * @return uint total number of reports submitted by reporter * @return uint governance vote count when first staked * @return uint number of votes cast by staker when first staked * @return bool whether staker is counted in totalStakers */ function getStakerInfo(address _stakerAddress) external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool ) { StakeInfo storage _staker = stakerDetails[_stakerAddress]; return ( _staker.startDate, _staker.stakedBalance, _staker.lockedBalance, _staker.rewardDebt, _staker.reporterLastTimestamp, _staker.reportsSubmitted, _staker.startVoteCount, _staker.startVoteTally, _staker.staked ); } /** * @dev Returns the timestamp for the last value of any ID from the oracle * @return uint256 timestamp of the last oracle value */ function getTimeOfLastNewValue() external view returns (uint256) { return timeOfLastNewValue; } /** * @dev Gets the timestamp for the value based on their index * @param _queryId is the id to look up * @param _index is the value index to look up * @return uint256 timestamp */ function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index) public view returns (uint256) { return reports[_queryId].timestamps[_index]; } /** * @dev Retrieves latest array index of data before the specified timestamp for the queryId * @param _queryId is the queryId to look up the index for * @param _timestamp is the timestamp before which to search for the latest index * @return _found whether the index was found * @return _index the latest index found before the specified timestamp */ // slither-disable-next-line calls-loop function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp) public view returns (bool _found, uint256 _index) { uint256 _count = getNewValueCountbyQueryId(_queryId); if (_count > 0) { uint256 _middle; uint256 _start = 0; uint256 _end = _count - 1; uint256 _time; //Checking Boundaries to short-circuit the algorithm _time = getTimestampbyQueryIdandIndex(_queryId, _start); if (_time >= _timestamp) return (false, 0); _time = getTimestampbyQueryIdandIndex(_queryId, _end); if (_time < _timestamp) { while(isInDispute(_queryId, _time) && _end > 0) { _end--; _time = getTimestampbyQueryIdandIndex(_queryId, _end); } if(_end == 0 && isInDispute(_queryId, _time)) { return (false, 0); } return (true, _end); } //Since the value is within our boundaries, do a binary search while (true) { _middle = (_end - _start) / 2 + 1 + _start; _time = getTimestampbyQueryIdandIndex(_queryId, _middle); if (_time < _timestamp) { //get immediate next value uint256 _nextTime = getTimestampbyQueryIdandIndex( _queryId, _middle + 1 ); if (_nextTime >= _timestamp) { if(!isInDispute(_queryId, _time)) { // _time is correct return (true, _middle); } else { // iterate backwards until we find a non-disputed value while(isInDispute(_queryId, _time) && _middle > 0) { _middle--; _time = getTimestampbyQueryIdandIndex(_queryId, _middle); } if(_middle == 0 && isInDispute(_queryId, _time)) { return (false, 0); } // _time is correct return (true, _middle); } } else { //look from middle + 1(next value) to end _start = _middle + 1; } } else { uint256 _prevTime = getTimestampbyQueryIdandIndex( _queryId, _middle - 1 ); if (_prevTime < _timestamp) { if(!isInDispute(_queryId, _prevTime)) { // _prevTime is correct return (true, _middle - 1); } else { // iterate backwards until we find a non-disputed value _middle--; while(isInDispute(_queryId, _prevTime) && _middle > 0) { _middle--; _prevTime = getTimestampbyQueryIdandIndex( _queryId, _middle ); } if(_middle == 0 && isInDispute(_queryId, _prevTime)) { return (false, 0); } // _prevtime is correct return (true, _middle); } } else { //look from start to middle -1(prev value) _end = _middle - 1; } } } } return (false, 0); } /** * @dev Returns the index of a reporter timestamp in the timestamp array for a specific data ID * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp to find in the timestamps array * @return uint256 of the index of the reporter timestamp in the array for specific ID */ function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (uint256) { return reports[_queryId].timestampIndex[_timestamp]; } /** * @dev Returns the address of the token used for staking * @return address of the token used for staking */ function getTokenAddress() external view returns (address) { return address(token); } /** * @dev Returns total amount of token staked for reporting * @return uint256 total amount of token staked */ function getTotalStakeAmount() external view returns (uint256) { return totalStakeAmount; } /** * @dev Returns total number of current stakers. Reporters with stakedBalance less than stakeAmount are excluded from this total * @return uint256 total stakers */ function getTotalStakers() external view returns (uint256) { return totalStakers; } /** * @dev Returns total balance of time based rewards in contract * @return uint256 amount of trb */ function getTotalTimeBasedRewardsBalance() external view returns (uint256) { return token.balanceOf(address(this)) - (totalStakeAmount + stakingRewardsBalance + toWithdraw); } /** * @dev Returns whether a given value is disputed * @param _queryId unique ID of the data feed * @param _timestamp timestamp of the value * @return bool whether the value is disputed */ function isInDispute(bytes32 _queryId, uint256 _timestamp) public view returns (bool) { return reports[_queryId].isDisputed[_timestamp]; } /** * @dev Retrieve value from oracle based on timestamp * @param _queryId being requested * @param _timestamp to retrieve data/value from * @return bytes value for timestamp submitted */ function retrieveData(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory) { return reports[_queryId].valueByTimestamp[_timestamp]; } /** * @dev Used during the upgrade process to verify valid Tellor contracts * @return bool value used to verify valid Tellor contracts */ function verify() external pure returns (uint256) { return 9999; } // ***************************************************************************** // * * // * Internal functions * // * * // ***************************************************************************** /** * @dev Updates accumulated staking rewards per staked token */ function _updateRewards() internal { if (timeOfLastAllocation == block.timestamp) { return; } if (totalStakeAmount == 0 || rewardRate == 0) { timeOfLastAllocation = block.timestamp; return; } // calculate accumulated reward per token staked uint256 _newAccumulatedRewardPerShare = accumulatedRewardPerShare + ((block.timestamp - timeOfLastAllocation) * rewardRate * 1e18) / totalStakeAmount; // calculate accumulated reward with _newAccumulatedRewardPerShare uint256 _accumulatedReward = (_newAccumulatedRewardPerShare * totalStakeAmount) / 1e18 - totalRewardDebt; if (_accumulatedReward >= stakingRewardsBalance) { // if staking rewards run out, calculate remaining reward per staked // token and set rewardRate to 0 uint256 _newPendingRewards = stakingRewardsBalance - ((accumulatedRewardPerShare * totalStakeAmount) / 1e18 - totalRewardDebt); accumulatedRewardPerShare += (_newPendingRewards * 1e18) / totalStakeAmount; rewardRate = 0; } else { accumulatedRewardPerShare = _newAccumulatedRewardPerShare; } timeOfLastAllocation = block.timestamp; } /** * @dev Called whenever a user's stake amount changes. First updates staking rewards, * transfers pending rewards to user's address, and finally updates user's stake amount * and other relevant variables. * @param _stakerAddress address of user whose stake is being updated * @param _newStakedBalance new staked balance of user */ function _updateStakeAndPayRewards( address _stakerAddress, uint256 _newStakedBalance ) internal { _updateRewards(); StakeInfo storage _staker = stakerDetails[_stakerAddress]; if (_staker.stakedBalance > 0) { // if address already has a staked balance, calculate and transfer pending rewards uint256 _pendingReward = (_staker.stakedBalance * accumulatedRewardPerShare) / 1e18 - _staker.rewardDebt; // get staker voting participation rate uint256 _numberOfVotes; (bool _success, bytes memory _returnData) = governance.call( abi.encodeWithSignature("getVoteCount()") ); if (_success) { _numberOfVotes = uint256(abi.decode(_returnData, (uint256))) - _staker.startVoteCount; } if (_numberOfVotes > 0) { // staking reward = pending reward * voting participation rate (_success, _returnData) = governance.call( abi.encodeWithSignature("getVoteTallyByAddress(address)",_stakerAddress) ); if(_success){ uint256 _voteTally = abi.decode(_returnData,(uint256)); uint256 _tempPendingReward = (_pendingReward * (_voteTally - _staker.startVoteTally)) / _numberOfVotes; if (_tempPendingReward < _pendingReward) { _pendingReward = _tempPendingReward; } } } stakingRewardsBalance -= _pendingReward; require(token.transfer(msg.sender, _pendingReward)); totalRewardDebt -= _staker.rewardDebt; totalStakeAmount -= _staker.stakedBalance; } _staker.stakedBalance = _newStakedBalance; // Update total stakers if (_staker.stakedBalance >= stakeAmount) { if (_staker.staked == false) { totalStakers++; } _staker.staked = true; } else { if (_staker.staked == true && totalStakers > 0) { totalStakers--; } _staker.staked = false; } // tracks rewards accumulated before stake amount updated _staker.rewardDebt = (_staker.stakedBalance * accumulatedRewardPerShare) / 1e18; totalRewardDebt += _staker.rewardDebt; totalStakeAmount += _staker.stakedBalance; // update reward rate if staking rewards are available // given staker's updated parameters if(rewardRate == 0) { rewardRate = (stakingRewardsBalance - ((accumulatedRewardPerShare * totalStakeAmount) / 1e18 - totalRewardDebt)) / 30 days; } } /** * @dev Internal function retrieves updated accumulatedRewardPerShare * @return uint256 up-to-date accumulated reward per share */ function _getUpdatedAccumulatedRewardPerShare() internal view returns (uint256) { if (totalStakeAmount == 0) { return accumulatedRewardPerShare; } uint256 _newAccumulatedRewardPerShare = accumulatedRewardPerShare + ((block.timestamp - timeOfLastAllocation) * rewardRate * 1e18) / totalStakeAmount; uint256 _accumulatedReward = (_newAccumulatedRewardPerShare * totalStakeAmount) / 1e18 - totalRewardDebt; if (_accumulatedReward >= stakingRewardsBalance) { uint256 _newPendingRewards = stakingRewardsBalance - ((accumulatedRewardPerShare * totalStakeAmount) / 1e18 - totalRewardDebt); _newAccumulatedRewardPerShare = accumulatedRewardPerShare + (_newPendingRewards * 1e18) / totalStakeAmount; } return _newAccumulatedRewardPerShare; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_reportingLock","type":"uint256"},{"internalType":"uint256","name":"_stakeAmountDollarTarget","type":"uint256"},{"internalType":"uint256","name":"_stakingTokenPrice","type":"uint256"},{"internalType":"uint256","name":"_minimumStakeAmount","type":"uint256"},{"internalType":"bytes32","name":"_stakingTokenPriceQueryId","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_value","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":true,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newStakeAmount","type":"uint256"}],"name":"NewStakeAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"NewStaker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_reporter","type":"address"},{"indexed":false,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_slashAmount","type":"uint256"}],"name":"ReporterSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeWithdrawRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"ValueRemoved","type":"event"},{"inputs":[],"name":"accumulatedRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getCurrentValue","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bool","name":"_ifRetrieve","type":"bool"},{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGovernanceAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataBefore","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getNewValueCountbyQueryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerAddress","type":"address"}],"name":"getPendingRewardByStaker","outputs":[{"internalType":"uint256","name":"_pendingReward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRealStakingRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReportDetails","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReporterByTimestamp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getReporterLastTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReportingLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getReportsSubmittedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerAddress","type":"address"}],"name":"getStakerInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeOfLastNewValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getTimestampIndexByTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyQueryIdandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTimeBasedRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governanceAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"removeValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportingLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestStakingWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"slashReporter","outputs":[{"internalType":"uint256","name":"_slashAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeAmountDollarTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingTokenPriceQueryId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"}],"name":"submitValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeBasedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfLastAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfLastNewValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610140604052426006553480156200001657600080fd5b50604051620035803803806200358083398101604081905262000039916200020c565b6001600160a01b038616620000955760405162461bcd60e51b815260206004820152601660248201527f6d7573742073657420746f6b656e20616464726573730000000000000000000060448201526064015b60405180910390fd5b60008311620000e75760405162461bcd60e51b815260206004820152601c60248201527f6d75737420736574207374616b696e6720746f6b656e2070726963650000000060448201526064016200008c565b60008511620001395760405162461bcd60e51b815260206004820152601760248201527f6d75737420736574207265706f7274696e67206c6f636b00000000000000000060448201526064016200008c565b80620001945760405162461bcd60e51b8152602060048201526024808201527f6d75737420736574207374616b696e6720746f6b656e207072696365207175656044820152631c9e525960e21b60648201526084016200008c565b606086811b6001600160601b03191660805233901b60a05260e085905261010084905260c0829052600083620001d386670de0b6b3a76400006200028c565b620001df91906200026b565b905082811015620001f5576003839055620001fb565b60038190555b506101205250620002b89350505050565b60008060008060008060c0878903121562000225578182fd5b86516001600160a01b03811681146200023c578283fd5b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826200028757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615620002b357634e487b7160e01b81526011600452602481fd5b500290565b60805160601c60a05160601c60c05160e05161010051610120516131f46200038c600039600081816108050152610db701526000818161079d0152610e7901526000818161044a015281816104dd015261154601526000818161058701528181610eb40152610edc0152600081816106d201526108d901526000818161087f015281816108ab015281816111220152818161179d015281816118640152818161190a01528181611c9b015281816120eb01528181612360015281816124a601528181612559015261289f01526131f46000f3fe608060405234801561001057600080fd5b50600436106103415760003560e01c806373252494116101bd578063bed9d861116100f9578063ce5e11bf116100a2578063d9c51cd41161007c578063d9c51cd41461082f578063e07c548614610842578063fc0c546a1461087a578063fc735e99146108a157610341565b8063ce5e11bf146107ed578063cecb064714610800578063d75174e11461082757610341565b8063c0f95d52116100d3578063c0f95d52146107bf578063c5958af9146107c7578063cb82cc8f146107da57610341565b8063bed9d8611461077d578063bf5745d614610785578063c0d416b81461079857610341565b80638929f4c61161016657806396426d971161014057806396426d97146106fd5780639d9b16ed1461070c578063a792765f1461073b578063adf1639d1461075d57610341565b80638929f4c6146106ba5780638da5cb5b146106cd57806394409a56146106f457610341565b80637b0a47ee116101975780637b0a47ee1461069f57806383bb3877146106a857806386989038146106b157610341565b806373252494146105c2578063733bdef0146105d357806377b03e0d1461067f57610341565b80633a0ce3421161028c5780635b5edcfc116102355780636b036f451161020f5780636b036f45146105825780636dd0a70f146105a95780636fd4f229146105b1578063722580b6146105ba57610341565b80635b5edcfc146105535780635eaa9ced1461056657806360c7dc471461057957610341565b80634dfc2a34116102665780634dfc2a341461050157806350005b83146105145780635aa6e6751461054057610341565b80633a0ce3421461049157806344e87f9114610499578063460c33a2146104db57610341565b80632e206cd7116102ee578063347f2336116102c8578063347f23361461046c57806336d42195146104755780633878293e1461047e57610341565b80632e206cd71461043457806331ed0db41461043d5780633321fc411461044557610341565b806319ab453c1161031f57806319ab453c1461038a578063294490851461039f5780632b6696a7146103c957610341565b806304d932e21461034657806310fe9ae81461036257806314c2a1bc14610382575b600080fd5b61034f60045481565b6040519081526020015b60405180910390f35b61036a6108a9565b6040516001600160a01b039091168152602001610359565b60085461034f565b61039d610398366004612e66565b6108ce565b005b6103b26103ad366004612f71565b610a3b565b604080519215158352602083019190915201610359565b6104156103d7366004612f71565b6000918252600b60209081526040808420928452600383018252808420546004909301909152909120546001600160a01b039091169160ff90911690565b604080516001600160a01b039093168352901515602083015201610359565b61034f60055481565b60095461034f565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b61034f600a5481565b61034f60015481565b61034f61048c366004612e66565b610d8d565b61039d610daf565b6104cb6104a7366004612f71565b6000918252600b602090815260408084209284526004909201905290205460ff1690565b6040519015158152602001610359565b7f000000000000000000000000000000000000000000000000000000000000000061034f565b61034f61050f366004612e87565b610f4b565b61034f610522366004612e66565b6001600160a01b03166000908152600c602052604090206004015490565b60005461036a906001600160a01b031681565b61039d610561366004612f71565b6111f6565b61039d610574366004612ef1565b6113ca565b61034f60035481565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b61034f6119f2565b61034f60065481565b60035461034f565b6000546001600160a01b031661036a565b6106396105e1366004612e66565b6001600160a01b03166000908152600c6020526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969895979496939592949193909260ff90911690565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e0830152151561010082015261012001610359565b61034f61068d366004612ed9565b6000908152600b602052604090205490565b61034f60025481565b61034f60075481565b61034f60095481565b61039d6106c8366004612ed9565b611a40565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61034f60085481565b61034f6706f05b59d3b2000081565b61034f61071a366004612f71565b6000918252600b602090815260408084209284526001909201905290205490565b61074e610749366004612f71565b611b2c565b6040516103599392919061302c565b61077061076b366004612ed9565b611b8f565b6040516103599190613090565b61039d611bb7565b61034f610793366004612e66565b611d80565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b60065461034f565b6107706107d5366004612f71565b611f7a565b61039d6107e8366004612ed9565b61202b565b61034f6107fb366004612f71565b612431565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b61034f612472565b61039d61083d366004612ed9565b612537565b61036a610850366004612f71565b6000918252600b60209081526040808420928452600390920190529020546001600160a01b031690565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61270f61034f565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109595760405162461bcd60e51b815260206004820152602560248201527f6f6e6c79206f776e65722063616e2073657420676f7665726e616e6365206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6000546001600160a01b0316156109b25760405162461bcd60e51b815260206004820152601e60248201527f676f7665726e616e6365206164647265737320616c72656164792073657400006044820152606401610950565b6001600160a01b038116610a195760405162461bcd60e51b815260206004820152602860248201527f676f7665726e616e636520616464726573732063616e2774206265207a65726f604482015267206164647265737360c01b6064820152608401610950565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600b602052604081205481908015610d7d5760008080610a616001856130fa565b90506000610a6f8984612431565b9050878110610a8957600080965096505050505050610d86565b610a938983612431565b905087811015610b3d575b6000898152600b6020908152604080832084845260040190915290205460ff168015610aca5750600082115b15610aed5781610ad981613141565b925050610ae68983612431565b9050610a9e565b81158015610b1757506000898152600b6020908152604080832084845260040190915290205460ff165b15610b2d57600080965096505050505050610d86565b50600195509350610d8692505050565b826002610b4a82856130fa565b610b5491906130bb565b610b5f9060016130a3565b610b6991906130a3565b9350610b758985612431565b905087811015610c84576000610b908a6107fb8760016130a3565b9050888110610c715760008a8152600b6020908152604080832085845260040190915290205460ff16610bcf5760018597509750505050505050610d86565b60008a8152600b6020908152604080832085845260040190915290205460ff168015610bfb5750600085115b15610c1e5784610c0a81613141565b955050610c178a86612431565b9150610bcf565b84158015610c48575060008a8152600b6020908152604080832085845260040190915290205460ff165b15610c5f5760008097509750505050505050610d86565b60018597509750505050505050610d86565b610c7c8560016130a3565b935050610d78565b6000610c958a6107fb6001886130fa565b905088811015610d695760008a8152600b6020908152604080832084845260040190915290205460ff16610cde576001610ccf81876130fa565b97509750505050505050610d86565b84610ce881613141565b9550505b60008a8152600b6020908152604080832084845260040190915290205460ff168015610d185750600085115b15610d3b5784610d2781613141565b955050610d348a86612431565b9050610cec565b84158015610c48575060008a8152600b6020908152604080832084845260040190915290205460ff16610c48565b610d746001866130fa565b9250505b610b3d565b60008092509250505b9250929050565b6001600160a01b0381166000908152600c60205260409020600501545b919050565b600080610de27f000000000000000000000000000000000000000000000000000000000000000061074961a8c0426130fa565b50915091508115610f4757600081806020019051810190610e039190612f92565b9050662386f26fc100008110158015610e25575069d3c21bcecceda100000081105b610e715760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207374616b696e6720746f6b656e20707269636500000000006044820152606401610950565b600081610ea67f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a76400006130db565b610eb091906130bb565b90507f0000000000000000000000000000000000000000000000000000000000000000811015610f03577f0000000000000000000000000000000000000000000000000000000000000000600355610f09565b60038190555b7f1af37d6aaef3c5ef293c3c63d0ac302f60db7fde22eb9f5e96ebd56992832110600354604051610f3c91815260200190565b60405180910390a150505b5050565b600080546001600160a01b03163314610fb15760405162461bcd60e51b815260206004820152602260248201527f6f6e6c7920676f7665726e616e63652063616e20736c617368207265706f727460448201526132b960f11b6064820152608401610950565b6001600160a01b0383166000908152600c60205260408120600181015460028201549192909190610fe282846130a3565b116110255760405162461bcd60e51b81526020600482015260136024820152727a65726f207374616b65722062616c616e636560681b6044820152606401610950565b600354811061106e57600354935060035483600201600082825461104991906130fa565b9091555050600354600a80546000906110639084906130fa565b909155506110fc9050565b60035461107b83836130a3565b106110c55760035493506110a28661109383876130fa565b61109d90856130fa565b612658565b80600a60008282546110b491906130fa565b9091555050600060028401556110fc565b6110cf81836130a3565b935080600a60008282546110e391906130fa565b909155506110f49050866000612658565b600060028401555b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190612eb9565b6111a757600080fd5b604080516001600160a01b038781168252602082018790528816917f4317784407a22e643706ef000f5c0eea399dea3632613786167ab71c9446e3ac910160405180910390a250505092915050565b6000546001600160a01b0316331461125a5760405162461bcd60e51b815260206004820152602160248201527f63616c6c6572206d75737420626520676f7665726e616e6365206164647265736044820152607360f81b6064820152608401610950565b6000828152600b60209081526040808320848452600481019092529091205460ff16156112c95760405162461bcd60e51b815260206004820152601660248201527f76616c756520616c7265616479206469737075746564000000000000000000006044820152606401610950565b600082815260018201602052604090205481548290829081106112fc57634e487b7160e01b600052603260045260246000fd5b906000526020600020015483146113495760405162461bcd60e51b81526020600482015260116024820152700696e76616c69642074696d657374616d7607c1b6044820152606401610950565b60408051602080820180845260008084528781526002870190925292902090516113739290612d02565b50600083815260048301602052604090819020805460ff19166001179055517fb326db0e54476c677e2b35b75856ac6f4d8bbfb0a6de6690582ebe4dabce0de790610f3c9086908690918252602082015260400190565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47085856040516113fb929190613000565b604051809103902014156114515760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d69747465640000000000000000006044820152606401610950565b6000868152600b60205260409020805484148061146c575083155b6114b85760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610950565b336000908152600c602052604090206003546001820154101561152f5760405162461bcd60e51b815260206004820152602960248201527f62616c616e6365206d7573742062652067726561746572207468616e207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610950565b600354816001015461154191906130bb565b61156d7f00000000000000000000000000000000000000000000000000000000000000006103e86130db565b61157791906130bb565b600482015461158690426130fa565b611592906103e86130db565b116115f15760405162461bcd60e51b815260206004820152602960248201527f7374696c6c20696e207265706f727465722074696d65206c6f636b2c20706c6560448201526861736520776169742160b81b6064820152608401610950565b8383604051611601929190613000565b604051809103902088146116635760405162461bcd60e51b815260206004820152602360248201527f7175657279206964206d7573742062652068617368206f66207175657279206460448201526261746160e81b6064820152608401610950565b426004820181905560009081526003830160205260409020546001600160a01b0316156116d25760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020616c7265616479207265706f7274656420666f7200006044820152606401610950565b81544260008181526001808601602090815260408084208690559185018755868352808320909401839055918152600285019092529020611714908888612d86565b50426000818152600384016020526040812080546001600160a01b03191633179055600654909161012c916706f05b59d3b200009161175391906130fa565b61175d91906130db565b61176791906130bb565b90506000600a5460045460085461177e91906130a3565b61178891906130a3565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156117e757600080fd5b505afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f9190612f92565b61182991906130fa565b905060008111801561183b5750600082115b1561199057818110156118ee5760405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156118b057600080fd5b505af11580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612eb9565b50611990565b60405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401602060405180830381600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198e9190612eb9565b505b42600681905560058401805460010190556040513391908c907f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca95906119de908e908e908e908e908e90613057565b60405180910390a450505050505050505050565b600080600754670de0b6b3a7640000600854611a0c612aab565b611a1691906130db565b611a2091906130bb565b611a2a91906130fa565b905080600454611a3a91906130fa565b91505090565b336000908152600c602052604090206001810154821115611aa35760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610950565b611ab73383836001015461109d91906130fa565b428155600281018054839190600090611ad19084906130a3565b9250508190555081600a6000828254611aea91906130a3565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef910160405180910390a15050565b600060606000806000611b3f8787610a3b565b9150915081611b695760006040518060200160405280600081525060009450945094505050611b88565b611b738782612431565b9250611b7f8784611f7a565b93506001945050505b9250925092565b60606000611ba2836107494260016130a3565b509250905080611bb157600080fd5b50919050565b336000908152600c60205260409020805462093a8090611bd790426130fa565b1015611c1a5760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610950565b6000816002015411611c795760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610950565b600281015460405163a9059cbb60e01b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401602060405180830381600087803b158015611ce757600080fd5b505af1158015611cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1f9190612eb9565b611d2857600080fd5b8060020154600a6000828254611d3e91906130fa565b9091555050600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b6001600160a01b0381166000908152600c602052604081206003810154670de0b6b3a7640000611dae612aab565b8360010154611dbd91906130db565b611dc791906130bb565b611dd191906130fa565b6000805460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b1790529051939550919283926001600160a01b0390921691611e1b91613010565b6000604051808303816000865af19150503d8060008114611e58576040519150601f19603f3d011682016040523d82523d6000602084013e611e5d565b606091505b509150915060008215611e9057836006015482806020019051810190611e839190612f92565b611e8d91906130fa565b90505b8015611f71576000546040516001600160a01b0388811660248301529091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b17905251611ee89190613010565b6000604051808303816000865af19150503d8060008114611f25576040519150601f19603f3d011682016040523d82523d6000602084013e611f2a565b606091505b5090935091508215611f715780846007015483806020019051810190611f509190612f92565b611f5a91906130fa565b611f6490876130db565b611f6e91906130bb565b94505b50505050919050565b6000828152600b602090815260408083208484526002019091529020805460609190611fa590613158565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd190613158565b801561201e5780601f10611ff35761010080835404028352916020019161201e565b820191906000526020600020905b81548152906001019060200180831161200157829003601f168201915b5050505050905092915050565b6000546001600160a01b03166120835760405162461bcd60e51b815260206004820152601a60248201527f676f7665726e616e63652061646472657373206e6f74207365740000000000006044820152606401610950565b336000908152600c602052604090206001810154600282015480156121d4578381106120e157838360020160008282546120bd91906130fa565b9250508190555083600a60008282546120d691906130fa565b909155506121cf9050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd333061211c85896130fa565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561216b57600080fd5b505af115801561217f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a39190612eb9565b6121ac57600080fd5b8260020154600a60008282546121c291906130fa565b9091555050600060028401555b6123ed565b8161233e576000805460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b179052905183926001600160a01b03169161221c91613010565b6000604051808303816000865af19150503d8060008114612259576040519150601f19603f3d011682016040523d82523d6000602084013e61225e565b606091505b50915091508115612283578080602001905181019061227d9190612f92565b60068601555b6000546040513360248201526001600160a01b039091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b179052516122d39190613010565b6000604051808303816000865af19150503d8060008114612310576040519150601f19603f3d011682016040523d82523d6000602084013e612315565b606091505b509092509050811561233b57808060200190518101906123359190612f92565b60078601555b50505b6040516323b872dd60e01b8152336004820152306024820152604481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156123ac57600080fd5b505af11580156123c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e49190612eb9565b6123ed57600080fd5b6123fb3361109d86856130a3565b428355604051849033907fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e59547654364790600090a350505050565b6000828152600b6020526040812080548390811061245f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000600a5460045460085461248791906130a3565b61249191906130a3565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156124f057600080fd5b505afa158015612504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125289190612f92565b61253291906130fa565b905090565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156125a557600080fd5b505af11580156125b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dd9190612eb9565b6125e657600080fd5b6125ee612bbf565b806004600082825461260091906130a3565b9250508190555062278d00600754670de0b6b3a764000060085460015461262791906130db565b61263191906130bb565b61263b91906130fa565b60045461264891906130fa565b61265291906130bb565b60025550565b612660612bbf565b6001600160a01b0382166000908152600c602052604090206001810154156129685760008160030154670de0b6b3a764000060015484600101546126a491906130db565b6126ae91906130bb565b6126b891906130fa565b6000805460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b17905290519394509192839283926001600160a01b0316916127039190613010565b6000604051808303816000865af19150503d8060008114612740576040519150601f19603f3d011682016040523d82523d6000602084013e612745565b606091505b50915091508115612776578460060154818060200190518101906127699190612f92565b61277391906130fa565b92505b821561286c576000546040516001600160a01b0389811660248301529091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b179052516127ce9190613010565b6000604051808303816000865af19150503d806000811461280b576040519150601f19603f3d011682016040523d82523d6000602084013e612810565b606091505b509092509050811561286c576000818060200190518101906128329190612f92565b905060008487600701548361284791906130fa565b61285190886130db565b61285b91906130bb565b905085811015612869578095505b50505b836004600082825461287e91906130fa565b909155505060405163a9059cbb60e01b8152336004820152602481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129239190612eb9565b61292c57600080fd5b84600301546007600082825461294291906130fa565b909155505060018501546008805460009061295e9084906130fa565b9091555050505050505b6001810182905560035482106129ae57600881015460ff1661299a57600980549060006129948361318d565b91905055505b60088101805460ff191660011790556129f1565b600881015460ff16151560011480156129c957506000600954115b156129e457600980549060006129de83613141565b91905055505b60088101805460ff191690555b670de0b6b3a76400006001548260010154612a0c91906130db565b612a1691906130bb565b6003820181905560078054600090612a2f9084906130a3565b9091555050600181015460088054600090612a4b9084906130a3565b9091555050600254612aa65762278d00600754670de0b6b3a7640000600854600154612a7791906130db565b612a8191906130bb565b612a8b91906130fa565b600454612a9891906130fa565b612aa291906130bb565b6002555b505050565b600060085460001415612ac157506001546108cb565b600060085460025460055442612ad791906130fa565b612ae191906130db565b612af390670de0b6b3a76400006130db565b612afd91906130bb565b600154612b0a91906130a3565b90506000600754670de0b6b3a764000060085484612b2891906130db565b612b3291906130bb565b612b3c91906130fa565b90506004548110612bb9576000600754670de0b6b3a7640000600854600154612b6591906130db565b612b6f91906130bb565b612b7991906130fa565b600454612b8691906130fa565b600854909150612b9e82670de0b6b3a76400006130db565b612ba891906130bb565b600154612bb591906130a3565b9250505b50905090565b426005541415612bce57612d00565b6008541580612bdd5750600254155b15612beb5742600555612d00565b600060085460025460055442612c0191906130fa565b612c0b91906130db565b612c1d90670de0b6b3a76400006130db565b612c2791906130bb565b600154612c3491906130a3565b90506000600754670de0b6b3a764000060085484612c5291906130db565b612c5c91906130bb565b612c6691906130fa565b90506004548110612cf3576000600754670de0b6b3a7640000600854600154612c8f91906130db565b612c9991906130bb565b612ca391906130fa565b600454612cb091906130fa565b600854909150612cc882670de0b6b3a76400006130db565b612cd291906130bb565b60016000828254612ce391906130a3565b9091555050600060025550612cf9565b60018290555b5050426005555b565b828054612d0e90613158565b90600052602060002090601f016020900481019282612d305760008555612d76565b82601f10612d4957805160ff1916838001178555612d76565b82800160010185558215612d76579182015b82811115612d76578251825591602001919060010190612d5b565b50612d82929150612dfa565b5090565b828054612d9290613158565b90600052602060002090601f016020900481019282612db45760008555612d76565b82601f10612dcd5782800160ff19823516178555612d76565b82800160010185558215612d76579182015b82811115612d76578235825591602001919060010190612ddf565b5b80821115612d825760008155600101612dfb565b80356001600160a01b0381168114610daa57600080fd5b60008083601f840112612e37578182fd5b50813567ffffffffffffffff811115612e4e578182fd5b602083019150836020828501011115610d8657600080fd5b600060208284031215612e77578081fd5b612e8082612e0f565b9392505050565b60008060408385031215612e99578081fd5b612ea283612e0f565b9150612eb060208401612e0f565b90509250929050565b600060208284031215612eca578081fd5b81518015158114612e80578182fd5b600060208284031215612eea578081fd5b5035919050565b60008060008060008060808789031215612f09578182fd5b86359550602087013567ffffffffffffffff80821115612f27578384fd5b612f338a838b01612e26565b9097509550604089013594506060890135915080821115612f52578384fd5b50612f5f89828a01612e26565b979a9699509497509295939492505050565b60008060408385031215612f83578182fd5b50508035926020909101359150565b600060208284031215612fa3578081fd5b5051919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612fec816020860160208601613111565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251613022818460208701613111565b9190910192915050565b60008415158252606060208301526130476060830185612fd4565b9050826040830152949350505050565b60006060825261306b606083018789612faa565b8560208401528281036040840152613084818587612faa565b98975050505050505050565b600060208252612e806020830184612fd4565b600082198211156130b6576130b66131a8565b500190565b6000826130d657634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156130f5576130f56131a8565b500290565b60008282101561310c5761310c6131a8565b500390565b60005b8381101561312c578181015183820152602001613114565b8381111561313b576000848401525b50505050565b600081613150576131506131a8565b506000190190565b600181811c9082168061316c57607f821691505b60208210811415611bb157634e487b7160e01b600052602260045260246000fd5b60006000198214156131a1576131a16131a8565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212204d04a6a545bc4bdeecb3a12a978d0a416164adc4c7de1063c71ee786fd702f4a64736f6c63430008030033000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb888000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000000000000000000000000000821ab0d4414980000000000000000000000000000000000000000000000000005f68e8131ecf800000000000000000000000000000000000000000000000000008ac7230489e800005c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded0Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103415760003560e01c806373252494116101bd578063bed9d861116100f9578063ce5e11bf116100a2578063d9c51cd41161007c578063d9c51cd41461082f578063e07c548614610842578063fc0c546a1461087a578063fc735e99146108a157610341565b8063ce5e11bf146107ed578063cecb064714610800578063d75174e11461082757610341565b8063c0f95d52116100d3578063c0f95d52146107bf578063c5958af9146107c7578063cb82cc8f146107da57610341565b8063bed9d8611461077d578063bf5745d614610785578063c0d416b81461079857610341565b80638929f4c61161016657806396426d971161014057806396426d97146106fd5780639d9b16ed1461070c578063a792765f1461073b578063adf1639d1461075d57610341565b80638929f4c6146106ba5780638da5cb5b146106cd57806394409a56146106f457610341565b80637b0a47ee116101975780637b0a47ee1461069f57806383bb3877146106a857806386989038146106b157610341565b806373252494146105c2578063733bdef0146105d357806377b03e0d1461067f57610341565b80633a0ce3421161028c5780635b5edcfc116102355780636b036f451161020f5780636b036f45146105825780636dd0a70f146105a95780636fd4f229146105b1578063722580b6146105ba57610341565b80635b5edcfc146105535780635eaa9ced1461056657806360c7dc471461057957610341565b80634dfc2a34116102665780634dfc2a341461050157806350005b83146105145780635aa6e6751461054057610341565b80633a0ce3421461049157806344e87f9114610499578063460c33a2146104db57610341565b80632e206cd7116102ee578063347f2336116102c8578063347f23361461046c57806336d42195146104755780633878293e1461047e57610341565b80632e206cd71461043457806331ed0db41461043d5780633321fc411461044557610341565b806319ab453c1161031f57806319ab453c1461038a578063294490851461039f5780632b6696a7146103c957610341565b806304d932e21461034657806310fe9ae81461036257806314c2a1bc14610382575b600080fd5b61034f60045481565b6040519081526020015b60405180910390f35b61036a6108a9565b6040516001600160a01b039091168152602001610359565b60085461034f565b61039d610398366004612e66565b6108ce565b005b6103b26103ad366004612f71565b610a3b565b604080519215158352602083019190915201610359565b6104156103d7366004612f71565b6000918252600b60209081526040808420928452600383018252808420546004909301909152909120546001600160a01b039091169160ff90911690565b604080516001600160a01b039093168352901515602083015201610359565b61034f60055481565b60095461034f565b61034f7f000000000000000000000000000000000000000000000000000000000000a8c081565b61034f600a5481565b61034f60015481565b61034f61048c366004612e66565b610d8d565b61039d610daf565b6104cb6104a7366004612f71565b6000918252600b602090815260408084209284526004909201905290205460ff1690565b6040519015158152602001610359565b7f000000000000000000000000000000000000000000000000000000000000a8c061034f565b61034f61050f366004612e87565b610f4b565b61034f610522366004612e66565b6001600160a01b03166000908152600c602052604090206004015490565b60005461036a906001600160a01b031681565b61039d610561366004612f71565b6111f6565b61039d610574366004612ef1565b6113ca565b61034f60035481565b61034f7f0000000000000000000000000000000000000000000000008ac7230489e8000081565b61034f6119f2565b61034f60065481565b60035461034f565b6000546001600160a01b031661036a565b6106396105e1366004612e66565b6001600160a01b03166000908152600c6020526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969895979496939592949193909260ff90911690565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e0830152151561010082015261012001610359565b61034f61068d366004612ed9565b6000908152600b602052604090205490565b61034f60025481565b61034f60075481565b61034f60095481565b61039d6106c8366004612ed9565b611a40565b61036a7f0000000000000000000000004c206bcd0cf70c22428efd55f321d62a062d3d3581565b61034f60085481565b61034f6706f05b59d3b2000081565b61034f61071a366004612f71565b6000918252600b602090815260408084209284526001909201905290205490565b61074e610749366004612f71565b611b2c565b6040516103599392919061302c565b61077061076b366004612ed9565b611b8f565b6040516103599190613090565b61039d611bb7565b61034f610793366004612e66565b611d80565b61034f7f00000000000000000000000000000000000000000000000821ab0d441498000081565b60065461034f565b6107706107d5366004612f71565b611f7a565b61039d6107e8366004612ed9565b61202b565b61034f6107fb366004612f71565b612431565b61034f7f5c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded081565b61034f612472565b61039d61083d366004612ed9565b612537565b61036a610850366004612f71565b6000918252600b60209081526040808420928452600390920190529020546001600160a01b031690565b61036a7f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb88881565b61270f61034f565b7f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8885b90565b336001600160a01b037f0000000000000000000000004c206bcd0cf70c22428efd55f321d62a062d3d3516146109595760405162461bcd60e51b815260206004820152602560248201527f6f6e6c79206f776e65722063616e2073657420676f7665726e616e6365206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6000546001600160a01b0316156109b25760405162461bcd60e51b815260206004820152601e60248201527f676f7665726e616e6365206164647265737320616c72656164792073657400006044820152606401610950565b6001600160a01b038116610a195760405162461bcd60e51b815260206004820152602860248201527f676f7665726e616e636520616464726573732063616e2774206265207a65726f604482015267206164647265737360c01b6064820152608401610950565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600b602052604081205481908015610d7d5760008080610a616001856130fa565b90506000610a6f8984612431565b9050878110610a8957600080965096505050505050610d86565b610a938983612431565b905087811015610b3d575b6000898152600b6020908152604080832084845260040190915290205460ff168015610aca5750600082115b15610aed5781610ad981613141565b925050610ae68983612431565b9050610a9e565b81158015610b1757506000898152600b6020908152604080832084845260040190915290205460ff165b15610b2d57600080965096505050505050610d86565b50600195509350610d8692505050565b826002610b4a82856130fa565b610b5491906130bb565b610b5f9060016130a3565b610b6991906130a3565b9350610b758985612431565b905087811015610c84576000610b908a6107fb8760016130a3565b9050888110610c715760008a8152600b6020908152604080832085845260040190915290205460ff16610bcf5760018597509750505050505050610d86565b60008a8152600b6020908152604080832085845260040190915290205460ff168015610bfb5750600085115b15610c1e5784610c0a81613141565b955050610c178a86612431565b9150610bcf565b84158015610c48575060008a8152600b6020908152604080832085845260040190915290205460ff165b15610c5f5760008097509750505050505050610d86565b60018597509750505050505050610d86565b610c7c8560016130a3565b935050610d78565b6000610c958a6107fb6001886130fa565b905088811015610d695760008a8152600b6020908152604080832084845260040190915290205460ff16610cde576001610ccf81876130fa565b97509750505050505050610d86565b84610ce881613141565b9550505b60008a8152600b6020908152604080832084845260040190915290205460ff168015610d185750600085115b15610d3b5784610d2781613141565b955050610d348a86612431565b9050610cec565b84158015610c48575060008a8152600b6020908152604080832084845260040190915290205460ff16610c48565b610d746001866130fa565b9250505b610b3d565b60008092509250505b9250929050565b6001600160a01b0381166000908152600c60205260409020600501545b919050565b600080610de27f5c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded061074961a8c0426130fa565b50915091508115610f4757600081806020019051810190610e039190612f92565b9050662386f26fc100008110158015610e25575069d3c21bcecceda100000081105b610e715760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207374616b696e6720746f6b656e20707269636500000000006044820152606401610950565b600081610ea67f00000000000000000000000000000000000000000000000821ab0d4414980000670de0b6b3a76400006130db565b610eb091906130bb565b90507f0000000000000000000000000000000000000000000000008ac7230489e80000811015610f03577f0000000000000000000000000000000000000000000000008ac7230489e80000600355610f09565b60038190555b7f1af37d6aaef3c5ef293c3c63d0ac302f60db7fde22eb9f5e96ebd56992832110600354604051610f3c91815260200190565b60405180910390a150505b5050565b600080546001600160a01b03163314610fb15760405162461bcd60e51b815260206004820152602260248201527f6f6e6c7920676f7665726e616e63652063616e20736c617368207265706f727460448201526132b960f11b6064820152608401610950565b6001600160a01b0383166000908152600c60205260408120600181015460028201549192909190610fe282846130a3565b116110255760405162461bcd60e51b81526020600482015260136024820152727a65726f207374616b65722062616c616e636560681b6044820152606401610950565b600354811061106e57600354935060035483600201600082825461104991906130fa565b9091555050600354600a80546000906110639084906130fa565b909155506110fc9050565b60035461107b83836130a3565b106110c55760035493506110a28661109383876130fa565b61109d90856130fa565b612658565b80600a60008282546110b491906130fa565b9091555050600060028401556110fc565b6110cf81836130a3565b935080600a60008282546110e391906130fa565b909155506110f49050866000612658565b600060028401555b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb888169063a9059cbb90604401602060405180830381600087803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119e9190612eb9565b6111a757600080fd5b604080516001600160a01b038781168252602082018790528816917f4317784407a22e643706ef000f5c0eea399dea3632613786167ab71c9446e3ac910160405180910390a250505092915050565b6000546001600160a01b0316331461125a5760405162461bcd60e51b815260206004820152602160248201527f63616c6c6572206d75737420626520676f7665726e616e6365206164647265736044820152607360f81b6064820152608401610950565b6000828152600b60209081526040808320848452600481019092529091205460ff16156112c95760405162461bcd60e51b815260206004820152601660248201527f76616c756520616c7265616479206469737075746564000000000000000000006044820152606401610950565b600082815260018201602052604090205481548290829081106112fc57634e487b7160e01b600052603260045260246000fd5b906000526020600020015483146113495760405162461bcd60e51b81526020600482015260116024820152700696e76616c69642074696d657374616d7607c1b6044820152606401610950565b60408051602080820180845260008084528781526002870190925292902090516113739290612d02565b50600083815260048301602052604090819020805460ff19166001179055517fb326db0e54476c677e2b35b75856ac6f4d8bbfb0a6de6690582ebe4dabce0de790610f3c9086908690918252602082015260400190565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47085856040516113fb929190613000565b604051809103902014156114515760405162461bcd60e51b815260206004820152601760248201527f76616c7565206d757374206265207375626d69747465640000000000000000006044820152606401610950565b6000868152600b60205260409020805484148061146c575083155b6114b85760405162461bcd60e51b815260206004820181905260248201527f6e6f6e6365206d757374206d617463682074696d657374616d7020696e6465786044820152606401610950565b336000908152600c602052604090206003546001820154101561152f5760405162461bcd60e51b815260206004820152602960248201527f62616c616e6365206d7573742062652067726561746572207468616e207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610950565b600354816001015461154191906130bb565b61156d7f000000000000000000000000000000000000000000000000000000000000a8c06103e86130db565b61157791906130bb565b600482015461158690426130fa565b611592906103e86130db565b116115f15760405162461bcd60e51b815260206004820152602960248201527f7374696c6c20696e207265706f727465722074696d65206c6f636b2c20706c6560448201526861736520776169742160b81b6064820152608401610950565b8383604051611601929190613000565b604051809103902088146116635760405162461bcd60e51b815260206004820152602360248201527f7175657279206964206d7573742062652068617368206f66207175657279206460448201526261746160e81b6064820152608401610950565b426004820181905560009081526003830160205260409020546001600160a01b0316156116d25760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020616c7265616479207265706f7274656420666f7200006044820152606401610950565b81544260008181526001808601602090815260408084208690559185018755868352808320909401839055918152600285019092529020611714908888612d86565b50426000818152600384016020526040812080546001600160a01b03191633179055600654909161012c916706f05b59d3b200009161175391906130fa565b61175d91906130db565b61176791906130bb565b90506000600a5460045460085461177e91906130a3565b61178891906130a3565b6040516370a0823160e01b81523060048201527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b0316906370a082319060240160206040518083038186803b1580156117e757600080fd5b505afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f9190612f92565b61182991906130fa565b905060008111801561183b5750600082115b1561199057818110156118ee5760405163a9059cbb60e01b8152336004820152602481018290527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156118b057600080fd5b505af11580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612eb9565b50611990565b60405163a9059cbb60e01b8152336004820152602481018390527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b03169063a9059cbb90604401602060405180830381600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198e9190612eb9565b505b42600681905560058401805460010190556040513391908c907f48e9e2c732ba278de6ac88a3a57a5c5ba13d3d8370e709b3b98333a57876ca95906119de908e908e908e908e908e90613057565b60405180910390a450505050505050505050565b600080600754670de0b6b3a7640000600854611a0c612aab565b611a1691906130db565b611a2091906130bb565b611a2a91906130fa565b905080600454611a3a91906130fa565b91505090565b336000908152600c602052604090206001810154821115611aa35760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610950565b611ab73383836001015461109d91906130fa565b428155600281018054839190600090611ad19084906130a3565b9250508190555081600a6000828254611aea91906130a3565b909155505060408051338152602081018490527f3d8d9df4bd0172df32e557fa48e96435cd7f2cac06aaffacfaee608e6f7898ef910160405180910390a15050565b600060606000806000611b3f8787610a3b565b9150915081611b695760006040518060200160405280600081525060009450945094505050611b88565b611b738782612431565b9250611b7f8784611f7a565b93506001945050505b9250925092565b60606000611ba2836107494260016130a3565b509250905080611bb157600080fd5b50919050565b336000908152600c60205260409020805462093a8090611bd790426130fa565b1015611c1a5760405162461bcd60e51b8152602060048201526012602482015271372064617973206469646e2774207061737360701b6044820152606401610950565b6000816002015411611c795760405162461bcd60e51b815260206004820152602260248201527f7265706f72746572206e6f74206c6f636b656420666f72207769746864726177604482015261185b60f21b6064820152608401610950565b600281015460405163a9059cbb60e01b815233600482015260248101919091527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b03169063a9059cbb90604401602060405180830381600087803b158015611ce757600080fd5b505af1158015611cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1f9190612eb9565b611d2857600080fd5b8060020154600a6000828254611d3e91906130fa565b9091555050600060028201556040513381527f4a7934670bd8304e7da22378be1368f7c4fef17c5aee81804beda8638fe428ec9060200160405180910390a150565b6001600160a01b0381166000908152600c602052604081206003810154670de0b6b3a7640000611dae612aab565b8360010154611dbd91906130db565b611dc791906130bb565b611dd191906130fa565b6000805460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b1790529051939550919283926001600160a01b0390921691611e1b91613010565b6000604051808303816000865af19150503d8060008114611e58576040519150601f19603f3d011682016040523d82523d6000602084013e611e5d565b606091505b509150915060008215611e9057836006015482806020019051810190611e839190612f92565b611e8d91906130fa565b90505b8015611f71576000546040516001600160a01b0388811660248301529091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b17905251611ee89190613010565b6000604051808303816000865af19150503d8060008114611f25576040519150601f19603f3d011682016040523d82523d6000602084013e611f2a565b606091505b5090935091508215611f715780846007015483806020019051810190611f509190612f92565b611f5a91906130fa565b611f6490876130db565b611f6e91906130bb565b94505b50505050919050565b6000828152600b602090815260408083208484526002019091529020805460609190611fa590613158565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd190613158565b801561201e5780601f10611ff35761010080835404028352916020019161201e565b820191906000526020600020905b81548152906001019060200180831161200157829003601f168201915b5050505050905092915050565b6000546001600160a01b03166120835760405162461bcd60e51b815260206004820152601a60248201527f676f7665726e616e63652061646472657373206e6f74207365740000000000006044820152606401610950565b336000908152600c602052604090206001810154600282015480156121d4578381106120e157838360020160008282546120bd91906130fa565b9250508190555083600a60008282546120d691906130fa565b909155506121cf9050565b6001600160a01b037f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb888166323b872dd333061211c85896130fa565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561216b57600080fd5b505af115801561217f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a39190612eb9565b6121ac57600080fd5b8260020154600a60008282546121c291906130fa565b9091555050600060028401555b6123ed565b8161233e576000805460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b179052905183926001600160a01b03169161221c91613010565b6000604051808303816000865af19150503d8060008114612259576040519150601f19603f3d011682016040523d82523d6000602084013e61225e565b606091505b50915091508115612283578080602001905181019061227d9190612f92565b60068601555b6000546040513360248201526001600160a01b039091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b179052516122d39190613010565b6000604051808303816000865af19150503d8060008114612310576040519150601f19603f3d011682016040523d82523d6000602084013e612315565b606091505b509092509050811561233b57808060200190518101906123359190612f92565b60078601555b50505b6040516323b872dd60e01b8152336004820152306024820152604481018590527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156123ac57600080fd5b505af11580156123c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e49190612eb9565b6123ed57600080fd5b6123fb3361109d86856130a3565b428355604051849033907fa96c2cce65119a2170d1711a6e82f18f2006448828483ba7545e59547654364790600090a350505050565b6000828152600b6020526040812080548390811061245f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000600a5460045460085461248791906130a3565b61249191906130a3565b6040516370a0823160e01b81523060048201527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b0316906370a082319060240160206040518083038186803b1580156124f057600080fd5b505afa158015612504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125289190612f92565b61253291906130fa565b905090565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156125a557600080fd5b505af11580156125b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dd9190612eb9565b6125e657600080fd5b6125ee612bbf565b806004600082825461260091906130a3565b9250508190555062278d00600754670de0b6b3a764000060085460015461262791906130db565b61263191906130bb565b61263b91906130fa565b60045461264891906130fa565b61265291906130bb565b60025550565b612660612bbf565b6001600160a01b0382166000908152600c602052604090206001810154156129685760008160030154670de0b6b3a764000060015484600101546126a491906130db565b6126ae91906130bb565b6126b891906130fa565b6000805460408051600481526024810182526020810180516001600160e01b03166339ecce1f60e21b17905290519394509192839283926001600160a01b0316916127039190613010565b6000604051808303816000865af19150503d8060008114612740576040519150601f19603f3d011682016040523d82523d6000602084013e612745565b606091505b50915091508115612776578460060154818060200190518101906127699190612f92565b61277391906130fa565b92505b821561286c576000546040516001600160a01b0389811660248301529091169060440160408051601f198184030181529181526020820180516001600160e01b03166317b8fb3b60e31b179052516127ce9190613010565b6000604051808303816000865af19150503d806000811461280b576040519150601f19603f3d011682016040523d82523d6000602084013e612810565b606091505b509092509050811561286c576000818060200190518101906128329190612f92565b905060008487600701548361284791906130fa565b61285190886130db565b61285b91906130bb565b905085811015612869578095505b50505b836004600082825461287e91906130fa565b909155505060405163a9059cbb60e01b8152336004820152602481018590527f000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb8886001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129239190612eb9565b61292c57600080fd5b84600301546007600082825461294291906130fa565b909155505060018501546008805460009061295e9084906130fa565b9091555050505050505b6001810182905560035482106129ae57600881015460ff1661299a57600980549060006129948361318d565b91905055505b60088101805460ff191660011790556129f1565b600881015460ff16151560011480156129c957506000600954115b156129e457600980549060006129de83613141565b91905055505b60088101805460ff191690555b670de0b6b3a76400006001548260010154612a0c91906130db565b612a1691906130bb565b6003820181905560078054600090612a2f9084906130a3565b9091555050600181015460088054600090612a4b9084906130a3565b9091555050600254612aa65762278d00600754670de0b6b3a7640000600854600154612a7791906130db565b612a8191906130bb565b612a8b91906130fa565b600454612a9891906130fa565b612aa291906130bb565b6002555b505050565b600060085460001415612ac157506001546108cb565b600060085460025460055442612ad791906130fa565b612ae191906130db565b612af390670de0b6b3a76400006130db565b612afd91906130bb565b600154612b0a91906130a3565b90506000600754670de0b6b3a764000060085484612b2891906130db565b612b3291906130bb565b612b3c91906130fa565b90506004548110612bb9576000600754670de0b6b3a7640000600854600154612b6591906130db565b612b6f91906130bb565b612b7991906130fa565b600454612b8691906130fa565b600854909150612b9e82670de0b6b3a76400006130db565b612ba891906130bb565b600154612bb591906130a3565b9250505b50905090565b426005541415612bce57612d00565b6008541580612bdd5750600254155b15612beb5742600555612d00565b600060085460025460055442612c0191906130fa565b612c0b91906130db565b612c1d90670de0b6b3a76400006130db565b612c2791906130bb565b600154612c3491906130a3565b90506000600754670de0b6b3a764000060085484612c5291906130db565b612c5c91906130bb565b612c6691906130fa565b90506004548110612cf3576000600754670de0b6b3a7640000600854600154612c8f91906130db565b612c9991906130bb565b612ca391906130fa565b600454612cb091906130fa565b600854909150612cc882670de0b6b3a76400006130db565b612cd291906130bb565b60016000828254612ce391906130a3565b9091555050600060025550612cf9565b60018290555b5050426005555b565b828054612d0e90613158565b90600052602060002090601f016020900481019282612d305760008555612d76565b82601f10612d4957805160ff1916838001178555612d76565b82800160010185558215612d76579182015b82811115612d76578251825591602001919060010190612d5b565b50612d82929150612dfa565b5090565b828054612d9290613158565b90600052602060002090601f016020900481019282612db45760008555612d76565b82601f10612dcd5782800160ff19823516178555612d76565b82800160010185558215612d76579182015b82811115612d76578235825591602001919060010190612ddf565b5b80821115612d825760008155600101612dfb565b80356001600160a01b0381168114610daa57600080fd5b60008083601f840112612e37578182fd5b50813567ffffffffffffffff811115612e4e578182fd5b602083019150836020828501011115610d8657600080fd5b600060208284031215612e77578081fd5b612e8082612e0f565b9392505050565b60008060408385031215612e99578081fd5b612ea283612e0f565b9150612eb060208401612e0f565b90509250929050565b600060208284031215612eca578081fd5b81518015158114612e80578182fd5b600060208284031215612eea578081fd5b5035919050565b60008060008060008060808789031215612f09578182fd5b86359550602087013567ffffffffffffffff80821115612f27578384fd5b612f338a838b01612e26565b9097509550604089013594506060890135915080821115612f52578384fd5b50612f5f89828a01612e26565b979a9699509497509295939492505050565b60008060408385031215612f83578182fd5b50508035926020909101359150565b600060208284031215612fa3578081fd5b5051919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612fec816020860160208601613111565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251613022818460208701613111565b9190910192915050565b60008415158252606060208301526130476060830185612fd4565b9050826040830152949350505050565b60006060825261306b606083018789612faa565b8560208401528281036040840152613084818587612faa565b98975050505050505050565b600060208252612e806020830184612fd4565b600082198211156130b6576130b66131a8565b500190565b6000826130d657634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156130f5576130f56131a8565b500290565b60008282101561310c5761310c6131a8565b500390565b60005b8381101561312c578181015183820152602001613114565b8381111561313b576000848401525b50505050565b600081613150576131506131a8565b506000190190565b600181811c9082168061316c57607f821691505b60208210811415611bb157634e487b7160e01b600052602260045260246000fd5b60006000198214156131a1576131a16131a8565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212204d04a6a545bc4bdeecb3a12a978d0a416164adc4c7de1063c71ee786fd702f4a64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb888000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000000000000000000000000000821ab0d4414980000000000000000000000000000000000000000000000000005f68e8131ecf800000000000000000000000000000000000000000000000000008ac7230489e800005c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded0
-----Decoded View---------------
Arg [0] : _token (address): 0xaf8cA653Fa2772d58f4368B0a71980e9E3cEB888
Arg [1] : _reportingLock (uint256): 43200
Arg [2] : _stakeAmountDollarTarget (uint256): 150000000000000000000
Arg [3] : _stakingTokenPrice (uint256): 110000000000000000000
Arg [4] : _minimumStakeAmount (uint256): 10000000000000000000
Arg [5] : _stakingTokenPriceQueryId (bytes32): 0x5c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded0
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000af8ca653fa2772d58f4368b0a71980e9e3ceb888
Arg [1] : 000000000000000000000000000000000000000000000000000000000000a8c0
Arg [2] : 00000000000000000000000000000000000000000000000821ab0d4414980000
Arg [3] : 000000000000000000000000000000000000000000000005f68e8131ecf80000
Arg [4] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [5] : 5c13cd9c97dbb98f2429c101a2a8150e6c7a0ddaff6124ee176a3a411067ded0Deployed Bytecode Sourcemap
768:40368:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1628:36;;;;;;;;;6429:25:1;;;6417:2;6402:18;1628:36:0;;;;;;;;32430:99;;;:::i;:::-;;;-1:-1:-1;;;;;4370:55:1;;;4352:74;;4340:2;4325:18;32430:99:0;4307:125:1;32672:105:0;32753:16;;32672:105;;6388:392;;;;;;:::i;:::-;;:::i;:::-;;27656:4071;;;;;;:::i;:::-;;:::i;:::-;;;;6213:14:1;;6206:22;6188:41;;6260:2;6245:18;;6238:34;;;;6161:18;27656:4071:0;6143:135:1;22957:253:0;;;;;;:::i;:::-;23071:7;23110:17;;;:7;:17;;;;;;;;:49;;;:37;;;:49;;;;;;23161:28;;;;:40;;;;;;;-1:-1:-1;;;;;23110:49:0;;;;23161:40;;;;;22957:253;;;;;-1:-1:-1;;;;;5026:55:1;;;5008:74;;5125:14;;5118:22;5113:2;5098:18;;5091:50;4981:18;22957:253:0;4963:184:1;1928:35:0;;;;;;32975:97;33052:12;;32975:97;;1255:38;;;;;2467:25;;;;;;1065:40;;;;;;24702:188;;;;;;:::i;:::-;;:::i;16664:869::-;;;:::i;33626:184::-;;;;;;:::i;:::-;33733:4;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;;;:40;;;;;;;;33626:184;;;;5619:14:1;;5612:22;5594:41;;5582:2;5567:18;33626:184:0;5549:92:1;24363:99:0;24441:13;24363:99;;11726:1697;;;;;;:::i;:::-;;:::i;24002:189::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24137:24:0;24105:7;24137:24;;;:13;:24;;;;;:46;;;;24002:189;885:25;;;;;-1:-1:-1;;;;;885:25:0;;;10054:580;;;;;;:::i;:::-;;:::i;13818:2697::-;;;;;;:::i;:::-;;:::i;1450:26::-;;;;;;1159:43;;;;;22311:299;;;:::i;2022:51::-;;;;;;25014:95;25090:11;;25014:95;;20299:100;20354:7;20381:10;-1:-1:-1;;;;;20381:10:0;20299:100;;25778:736;;;;;;:::i;:::-;-1:-1:-1;;;;;26125:29:0;25889:7;26125:29;;;:13;:29;;;;;26187:17;;26219:21;;;;26255;;;;26291:18;;;;26324:29;;;;26368:24;;;;26407:22;;;;26444;;;;26481:14;;;;;26187:17;;26219:21;;26255;;26291:18;;26324:29;;26368:24;;26407:22;;26481:14;;;;;25778:736;;;;;15375:25:1;;;15431:2;15416:18;;15409:34;;;;15459:18;;;15452:34;;;;15517:2;15502:18;;15495:34;;;;15560:3;15545:19;;15538:35;;;;15604:3;15589:19;;15582:35;15648:3;15633:19;;15626:35;15692:3;15677:19;;15670:35;15749:14;15742:22;15736:3;15721:19;;15714:51;15362:3;15347:19;25778:736:0;15329:442:1;20624:176:0;;;;;;:::i;:::-;20725:7;20757:17;;;:7;:17;;;;;:35;;20624:176;1373:25;;;;;;2159:30;;;;;;2362:27;;;;;;10796:511;;;;;;:::i;:::-;;:::i;978:30::-;;;;;2267:31;;;;;;1828:46;;1870:4;1828:46;;32077:210;;;;;;:::i;:::-;32203:7;32235:17;;;:7;:17;;;;;;;;:44;;;:32;;;;:44;;;;;;32077:210;19587:611;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;18908:260::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17631:613::-;;;:::i;21015:1124::-;;;;;;:::i;:::-;;:::i;1525:48::-;;;;;26679:109;26762:18;;26679:109;;34041:199;;;;;;:::i;:::-;;:::i;7573:2209::-;;;;;;:::i;:::-;;:::i;27012:197::-;;;;;;:::i;:::-;;:::i;1706:49::-;;;;;33205:189;;;:::i;6956:495::-;;;;;;:::i;:::-;;:::i;23578:209::-;;;;;;:::i;:::-;23698:7;23730:17;;;:7;:17;;;;;;;;:49;;;:37;;;;:49;;;;;-1:-1:-1;;;;;23730:49:0;;23578:209;811:29;;;;;34409:80;34477:4;34409:80;;32430:99;32515:5;32430:99;;:::o;6388:392::-;6458:10;-1:-1:-1;;;;;6472:5:0;6458:19;;6450:69;;;;-1:-1:-1;;;6450:69:0;;10870:2:1;6450:69:0;;;10852:21:1;10909:2;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;-1:-1:-1;;;10999:18:1;;;10992:35;11044:19;;6450:69:0;;;;;;;;;6560:1;6538:10;-1:-1:-1;;;;;6538:10:0;:24;6530:67;;;;-1:-1:-1;;;6530:67:0;;13507:2:1;6530:67:0;;;13489:21:1;13546:2;13526:18;;;13519:30;13585:32;13565:18;;;13558:60;13635:18;;6530:67:0;13479:180:1;6530:67:0;-1:-1:-1;;;;;6630:32:0;;6608:122;;;;-1:-1:-1;;;6608:122:0;;14621:2:1;6608:122:0;;;14603:21:1;14660:2;14640:18;;;14633:30;14699:34;14679:18;;;14672:62;-1:-1:-1;;;14750:18:1;;;14743:38;14798:19;;6608:122:0;14593:230:1;6608:122:0;6741:10;:31;;-1:-1:-1;;;;;;6741:31:0;-1:-1:-1;;;;;6741:31:0;;;;;;;;;;6388:392::o;27656:4071::-;27773:11;20757:17;;;:7;:17;;;;;:35;27773:11;;27885:10;;27881:3811;;27912:15;;;27990:10;27999:1;27990:6;:10;:::i;:::-;27975:25;;28015:13;28117:47;28147:8;28157:6;28117:29;:47::i;:::-;28109:55;;28192:10;28183:5;:19;28179:42;;28212:5;28219:1;28204:17;;;;;;;;;;;28179:42;28244:45;28274:8;28284:4;28244:29;:45::i;:::-;28236:53;;28316:10;28308:5;:18;28304:393;;;28347:173;33733:4;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;28353;;;;;28392:1;28385:4;:8;28353:40;28347:173;;;28418:6;;;;:::i;:::-;;;;28455:45;28485:8;28495:4;28455:29;:45::i;:::-;28447:53;;28347:173;;;28541:9;;:41;;;;-1:-1:-1;33733:4:0;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;28554:28;28538:106;;;28615:5;28622:1;28607:17;;;;;;;;;;;28538:106;-1:-1:-1;28670:4:0;;-1:-1:-1;28676:4:0;-1:-1:-1;28662:19:0;;-1:-1:-1;;;28662:19:0;28304:393;28855:6;28847:1;28830:13;28855:6;28830:4;:13;:::i;:::-;28829:19;;;;:::i;:::-;:23;;28851:1;28829:23;:::i;:::-;:32;;;;:::i;:::-;28819:42;;28888:48;28918:8;28928:7;28888:29;:48::i;:::-;28880:56;;28967:10;28959:5;:18;28955:2711;;;29050:17;29070:125;29126:8;29161:11;:7;29171:1;29161:11;:::i;29070:125::-;29050:145;;29235:10;29222:9;:23;29218:1019;;33733:4;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;29274:796;;29396:4;29402:7;29388:22;;;;;;;;;;;;29274:796;33733:4;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;29566:43;;;;;29608:1;29598:7;:11;29566:43;29560:218;;;29646:9;;;;:::i;:::-;;;;29698:48;29728:8;29738:7;29698:29;:48::i;:::-;29690:56;;29560:218;;;29811:12;;:44;;;;-1:-1:-1;33733:4:0;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;29827:28;29808:133;;;29900:5;29907:1;29892:17;;;;;;;;;;;;29808:133;30028:4;30034:7;30020:22;;;;;;;;;;;;29218:1019;30202:11;:7;30212:1;30202:11;:::i;:::-;30193:20;;28955:2711;;;;30285:17;30305:125;30361:8;30396:11;30406:1;30396:7;:11;:::i;30305:125::-;30285:145;;30469:10;30457:9;:22;30453:1194;;;33733:4;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;30508:973;;30638:4;30644:11;30638:4;30644:7;:11;:::i;:::-;30630:26;;;;;;;;;;;;30508:973;30806:9;;;;:::i;:::-;;;;30846:335;33733:4;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;30852:47;;;;;30898:1;30888:7;:11;30852:47;30846:335;;;30936:9;;;;:::i;:::-;;;;30992:157;31060:8;31107:7;30992:29;:157::i;:::-;30980:169;;30846:335;;;31214:12;;:48;;;;-1:-1:-1;33733:4:0;33762:17;;;:7;:17;;;;;;;;:40;;;:28;;:40;;;;;;;;31230:32;33626:184;30453:1194;31612:11;31622:1;31612:7;:11;:::i;:::-;31605:18;;28955:2711;;28787:2894;;27881:3811;31710:5;31717:1;31702:17;;;;;27656:4071;;;;;;:::o;24702:188::-;-1:-1:-1;;;;;24841:24:0;;24809:7;24841:24;;;:13;:24;;;;;:41;;;24702:188;;;;:::o;16664:869::-;16750:14;;16789:104;16817:24;16856:26;16874:8;16856:15;:26;:::i;16789:104::-;16749:144;;;;;16908:9;16904:622;;;16934:26;16974:4;16963:27;;;;;;;;;;;;:::i;:::-;16934:56;;17053:10;17031:18;:32;;:70;;;;;17088:13;17067:18;:34;17031:70;17005:159;;;;-1:-1:-1;;;17005:159:0;;8296:2:1;17005:159:0;;;8278:21:1;8335:2;8315:18;;;8308:30;8374:29;8354:18;;;8347:57;8421:18;;17005:159:0;8268:177:1;17005:159:0;17181:28;17247:18;17213:30;:23;17239:4;17213:30;:::i;:::-;17212:53;;;;:::i;:::-;17181:84;;17306:18;17283:20;:41;17280:188;;;17359:18;17345:11;:32;17280:188;;;17418:11;:34;;;17280:188;17487:27;17502:11;;17487:27;;;;6429:25:1;;6417:2;6402:18;;6384:76;17487:27:0;;;;;;;;16904:622;;;16664:869;;:::o;11726:1697::-;11824:20;11884:10;;-1:-1:-1;;;;;11884:10:0;11870;:24;11862:71;;;;-1:-1:-1;;;11862:71:0;;7893:2:1;11862:71:0;;;7875:21:1;7932:2;7912:18;;;7905:30;7971:34;7951:18;;;7944:62;-1:-1:-1;;;8022:18:1;;;8015:32;8064:19;;11862:71:0;7865:224:1;11862:71:0;-1:-1:-1;;;;;11972:24:0;;11944:25;11972:24;;;:13;:24;;;;;12032:21;;;;12089;;;;11972:24;;12032:21;;12089;12129:31;12089:21;12032;12129:31;:::i;:::-;:35;12121:67;;;;-1:-1:-1;;;12121:67:0;;11276:2:1;12121:67:0;;;11258:21:1;11315:2;11295:18;;;11288:30;-1:-1:-1;;;11334:18:1;;;11327:49;11393:18;;12121:67:0;11248:169:1;12121:67:0;12221:11;;12203:14;:29;12199:1089;;12349:11;;12334:26;;12400:11;;12375:7;:21;;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;12440:11:0;;12426:10;:25;;:10;;:25;;12440:11;;12426:25;:::i;:::-;;;;-1:-1:-1;12199:1089:0;;-1:-1:-1;12199:1089:0;;12508:11;;12473:31;12490:14;12473;:31;:::i;:::-;:46;12469:819;;12709:11;;;-1:-1:-1;12735:134:0;12779:9;12825:28;12839:14;12709:11;12825:28;:::i;:::-;12807:47;;:14;:47;:::i;:::-;12735:25;:134::i;:::-;12898:14;12884:10;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;12951:1:0;12927:21;;;:25;12469:819;;;13108:31;13125:14;13108;:31;:::i;:::-;13093:46;;13168:14;13154:10;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;13197:39:0;;-1:-1:-1;13223:9:0;13234:1;13197:25;:39::i;:::-;13275:1;13251:21;;;:25;12469:819;13306:40;;-1:-1:-1;;;13306:40:0;;-1:-1:-1;;;;;5344:55:1;;;13306:40:0;;;5326:74:1;5416:18;;;5409:34;;;13306:5:0;:14;;;;5299:18:1;;13306:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13298:49;;;;;;13363:52;;;-1:-1:-1;;;;;5344:55:1;;;5326:74;;5431:2;5416:18;;5409:34;;;13363:52:0;;;;;5299:18:1;13363:52:0;;;;;;;11726:1697;;;;;;;:::o;10054:580::-;10155:10;;-1:-1:-1;;;;;10155:10:0;10141;:24;10133:70;;;;-1:-1:-1;;;10133:70:0;;8652:2:1;10133:70:0;;;8634:21:1;8691:2;8671:18;;;8664:30;8730:34;8710:18;;;8703:62;-1:-1:-1;;;8781:18:1;;;8774:31;8822:19;;10133:70:0;8624:223:1;10133:70:0;10214:22;10239:17;;;:7;:17;;;;;;;;10276:30;;;:18;;;:30;;;;;;;;;10275:31;10267:66;;;;-1:-1:-1;;;10267:66:0;;13866:2:1;10267:66:0;;;13848:21:1;13905:2;13885:18;;;13878:30;13944:24;13924:18;;;13917:52;13986:18;;10267:66:0;13838:172:1;10267:66:0;10344:14;10361:34;;;:22;;;:34;;;;;;10428:26;;10361:7;;:34;;10428:26;;;;-1:-1:-1;;;10428:26:0;;;;;;;;;;;;;;;;;10414:10;:40;10406:70;;;;-1:-1:-1;;;10406:70:0;;9054:2:1;10406:70:0;;;9036:21:1;9093:2;9073:18;;;9066:30;-1:-1:-1;;;9112:18:1;;;9105:47;9169:18;;10406:70:0;9026:167:1;10406:70:0;10487:41;;;;;;;;;;-1:-1:-1;10487:41:0;;;:36;;;:24;;;:36;;;;;;:41;;;;;;:::i;:::-;-1:-1:-1;10539:30:0;;;;:18;;;:30;;;;;;;:37;;-1:-1:-1;;10539:37:0;10572:4;10539:37;;;10592:34;;;;;10605:8;;10558:10;;6639:25:1;;;6695:2;6680:18;;6673:34;6627:2;6612:18;;6594:119;13818:2697:0;14015:13;14004:6;;13994:17;;;;;;;:::i;:::-;;;;;;;;:34;;13986:70;;;;-1:-1:-1;;;13986:70:0;;9747:2:1;13986:70:0;;;9729:21:1;9786:2;9766:18;;;9759:30;9825:25;9805:18;;;9798:53;9868:18;;13986:70:0;9719:173:1;13986:70:0;14067:22;14092:17;;;:7;:17;;;;;14152:25;;14142:35;;;:50;;-1:-1:-1;14181:11:0;;14142:50;14120:132;;;;-1:-1:-1;;;14120:132:0;;10099:2:1;14120:132:0;;;10081:21:1;;;10118:18;;;10111:30;10177:34;10157:18;;;10150:62;10229:18;;14120:132:0;10071:182:1;14120:132:0;14305:10;14263:25;14291;;;:13;:25;;;;;14374:11;;14349:21;;;;:36;;14327:127;;;;-1:-1:-1;;;14327:127:0;;10460:2:1;14327:127:0;;;10442:21:1;10499:2;10479:18;;;10472:30;10538:34;10518:18;;;10511:62;-1:-1:-1;;;10589:18:1;;;10582:39;10638:19;;14327:127:0;10432:231:1;14327:127:0;14675:11;;14651:7;:21;;;:35;;;;:::i;:::-;14626:20;:13;14642:4;14626:20;:::i;:::-;14625:62;;;;:::i;:::-;14568:29;;;;14550:47;;:15;:47;:::i;:::-;14549:56;;14601:4;14549:56;:::i;:::-;:138;14527:229;;;;-1:-1:-1;;;14527:229:0;;12741:2:1;14527:229:0;;;12723:21:1;12780:2;12760:18;;;12753:30;12819:34;12799:18;;;12792:62;-1:-1:-1;;;12870:18:1;;;12863:39;12919:19;;14527:229:0;12713:231:1;14527:229:0;14811:10;;14801:21;;;;;;;:::i;:::-;;;;;;;;14789:8;:33;14767:118;;;;-1:-1:-1;;;14767:118:0;;14217:2:1;14767:118:0;;;14199:21:1;14256:2;14236:18;;;14229:30;14295:34;14275:18;;;14268:62;-1:-1:-1;;;14346:18:1;;;14339:33;14389:19;;14767:118:0;14189:225:1;14767:118:0;14928:15;14896:29;;;:47;;;15089:1;15033:44;;;:27;;;:44;;;;;;-1:-1:-1;;;;;15033:44:0;:58;15011:138;;;;-1:-1:-1;;;15011:138:0;;12382:2:1;15011:138:0;;;12364:21:1;12421:2;12401:18;;;12394:30;12460:32;12440:18;;;12433:60;12510:18;;15011:138:0;12354:180:1;15011:138:0;15297:25;;15278:15;15297:18;15255:39;;;:22;;;;:39;;;;;;;;:67;;;15333:40;;;;;;;;;;;;;;;;;15384:41;;;:24;;;:41;;;;;:50;;15428:6;;15384:50;:::i;:::-;-1:-1:-1;15473:15:0;15445:44;;;;:27;;;:44;;;;;:57;;-1:-1:-1;;;;;;15445:57:0;15492:10;15445:57;;;15590:18;;15445:44;;15631:3;;1870:4;;15572:36;;15590:18;15572:36;:::i;:::-;15571:56;;;;:::i;:::-;15570:64;;;;:::i;:::-;15552:82;;15668:37;15811:10;;15787:21;;15768:16;;:40;;;;:::i;:::-;:53;;;;:::i;:::-;15721:30;;-1:-1:-1;;;15721:30:0;;15745:4;15721:30;;;4352:74:1;15721:5:0;-1:-1:-1;;;;;15721:15:0;;;;4325:18:1;;15721:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:101;;;;:::i;:::-;15668:154;;15869:1;15837:29;:33;:48;;;;;15884:1;15874:7;:11;15837:48;15833:293;;;15938:7;15906:29;:39;15902:213;;;15966:57;;-1:-1:-1;;;15966:57:0;;15981:10;15966:57;;;5326:74:1;5416:18;;;5409:34;;;15966:5:0;-1:-1:-1;;;;;15966:14:0;;;;5299:18:1;;15966:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15902:213;;;16064:35;;-1:-1:-1;;;16064:35:0;;16079:10;16064:35;;;5326:74:1;5416:18;;;5409:34;;;16064:5:0;-1:-1:-1;;;;;16064:14:0;;;;5299:18:1;;16064:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15902:213;16239:15;16218:18;:36;;;16289:24;;;:26;;;;;;16342:165;;16486:10;;16239:15;16366:8;;16342:165;;;;16419:6;;;;16440;;16461:10;;;;16342:165;:::i;:::-;;;;;;;;13818:2697;;;;;;;;;;:::o;22311:299::-;22374:7;22394:23;22528:15;;22508:4;22475:16;;22421:38;:36;:38::i;:::-;:70;;;;:::i;:::-;22420:92;;;;:::i;:::-;:123;;;;:::i;:::-;22394:149;;22586:15;22562:21;;:39;;;;:::i;:::-;22554:48;;;22311:299;:::o;10796:511::-;10907:10;10865:25;10893;;;:13;:25;;;;;10951:21;;;;:32;-1:-1:-1;10951:32:0;10929:109;;;;-1:-1:-1;;;10929:109:0;;13151:2:1;10929:109:0;;;13133:21:1;13190:2;13170:18;;;13163:30;13229:29;13209:18;;;13202:57;13276:18;;10929:109:0;13123:177:1;10929:109:0;11049:70;11075:10;11111:7;11087;:21;;;:31;;;;:::i;11049:70::-;11150:15;11130:35;;11176:21;;;:32;;11201:7;;11176:21;11130:17;;11176:32;;11201:7;;11176:32;:::i;:::-;;;;;;;;11233:7;11219:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;11256:43:0;;;11279:10;5326:74:1;;5431:2;5416:18;;5409:34;;;11256:43:0;;5299:18:1;11256:43:0;;;;;;;10796:511;;:::o;19587:611::-;19710:16;19741:19;19775:27;19831:11;19844:14;19862:80;19898:8;19921:10;19862:21;:80::i;:::-;19830:112;;;;19958:6;19953:41;;19974:5;19981:9;;;;;;;;;;;;19992:1;19966:28;;;;;;;;;;19953:41;20027:47;20057:8;20067:6;20027:29;:47::i;:::-;20005:69;;20094:43;20107:8;20117:19;20094:12;:43::i;:::-;20085:52;;20156:4;20148:42;;;;19587:611;;;;;;:::o;18908:260::-;19001:19;19038:12;19083:44;19097:8;19107:19;:15;19125:1;19107:19;:::i;19083:44::-;-1:-1:-1;19061:66:0;-1:-1:-1;19061:66:0;-1:-1:-1;19061:66:0;19138:23;;19151:8;;;19138:23;18908:260;;;;:::o;17631:613::-;17718:10;17676:25;17704;;;:13;:25;;;;;17850:17;;17871:6;;17832:35;;:15;:35;:::i;:::-;:45;;17810:113;;;;-1:-1:-1;;;17810:113:0;;9400:2:1;17810:113:0;;;9382:21:1;9439:2;9419:18;;;9412:30;-1:-1:-1;;;9458:18:1;;;9451:48;9516:18;;17810:113:0;9372:168:1;17810:113:0;17980:1;17956:7;:21;;;:25;17934:109;;;;-1:-1:-1;;;17934:109:0;;11979:2:1;17934:109:0;;;11961:21:1;12018:2;11998:18;;;11991:30;12057:34;12037:18;;;12030:62;-1:-1:-1;;;12108:18:1;;;12101:32;12150:19;;17934:109:0;11951:224:1;17934:109:0;18089:21;;;;18062:49;;-1:-1:-1;;;18062:49:0;;18077:10;18062:49;;;5326:74:1;5416:18;;;5409:34;;;;18062:5:0;-1:-1:-1;;;;;18062:14:0;;;;5299:18:1;;18062:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18054:58;;;;;;18137:7;:21;;;18123:10;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;18193:1:0;18169:21;;;:25;18210:26;;18225:10;4352:74:1;;18210:26:0;;4340:2:1;4325:18;18210:26:0;;;;;;;17631:613;:::o;21015:1124::-;-1:-1:-1;;;;;21177:29:0;;21109:22;21177:29;;;:13;:29;;;;;21347:18;;;;21327:4;21272:38;:36;:38::i;:::-;21235:7;:21;;;:75;;;;:::i;:::-;21234:97;;;;:::i;:::-;:131;;;;:::i;:::-;21377:13;21420:10;;21450:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21450:41:0;-1:-1:-1;;;21450:41:0;;;21420:82;;21217:148;;-1:-1:-1;21377:13:0;;;;-1:-1:-1;;;;;21420:10:0;;;;:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21376:126;;;;21513:22;21550:8;21546:130;;;21642:7;:22;;;21615:11;21604:34;;;;;;;;;;;;:::i;:::-;21596:68;;;;:::i;:::-;21579:85;;21546:130;21690:18;;21686:446;;21754:10;;21792:72;;-1:-1:-1;;;;;4370:55:1;;;21792:72:0;;;4352:74:1;21754:10:0;;;;4325:18:1;;21792:72:0;;;-1:-1:-1;;21792:72:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21792:72:0;-1:-1:-1;;;21792:72:0;;;21754:129;;;21792:72;21754:129;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21729:154:0;;-1:-1:-1;21729:154:0;-1:-1:-1;21902:219:0;;;;22087:14;22034:7;:22;;;22009:11;21998:33;;;;;;;;;;;;:::i;:::-;:58;;;;:::i;:::-;21980:77;;:14;:77;:::i;:::-;21979:122;;;;:::i;:::-;21937:164;;21902:219;21015:1124;;;;;;;:::o;34041:199::-;34186:17;;;;:7;:17;;;;;;;;:46;;;:34;;:46;;;;;34179:53;;34149:12;;34186:46;34179:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34041:199;;;;:::o;7573:2209::-;7662:1;7640:10;-1:-1:-1;;;;;7640:10:0;7632:63;;;;-1:-1:-1;;;7632:63:0;;11624:2:1;7632:63:0;;;11606:21:1;11663:2;11643:18;;;11636:30;11702:28;11682:18;;;11675:56;11748:18;;7632:63:0;11596:176:1;7632:63:0;7748:10;7706:25;7734;;;:13;:25;;;;;7795:21;;;;7852;;;;7888:18;;7884:1681;;7945:7;7927:14;:25;7923:714;;8075:7;8050;:21;;;:32;;;;;;;:::i;:::-;;;;;;;;8115:7;8101:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;7923:714:0;;-1:-1:-1;7923:714:0;;-1:-1:-1;;;;;8335:5:0;:18;;8380:10;8425:4;8457:24;8467:14;8457:7;:24;:::i;:::-;8335:169;;-1:-1:-1;;;;;;8335:169:0;;;;;;;-1:-1:-1;;;;;4718:15:1;;;8335:169:0;;;4700:34:1;4770:15;;;;4750:18;;;4743:43;4802:18;;;4795:34;4612:18;;8335:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8305:218;;;;;;8556:7;:21;;;8542:10;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;8620:1:0;8596:21;;;:25;7923:714;7884:1681;;;8673:19;8669:807;;8875:13;8918:10;;8956:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8956:41:0;-1:-1:-1;;;8956:41:0;;;8918:98;;8875:13;;-1:-1:-1;;;;;8918:10:0;;:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8874:142;;;;9039:8;9035:125;;;9116:11;9105:34;;;;;;;;;;;;:::i;:::-;9072:22;;;:68;9035:125;9203:10;;9241:68;;9298:10;9241:68;;;4352:74:1;-1:-1:-1;;;;;9203:10:0;;;;4325:18:1;;9241:68:0;;;-1:-1:-1;;9241:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9241:68:0;-1:-1:-1;;;9241:68:0;;;9203:125;;;9241:68;9203:125;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9178:150:0;;-1:-1:-1;9178:150:0;-1:-1:-1;9347:114:0;;;;9419:11;9408:33;;;;;;;;;;;;:::i;:::-;9382:22;;;:59;9347:114;8669:807;;;9498:54;;-1:-1:-1;;;9498:54:0;;9517:10;9498:54;;;4700:34:1;9537:4:0;4750:18:1;;;4743:43;4802:18;;;4795:34;;;9498:5:0;-1:-1:-1;;;;;9498:18:0;;;;4612::1;;9498:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9490:63;;;;;;9575;9601:10;9613:24;9630:7;9613:14;:24;:::i;9575:63::-;9669:15;9649:35;;9744:30;;9766:7;;9754:10;;9744:30;;9649:17;;9744:30;7573:2209;;;;:::o;27012:197::-;27133:7;27165:17;;;:7;:17;;;;;:36;;27194:6;;27165:36;;;;-1:-1:-1;;;27165:36:0;;;;;;;;;;;;;;;;;27158:43;;27012:197;;;;:::o;33205:189::-;33271:7;33375:10;;33351:21;;33332:16;;:40;;;;:::i;:::-;:53;;;;:::i;:::-;33298:30;;-1:-1:-1;;;33298:30:0;;33322:4;33298:30;;;4352:74:1;33298:5:0;-1:-1:-1;;;;;33298:15:0;;;;4325:18:1;;33298:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:88;;;;:::i;:::-;33291:95;;33205:189;:::o;6956:495::-;7028:54;;-1:-1:-1;;;7028:54:0;;7047:10;7028:54;;;4700:34:1;7067:4:0;4750:18:1;;;4743:43;4802:18;;;4795:34;;;7028:5:0;-1:-1:-1;;;;;7028:18:0;;;;4612::1;;7028:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7020:63;;;;;;7094:16;:14;:16::i;:::-;7146:7;7121:21;;:32;;;;;;;:::i;:::-;;;;;;;;7436:7;7403:15;;7375:4;7334:16;;7306:25;;:44;;;;:::i;:::-;7305:74;;;;:::i;:::-;:113;;;;:::i;:::-;7263:21;;:156;;;;:::i;:::-;7262:181;;;;:::i;:::-;7236:10;:207;-1:-1:-1;6956:495:0:o;36834:3088::-;36965:16;:14;:16::i;:::-;-1:-1:-1;;;;;37020:29:0;;36992:25;37020:29;;;:13;:29;;;;;37064:21;;;;:25;37060:1754;;37202:22;37339:7;:18;;;37315:4;37269:25;;37228:7;:21;;;:66;;;;:::i;:::-;37227:92;;;;:::i;:::-;:130;;;;:::i;:::-;37425:22;37506:10;;37540:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37540:41:0;-1:-1:-1;;;37540:41:0;;;37506:90;;37202:155;;-1:-1:-1;37425:22:0;;;;;;-1:-1:-1;;;;;37506:10:0;;:90;;37540:41;37506:90;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37462:134;;;;37615:8;37611:176;;;37749:7;:22;;;37701:11;37690:34;;;;;;;;;;;;:::i;:::-;37682:89;;;;:::i;:::-;37644:127;;37611:176;37805:18;;37801:774;;37950:10;;37988:72;;-1:-1:-1;;;;;4370:55:1;;;37988:72:0;;;4352:74:1;37950:10:0;;;;4325:18:1;;37988:72:0;;;-1:-1:-1;;37988:72:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37988:72:0;-1:-1:-1;;;37988:72:0;;;37950:129;;;37988:72;37950:129;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37924:155:0;;-1:-1:-1;37924:155:0;-1:-1:-1;38098:462:0;;;;38133:18;38165:11;38154:33;;;;;;;;;;;;:::i;:::-;38133:54;;38210:26;38377:14;38325:7;:22;;;38312:10;:35;;;;:::i;:::-;38265:83;;:14;:83;:::i;:::-;38264:127;;;;:::i;:::-;38210:181;;38439:14;38418:18;:35;38414:127;;;38499:18;38482:35;;38414:127;38098:462;;;38614:14;38589:21;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;38651:42:0;;-1:-1:-1;;;38651:42:0;;38666:10;38651:42;;;5326:74:1;5416:18;;;5409:34;;;38651:5:0;-1:-1:-1;;;;;38651:14:0;;;;5299:18:1;;38651:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38643:51;;;;;;38728:7;:18;;;38709:15;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;38781:21:0;;;;38761:16;:41;;:16;;:41;;38781:21;;38761:41;:::i;:::-;;;;-1:-1:-1;;;;;;37060:1754:0;38824:21;;;:41;;;38938:11;;38913:36;;38909:348;;38970:14;;;;;;38966:78;;39014:12;:14;;;:12;:14;;;:::i;:::-;;;;;;38966:78;39058:14;;;:21;;-1:-1:-1;;39058:21:0;39075:4;39058:21;;;38909:348;;;39116:14;;;;;;:22;;:14;:22;:42;;;;;39157:1;39142:12;;:16;39116:42;39112:97;;;39179:12;:14;;;:12;:14;;;:::i;:::-;;;;;;39112:97;39223:14;;;:22;;-1:-1:-1;;39223:22:0;;;38909:348;39435:4;39393:25;;39369:7;:21;;;:49;;;;:::i;:::-;39368:71;;;;:::i;:::-;39334:18;;;:105;;;39450:15;:37;;:15;;:37;;39334:105;;39450:37;:::i;:::-;;;;-1:-1:-1;;39518:21:0;;;;39498:16;:41;;:16;;:41;;39518:21;;39498:41;:::i;:::-;;;;-1:-1:-1;;39664:10:0;;39661:254;;39896:7;39863:15;;39835:4;39794:16;;39766:25;;:44;;;;:::i;:::-;39765:74;;;;:::i;:::-;:113;;;;:::i;:::-;39723:21;;:156;;;;:::i;:::-;39722:181;;;;:::i;:::-;39696:10;:207;39661:254;36834:3088;;;:::o;40087:1046::-;40185:7;40214:16;;40234:1;40214:21;40210:86;;;-1:-1:-1;40259:25:0;;40252:32;;40210:86;40306:37;40465:16;;40431:10;;40407:20;;40389:15;:38;;;;:::i;:::-;40388:53;;;;:::i;:::-;:60;;40444:4;40388:60;:::i;:::-;40387:94;;;;:::i;:::-;40346:25;;:135;;;;:::i;:::-;40306:175;;40492:26;40620:15;;40600:4;40567:16;;40522:29;:61;;;;:::i;:::-;40521:83;;;;:::i;:::-;:114;;;;:::i;:::-;40492:143;;40672:21;;40650:18;:43;40646:433;;40710:26;40879:15;;40851:4;40810:16;;40782:25;;:44;;;;:::i;:::-;40781:74;;;;:::i;:::-;:113;;;;:::i;:::-;40739:21;;:156;;;;:::i;:::-;41051:16;;40710:185;;-1:-1:-1;41005:25:0;40710:185;41026:4;41005:25;:::i;:::-;41004:63;;;;:::i;:::-;40959:25;;:108;;;;:::i;:::-;40910:157;;40646:433;;-1:-1:-1;41096:29:0;-1:-1:-1;40087:1046:0;:::o;35013:1438::-;35087:15;35063:20;;:39;35059:78;;;35119:7;;35059:78;35151:16;;:21;;:40;;-1:-1:-1;35176:10:0;;:15;35151:40;35147:132;;;35231:15;35208:20;:38;35261:7;;35147:132;35347:37;35506:16;;35472:10;;35448:20;;35430:15;:38;;;;:::i;:::-;35429:53;;;;:::i;:::-;:60;;35485:4;35429:60;:::i;:::-;35428:94;;;;:::i;:::-;35387:25;;:135;;;;:::i;:::-;35347:175;;35609:26;35737:15;;35717:4;35684:16;;35639:29;:61;;;;:::i;:::-;35638:83;;;;:::i;:::-;:114;;;;:::i;:::-;35609:143;;35789:21;;35767:18;:43;35763:632;;35955:26;36124:15;;36096:4;36055:16;;36027:25;;:44;;;;:::i;:::-;36026:74;;;;:::i;:::-;:113;;;;:::i;:::-;35984:21;;:156;;;;:::i;:::-;36248:16;;35955:185;;-1:-1:-1;36202:25:0;35955:185;36223:4;36202:25;:::i;:::-;36201:63;;;;:::i;:::-;36155:25;;:109;;;;;;;:::i;:::-;;;;-1:-1:-1;;36292:1:0;36279:10;:14;-1:-1:-1;35763:632:0;;;36326:25;:57;;;35763:632;-1:-1:-1;;36428:15:0;36405:20;:38;35013:1438;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;215:375;;;330:3;323:4;315:6;311:17;307:27;297:2;;355:8;345;338:26;297:2;-1:-1:-1;385:20:1;;428:18;417:30;;414:2;;;467:8;457;450:26;414:2;511:4;503:6;499:17;487:29;;563:3;556:4;547:6;539;535:19;531:30;528:39;525:2;;;580:1;577;570:12;595:196;;707:2;695:9;686:7;682:23;678:32;675:2;;;728:6;720;713:22;675:2;756:29;775:9;756:29;:::i;:::-;746:39;665:126;-1:-1:-1;;;665:126:1:o;796:270::-;;;925:2;913:9;904:7;900:23;896:32;893:2;;;946:6;938;931:22;893:2;974:29;993:9;974:29;:::i;:::-;964:39;;1022:38;1056:2;1045:9;1041:18;1022:38;:::i;:::-;1012:48;;883:183;;;;;:::o;1071:297::-;;1191:2;1179:9;1170:7;1166:23;1162:32;1159:2;;;1212:6;1204;1197:22;1159:2;1249:9;1243:16;1302:5;1295:13;1288:21;1281:5;1278:32;1268:2;;1329:6;1321;1314:22;1373:190;;1485:2;1473:9;1464:7;1460:23;1456:32;1453:2;;;1506:6;1498;1491:22;1453:2;-1:-1:-1;1534:23:1;;1443:120;-1:-1:-1;1443:120:1:o;1568:884::-;;;;;;;1769:3;1757:9;1748:7;1744:23;1740:33;1737:2;;;1791:6;1783;1776:22;1737:2;1832:9;1819:23;1809:33;;1893:2;1882:9;1878:18;1865:32;1916:18;1957:2;1949:6;1946:14;1943:2;;;1978:6;1970;1963:22;1943:2;2022:58;2072:7;2063:6;2052:9;2048:22;2022:58;:::i;:::-;2099:8;;-1:-1:-1;1996:84:1;-1:-1:-1;2181:2:1;2166:18;;2153:32;;-1:-1:-1;2238:2:1;2223:18;;2210:32;;-1:-1:-1;2254:16:1;;;2251:2;;;2288:6;2280;2273:22;2251:2;;2332:60;2384:7;2373:8;2362:9;2358:24;2332:60;:::i;:::-;1727:725;;;;-1:-1:-1;1727:725:1;;-1:-1:-1;1727:725:1;;2411:8;;1727:725;-1:-1:-1;;;1727:725:1:o;2457:258::-;;;2586:2;2574:9;2565:7;2561:23;2557:32;2554:2;;;2607:6;2599;2592:22;2554:2;-1:-1:-1;;2635:23:1;;;2705:2;2690:18;;;2677:32;;-1:-1:-1;2544:171:1:o;2915:194::-;;3038:2;3026:9;3017:7;3013:23;3009:32;3006:2;;;3059:6;3051;3044:22;3006:2;-1:-1:-1;3087:16:1;;2996:113;-1:-1:-1;2996:113:1:o;3114:268::-;;3202:6;3197:3;3190:19;3254:6;3247:5;3240:4;3235:3;3231:14;3218:43;3306:3;3299:4;3290:6;3285:3;3281:16;3277:27;3270:40;3371:4;3364:2;3360:7;3355:2;3347:6;3343:15;3339:29;3334:3;3330:39;3326:50;3319:57;;3180:202;;;;;:::o;3387:257::-;;3466:5;3460:12;3493:6;3488:3;3481:19;3509:63;3565:6;3558:4;3553:3;3549:14;3542:4;3535:5;3531:16;3509:63;:::i;:::-;3626:2;3605:15;-1:-1:-1;;3601:29:1;3592:39;;;;3633:4;3588:50;;3436:208;-1:-1:-1;;3436:208:1:o;3649:273::-;;3832:6;3824;3819:3;3806:33;3858:16;;3883:15;;;3858:16;3796:126;-1:-1:-1;3796:126:1:o;3927:274::-;;4094:6;4088:13;4110:53;4156:6;4151:3;4144:4;4136:6;4132:17;4110:53;:::i;:::-;4179:16;;;;;4064:137;-1:-1:-1;;4064:137:1:o;5646:369::-;;5857:6;5850:14;5843:22;5832:9;5825:41;5902:2;5897;5886:9;5882:18;5875:30;5922:44;5962:2;5951:9;5947:18;5939:6;5922:44;:::i;:::-;5914:52;;6002:6;5997:2;5986:9;5982:18;5975:34;5815:200;;;;;;:::o;6718:502::-;;6959:2;6948:9;6941:21;6985:61;7042:2;7031:9;7027:18;7019:6;7011;6985:61;:::i;:::-;7082:6;7077:2;7066:9;7062:18;7055:34;7137:9;7129:6;7125:22;7120:2;7109:9;7105:18;7098:50;7165:49;7207:6;7199;7191;7165:49;:::i;:::-;7157:57;6931:289;-1:-1:-1;;;;;;;;6931:289:1:o;7225:217::-;;7372:2;7361:9;7354:21;7392:44;7432:2;7421:9;7417:18;7409:6;7392:44;:::i;15776:128::-;;15847:1;15843:6;15840:1;15837:13;15834:2;;;15853:18;;:::i;:::-;-1:-1:-1;15889:9:1;;15824:80::o;15909:217::-;;15975:1;15965:2;;-1:-1:-1;;;16000:31:1;;16054:4;16051:1;16044:15;16082:4;16007:1;16072:15;15965:2;-1:-1:-1;16111:9:1;;15955:171::o;16131:168::-;;16237:1;16233;16229:6;16225:14;16222:1;16219:21;16214:1;16207:9;16200:17;16196:45;16193:2;;;16244:18;;:::i;:::-;-1:-1:-1;16284:9:1;;16183:116::o;16304:125::-;;16372:1;16369;16366:8;16363:2;;;16377:18;;:::i;:::-;-1:-1:-1;16414:9:1;;16353:76::o;16434:258::-;16506:1;16516:113;16530:6;16527:1;16524:13;16516:113;;;16606:11;;;16600:18;16587:11;;;16580:39;16552:2;16545:10;16516:113;;;16647:6;16644:1;16641:13;16638:2;;;16682:1;16673:6;16668:3;16664:16;16657:27;16638:2;;16487:205;;;:::o;16697:136::-;;16764:5;16754:2;;16773:18;;:::i;:::-;-1:-1:-1;;;16809:18:1;;16744:89::o;16838:380::-;16917:1;16913:12;;;;16960;;;16981:2;;17035:4;17027:6;17023:17;17013:27;;16981:2;17088;17080:6;17077:14;17057:18;17054:38;17051:2;;;17134:10;17129:3;17125:20;17122:1;17115:31;17169:4;17166:1;17159:15;17197:4;17194:1;17187:15;17223:135;;-1:-1:-1;;17283:17:1;;17280:2;;;17303:18;;:::i;:::-;-1:-1:-1;17350:1:1;17339:13;;17270:88::o;17363:127::-;17424:10;17419:3;17415:20;17412:1;17405:31;17455:4;17452:1;17445:15;17479:4;17476:1;17469:15
Swarm Source
ipfs://4d04a6a545bc4bdeecb3a12a978d0a416164adc4c7de1063c71ee786fd702f4a
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...Loading[ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.