Source Code
Overview
ETH Balance
More Info
ContractCreator
Multichain Info
N/A
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x16d623f2...3fdA14249 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Governance
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/**
*Submitted for verification at sepolia.lineascan.build/ on 2024-04-12
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;
/**
@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.
*/
interface IOracle {
/**
* @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;
/**
* @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 uint256 amount of token slashed and sent to recipient address
*/
function slashReporter(address _reporter, address _recipient)
external
returns (uint256);
// *****************************************************************************
// * *
// * Getters *
// * *
// *****************************************************************************
/**
* @dev Returns the block number at a given timestamp
* @param _queryId is ID of the specific data feed
* @param _timestamp is the timestamp to find the corresponding block number for
* @return uint256 block number of the timestamp for the given data ID
*/
function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp)
external
view
returns (uint256);
/**
* @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);
/**
* @dev Returns the number of values submitted by a specific reporter address
* @param _reporter is the address of a reporter
* @return uint256 of the number of values submitted by the given reporter
*/
function getReportsSubmittedByAddress(address _reporter)
external
view
returns (uint256);
/**
* @dev Returns amount required to report oracle values
* @return uint256 stake amount
*/
function getStakeAmount() external view returns (uint256);
/**
* @dev Allows users to retrieve 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
*/
function getStakerInfo(address _stakerAddress)
external
view
returns (
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
);
/**
* @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)
external
view
returns (
bool _ifRetrieve,
bytes memory _value,
uint256 _timestampRetrieved
);
/**
* @dev Returns the address of the token used for staking
* @return address of the token used for staking
*/
function getTokenAddress() external view returns (address);
/**
* @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)
external
view
returns (bytes memory);
}
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);
}
interface ITellor {
//Controller
function addresses(bytes32) external view returns (address);
function uints(bytes32) external view returns (uint256);
function burn(uint256 _amount) external;
function changeDeity(address _newDeity) external;
function changeOwner(address _newOwner) external;
function changeUint(bytes32 _target, uint256 _amount) external;
function migrate() external;
function mint(address _reciever, uint256 _amount) external;
function init() external;
function getAllDisputeVars(uint256 _disputeId)
external
view
returns (
bytes32,
bool,
bool,
bool,
address,
address,
address,
uint256[9] memory,
int256
);
function getDisputeIdByDisputeHash(bytes32 _hash)
external
view
returns (uint256);
function getDisputeUintVars(uint256 _disputeId, bytes32 _data)
external
view
returns (uint256);
function getLastNewValueById(uint256 _requestId)
external
view
returns (uint256, bool);
function retrieveData(uint256 _requestId, uint256 _timestamp)
external
view
returns (uint256);
function getNewValueCountbyRequestId(uint256 _requestId)
external
view
returns (uint256);
function getAddressVars(bytes32 _data) external view returns (address);
function getUintVar(bytes32 _data) external view returns (uint256);
function totalSupply() external view returns (uint256);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function isMigrated(address _addy) external view returns (bool);
function allowance(address _user, address _spender)
external
view
returns (uint256);
function allowedToTrade(address _user, uint256 _amount)
external
view
returns (bool);
function approve(address _spender, uint256 _amount) external returns (bool);
function approveAndTransferFrom(
address _from,
address _to,
uint256 _amount
) external returns (bool);
function balanceOf(address _user) external view returns (uint256);
function balanceOfAt(address _user, uint256 _blockNumber)
external
view
returns (uint256);
function transfer(address _to, uint256 _amount)
external
returns (bool success);
function transferFrom(
address _from,
address _to,
uint256 _amount
) external returns (bool success);
function depositStake() external;
function requestStakingWithdraw() external;
function withdrawStake() external;
function changeStakingStatus(address _reporter, uint256 _status) external;
function slashReporter(address _reporter, address _disputer) external;
function getStakerInfo(address _staker)
external
view
returns (uint256, uint256);
function getTimestampbyRequestIDandIndex(uint256 _requestId, uint256 _index)
external
view
returns (uint256);
function getNewCurrentVariables()
external
view
returns (
bytes32 _c,
uint256[5] memory _r,
uint256 _d,
uint256 _t
);
function getNewValueCountbyQueryId(bytes32 _queryId)
external
view
returns (uint256);
function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index)
external
view
returns (uint256);
function retrieveData(bytes32 _queryId, uint256 _timestamp)
external
view
returns (bytes memory);
//Governance
enum VoteResult {
FAILED,
PASSED,
INVALID
}
function setApprovedFunction(bytes4 _func, bool _val) external;
function beginDispute(bytes32 _queryId, uint256 _timestamp) external;
function delegate(address _delegate) external;
function delegateOfAt(address _user, uint256 _blockNumber)
external
view
returns (address);
function executeVote(uint256 _disputeId) external;
function proposeVote(
address _contract,
bytes4 _function,
bytes calldata _data,
uint256 _timestamp
) external;
function tallyVotes(uint256 _disputeId) external;
function governance() external view returns (address);
function updateMinDisputeFee() external;
function verify() external pure returns (uint256);
function vote(
uint256 _disputeId,
bool _supports,
bool _invalidQuery
) external;
function voteFor(
address[] calldata _addys,
uint256 _disputeId,
bool _supports,
bool _invalidQuery
) external;
function getDelegateInfo(address _holder)
external
view
returns (address, uint256);
function isFunctionApproved(bytes4 _func) external view returns (bool);
function isApprovedGovernanceContract(address _contract)
external
returns (bool);
function getVoteRounds(bytes32 _hash)
external
view
returns (uint256[] memory);
function getVoteCount() external view returns (uint256);
function getVoteInfo(uint256 _disputeId)
external
view
returns (
bytes32,
uint256[9] memory,
bool[2] memory,
VoteResult,
bytes memory,
bytes4,
address[2] memory
);
function getDisputeInfo(uint256 _disputeId)
external
view
returns (
uint256,
uint256,
bytes memory,
address
);
function getOpenDisputesOnId(bytes32 _queryId)
external
view
returns (uint256);
function didVote(uint256 _disputeId, address _voter)
external
view
returns (bool);
//Oracle
function getReportTimestampByIndex(bytes32 _queryId, uint256 _index)
external
view
returns (uint256);
function getValueByTimestamp(bytes32 _queryId, uint256 _timestamp)
external
view
returns (bytes memory);
function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp)
external
view
returns (uint256);
function getReportingLock() external view returns (uint256);
function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp)
external
view
returns (address);
function reportingLock() external view returns (uint256);
function removeValue(bytes32 _queryId, uint256 _timestamp) external;
function getTipsByUser(address _user) external view returns(uint256);
function tipQuery(bytes32 _queryId, uint256 _tip, bytes memory _queryData) external;
function submitValue(bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes memory _queryData) external;
function burnTips() external;
function changeReportingLock(uint256 _newReportingLock) external;
function getReportsSubmittedByAddress(address _reporter) external view returns(uint256);
function changeTimeBasedReward(uint256 _newTimeBasedReward) external;
function getReporterLastTimestamp(address _reporter) external view returns(uint256);
function getTipsById(bytes32 _queryId) external view returns(uint256);
function getTimeBasedReward() external view returns(uint256);
function getTimestampCountById(bytes32 _queryId) external view returns(uint256);
function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(uint256);
function getCurrentReward(bytes32 _queryId) external view returns(uint256, uint256);
function getCurrentValue(bytes32 _queryId) external view returns(bytes memory);
function getDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns(bool _ifRetrieve, bytes memory _value, uint256 _timestampRetrieved);
function getTimeOfLastNewValue() external view returns(uint256);
function depositStake(uint256 _amount) external;
function requestStakingWithdraw(uint256 _amount) external;
//Test functions
function changeAddressVar(bytes32 _id, address _addy) external;
//parachute functions
function killContract() external;
function migrateFor(address _destination, uint256 _amount) external;
function rescue51PercentAttack(address _tokenHolder) external;
function rescueBrokenDataReporting() external;
function rescueFailedUpdate() external;
//Tellor 360
function addStakingRewards(uint256 _amount) external;
function _sliceUint(bytes memory _b)
external
pure
returns (uint256 _number);
function claimOneTimeTip(bytes32 _queryId, uint256[] memory _timestamps)
external;
function claimTip(
bytes32 _feedId,
bytes32 _queryId,
uint256[] memory _timestamps
) external;
function fee() external view returns (uint256);
function feedsWithFunding(uint256) external view returns (bytes32);
function fundFeed(
bytes32 _feedId,
bytes32 _queryId,
uint256 _amount
) external;
function getCurrentFeeds(bytes32 _queryId)
external
view
returns (bytes32[] memory);
function getCurrentTip(bytes32 _queryId) external view returns (uint256);
function getDataAfter(bytes32 _queryId, uint256 _timestamp)
external
view
returns (bytes memory _value, uint256 _timestampRetrieved);
function getDataFeed(bytes32 _feedId)
external
view
returns (Autopay.FeedDetails memory);
function getFundedFeeds() external view returns (bytes32[] memory);
function getFundedQueryIds() external view returns (bytes32[] memory);
function getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp)
external
view
returns (bool _found, uint256 _index);
function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp)
external
view
returns (bool _found, uint256 _index);
function getMultipleValuesBefore(
bytes32 _queryId,
uint256 _timestamp,
uint256 _maxAge,
uint256 _maxCount
)
external
view
returns (uint256[] memory _values, uint256[] memory _timestamps);
function getPastTipByIndex(bytes32 _queryId, uint256 _index)
external
view
returns (Autopay.Tip memory);
function getPastTipCount(bytes32 _queryId) external view returns (uint256);
function getPastTips(bytes32 _queryId)
external
view
returns (Autopay.Tip[] memory);
function getQueryIdFromFeedId(bytes32 _feedId)
external
view
returns (bytes32);
function getRewardAmount(
bytes32 _feedId,
bytes32 _queryId,
uint256[] memory _timestamps
) external view returns (uint256 _cumulativeReward);
function getRewardClaimedStatus(
bytes32 _feedId,
bytes32 _queryId,
uint256 _timestamp
) external view returns (bool);
function getTipsByAddress(address _user) external view returns (uint256);
function isInDispute(bytes32 _queryId, uint256 _timestamp)
external
view
returns (bool);
function queryIdFromDataFeedId(bytes32) external view returns (bytes32);
function queryIdsWithFunding(uint256) external view returns (bytes32);
function queryIdsWithFundingIndex(bytes32) external view returns (uint256);
function setupDataFeed(
bytes32 _queryId,
uint256 _reward,
uint256 _startTime,
uint256 _interval,
uint256 _window,
uint256 _priceThreshold,
uint256 _rewardIncreasePerSecond,
bytes memory _queryData,
uint256 _amount
) external;
function tellor() external view returns (address);
function tip(
bytes32 _queryId,
uint256 _amount,
bytes memory _queryData
) external;
function tips(bytes32, uint256)
external
view
returns (uint256 amount, uint256 timestamp);
function token() external view returns (address);
function userTipsTotal(address) external view returns (uint256);
function valueFor(bytes32 _id)
external
view
returns (
int256 _value,
uint256 _timestamp,
uint256 _statusCode
);
}
interface Autopay {
struct FeedDetails {
uint256 reward;
uint256 balance;
uint256 startTime;
uint256 interval;
uint256 window;
uint256 priceThreshold;
uint256 rewardIncreasePerSecond;
uint256 feedsWithFundingIndex;
}
struct Tip {
uint256 amount;
uint256 timestamp;
}
function getStakeAmount() external view returns(uint256);
function stakeAmount() external view returns(uint256);
function token() external view returns(address);
}
/**
* @dev EIP2362 Interface for pull oracles
* https://github.com/tellor-io/EIP-2362
*/
interface IERC2362
{
/**
* @dev Exposed function pertaining to EIP standards
* @param _id bytes32 ID of the query
* @return int,uint,uint returns the value, timestamp, and status code of query
*/
function valueFor(bytes32 _id) external view returns(int256,uint256,uint256);
}
interface IMappingContract{
function getTellorID(bytes32 _id) external view returns(bytes32);
}
/**
@author Tellor Inc
@title UsingTellor
@dev This contract helps smart contracts read data from Tellor
*/
contract UsingTellor is IERC2362 {
ITellor public tellor;
IMappingContract public idMappingContract;
/*Constructor*/
/**
* @dev the constructor sets the oracle address in storage
* @param _tellor is the Tellor Oracle address
*/
constructor(address payable _tellor) {
tellor = ITellor(_tellor);
}
/*Getters*/
/**
* @dev Retrieves the next value for the queryId after the specified timestamp
* @param _queryId is the queryId to look up the value for
* @param _timestamp after which to search for next value
* @return _value the value retrieved
* @return _timestampRetrieved the value's timestamp
*/
function getDataAfter(bytes32 _queryId, uint256 _timestamp)
public
view
returns (bytes memory _value, uint256 _timestampRetrieved)
{
(bool _found, uint256 _index) = getIndexForDataAfter(
_queryId,
_timestamp
);
if (!_found) {
return ("", 0);
}
_timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index);
_value = retrieveData(_queryId, _timestampRetrieved);
return (_value, _timestampRetrieved);
}
/**
* @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 _value the value retrieved
* @return _timestampRetrieved the value's timestamp
*/
function getDataBefore(bytes32 _queryId, uint256 _timestamp)
public
view
returns (bytes memory _value, uint256 _timestampRetrieved)
{
(, _value, _timestampRetrieved) = tellor.getDataBefore(
_queryId,
_timestamp
);
}
/**
* @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 getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp)
public
view
returns (bool _found, uint256 _index)
{
uint256 _count = getNewValueCountbyQueryId(_queryId);
if (_count == 0) return (false, 0);
_count--;
bool _search = true; // perform binary search
uint256 _middle = 0;
uint256 _start = 0;
uint256 _end = _count;
uint256 _timestampRetrieved;
// checking boundaries to short-circuit the algorithm
_timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _end);
if (_timestampRetrieved <= _timestamp) return (false, 0);
_timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _start);
if (_timestampRetrieved > _timestamp) {
// candidate found, check for disputes
_search = false;
}
// since the value is within our boundaries, do a binary search
while (_search) {
_middle = (_end + _start) / 2;
_timestampRetrieved = getTimestampbyQueryIdandIndex(
_queryId,
_middle
);
if (_timestampRetrieved > _timestamp) {
// get immediate previous value
uint256 _prevTime = getTimestampbyQueryIdandIndex(
_queryId,
_middle - 1
);
if (_prevTime <= _timestamp) {
// candidate found, check for disputes
_search = false;
} else {
// look from start to middle -1(prev value)
_end = _middle - 1;
}
} else {
// get immediate next value
uint256 _nextTime = getTimestampbyQueryIdandIndex(
_queryId,
_middle + 1
);
if (_nextTime > _timestamp) {
// candidate found, check for disputes
_search = false;
_middle++;
_timestampRetrieved = _nextTime;
} else {
// look from middle + 1(next value) to end
_start = _middle + 1;
}
}
}
// candidate found, check for disputed values
if (!isInDispute(_queryId, _timestampRetrieved)) {
// _timestampRetrieved is correct
return (true, _middle);
} else {
// iterate forward until we find a non-disputed value
while (
isInDispute(_queryId, _timestampRetrieved) && _middle < _count
) {
_middle++;
_timestampRetrieved = getTimestampbyQueryIdandIndex(
_queryId,
_middle
);
}
if (
_middle == _count && isInDispute(_queryId, _timestampRetrieved)
) {
return (false, 0);
}
// _timestampRetrieved is correct
return (true, _middle);
}
}
/**
* @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)
{
return tellor.getIndexForDataBefore(_queryId, _timestamp);
}
/**
* @dev Retrieves multiple uint256 values before the specified timestamp
* @param _queryId the unique id of the data query
* @param _timestamp the timestamp before which to search for values
* @param _maxAge the maximum number of seconds before the _timestamp to search for values
* @param _maxCount the maximum number of values to return
* @return _values the values retrieved, ordered from oldest to newest
* @return _timestamps the timestamps of the values retrieved
*/
function getMultipleValuesBefore(
bytes32 _queryId,
uint256 _timestamp,
uint256 _maxAge,
uint256 _maxCount
)
public
view
returns (bytes[] memory _values, uint256[] memory _timestamps)
{
// get index of first possible value
(bool _ifRetrieve, uint256 _startIndex) = getIndexForDataAfter(
_queryId,
_timestamp - _maxAge
);
// no value within range
if (!_ifRetrieve) {
return (new bytes[](0), new uint256[](0));
}
uint256 _endIndex;
// get index of last possible value
(_ifRetrieve, _endIndex) = getIndexForDataBefore(_queryId, _timestamp);
// no value before _timestamp
if (!_ifRetrieve) {
return (new bytes[](0), new uint256[](0));
}
uint256 _valCount = 0;
uint256 _index = 0;
uint256[] memory _timestampsArrayTemp = new uint256[](_maxCount);
// generate array of non-disputed timestamps within range
while (_valCount < _maxCount && _endIndex + 1 - _index > _startIndex) {
uint256 _timestampRetrieved = getTimestampbyQueryIdandIndex(
_queryId,
_endIndex - _index
);
if (!isInDispute(_queryId, _timestampRetrieved)) {
_timestampsArrayTemp[_valCount] = _timestampRetrieved;
_valCount++;
}
_index++;
}
bytes[] memory _valuesArray = new bytes[](_valCount);
uint256[] memory _timestampsArray = new uint256[](_valCount);
// retrieve values and reverse timestamps order
for (uint256 _i = 0; _i < _valCount; _i++) {
_timestampsArray[_i] = _timestampsArrayTemp[_valCount - 1 - _i];
_valuesArray[_i] = retrieveData(_queryId, _timestampsArray[_i]);
}
return (_valuesArray, _timestampsArray);
}
/**
* @dev Counts the number of values that have been submitted for the queryId
* @param _queryId the id to look up
* @return uint256 count of the number of values received for the queryId
*/
function getNewValueCountbyQueryId(bytes32 _queryId)
public
view
returns (uint256)
{
return tellor.getNewValueCountbyQueryId(_queryId);
}
/**
* @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)
public
view
returns (address)
{
return tellor.getReporterByTimestamp(_queryId, _timestamp);
}
/**
* @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 tellor.getTimestampbyQueryIdandIndex(_queryId, _index);
}
/**
* @dev Determines whether a value with a given queryId and timestamp has been disputed
* @param _queryId is the value id to look up
* @param _timestamp is the timestamp of the value to look up
* @return bool true if queryId/timestamp is under dispute
*/
function isInDispute(bytes32 _queryId, uint256 _timestamp)
public
view
returns (bool)
{
return tellor.isInDispute(_queryId, _timestamp);
}
/**
* @dev Retrieve value from oracle based on queryId/timestamp
* @param _queryId being requested
* @param _timestamp to retrieve data/value from
* @return bytes value for query/timestamp submitted
*/
function retrieveData(bytes32 _queryId, uint256 _timestamp)
public
view
returns (bytes memory)
{
return tellor.retrieveData(_queryId, _timestamp);
}
/**
* @dev allows dev to set mapping contract for valueFor (EIP2362)
* @param _addy address of mapping contract
*/
function setIdMappingContract(address _addy) external {
require(address(idMappingContract) == address(0));
idMappingContract = IMappingContract(_addy);
}
/**
* @dev Retrieve most recent int256 value from oracle based on queryId
* @param _id being requested
* @return _value most recent value submitted
* @return _timestamp timestamp of most recent value
* @return _statusCode 200 if value found, 404 if not found
*/
function valueFor(bytes32 _id)
external
view
override
returns (
int256 _value,
uint256 _timestamp,
uint256 _statusCode
)
{
bytes32 _queryId = idMappingContract.getTellorID(_id);
bytes memory _valueBytes;
(_valueBytes, _timestamp) = getDataBefore(
_queryId,
block.timestamp + 1
);
if (_timestamp == 0) {
return (0, 0, 404);
}
uint256 _valueUint = _sliceUint(_valueBytes);
_value = int256(_valueUint);
return (_value, _timestamp, 200);
}
// Internal functions
/**
* @dev Convert bytes to uint256
* @param _b bytes value to convert to uint256
* @return _number uint256 converted from bytes
*/
function _sliceUint(bytes memory _b)
internal
pure
returns (uint256 _number)
{
for (uint256 _i = 0; _i < _b.length; _i++) {
_number = _number * 256 + uint8(_b[_i]);
}
}
}
/**
@author Tellor Inc.
@title Governance
@dev This is a governance contract to be used with TellorFlex. It handles disputing
* Tellor oracle data and voting on those disputes
*/
contract Governance is UsingTellor {
// Storage
IOracle public oracle; // Tellor oracle contract
IERC20 public token; // token used for dispute fees, same as reporter staking token
address public oracleAddress; //tellorFlex address
address public teamMultisig; // address of team multisig wallet, one of four stakeholder groups
uint256 public voteCount; // total number of votes initiated
bytes32 public autopayAddrsQueryId =
keccak256(abi.encode("AutopayAddresses", abi.encode(bytes("")))); // query id for autopay addresses array
mapping(uint256 => Dispute) private disputeInfo; // mapping of dispute IDs to the details of the dispute
mapping(bytes32 => uint256) private openDisputesOnId; // mapping of a query ID to the number of disputes on that query ID
mapping(uint256 => Vote) private voteInfo; // mapping of dispute IDs to the details of the vote
mapping(bytes32 => uint256[]) private voteRounds; // mapping of vote identifier hashes to an array of dispute IDs
mapping(address => uint256) private voteTallyByAddress; // mapping of addresses to the number of votes they have cast
mapping(address => uint256[]) private disputeIdsByReporter; // mapping of reporter addresses to an array of dispute IDs
enum VoteResult {
FAILED,
PASSED,
INVALID
} // status of a potential vote
// Structs
struct Dispute {
bytes32 queryId; // query ID of disputed value
uint256 timestamp; // timestamp of disputed value
bytes value; // disputed value
address disputedReporter; // reporter who submitted the disputed value
uint256 slashedAmount; // amount of tokens slashed from reporter
}
struct Tally {
uint256 doesSupport; // number of votes in favor
uint256 against; // number of votes against
uint256 invalidQuery; // number of votes for invalid
}
struct Vote {
bytes32 identifierHash; // identifier hash of the vote
uint256 voteRound; // the round of voting on a given dispute or proposal
uint256 startDate; // timestamp of when vote was initiated
uint256 blockNumber; // block number of when vote was initiated
uint256 fee; // fee paid to initiate the vote round
uint256 tallyDate; // timestamp of when the votes were tallied
Tally tokenholders; // vote tally of tokenholders
Tally users; // vote tally of users
Tally reporters; // vote tally of reporters
Tally teamMultisig; // vote tally of teamMultisig
bool executed; // boolean of whether the vote was executed
VoteResult result; // VoteResult after votes were tallied
address initiator; // address which initiated dispute/proposal
mapping(address => bool) voted; // mapping of address to whether or not they voted
}
// Events
event NewDispute(
uint256 _disputeId,
bytes32 _queryId,
uint256 _timestamp,
address _reporter
); // Emitted when a new dispute is opened
event Voted(
uint256 _disputeId,
bool _supports,
address _voter,
bool _invalidQuery
); // Emitted when an address casts their vote
event VoteExecuted(uint256 _disputeId, VoteResult _result); // Emitted when a vote is executed
event VoteTallied(
uint256 _disputeId,
VoteResult _result,
address _initiator,
address _reporter
); // Emitted when all casting for a vote is tallied
/**
* @dev Initializes contract parameters
* @param _tellor address of tellor oracle contract to be governed
* @param _teamMultisig address of tellor team multisig, one of four voting
* stakeholder groups
*/
constructor(
address payable _tellor,
address _teamMultisig
) UsingTellor(_tellor) {
oracle = IOracle(_tellor);
token = IERC20(oracle.getTokenAddress());
oracleAddress = _tellor;
teamMultisig = _teamMultisig;
}
/**
* @dev Initializes a dispute/vote in the system
* @param _queryId being disputed
* @param _timestamp being disputed
*/
function beginDispute(bytes32 _queryId, uint256 _timestamp) external {
// Ensure value actually exists
address _reporter = oracle.getReporterByTimestamp(_queryId, _timestamp);
require(_reporter != address(0), "no value exists at given timestamp");
bytes32 _hash = keccak256(abi.encodePacked(_queryId, _timestamp));
// Push new vote round
uint256 _disputeId = voteCount + 1;
uint256[] storage _voteRounds = voteRounds[_hash];
_voteRounds.push(_disputeId);
// Create new vote and dispute
Vote storage _thisVote = voteInfo[_disputeId];
Dispute storage _thisDispute = disputeInfo[_disputeId];
// Initialize dispute information - query ID, timestamp, value, etc.
_thisDispute.queryId = _queryId;
_thisDispute.timestamp = _timestamp;
_thisDispute.disputedReporter = _reporter;
// Initialize vote information - hash, initiator, block number, etc.
_thisVote.identifierHash = _hash;
_thisVote.initiator = msg.sender;
_thisVote.blockNumber = block.number;
_thisVote.startDate = block.timestamp;
_thisVote.voteRound = _voteRounds.length;
disputeIdsByReporter[_reporter].push(_disputeId);
uint256 _disputeFee = getDisputeFee();
if (_voteRounds.length == 1) {
require(
block.timestamp - _timestamp < 12 hours,
"Dispute must be started within reporting lock time"
);
openDisputesOnId[_queryId]++;
// calculate dispute fee based on number of open disputes on query ID
if (openDisputesOnId[_queryId] > 4) {
_disputeFee = oracle.getStakeAmount();
} else {
_disputeFee =
_disputeFee *
2 ** (openDisputesOnId[_queryId] - 1);
}
// slash a single stakeAmount from reporter
_thisDispute.slashedAmount = oracle.slashReporter(
_reporter,
address(this)
);
_thisDispute.value = oracle.retrieveData(_queryId, _timestamp);
oracle.removeValue(_queryId, _timestamp);
} else {
uint256 _prevId = _voteRounds[_voteRounds.length - 2];
require(
block.timestamp - voteInfo[_prevId].tallyDate < 1 days,
"New dispute round must be started within a day"
);
if (_voteRounds.length > 4) {
_disputeFee = oracle.getStakeAmount();
} else {
_disputeFee = _disputeFee * 2 ** (_voteRounds.length - 1);
}
_thisDispute.slashedAmount = disputeInfo[_voteRounds[0]]
.slashedAmount;
_thisDispute.value = disputeInfo[_voteRounds[0]].value;
}
_thisVote.fee = _disputeFee;
voteCount++;
require(
token.transferFrom(msg.sender, address(this), _disputeFee),
"Fee must be paid"
); // This is the dispute fee. Returned if dispute passes
emit NewDispute(_disputeId, _queryId, _timestamp, _reporter);
}
/**
* @dev Executes vote and transfers corresponding balances to initiator/reporter
* @param _disputeId is the ID of the vote being executed
*/
function executeVote(uint256 _disputeId) external {
// Ensure validity of vote ID, vote has been executed, and vote must be tallied
Vote storage _thisVote = voteInfo[_disputeId];
require(
_disputeId <= voteCount && _disputeId > 0,
"Dispute ID must be valid"
);
require(!_thisVote.executed, "Vote has already been executed");
require(_thisVote.tallyDate > 0, "Vote must be tallied");
// Ensure vote must be final vote and that time has to be pass (86400 = 24 * 60 * 60 for seconds in a day)
require(
voteRounds[_thisVote.identifierHash].length == _thisVote.voteRound,
"Must be the final vote"
);
//The time has to pass after the vote is tallied
require(
block.timestamp - _thisVote.tallyDate >= 1 days,
"1 day has to pass after tally to allow for disputes"
);
_thisVote.executed = true;
Dispute storage _thisDispute = disputeInfo[_disputeId];
openDisputesOnId[_thisDispute.queryId]--;
uint256 _i;
uint256 _voteID;
if (_thisVote.result == VoteResult.PASSED) {
// If vote is in dispute and passed, iterate through each vote round and transfer the dispute to initiator
for (
_i = voteRounds[_thisVote.identifierHash].length;
_i > 0;
_i--
) {
_voteID = voteRounds[_thisVote.identifierHash][_i - 1];
_thisVote = voteInfo[_voteID];
// If the first vote round, also make sure to transfer the reporter's slashed stake to the initiator
if (_i == 1) {
token.transfer(
_thisVote.initiator,
_thisDispute.slashedAmount
);
}
token.transfer(_thisVote.initiator, _thisVote.fee);
}
} else if (_thisVote.result == VoteResult.INVALID) {
// If vote is in dispute and is invalid, iterate through each vote round and transfer the dispute fee to initiator
for (
_i = voteRounds[_thisVote.identifierHash].length;
_i > 0;
_i--
) {
_voteID = voteRounds[_thisVote.identifierHash][_i - 1];
_thisVote = voteInfo[_voteID];
token.transfer(_thisVote.initiator, _thisVote.fee);
}
// Transfer slashed tokens back to disputed reporter
token.transfer(
_thisDispute.disputedReporter,
_thisDispute.slashedAmount
);
} else if (_thisVote.result == VoteResult.FAILED) {
// If vote is in dispute and fails, iterate through each vote round and transfer the dispute fee to disputed reporter
uint256 _reporterReward = 0;
for (
_i = voteRounds[_thisVote.identifierHash].length;
_i > 0;
_i--
) {
_voteID = voteRounds[_thisVote.identifierHash][_i - 1];
_thisVote = voteInfo[_voteID];
_reporterReward += _thisVote.fee;
}
_reporterReward += _thisDispute.slashedAmount;
token.transfer(_thisDispute.disputedReporter, _reporterReward);
}
emit VoteExecuted(_disputeId, voteInfo[_disputeId].result);
}
/**
* @dev Tallies the votes and begins the 1 day challenge period
* @param _disputeId is the dispute id
*/
function tallyVotes(uint256 _disputeId) external {
// Ensure vote has not been executed and that vote has not been tallied
Vote storage _thisVote = voteInfo[_disputeId];
require(_thisVote.tallyDate == 0, "Vote has already been tallied");
require(
_disputeId <= voteCount && _disputeId > 0,
"Vote does not exist"
);
// Determine appropriate vote duration dispute round
// Vote time increases as rounds increase but only up to 6 days (withdrawal period)
require(
block.timestamp - _thisVote.startDate >=
86400 * _thisVote.voteRound ||
block.timestamp - _thisVote.startDate >= 86400 * 6,
"Time for voting has not elapsed"
);
// Get total votes from each separate stakeholder group. This will allow
// normalization so each group's votes can be combined and compared to
// determine the vote outcome.
uint256 _tokenVoteSum = _thisVote.tokenholders.doesSupport +
_thisVote.tokenholders.against +
_thisVote.tokenholders.invalidQuery;
uint256 _reportersVoteSum = _thisVote.reporters.doesSupport +
_thisVote.reporters.against +
_thisVote.reporters.invalidQuery;
uint256 _multisigVoteSum = _thisVote.teamMultisig.doesSupport +
_thisVote.teamMultisig.against +
_thisVote.teamMultisig.invalidQuery;
uint256 _usersVoteSum = _thisVote.users.doesSupport +
_thisVote.users.against +
_thisVote.users.invalidQuery;
// Cannot divide by zero
if (_tokenVoteSum == 0) {
_tokenVoteSum++;
}
if (_reportersVoteSum == 0) {
_reportersVoteSum++;
}
if (_multisigVoteSum == 0) {
_multisigVoteSum++;
}
if (_usersVoteSum == 0) {
_usersVoteSum++;
}
// Normalize and combine each stakeholder group votes
uint256 _scaledDoesSupport = ((_thisVote.tokenholders.doesSupport *
1e18) / _tokenVoteSum) +
((_thisVote.reporters.doesSupport * 1e18) / _reportersVoteSum) +
((_thisVote.teamMultisig.doesSupport * 1e18) / _multisigVoteSum) +
((_thisVote.users.doesSupport * 1e18) / _usersVoteSum);
uint256 _scaledAgainst = ((_thisVote.tokenholders.against * 1e18) /
_tokenVoteSum) +
((_thisVote.reporters.against * 1e18) / _reportersVoteSum) +
((_thisVote.teamMultisig.against * 1e18) / _multisigVoteSum) +
((_thisVote.users.against * 1e18) / _usersVoteSum);
uint256 _scaledInvalid = ((_thisVote.tokenholders.invalidQuery * 1e18) /
_tokenVoteSum) +
((_thisVote.reporters.invalidQuery * 1e18) / _reportersVoteSum) +
((_thisVote.teamMultisig.invalidQuery * 1e18) / _multisigVoteSum) +
((_thisVote.users.invalidQuery * 1e18) / _usersVoteSum);
// If votes in support outweight the sum of against and invalid, result is passed
if (_scaledDoesSupport > _scaledAgainst + _scaledInvalid) {
_thisVote.result = VoteResult.PASSED;
// If votes in against outweight the sum of support and invalid, result is failed
} else if (_scaledAgainst > _scaledDoesSupport + _scaledInvalid) {
_thisVote.result = VoteResult.FAILED;
// Otherwise, result is invalid
} else {
_thisVote.result = VoteResult.INVALID;
}
_thisVote.tallyDate = block.timestamp; // Update time vote was tallied
emit VoteTallied(
_disputeId,
_thisVote.result,
_thisVote.initiator,
disputeInfo[_disputeId].disputedReporter
);
}
/**
* @dev Enables the sender address to cast a vote
* @param _disputeId is the ID of the vote
* @param _supports is the address's vote: whether or not they support or are against
* @param _invalidQuery is whether or not the dispute is valid
*/
function vote(
uint256 _disputeId,
bool _supports,
bool _invalidQuery
) public {
// Ensure that dispute has not been executed and that vote does not exist and is not tallied
require(
_disputeId <= voteCount && _disputeId > 0,
"Vote does not exist"
);
Vote storage _thisVote = voteInfo[_disputeId];
require(_thisVote.tallyDate == 0, "Vote has already been tallied");
require(!_thisVote.voted[msg.sender], "Sender has already voted");
// Update voting status and increment total queries for support, invalid, or against based on vote
_thisVote.voted[msg.sender] = true;
uint256 _tokenBalance = token.balanceOf(msg.sender);
(, uint256 _stakedBalance, uint256 _lockedBalance, , , , , ) = oracle
.getStakerInfo(msg.sender);
_tokenBalance += _stakedBalance + _lockedBalance;
if (_invalidQuery) {
_thisVote.tokenholders.invalidQuery += _tokenBalance;
_thisVote.reporters.invalidQuery += oracle
.getReportsSubmittedByAddress(msg.sender);
_thisVote.users.invalidQuery += _getUserTips(msg.sender);
if (msg.sender == teamMultisig) {
_thisVote.teamMultisig.invalidQuery += 1;
}
} else if (_supports) {
_thisVote.tokenholders.doesSupport += _tokenBalance;
_thisVote.reporters.doesSupport += oracle
.getReportsSubmittedByAddress(msg.sender);
_thisVote.users.doesSupport += _getUserTips(msg.sender);
if (msg.sender == teamMultisig) {
_thisVote.teamMultisig.doesSupport += 1;
}
} else {
_thisVote.tokenholders.against += _tokenBalance;
_thisVote.reporters.against += oracle.getReportsSubmittedByAddress(
msg.sender
);
_thisVote.users.against += _getUserTips(msg.sender);
if (msg.sender == teamMultisig) {
_thisVote.teamMultisig.against += 1;
}
}
voteTallyByAddress[msg.sender]++;
emit Voted(_disputeId, _supports, msg.sender, _invalidQuery);
}
/**
* @dev Enables the sender address to cast votes for multiple disputes
* @param _disputeIds is an array of vote IDs
* @param _supports is an array of the address's votes: whether or not they support or are against
* @param _invalidQuery is array of whether or not the dispute is valid
*/
function voteOnMultipleDisputes(
uint256[] memory _disputeIds,
bool[] memory _supports,
bool[] memory _invalidQuery
) external {
for (uint256 _i = 0; _i < _disputeIds.length; _i++) {
vote(_disputeIds[_i], _supports[_i], _invalidQuery[_i]);
}
}
// *****************************************************************************
// * *
// * Getters *
// * *
// *****************************************************************************
/**
* @dev Determines if an address voted for a specific vote
* @param _disputeId is the ID of the vote
* @param _voter is the address of the voter to check for
* @return bool of whether or note the address voted for the specific vote
*/
function didVote(
uint256 _disputeId,
address _voter
) external view returns (bool) {
return voteInfo[_disputeId].voted[_voter];
}
/**
* @dev Get the latest dispute fee
*/
function getDisputeFee() public view returns (uint256) {
return (oracle.getStakeAmount() / 10);
}
function getDisputesByReporter(
address _reporter
) external view returns (uint256[] memory) {
return disputeIdsByReporter[_reporter];
}
/**
* @dev Returns info on a dispute for a given ID
* @param _disputeId is the ID of a specific dispute
* @return bytes32 of the data ID of the dispute
* @return uint256 of the timestamp of the dispute
* @return bytes memory of the value being disputed
* @return address of the reporter being disputed
*/
function getDisputeInfo(
uint256 _disputeId
) external view returns (bytes32, uint256, bytes memory, address) {
Dispute storage _d = disputeInfo[_disputeId];
return (_d.queryId, _d.timestamp, _d.value, _d.disputedReporter);
}
/**
* @dev Returns the number of open disputes for a specific query ID
* @param _queryId is the ID of a specific data feed
* @return uint256 of the number of open disputes for the query ID
*/
function getOpenDisputesOnId(
bytes32 _queryId
) external view returns (uint256) {
return openDisputesOnId[_queryId];
}
/**
* @dev Returns the total number of votes
* @return uint256 of the total number of votes
*/
function getVoteCount() external view returns (uint256) {
return voteCount;
}
/**
* @dev Returns info on a vote for a given vote ID
* @param _disputeId is the ID of a specific vote
* @return bytes32 identifier hash of the vote
* @return uint256[17] memory of the pertinent round info (vote rounds, start date, fee, etc.)
* @return bool memory of both whether or not the vote was executed
* @return VoteResult result of the vote
* @return address memory of the vote initiator
*/
function getVoteInfo(
uint256 _disputeId
)
external
view
returns (bytes32, uint256[17] memory, bool, VoteResult, address)
{
Vote storage _v = voteInfo[_disputeId];
return (
_v.identifierHash,
[
_v.voteRound,
_v.startDate,
_v.blockNumber,
_v.fee,
_v.tallyDate,
_v.tokenholders.doesSupport,
_v.tokenholders.against,
_v.tokenholders.invalidQuery,
_v.users.doesSupport,
_v.users.against,
_v.users.invalidQuery,
_v.reporters.doesSupport,
_v.reporters.against,
_v.reporters.invalidQuery,
_v.teamMultisig.doesSupport,
_v.teamMultisig.against,
_v.teamMultisig.invalidQuery
],
_v.executed,
_v.result,
_v.initiator
);
}
/**
* @dev Returns an array of voting rounds for a given vote
* @param _hash is the identifier hash for a vote
* @return uint256[] memory dispute IDs of the vote rounds
*/
function getVoteRounds(
bytes32 _hash
) external view returns (uint256[] memory) {
return voteRounds[_hash];
}
/**
* @dev Returns the total number of votes cast by an address
* @param _voter is the address of the voter to check for
* @return uint256 of the total number of votes cast by the voter
*/
function getVoteTallyByAddress(
address _voter
) external view returns (uint256) {
return voteTallyByAddress[_voter];
}
// Internal
/**
* @dev Retrieves total tips contributed to autopay by a given address
* @param _user address of the user to check the tip count for
* @return _userTipTally uint256 of total tips contributed to autopay by the address
*/
function _getUserTips(
address _user
) internal returns (uint256 _userTipTally) {
// get autopay addresses array from oracle
(bytes memory _autopayAddrsBytes, uint256 _timestamp) = getDataBefore(
autopayAddrsQueryId,
block.timestamp - 12 hours
);
if (_timestamp > 0) {
address[] memory _autopayAddrs = abi.decode(
_autopayAddrsBytes,
(address[])
);
// iterate through autopay addresses retrieve tips by user address
for (uint256 _i = 0; _i < _autopayAddrs.length; _i++) {
(bool _success, bytes memory _returnData) = _autopayAddrs[_i]
.call(
abi.encodeWithSignature(
"getTipsByAddress(address)",
_user
)
);
if (_success) {
_userTipTally += abi.decode(_returnData, (uint256));
}
}
}
}
}Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"_tellor","type":"address"},{"internalType":"address","name":"_teamMultisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"enum Governance.VoteResult","name":"_result","type":"uint8"}],"name":"VoteExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"enum Governance.VoteResult","name":"_result","type":"uint8"},{"indexed":false,"internalType":"address","name":"_initiator","type":"address"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"VoteTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_supports","type":"bool"},{"indexed":false,"internalType":"address","name":"_voter","type":"address"},{"indexed":false,"internalType":"bool","name":"_invalidQuery","type":"bool"}],"name":"Voted","type":"event"},{"inputs":[],"name":"autopayAddrsQueryId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"beginDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"}],"name":"didVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"executeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataAfter","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDisputeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"getDisputeInfo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getDisputesByReporter","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataAfter","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"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"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_maxAge","type":"uint256"},{"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"getMultipleValuesBefore","outputs":[{"internalType":"bytes[]","name":"_values","type":"bytes[]"},{"internalType":"uint256[]","name":"_timestamps","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":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getOpenDisputesOnId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"getVoteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"getVoteInfo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256[17]","name":"","type":"uint256[17]"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"enum Governance.VoteResult","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"getVoteRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"getVoteTallyByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idMappingContract","outputs":[{"internalType":"contract IMappingContract","name":"","type":"address"}],"stateMutability":"view","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":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"_addy","type":"address"}],"name":"setIdMappingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"tallyVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tellor","outputs":[{"internalType":"contract ITellor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"valueFor","outputs":[{"internalType":"int256","name":"_value","type":"int256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_statusCode","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"bool","name":"_supports","type":"bool"},{"internalType":"bool","name":"_invalidQuery","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_disputeIds","type":"uint256[]"},{"internalType":"bool[]","name":"_supports","type":"bool[]"},{"internalType":"bool[]","name":"_invalidQuery","type":"bool[]"}],"name":"voteOnMultipleDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
0x60a060405260006080908152620000189060c06200020f565b60408051601f1981840301815290829052620000379160200162000224565b604051602081830303815290604052805190602001206007553480156200005d57600080fd5b5060405162003e3438038062003e34833981016040819052620000809162000183565b600080546001600160a01b0384166001600160a01b0319918216811790925560028054909116821790556040805163021fd35d60e31b815290516310fe9ae891600480820192602092909190829003018186803b158015620000e157600080fd5b505afa158015620000f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011c91906200015d565b600380546001600160a01b03199081166001600160a01b03938416179091556004805482169483169490941790935560058054909316911617905562000279565b6000602082840312156200016f578081fd5b81516200017c8162000260565b9392505050565b6000806040838503121562000196578081fd5b8251620001a38162000260565b6020840151909250620001b68162000260565b809150509250929050565b60008151808452815b81811015620001e857602081850181015186830182015201620001ca565b81811115620001fa5782602083870101525b50601f01601f19169290920160200192915050565b6000602082526200017c6020830184620001c1565b600060408252601060408301526f4175746f70617941646472657373657360801b6060830152608060208301526200017c6080830184620001c1565b6001600160a01b03811681146200027657600080fd5b50565b613bab80620002896000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c8063a7c438bc1161011a578063dbc0c085116100ad578063f66f49c31161007c578063f66f49c3146104f1578063f78eea8314610504578063f98a4eca14610532578063fc0c546a14610545578063fcd4a5461461055857610205565b8063dbc0c085146104b0578063df133bca146104c3578063e07c5486146104d6578063e7b3387c146104e957610205565b8063c5958af9116100e9578063c5958af91461046b578063c63840711461048b578063ce5e11bf14610494578063d8add0f6146104a757610205565b8063a7c438bc146103ea578063a89ae4ba14610427578063bbf3e10b1461043a578063bdc7d9d81461044257610205565b806344e87f911161019d57806364ee3c6d1161016c57806364ee3c6d1461036c57806377b03e0d1461038d5780637dc0d1d0146103a05780638d824273146103b3578063a792765f146103d757610205565b806344e87f91146103005780634d318b0e146103235780634e9fe708146103365780636169c3081461034957610205565b80631f379acc116101d95780631f379acc14610290578063248638e5146102a357806329449085146102c35780632af8aae0146102ed57610205565b8062b121901461020a5780630e1596ef1461021f578063193b505b146102525780631959ad5b14610265575b600080fd5b61021d61021836600461337c565b610579565b005b61023f61022d3660046134fa565b60009081526009602052604090205490565b6040519081526020015b60405180910390f35b61021d6102603660046132a8565b61061d565b600054610278906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61021d61029e36600461352a565b610655565b6102b66102b13660046134fa565b610eba565b6040516102499190613794565b6102d66102d136600461352a565b610f1c565b604080519215158352602083019190915201610249565b600154610278906001600160a01b031681565b61031361030e36600461352a565b610fab565b6040519015158152602001610249565b61021d6103313660046134fa565b611036565b6102b66103443660046132a8565b61154b565b61035c6103573660046134fa565b6115b5565b604051610249949392919061380a565b61037f61037a36600461352a565b611689565b604051610249929190613856565b61023f61039b3660046134fa565b6116e2565b600254610278906001600160a01b031681565b6103c66103c13660046134fa565b611765565b6040516102499594939291906137a7565b61037f6103e536600461352a565b61186a565b6103136103f83660046135af565b6000828152600a602090815260408083206001600160a01b038516845260130190915290205460ff1692915050565b600454610278906001600160a01b031681565b61023f611900565b61023f6104503660046132a8565b6001600160a01b03166000908152600c602052604090205490565b61047e61047936600461352a565b611999565b6040516102499190613843565b61023f60065481565b61023f6104a236600461352a565b611a21565b61023f60075481565b600554610278906001600160a01b031681565b61021d6104d13660046135de565b611aa5565b6102786104e436600461352a565b612082565b60065461023f565b6102d66104ff36600461352a565b612106565b6105176105123660046134fa565b6122c2565b60408051938452602084019290925290820152606001610249565b61021d6105403660046134fa565b612392565b600354610278906001600160a01b031681565b61056b61056636600461354b565b612b71565b60405161024992919061371f565b60005b8351811015610617576106058482815181106105a857634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106105d057634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106105f857634e487b7160e01b600052603260045260246000fd5b6020026020010151611aa5565b8061060f81613b08565b91505061057c565b50505050565b6001546001600160a01b03161561063357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405163703e2a4360e11b815260048101849052602481018390526000916001600160a01b03169063e07c54869060440160206040518083038186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906132c4565b90506001600160a01b0381166107415760405162461bcd60e51b815260206004820152602260248201527f6e6f2076616c75652065786973747320617420676976656e2074696d6573746160448201526106d760f41b60648201526084015b60405180910390fd5b6040805160208082018690528183018590528251808303840181526060909201909252805191012060065460009061077a906001613917565b6000838152600b60209081526040808320805460018082018355828652848620909101869055858552600a8452828520600885528386208c81558083018c9055600380820180546001600160a01b0319166001600160a01b038e169081179091558b845560128401805475ffffffffffffffffffffffffffffffffffffffff0000191633620100000217905543918401919091554260028401558454838501558752600d8652938620805492830181558652938520018590559394509091610840611900565b845490915060011415610b4b5761a8c061085a8942613a79565b106108c25760405162461bcd60e51b815260206004820152603260248201527f44697370757465206d75737420626520737461727465642077697468696e207260448201527165706f7274696e67206c6f636b2074696d6560701b6064820152608401610738565b60008981526009602052604081208054916108dc83613b08565b90915550506000898152600960205260409020546004101561098557600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190613512565b90506109b8565b6000898152600960205260409020546109a090600190613a79565b6109ab90600261398c565b6109b59082613a5a565b90505b60025460405163137f0a8d60e21b81526001600160a01b03898116600483015230602483015290911690634dfc2a3490604401602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613512565b60048381019190915560025460405163c5958af960e01b81529182018b9052602482018a90526001600160a01b03169063c5958af99060440160006040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aca919081019061357c565b8051610ae0916002850191602090910190613093565b506002546040516316d7b73f60e21b8152600481018b9052602481018a90526001600160a01b0390911690635b5edcfc90604401600060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b50505050610d79565b83546000908590610b5e90600290613a79565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905062015180600a60008381526020019081526020016000206005015442610baf9190613a79565b10610c135760405162461bcd60e51b815260206004820152602e60248201527f4e6577206469737075746520726f756e64206d7573742062652073746172746560448201526d642077697468696e20612064617960901b6064820152608401610738565b845460041015610caa57600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6b57600080fd5b505afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca39190613512565b9150610cd0565b8454610cb890600190613a79565b610cc390600261398c565b610ccd9083613a5a565b91505b6008600086600081548110610cf557634e487b7160e01b600052603260045260246000fd5b906000526020600020015481526020019081526020016000206004015483600401819055506008600086600081548110610d3f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020183600201908054610d6b90613ad3565b610d76929190613117565b50505b6004830181905560068054906000610d9083613b08565b90915550506003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190613459565b610e5e5760405162461bcd60e51b815260206004820152601060248201526f119959481b5d5cdd081899481c185a5960821b6044820152606401610738565b60408051868152602081018b90529081018990526001600160a01b03881660608201527f12b7317353cd7caa8eae8057464e3de356c1429d814fb3421797eccb19043044906080015b60405180910390a1505050505050505050565b6000818152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610f1057602002820191906000526020600020905b815481526020019060010190808311610efc575b50505050509050919050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9f91906134cd565b915091505b9250929050565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613459565b9392505050565b6000818152600a602052604090206005810154156110965760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b60065482111580156110a85750600082115b6110ea5760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b60018101546110fc9062015180613a5a565b600282015461110b9042613a79565b10158061112a57506207e9008160020154426111279190613a79565b10155b6111765760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c6170736564006044820152606401610738565b6008810154600782015460068301546000929161119291613917565b61119c9190613917565b600e830154600d840154600c8501549293506000926111bb9190613917565b6111c59190613917565b60118401546010850154600f8601549293506000926111e49190613917565b6111ee9190613917565b600b850154600a860154600987015492935060009261120d9190613917565b6112179190613917565b90508361122c578361122881613b08565b9450505b8261123f578261123b81613b08565b9350505b81611252578161124e81613b08565b9250505b80611265578061126181613b08565b9150505b6009850154600090829061128190670de0b6b3a7640000613a5a565b61128b919061392f565b600f87015484906112a490670de0b6b3a7640000613a5a565b6112ae919061392f565b600c88015486906112c790670de0b6b3a7640000613a5a565b6112d1919061392f565b600689015488906112ea90670de0b6b3a7640000613a5a565b6112f4919061392f565b6112fe9190613917565b6113089190613917565b6113129190613917565b90506000828760090160010154670de0b6b3a76400006113329190613a5a565b61133c919061392f565b6010880154859061135590670de0b6b3a7640000613a5a565b61135f919061392f565b600d890154879061137890670de0b6b3a7640000613a5a565b611382919061392f565b60078a0154899061139b90670de0b6b3a7640000613a5a565b6113a5919061392f565b6113af9190613917565b6113b99190613917565b6113c39190613917565b90506000838860090160020154670de0b6b3a76400006113e39190613a5a565b6113ed919061392f565b6011890154869061140690670de0b6b3a7640000613a5a565b611410919061392f565b600e8a0154889061142990670de0b6b3a7640000613a5a565b611433919061392f565b60088b01548a9061144c90670de0b6b3a7640000613a5a565b611456919061392f565b6114609190613917565b61146a9190613917565b6114749190613917565b90506114808183613917565b8311156114a5576012880180546001919061ff001916610100835b02179055506114e0565b6114af8184613917565b8211156114ce576012880180546000919061ff0019166101008361149b565b60128801805461ff0019166102001790555b426005890155601288015460008a815260086020526040908190206003015490517fa2d4e500801849d40ad00f0f12ba92a5263f83ec68946e647be95cfbe581c7b692610ea7928d9260ff610100840416926001600160a01b0362010000909104811692169061388c565b6001600160a01b0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015610f105760200282019190600052602060002090815481526020019060010190808311610efc5750505050509050919050565b6000818152600860205260408120805460018201546003830154600284018054869560609587959194909391926001600160a01b039091169082906115f990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461162590613ad3565b80156116725780601f1061164757610100808354040283529160200191611672565b820191906000526020600020905b81548152906001019060200180831161165557829003601f168201915b505050505091509450945094509450509193509193565b6060600080600061169a8686612106565b91509150816116c15760006040518060200160405280600081525090935093505050610fa4565b6116cb8682611a21565b92506116d78684611999565b935050509250929050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190613512565b92915050565b600061176f613192565b50506000908152600a60208181526040928390208054845161022081018652600183015481526002830154938101939093526003820154948301949094526004810154606083015260058101546080830152600681015460a0830152600781015460c0830152600881015460e083015260098101546101008084019190915292810154610120830152600b810154610140830152600c810154610160830152600d810154610180830152600e8101546101a0830152600f8101546101c083015260108101546101e08301526011810154610200830152601201549293909260ff8082169382041691620100009091046001600160a01b031690565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f49190810190613475565b90969095509350505050565b6000600a600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561195257600080fd5b505afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190613512565b611994919061392f565b905090565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b1580156119e557600080fd5b505afa1580156119f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102f919081019061357c565b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b158015611a6d57600080fd5b505afa158015611a81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613512565b6006548311158015611ab75750600083115b611af95760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b6000838152600a60205260409020600581015415611b595760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b33600090815260138201602052604090205460ff1615611bbb5760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f74656400000000000000006044820152606401610738565b336000818152601383016020526040808220805460ff1916600117905560035490516370a0823160e01b8152600481019390935290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190613512565b600254604051630733bdef60e41b815233600482015291925060009182916001600160a01b03169063733bdef0906024016101006040518083038186803b158015611ca057600080fd5b505afa158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd8919061361f565b505050505092509250508082611cee9190613917565b611cf89084613917565b92508415611e095782846006016002016000828254611d179190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611d5f57600080fd5b505afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613512565b600e85018054600090611dab908490613917565b90915550611dba905033612ed0565b600b85018054600090611dce908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016002016000828254611dfe9190613917565b90915550505b612011565b8515611f0d5782846006016000016000828254611e269190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613512565b600c85018054600090611eba908490613917565b90915550611ec9905033612ed0565b600985018054600090611edd908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016000016000828254611dfe9190613917565b82846006016001016000828254611f249190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190613512565b600d85018054600090611fb8908490613917565b90915550611fc7905033612ed0565b600a85018054600090611fdb908490613917565b90915550506005546001600160a01b031633141561201157600184600f01600101600082825461200b9190613917565b90915550505b336000908152600c6020526040812080549161202c83613b08565b90915550506040805188815287151560208201523381830152861515606082015290517fbe6f1c58cc15c8e86d6f0ef23c5a30eb33319af3b57f6b7d9b56ccfa87696b849181900360800190a150505050505050565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b1580156120ce57600080fd5b505afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f91906132c4565b6000806000612114856116e2565b905080612128576000809250925050610fa4565b8061213281613abc565b91506001905060008083816121478a83611a21565b90508881116121625760008097509750505050505050610fa4565b61216c8a84611a21565b90508881111561217b57600094505b841561222d57600261218d8484613917565b612197919061392f565b93506121a38a85611a21565b9050888111156121e45760006121be8b6104a2600188613a79565b90508981116121d057600095506121de565b6121db600186613a79565b92505b50612228565b60006121f58b6104a2876001613917565b90508981111561221857600095508461220d81613b08565b955050809150612226565b612223856001613917565b93505b505b61217b565b6122378a82610fab565b61224d5760018497509750505050505050610fa4565b6122578a82610fab565b801561226257508584105b15612285578361227181613b08565b94505061227e8a85611a21565b905061224d565b858414801561229957506122998a82610fab565b156122b05760008097509750505050505050610fa4565b60018497509750505050505050610fa4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190613512565b9050606061235a826103e5426001613917565b945090508361237657600080610194945094509450505061238b565b60006123818261302e565b955060c893505050505b9193909250565b6000818152600a6020526040902060065482118015906123b25750600082115b6123fe5760405162461bcd60e51b815260206004820152601860248201527f44697370757465204944206d7573742062652076616c696400000000000000006044820152606401610738565b601281015460ff16156124535760405162461bcd60e51b815260206004820152601e60248201527f566f74652068617320616c7265616479206265656e20657865637574656400006044820152606401610738565b60008160050154116124a75760405162461bcd60e51b815260206004820152601460248201527f566f7465206d7573742062652074616c6c6965640000000000000000000000006044820152606401610738565b600181015481546000908152600b60205260409020541461250a5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265207468652066696e616c20766f7465000000000000000000006044820152606401610738565b6201518081600501544261251e9190613a79565b10156125885760405162461bcd60e51b815260206004820152603360248201527f31206461792068617320746f20706173732061667465722074616c6c7920746f60448201527220616c6c6f7720666f7220646973707574657360681b6064820152608401610738565b60128101805460ff1916600117905560008281526008602090815260408083208054845260099092528220805491926125c083613abc565b90915550600090508060016012850154610100900460ff1660028111156125f757634e487b7160e01b600052602160045260246000fd5b14156127c15783546000908152600b602052604090205491505b81156127bc5783546000908152600b60205260409020612632600184613a79565b8154811061265057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600a60008281526020019081526020016000209350816001141561271357600354601285015460048581015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190613459565b505b600354601285015460048087015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a99190613459565b50816127b481613abc565b925050612611565b612b16565b60026012850154610100900460ff1660028111156127ef57634e487b7160e01b600052602160045260246000fd5b14156129ab5783546000908152600b602052604090205491505b81156129155783546000908152600b6020526040902061282a600184613a79565b8154811061284857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910154808352600a9091526040918290206003546012820154600480840154955163a9059cbb60e01b81526001600160a01b03620100009093048316918101919091526024810195909552919750919350169063a9059cbb90604401602060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613459565b508161290d81613abc565b925050612809565b600380549084015460048086015460405163a9059cbb60e01b81526001600160a01b0393841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561296d57600080fd5b505af1158015612981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a59190613459565b50612b16565b60006012850154610100900460ff1660028111156129d957634e487b7160e01b600052602160045260246000fd5b1415612b165783546000908152600b602052604081205492505b8215612a785784546000908152600b60205260409020612a14600185613a79565b81548110612a3257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549150600a60008381526020019081526020016000209450846004015481612a649190613917565b905082612a7081613abc565b9350506129f3565b6004840154612a879082613917565b600380549086015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b139190613459565b50505b6000858152600a6020526040908190206012015490517f40d231bf91823121de9e1c012d95f835ea5684dc1d93360d9510a30543345da491612b62918891610100900460ff1690613878565b60405180910390a15050505050565b606080600080612b85886104ff888a613a79565b9150915081612bd6576040805160008082526020820190925290612bb9565b6060815260200190600190039081612ba45790505b506040805160008152602081019091529094509250612ec7915050565b6000612be28989610f1c565b909350905082612c35576040805160008082526020820190925290612c17565b6060815260200190600190039081612c025790505b506040805160008152602081019091529095509350612ec792505050565b60008060008867ffffffffffffffff811115612c6157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c8a578160200160208202803683370190505b5090505b8883108015612cb157508482612ca5866001613917565b612caf9190613a79565b115b15612d23576000612cc68d6104a28588613a79565b9050612cd28d82610fab565b612d105780828581518110612cf757634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612d0c81613b08565b9450505b82612d1a81613b08565b93505050612c8e565b60008367ffffffffffffffff811115612d4c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d7f57816020015b6060815260200190600190039081612d6a5790505b50905060008467ffffffffffffffff811115612dab57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612dd4578160200160208202803683370190505b50905060005b85811015612eba578381612def600189613a79565b612df99190613a79565b81518110612e1757634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612e3f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612e7c8f838381518110612e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151611999565b838281518110612e9c57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612eb290613b08565b915050612dda565b5090985096505050505050505b94509492505050565b6000806000612ee960075461a8c0426103e59190613a79565b9092509050801561302757600082806020019051810190612f0a91906132e0565b905060005b815181101561302457600080838381518110612f3b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031688604051602401612f6c91906001600160a01b0391909116815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166345d6082360e01b17905251612fa19190613703565b6000604051808303816000865af19150503d8060008114612fde576040519150601f19603f3d011682016040523d82523d6000602084013e612fe3565b606091505b5091509150811561300f57808060200190518101906130029190613512565b61300c9088613917565b96505b5050808061301c90613b08565b915050612f0f565b50505b5050919050565b6000805b825181101561308d5782818151811061305b57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61306f83610100613a5a565b6130799190613917565b91508061308581613b08565b915050613032565b50919050565b82805461309f90613ad3565b90600052602060002090601f0160209004810192826130c15760008555613107565b82601f106130da57805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131075782518255916020019190600101906130ec565b506131139291506131b1565b5090565b82805461312390613ad3565b90600052602060002090601f0160209004810192826131455760008555613107565b82601f106131565780548555613107565b8280016001018555821561310757600052602060002091601f016020900482015b82811115613107578254825591600101919060010190613177565b6040518061022001604052806011906020820280368337509192915050565b5b8082111561311357600081556001016131b2565b600082601f8301126131d6578081fd5b813560206131eb6131e6836138f3565b6138c2565b80838252828201915082860187848660051b890101111561320a578586fd5b855b8581101561323157813561321f81613b67565b8452928401929084019060010161320c565b5090979650505050505050565b600082601f83011261324e578081fd5b815167ffffffffffffffff81111561326857613268613b39565b61327b601f8201601f19166020016138c2565b81815284602083860101111561328f578283fd5b6132a0826020830160208701613a90565b949350505050565b6000602082840312156132b9578081fd5b813561102f81613b4f565b6000602082840312156132d5578081fd5b815161102f81613b4f565b600060208083850312156132f2578182fd5b825167ffffffffffffffff811115613308578283fd5b8301601f81018513613318578283fd5b80516133266131e6826138f3565b80828252848201915084840188868560051b8701011115613345578687fd5b8694505b8385101561337057805161335c81613b4f565b835260019490940193918501918501613349565b50979650505050505050565b600080600060608486031215613390578182fd5b833567ffffffffffffffff808211156133a7578384fd5b818601915086601f8301126133ba578384fd5b813560206133ca6131e6836138f3565b8083825282820191508286018b848660051b89010111156133e9578889fd5b8896505b8487101561340b5780358352600196909601959183019183016133ed565b5097505087013592505080821115613421578384fd5b61342d878388016131c6565b93506040860135915080821115613442578283fd5b5061344f868287016131c6565b9150509250925092565b60006020828403121561346a578081fd5b815161102f81613b67565b600080600060608486031215613489578283fd5b835161349481613b67565b602085015190935067ffffffffffffffff8111156134b0578283fd5b6134bc8682870161323e565b925050604084015190509250925092565b600080604083850312156134df578182fd5b82516134ea81613b67565b6020939093015192949293505050565b60006020828403121561350b578081fd5b5035919050565b600060208284031215613523578081fd5b5051919050565b6000806040838503121561353c578182fd5b50508035926020909101359150565b60008060008060808587031215613560578182fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358d578081fd5b815167ffffffffffffffff8111156135a3578182fd5b6132a08482850161323e565b600080604083850312156135c1578182fd5b8235915060208301356135d381613b4f565b809150509250929050565b6000806000606084860312156135f2578081fd5b83359250602084013561360481613b67565b9150604084013561361481613b67565b809150509250925092565b600080600080600080600080610100898b03121561363b578586fd5b505086516020880151604089015160608a015160808b015160a08c015160c08d015160e0909d0151959e949d50929b919a50985090965094509092509050565b6000815180845260208085019450808401835b838110156136aa5781518752958201959082019060010161368e565b509495945050505050565b600081518084526136cd816020860160208601613a90565b601f01601f19169290920160200192915050565b600381106136ff57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613715818460208701613a90565b9190910192915050565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b8381101561377557605f198887030185526137638683516136b5565b95509382019390820190600101613747565b50508584038187015250505061378b818561367b565b95945050505050565b60006020825261102f602083018461367b565b8581526102a0810160208083018760005b60118110156137d5578151835291830191908301906001016137b8565b505050508415156102408301526137f06102608301856136e1565b6001600160a01b0383166102808301529695505050505050565b60008582528460208301526080604083015261382960808301856136b5565b90506001600160a01b038316606083015295945050505050565b60006020825261102f60208301846136b5565b60006040825261386960408301856136b5565b90508260208301529392505050565b8281526040810161102f60208301846136e1565b848152608081016138a060208301866136e1565b6001600160a01b03808516604084015280841660608401525095945050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156138eb576138eb613b39565b604052919050565b600067ffffffffffffffff82111561390d5761390d613b39565b5060051b60200190565b6000821982111561392a5761392a613b23565b500190565b60008261394a57634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116139615750612ec7565b81870482111561397357613973613b23565b8086161561398057918102915b9490941c938002613952565b600061102f60001984846000826139a55750600161102f565b816139b25750600061102f565b81600181146139c857600281146139d2576139ff565b600191505061102f565b60ff8411156139e3576139e3613b23565b6001841b9150848211156139f9576139f9613b23565b5061102f565b5060208310610133831016604e8410600b8410161715613a32575081810a83811115613a2d57613a2d613b23565b61102f565b613a3f848484600161394f565b808604821115613a5157613a51613b23565b02949350505050565b6000816000190483118215151615613a7457613a74613b23565b500290565b600082821015613a8b57613a8b613b23565b500390565b60005b83811015613aab578181015183820152602001613a93565b838111156106175750506000910152565b600081613acb57613acb613b23565b506000190190565b600181811c90821680613ae757607f821691505b6020821081141561308d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613b1c57613b1c613b23565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b6457600080fd5b50565b8015158114613b6457600080fdfea2646970667358221220d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe564736f6c63430008030033000000000000000000000000c7199e0686df9844b511faf2796c518f6d7292eb000000000000000000000000896419ed2e0dc848a1f7d2814f4e5df4b9b9bfcc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102055760003560e01c8063a7c438bc1161011a578063dbc0c085116100ad578063f66f49c31161007c578063f66f49c3146104f1578063f78eea8314610504578063f98a4eca14610532578063fc0c546a14610545578063fcd4a5461461055857610205565b8063dbc0c085146104b0578063df133bca146104c3578063e07c5486146104d6578063e7b3387c146104e957610205565b8063c5958af9116100e9578063c5958af91461046b578063c63840711461048b578063ce5e11bf14610494578063d8add0f6146104a757610205565b8063a7c438bc146103ea578063a89ae4ba14610427578063bbf3e10b1461043a578063bdc7d9d81461044257610205565b806344e87f911161019d57806364ee3c6d1161016c57806364ee3c6d1461036c57806377b03e0d1461038d5780637dc0d1d0146103a05780638d824273146103b3578063a792765f146103d757610205565b806344e87f91146103005780634d318b0e146103235780634e9fe708146103365780636169c3081461034957610205565b80631f379acc116101d95780631f379acc14610290578063248638e5146102a357806329449085146102c35780632af8aae0146102ed57610205565b8062b121901461020a5780630e1596ef1461021f578063193b505b146102525780631959ad5b14610265575b600080fd5b61021d61021836600461337c565b610579565b005b61023f61022d3660046134fa565b60009081526009602052604090205490565b6040519081526020015b60405180910390f35b61021d6102603660046132a8565b61061d565b600054610278906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61021d61029e36600461352a565b610655565b6102b66102b13660046134fa565b610eba565b6040516102499190613794565b6102d66102d136600461352a565b610f1c565b604080519215158352602083019190915201610249565b600154610278906001600160a01b031681565b61031361030e36600461352a565b610fab565b6040519015158152602001610249565b61021d6103313660046134fa565b611036565b6102b66103443660046132a8565b61154b565b61035c6103573660046134fa565b6115b5565b604051610249949392919061380a565b61037f61037a36600461352a565b611689565b604051610249929190613856565b61023f61039b3660046134fa565b6116e2565b600254610278906001600160a01b031681565b6103c66103c13660046134fa565b611765565b6040516102499594939291906137a7565b61037f6103e536600461352a565b61186a565b6103136103f83660046135af565b6000828152600a602090815260408083206001600160a01b038516845260130190915290205460ff1692915050565b600454610278906001600160a01b031681565b61023f611900565b61023f6104503660046132a8565b6001600160a01b03166000908152600c602052604090205490565b61047e61047936600461352a565b611999565b6040516102499190613843565b61023f60065481565b61023f6104a236600461352a565b611a21565b61023f60075481565b600554610278906001600160a01b031681565b61021d6104d13660046135de565b611aa5565b6102786104e436600461352a565b612082565b60065461023f565b6102d66104ff36600461352a565b612106565b6105176105123660046134fa565b6122c2565b60408051938452602084019290925290820152606001610249565b61021d6105403660046134fa565b612392565b600354610278906001600160a01b031681565b61056b61056636600461354b565b612b71565b60405161024992919061371f565b60005b8351811015610617576106058482815181106105a857634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106105d057634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106105f857634e487b7160e01b600052603260045260246000fd5b6020026020010151611aa5565b8061060f81613b08565b91505061057c565b50505050565b6001546001600160a01b03161561063357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405163703e2a4360e11b815260048101849052602481018390526000916001600160a01b03169063e07c54869060440160206040518083038186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906132c4565b90506001600160a01b0381166107415760405162461bcd60e51b815260206004820152602260248201527f6e6f2076616c75652065786973747320617420676976656e2074696d6573746160448201526106d760f41b60648201526084015b60405180910390fd5b6040805160208082018690528183018590528251808303840181526060909201909252805191012060065460009061077a906001613917565b6000838152600b60209081526040808320805460018082018355828652848620909101869055858552600a8452828520600885528386208c81558083018c9055600380820180546001600160a01b0319166001600160a01b038e169081179091558b845560128401805475ffffffffffffffffffffffffffffffffffffffff0000191633620100000217905543918401919091554260028401558454838501558752600d8652938620805492830181558652938520018590559394509091610840611900565b845490915060011415610b4b5761a8c061085a8942613a79565b106108c25760405162461bcd60e51b815260206004820152603260248201527f44697370757465206d75737420626520737461727465642077697468696e207260448201527165706f7274696e67206c6f636b2074696d6560701b6064820152608401610738565b60008981526009602052604081208054916108dc83613b08565b90915550506000898152600960205260409020546004101561098557600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190613512565b90506109b8565b6000898152600960205260409020546109a090600190613a79565b6109ab90600261398c565b6109b59082613a5a565b90505b60025460405163137f0a8d60e21b81526001600160a01b03898116600483015230602483015290911690634dfc2a3490604401602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613512565b60048381019190915560025460405163c5958af960e01b81529182018b9052602482018a90526001600160a01b03169063c5958af99060440160006040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aca919081019061357c565b8051610ae0916002850191602090910190613093565b506002546040516316d7b73f60e21b8152600481018b9052602481018a90526001600160a01b0390911690635b5edcfc90604401600060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b50505050610d79565b83546000908590610b5e90600290613a79565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905062015180600a60008381526020019081526020016000206005015442610baf9190613a79565b10610c135760405162461bcd60e51b815260206004820152602e60248201527f4e6577206469737075746520726f756e64206d7573742062652073746172746560448201526d642077697468696e20612064617960901b6064820152608401610738565b845460041015610caa57600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6b57600080fd5b505afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca39190613512565b9150610cd0565b8454610cb890600190613a79565b610cc390600261398c565b610ccd9083613a5a565b91505b6008600086600081548110610cf557634e487b7160e01b600052603260045260246000fd5b906000526020600020015481526020019081526020016000206004015483600401819055506008600086600081548110610d3f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020183600201908054610d6b90613ad3565b610d76929190613117565b50505b6004830181905560068054906000610d9083613b08565b90915550506003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190613459565b610e5e5760405162461bcd60e51b815260206004820152601060248201526f119959481b5d5cdd081899481c185a5960821b6044820152606401610738565b60408051868152602081018b90529081018990526001600160a01b03881660608201527f12b7317353cd7caa8eae8057464e3de356c1429d814fb3421797eccb19043044906080015b60405180910390a1505050505050505050565b6000818152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610f1057602002820191906000526020600020905b815481526020019060010190808311610efc575b50505050509050919050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9f91906134cd565b915091505b9250929050565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613459565b9392505050565b6000818152600a602052604090206005810154156110965760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b60065482111580156110a85750600082115b6110ea5760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b60018101546110fc9062015180613a5a565b600282015461110b9042613a79565b10158061112a57506207e9008160020154426111279190613a79565b10155b6111765760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c6170736564006044820152606401610738565b6008810154600782015460068301546000929161119291613917565b61119c9190613917565b600e830154600d840154600c8501549293506000926111bb9190613917565b6111c59190613917565b60118401546010850154600f8601549293506000926111e49190613917565b6111ee9190613917565b600b850154600a860154600987015492935060009261120d9190613917565b6112179190613917565b90508361122c578361122881613b08565b9450505b8261123f578261123b81613b08565b9350505b81611252578161124e81613b08565b9250505b80611265578061126181613b08565b9150505b6009850154600090829061128190670de0b6b3a7640000613a5a565b61128b919061392f565b600f87015484906112a490670de0b6b3a7640000613a5a565b6112ae919061392f565b600c88015486906112c790670de0b6b3a7640000613a5a565b6112d1919061392f565b600689015488906112ea90670de0b6b3a7640000613a5a565b6112f4919061392f565b6112fe9190613917565b6113089190613917565b6113129190613917565b90506000828760090160010154670de0b6b3a76400006113329190613a5a565b61133c919061392f565b6010880154859061135590670de0b6b3a7640000613a5a565b61135f919061392f565b600d890154879061137890670de0b6b3a7640000613a5a565b611382919061392f565b60078a0154899061139b90670de0b6b3a7640000613a5a565b6113a5919061392f565b6113af9190613917565b6113b99190613917565b6113c39190613917565b90506000838860090160020154670de0b6b3a76400006113e39190613a5a565b6113ed919061392f565b6011890154869061140690670de0b6b3a7640000613a5a565b611410919061392f565b600e8a0154889061142990670de0b6b3a7640000613a5a565b611433919061392f565b60088b01548a9061144c90670de0b6b3a7640000613a5a565b611456919061392f565b6114609190613917565b61146a9190613917565b6114749190613917565b90506114808183613917565b8311156114a5576012880180546001919061ff001916610100835b02179055506114e0565b6114af8184613917565b8211156114ce576012880180546000919061ff0019166101008361149b565b60128801805461ff0019166102001790555b426005890155601288015460008a815260086020526040908190206003015490517fa2d4e500801849d40ad00f0f12ba92a5263f83ec68946e647be95cfbe581c7b692610ea7928d9260ff610100840416926001600160a01b0362010000909104811692169061388c565b6001600160a01b0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015610f105760200282019190600052602060002090815481526020019060010190808311610efc5750505050509050919050565b6000818152600860205260408120805460018201546003830154600284018054869560609587959194909391926001600160a01b039091169082906115f990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461162590613ad3565b80156116725780601f1061164757610100808354040283529160200191611672565b820191906000526020600020905b81548152906001019060200180831161165557829003601f168201915b505050505091509450945094509450509193509193565b6060600080600061169a8686612106565b91509150816116c15760006040518060200160405280600081525090935093505050610fa4565b6116cb8682611a21565b92506116d78684611999565b935050509250929050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190613512565b92915050565b600061176f613192565b50506000908152600a60208181526040928390208054845161022081018652600183015481526002830154938101939093526003820154948301949094526004810154606083015260058101546080830152600681015460a0830152600781015460c0830152600881015460e083015260098101546101008084019190915292810154610120830152600b810154610140830152600c810154610160830152600d810154610180830152600e8101546101a0830152600f8101546101c083015260108101546101e08301526011810154610200830152601201549293909260ff8082169382041691620100009091046001600160a01b031690565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f49190810190613475565b90969095509350505050565b6000600a600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561195257600080fd5b505afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190613512565b611994919061392f565b905090565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b1580156119e557600080fd5b505afa1580156119f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102f919081019061357c565b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b158015611a6d57600080fd5b505afa158015611a81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613512565b6006548311158015611ab75750600083115b611af95760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b6000838152600a60205260409020600581015415611b595760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b33600090815260138201602052604090205460ff1615611bbb5760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f74656400000000000000006044820152606401610738565b336000818152601383016020526040808220805460ff1916600117905560035490516370a0823160e01b8152600481019390935290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190613512565b600254604051630733bdef60e41b815233600482015291925060009182916001600160a01b03169063733bdef0906024016101006040518083038186803b158015611ca057600080fd5b505afa158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd8919061361f565b505050505092509250508082611cee9190613917565b611cf89084613917565b92508415611e095782846006016002016000828254611d179190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611d5f57600080fd5b505afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613512565b600e85018054600090611dab908490613917565b90915550611dba905033612ed0565b600b85018054600090611dce908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016002016000828254611dfe9190613917565b90915550505b612011565b8515611f0d5782846006016000016000828254611e269190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613512565b600c85018054600090611eba908490613917565b90915550611ec9905033612ed0565b600985018054600090611edd908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016000016000828254611dfe9190613917565b82846006016001016000828254611f249190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190613512565b600d85018054600090611fb8908490613917565b90915550611fc7905033612ed0565b600a85018054600090611fdb908490613917565b90915550506005546001600160a01b031633141561201157600184600f01600101600082825461200b9190613917565b90915550505b336000908152600c6020526040812080549161202c83613b08565b90915550506040805188815287151560208201523381830152861515606082015290517fbe6f1c58cc15c8e86d6f0ef23c5a30eb33319af3b57f6b7d9b56ccfa87696b849181900360800190a150505050505050565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b1580156120ce57600080fd5b505afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f91906132c4565b6000806000612114856116e2565b905080612128576000809250925050610fa4565b8061213281613abc565b91506001905060008083816121478a83611a21565b90508881116121625760008097509750505050505050610fa4565b61216c8a84611a21565b90508881111561217b57600094505b841561222d57600261218d8484613917565b612197919061392f565b93506121a38a85611a21565b9050888111156121e45760006121be8b6104a2600188613a79565b90508981116121d057600095506121de565b6121db600186613a79565b92505b50612228565b60006121f58b6104a2876001613917565b90508981111561221857600095508461220d81613b08565b955050809150612226565b612223856001613917565b93505b505b61217b565b6122378a82610fab565b61224d5760018497509750505050505050610fa4565b6122578a82610fab565b801561226257508584105b15612285578361227181613b08565b94505061227e8a85611a21565b905061224d565b858414801561229957506122998a82610fab565b156122b05760008097509750505050505050610fa4565b60018497509750505050505050610fa4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190613512565b9050606061235a826103e5426001613917565b945090508361237657600080610194945094509450505061238b565b60006123818261302e565b955060c893505050505b9193909250565b6000818152600a6020526040902060065482118015906123b25750600082115b6123fe5760405162461bcd60e51b815260206004820152601860248201527f44697370757465204944206d7573742062652076616c696400000000000000006044820152606401610738565b601281015460ff16156124535760405162461bcd60e51b815260206004820152601e60248201527f566f74652068617320616c7265616479206265656e20657865637574656400006044820152606401610738565b60008160050154116124a75760405162461bcd60e51b815260206004820152601460248201527f566f7465206d7573742062652074616c6c6965640000000000000000000000006044820152606401610738565b600181015481546000908152600b60205260409020541461250a5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265207468652066696e616c20766f7465000000000000000000006044820152606401610738565b6201518081600501544261251e9190613a79565b10156125885760405162461bcd60e51b815260206004820152603360248201527f31206461792068617320746f20706173732061667465722074616c6c7920746f60448201527220616c6c6f7720666f7220646973707574657360681b6064820152608401610738565b60128101805460ff1916600117905560008281526008602090815260408083208054845260099092528220805491926125c083613abc565b90915550600090508060016012850154610100900460ff1660028111156125f757634e487b7160e01b600052602160045260246000fd5b14156127c15783546000908152600b602052604090205491505b81156127bc5783546000908152600b60205260409020612632600184613a79565b8154811061265057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600a60008281526020019081526020016000209350816001141561271357600354601285015460048581015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190613459565b505b600354601285015460048087015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a99190613459565b50816127b481613abc565b925050612611565b612b16565b60026012850154610100900460ff1660028111156127ef57634e487b7160e01b600052602160045260246000fd5b14156129ab5783546000908152600b602052604090205491505b81156129155783546000908152600b6020526040902061282a600184613a79565b8154811061284857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910154808352600a9091526040918290206003546012820154600480840154955163a9059cbb60e01b81526001600160a01b03620100009093048316918101919091526024810195909552919750919350169063a9059cbb90604401602060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613459565b508161290d81613abc565b925050612809565b600380549084015460048086015460405163a9059cbb60e01b81526001600160a01b0393841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561296d57600080fd5b505af1158015612981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a59190613459565b50612b16565b60006012850154610100900460ff1660028111156129d957634e487b7160e01b600052602160045260246000fd5b1415612b165783546000908152600b602052604081205492505b8215612a785784546000908152600b60205260409020612a14600185613a79565b81548110612a3257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549150600a60008381526020019081526020016000209450846004015481612a649190613917565b905082612a7081613abc565b9350506129f3565b6004840154612a879082613917565b600380549086015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b139190613459565b50505b6000858152600a6020526040908190206012015490517f40d231bf91823121de9e1c012d95f835ea5684dc1d93360d9510a30543345da491612b62918891610100900460ff1690613878565b60405180910390a15050505050565b606080600080612b85886104ff888a613a79565b9150915081612bd6576040805160008082526020820190925290612bb9565b6060815260200190600190039081612ba45790505b506040805160008152602081019091529094509250612ec7915050565b6000612be28989610f1c565b909350905082612c35576040805160008082526020820190925290612c17565b6060815260200190600190039081612c025790505b506040805160008152602081019091529095509350612ec792505050565b60008060008867ffffffffffffffff811115612c6157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c8a578160200160208202803683370190505b5090505b8883108015612cb157508482612ca5866001613917565b612caf9190613a79565b115b15612d23576000612cc68d6104a28588613a79565b9050612cd28d82610fab565b612d105780828581518110612cf757634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612d0c81613b08565b9450505b82612d1a81613b08565b93505050612c8e565b60008367ffffffffffffffff811115612d4c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d7f57816020015b6060815260200190600190039081612d6a5790505b50905060008467ffffffffffffffff811115612dab57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612dd4578160200160208202803683370190505b50905060005b85811015612eba578381612def600189613a79565b612df99190613a79565b81518110612e1757634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612e3f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612e7c8f838381518110612e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151611999565b838281518110612e9c57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612eb290613b08565b915050612dda565b5090985096505050505050505b94509492505050565b6000806000612ee960075461a8c0426103e59190613a79565b9092509050801561302757600082806020019051810190612f0a91906132e0565b905060005b815181101561302457600080838381518110612f3b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031688604051602401612f6c91906001600160a01b0391909116815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166345d6082360e01b17905251612fa19190613703565b6000604051808303816000865af19150503d8060008114612fde576040519150601f19603f3d011682016040523d82523d6000602084013e612fe3565b606091505b5091509150811561300f57808060200190518101906130029190613512565b61300c9088613917565b96505b5050808061301c90613b08565b915050612f0f565b50505b5050919050565b6000805b825181101561308d5782818151811061305b57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61306f83610100613a5a565b6130799190613917565b91508061308581613b08565b915050613032565b50919050565b82805461309f90613ad3565b90600052602060002090601f0160209004810192826130c15760008555613107565b82601f106130da57805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131075782518255916020019190600101906130ec565b506131139291506131b1565b5090565b82805461312390613ad3565b90600052602060002090601f0160209004810192826131455760008555613107565b82601f106131565780548555613107565b8280016001018555821561310757600052602060002091601f016020900482015b82811115613107578254825591600101919060010190613177565b6040518061022001604052806011906020820280368337509192915050565b5b8082111561311357600081556001016131b2565b600082601f8301126131d6578081fd5b813560206131eb6131e6836138f3565b6138c2565b80838252828201915082860187848660051b890101111561320a578586fd5b855b8581101561323157813561321f81613b67565b8452928401929084019060010161320c565b5090979650505050505050565b600082601f83011261324e578081fd5b815167ffffffffffffffff81111561326857613268613b39565b61327b601f8201601f19166020016138c2565b81815284602083860101111561328f578283fd5b6132a0826020830160208701613a90565b949350505050565b6000602082840312156132b9578081fd5b813561102f81613b4f565b6000602082840312156132d5578081fd5b815161102f81613b4f565b600060208083850312156132f2578182fd5b825167ffffffffffffffff811115613308578283fd5b8301601f81018513613318578283fd5b80516133266131e6826138f3565b80828252848201915084840188868560051b8701011115613345578687fd5b8694505b8385101561337057805161335c81613b4f565b835260019490940193918501918501613349565b50979650505050505050565b600080600060608486031215613390578182fd5b833567ffffffffffffffff808211156133a7578384fd5b818601915086601f8301126133ba578384fd5b813560206133ca6131e6836138f3565b8083825282820191508286018b848660051b89010111156133e9578889fd5b8896505b8487101561340b5780358352600196909601959183019183016133ed565b5097505087013592505080821115613421578384fd5b61342d878388016131c6565b93506040860135915080821115613442578283fd5b5061344f868287016131c6565b9150509250925092565b60006020828403121561346a578081fd5b815161102f81613b67565b600080600060608486031215613489578283fd5b835161349481613b67565b602085015190935067ffffffffffffffff8111156134b0578283fd5b6134bc8682870161323e565b925050604084015190509250925092565b600080604083850312156134df578182fd5b82516134ea81613b67565b6020939093015192949293505050565b60006020828403121561350b578081fd5b5035919050565b600060208284031215613523578081fd5b5051919050565b6000806040838503121561353c578182fd5b50508035926020909101359150565b60008060008060808587031215613560578182fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358d578081fd5b815167ffffffffffffffff8111156135a3578182fd5b6132a08482850161323e565b600080604083850312156135c1578182fd5b8235915060208301356135d381613b4f565b809150509250929050565b6000806000606084860312156135f2578081fd5b83359250602084013561360481613b67565b9150604084013561361481613b67565b809150509250925092565b600080600080600080600080610100898b03121561363b578586fd5b505086516020880151604089015160608a015160808b015160a08c015160c08d015160e0909d0151959e949d50929b919a50985090965094509092509050565b6000815180845260208085019450808401835b838110156136aa5781518752958201959082019060010161368e565b509495945050505050565b600081518084526136cd816020860160208601613a90565b601f01601f19169290920160200192915050565b600381106136ff57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613715818460208701613a90565b9190910192915050565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b8381101561377557605f198887030185526137638683516136b5565b95509382019390820190600101613747565b50508584038187015250505061378b818561367b565b95945050505050565b60006020825261102f602083018461367b565b8581526102a0810160208083018760005b60118110156137d5578151835291830191908301906001016137b8565b505050508415156102408301526137f06102608301856136e1565b6001600160a01b0383166102808301529695505050505050565b60008582528460208301526080604083015261382960808301856136b5565b90506001600160a01b038316606083015295945050505050565b60006020825261102f60208301846136b5565b60006040825261386960408301856136b5565b90508260208301529392505050565b8281526040810161102f60208301846136e1565b848152608081016138a060208301866136e1565b6001600160a01b03808516604084015280841660608401525095945050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156138eb576138eb613b39565b604052919050565b600067ffffffffffffffff82111561390d5761390d613b39565b5060051b60200190565b6000821982111561392a5761392a613b23565b500190565b60008261394a57634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116139615750612ec7565b81870482111561397357613973613b23565b8086161561398057918102915b9490941c938002613952565b600061102f60001984846000826139a55750600161102f565b816139b25750600061102f565b81600181146139c857600281146139d2576139ff565b600191505061102f565b60ff8411156139e3576139e3613b23565b6001841b9150848211156139f9576139f9613b23565b5061102f565b5060208310610133831016604e8410600b8410161715613a32575081810a83811115613a2d57613a2d613b23565b61102f565b613a3f848484600161394f565b808604821115613a5157613a51613b23565b02949350505050565b6000816000190483118215151615613a7457613a74613b23565b500290565b600082821015613a8b57613a8b613b23565b500390565b60005b83811015613aab578181015183820152602001613a93565b838111156106175750506000910152565b600081613acb57613acb613b23565b506000190190565b600181811c90821680613ae757607f821691505b6020821081141561308d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613b1c57613b1c613b23565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b6457600080fd5b50565b8015158114613b6457600080fdfea2646970667358221220d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe564736f6c63430008030033
Deployed Bytecode Sourcemap
33031:24511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51179:311;;;;;;:::i;:::-;;:::i;:::-;;53570:147;;;;;;:::i;:::-;53656:7;53683:26;;;:16;:26;;;;;;;53570:147;;;;13231:25:1;;;13219:2;13204:18;53570:147:0;;;;;;;;31267:176;;;;;;:::i;:::-;;:::i;20054:21::-;;;;;-1:-1:-1;;;;;20054:21:0;;;;;;-1:-1:-1;;;;;10275:55:1;;;10257:74;;10245:2;10230:18;20054:21:0;10212:125:1;37305:3242:0;;;;;;:::i;:::-;;:::i;55658:138::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26017:227::-;;;;;;:::i;:::-;;:::i;:::-;;;;13015:14:1;;13008:22;12990:41;;13062:2;13047:18;;13040:34;;;;12963:18;26017:227:0;12945:135:1;20082:41:0;;;;;-1:-1:-1;;;;;20082:41:0;;;30498:184;;;;;;:::i;:::-;;:::i;:::-;;;12795:14:1;;12788:22;12770:41;;12758:2;12743:18;30498:184:0;12725:92:1;44405:3886:0;;;;;;:::i;:::-;;:::i;52555:164::-;;;;;;:::i;:::-;;:::i;53079:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;20723:547::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28998:183::-;;;;;;:::i;:::-;;:::i;33089:21::-;;;;;-1:-1:-1;;;;;33089:21:0;;;54395:1054;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;21614:296::-;;;;;;:::i;:::-;;:::i;52203:167::-;;;;;;:::i;:::-;52304:4;52328:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;52328:34:0;;;;:26;;:34;;;;;;;;52203:167;;;;;33232:28;;;;;-1:-1:-1;;;;;33232:28:0;;;52436:111;;;:::i;56022:147::-;;;;;;:::i;:::-;-1:-1:-1;;;;;56135:26:0;56108:7;56135:26;;;:18;:26;;;;;;;56022:147;30927:194;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33389:24::-;;;;;;29982:215;;;;;;:::i;:::-;;:::i;33455:110::-;;;;;;33288:27;;;;;-1:-1:-1;;;;;33288:27:0;;;48579:2266;;;;;;:::i;:::-;;:::i;29549:209::-;;;;;;:::i;:::-;;:::i;53843:91::-;53917:9;;53843:91;;22357:3213;;;;;;:::i;:::-;;:::i;31754:649::-;;;;;;:::i;:::-;;:::i;:::-;;;;16584:25:1;;;16640:2;16625:18;;16618:34;;;;16668:18;;;16661:34;16572:2;16557:18;31754:649:0;16539:162:1;40722:3544:0;;;;;;:::i;:::-;;:::i;33143:19::-;;;;;-1:-1:-1;;;;;33143:19:0;;;26781:1988;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;51179:311::-;51354:10;51349:134;51375:11;:18;51370:2;:23;51349:134;;;51416:55;51421:11;51433:2;51421:15;;;;;;-1:-1:-1;;;51421:15:0;;;;;;;;;;;;;;;51438:9;51448:2;51438:13;;;;;;-1:-1:-1;;;51438:13:0;;;;;;;;;;;;;;;51453;51467:2;51453:17;;;;;;-1:-1:-1;;;51453:17:0;;;;;;;;;;;;;;;51416:4;:55::i;:::-;51395:4;;;;:::i;:::-;;;;51349:134;;;;51179:311;;;:::o;31267:176::-;31348:17;;-1:-1:-1;;;;;31348:17:0;31340:40;31332:49;;;;;;31392:17;:43;;-1:-1:-1;;;;;;31392:43:0;-1:-1:-1;;;;;31392:43:0;;;;;;;;;;31267:176::o;37305:3242::-;37446:6;;:51;;-1:-1:-1;;;37446:51:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;37426:17:0;;-1:-1:-1;;;;;37446:6:0;;:29;;14283:18:1;;37446:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37426:71;-1:-1:-1;;;;;;37516:23:0;;37508:70;;;;-1:-1:-1;;;37508:70:0;;18390:2:1;37508:70:0;;;18372:21:1;18429:2;18409:18;;;18402:30;18468:34;18448:18;;;18441:62;-1:-1:-1;;;18519:18:1;;;18512:32;18561:19;;37508:70:0;;;;;;;;;37615:38;;;;;;;9737:19:1;;;9772:12;;;9765:28;;;37615:38:0;;;;;;;;;9809:12:1;;;;37615:38:0;;;37605:49;;;;;37718:9;;-1:-1:-1;;37718:13:0;;37730:1;37718:13;:::i;:::-;37742:29;37774:17;;;:10;:17;;;;;;;;37802:28;;;;;;;;;;;;;;;;;;;;37908:20;;;:8;:20;;;;;37970:11;:23;;;;;38084:31;;;38126:22;;;:35;;;38172:29;;;;:41;;-1:-1:-1;;;;;;38172:41:0;-1:-1:-1;;;;;38172:41:0;;;;;;;;38302:32;;;38345:19;;;:32;;-1:-1:-1;;38345:32:0;38367:10;38345:32;;;;;38412:12;38388:21;;;:36;;;;38457:15;38345:19;38435;;:37;38505:18;;38483:19;;;:40;38534:31;;:20;:31;;;;;:48;;;;;;;;;;;;;;;;37802:28;;-1:-1:-1;37908:20:0;;38615:15;:13;:15::i;:::-;38645:18;;38593:37;;-1:-1:-1;38667:1:0;38645:23;38641:1578;;;38742:8;38711:28;38729:10;38711:15;:28;:::i;:::-;:39;38685:151;;;;-1:-1:-1;;;38685:151:0;;17266:2:1;38685:151:0;;;17248:21:1;17305:2;17285:18;;;17278:30;17344:34;17324:18;;;17317:62;-1:-1:-1;;;17395:18:1;;;17388:48;17453:19;;38685:151:0;17238:240:1;38685:151:0;38851:26;;;;:16;:26;;;;;:28;;;;;;:::i;:::-;;;;-1:-1:-1;;38981:26:0;;;;:16;:26;;;;;;39010:1;-1:-1:-1;38977:256:0;;;39046:6;;;;;;;;;-1:-1:-1;;;;;39046:6:0;-1:-1:-1;;;;;39046:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39032:37;;38977:256;;;39186:26;;;;:16;:26;;;;;;:30;;39215:1;;39186:30;:::i;:::-;39180:37;;:1;:37;:::i;:::-;39145:72;;:11;:72;:::i;:::-;39110:107;;38977:256;39333:6;;:95;;-1:-1:-1;;;39333:95:0;;-1:-1:-1;;;;;10595:15:1;;;39333:95:0;;;10577:34:1;39408:4:0;10627:18:1;;;10620:43;39333:6:0;;;;:20;;10489:18:1;;39333:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39304:26;;;;:124;;;;39464:6;;:41;;-1:-1:-1;;;39464:41:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;39464:6:0;;:19;;14283:18:1;;39464:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39464:41:0;;;;;;;;;;;;:::i;:::-;39443:62;;;;:18;;;;:62;;;;;;:::i;:::-;-1:-1:-1;39520:6:0;;:40;;-1:-1:-1;;;39520:40:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;39520:6:0;;;;:18;;14283::1;;39520:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38641:1578;;;39623:18;;39593:15;;39611:11;;39623:22;;39644:1;;39623:22;:::i;:::-;39611:35;;;;;;-1:-1:-1;;;39611:35:0;;;;;;;;;;;;;;;;;39593:53;;39735:6;39705:8;:17;39714:7;39705:17;;;;;;;;;;;:27;;;39687:15;:45;;;;:::i;:::-;:54;39661:162;;;;-1:-1:-1;;;39661:162:0;;20629:2:1;39661:162:0;;;20611:21:1;20668:2;20648:18;;;20641:30;20707:34;20687:18;;;20680:62;-1:-1:-1;;;20758:18:1;;;20751:44;20812:19;;39661:162:0;20601:236:1;39661:162:0;39842:18;;39863:1;-1:-1:-1;39838:198:0;;;39899:6;;;;;;;;;-1:-1:-1;;;;;39899:6:0;-1:-1:-1;;;;;39899:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39885:37;;39838:198;;;39997:18;;:22;;40018:1;;39997:22;:::i;:::-;39991:29;;:1;:29;:::i;:::-;39977:43;;:11;:43;:::i;:::-;39963:57;;39838:198;40079:11;:27;40091:11;40103:1;40091:14;;;;;;-1:-1:-1;;;40091:14:0;;;;;;;;;;;;;;;;;40079:27;;;;;;;;;;;:59;;;40050:12;:26;;:88;;;;40174:11;:27;40186:11;40198:1;40186:14;;;;;;-1:-1:-1;;;40186:14:0;;;;;;;;;;;;;;;;;40174:27;;;;;;;;;;;:33;;40153:12;:18;;:54;;;;;;:::i;:::-;;;;;;:::i;:::-;;38641:1578;;40229:13;;;:27;;;40267:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;40311:5:0;;:58;;-1:-1:-1;;;40311:58:0;;40330:10;40311:58;;;10937:34:1;40350:4:0;10987:18:1;;;10980:43;11039:18;;;11032:34;;;-1:-1:-1;;;;;40311:5:0;;;;:18;;10849::1;;40311:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40289:124;;;;-1:-1:-1;;;40289:124:0;;18045:2:1;40289:124:0;;;18027:21:1;18084:2;18064:18;;;18057:30;-1:-1:-1;;;18103:18:1;;;18096:46;18159:18;;40289:124:0;18017:166:1;40289:124:0;40484:55;;;22417:25:1;;;22473:2;22458:18;;22451:34;;;22501:18;;;22494:34;;;-1:-1:-1;;;;;22564:55:1;;22559:2;22544:18;;22537:83;40484:55:0;;22404:3:1;22389:19;40484:55:0;;;;;;;;37305:3242;;;;;;;;;:::o;55658:138::-;55771:17;;;;:10;:17;;;;;;;;;55764:24;;;;;;;;;;;;;;;;;55735:16;;55764:24;;;55771:17;55764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55658:138;;;:::o;26017:227::-;26134:11;26186:6;;:50;;-1:-1:-1;;;26186:50:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;26134:11:0;;-1:-1:-1;;;;;26186:6:0;;:28;;14283:18:1;;26186:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26179:57;;;;26017:227;;;;;;:::o;30498:184::-;30605:4;30634:6;;:40;;-1:-1:-1;;;30634:40:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;30634:6:0;;;;:18;;14283::1;;30634:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30627:47;30498:184;-1:-1:-1;;;30498:184:0:o;44405:3886::-;44546:22;44571:20;;;:8;:20;;;;;44610:19;;;;:24;44602:66;;;;-1:-1:-1;;;44602:66:0;;16908:2:1;44602:66:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:31;16966:18;;;16959:59;17035:18;;44602:66:0;16880:179:1;44602:66:0;44715:9;;44701:10;:23;;:41;;;;;44741:1;44728:10;:14;44701:41;44679:110;;;;-1:-1:-1;;;44679:110:0;;21393:2:1;44679:110:0;;;21375:21:1;21432:2;21412:18;;;21405:30;-1:-1:-1;;;21451:18:1;;;21444:49;21510:18;;44679:110:0;21365:169:1;44679:110:0;45043:19;;;;45035:27;;:5;:27;:::i;:::-;44995:19;;;;44977:37;;:15;:37;:::i;:::-;:85;;:156;;;;45124:9;45101;:19;;;45083:15;:37;;;;:::i;:::-;:50;;44977:156;44955:237;;;;-1:-1:-1;;;44955:237:0;;17685:2:1;44955:237:0;;;17667:21:1;17724:2;17704:18;;;17697:30;17763:33;17743:18;;;17736:61;17814:18;;44955:237:0;17657:181:1;44955:237:0;45526:35;;;;45480:30;;;;45526:22;;;45430:34;45406:21;;45526:35;45430:80;;;:::i;:::-;:131;;;;:::i;:::-;45690:32;;;;45647:27;;;;45690:19;;;45600:31;45406:155;;-1:-1:-1;45572:25:0;;45600:74;;45647:27;45600:74;:::i;:::-;:122;;;;:::i;:::-;45856:35;;;;45810:30;;;;45856:22;;;45760:34;45572:150;;-1:-1:-1;45733:24:0;;45760:80;;45810:30;45760:80;:::i;:::-;:131;;;;:::i;:::-;46008:28;;;;45969:23;;;;46008:15;;;45926:27;45733:158;;-1:-1:-1;45902:21:0;;45926:66;;45969:23;45926:66;:::i;:::-;:110;;;;:::i;:::-;45902:134;-1:-1:-1;46085:18:0;46081:66;;46120:15;;;;:::i;:::-;;;;46081:66;46161:22;46157:74;;46200:19;;;;:::i;:::-;;;;46157:74;46245:21;46241:72;;46283:18;;;;:::i;:::-;;;;46241:72;46327:18;46323:66;;46362:15;;;;:::i;:::-;;;;46323:66;46741:15;;;:27;46462:26;;46779:13;;46741:34;;46771:4;46741:34;:::i;:::-;46740:52;;;;:::i;:::-;46661:22;;;:34;46706:16;;46661:41;;46698:4;46661:41;:::i;:::-;46660:62;;;;:::i;:::-;46583:19;;;:31;46625:17;;46583:38;;46617:4;46583:38;:::i;:::-;46582:60;;;;:::i;:::-;46493:22;;;:34;46551:13;;46493:54;;46543:4;46493:54;:::i;:::-;46492:72;;;;:::i;:::-;46491:152;;;;:::i;:::-;:232;;;;:::i;:::-;:302;;;;:::i;:::-;46462:331;;46804:22;47101:13;47067:9;:15;;:23;;;47093:4;47067:30;;;;:::i;:::-;47066:48;;;;:::i;:::-;46991:30;;;;47032:16;;46991:37;;47024:4;46991:37;:::i;:::-;46990:58;;;;:::i;:::-;46917:27;;;;46955:17;;46917:34;;46947:4;46917:34;:::i;:::-;46916:56;;;;:::i;:::-;46831:30;;;;46885:13;;46831:37;;46864:4;46831:37;:::i;:::-;46830:68;;;;:::i;:::-;46829:144;;;;:::i;:::-;:220;;;;:::i;:::-;:286;;;;:::i;:::-;46804:311;;47126:22;47443:13;47404:9;:15;;:28;;;47435:4;47404:35;;;;:::i;:::-;47403:53;;;;:::i;:::-;47323:35;;;;47369:16;;47323:42;;47361:4;47323:42;:::i;:::-;47322:63;;;;:::i;:::-;47244:32;;;;47287:17;;47244:39;;47279:4;47244:39;:::i;:::-;47243:61;;;;:::i;:::-;47153:35;;;;47212:13;;47153:42;;47191:4;47153:42;:::i;:::-;47152:73;;;;:::i;:::-;47151:154;;;;:::i;:::-;:235;;;;:::i;:::-;:306;;;;:::i;:::-;47126:331;-1:-1:-1;47586:31:0;47126:331;47586:14;:31;:::i;:::-;47565:18;:52;47561:458;;;47634:16;;;:36;;47653:17;;47634:16;-1:-1:-1;;47634:36:0;;47653:17;47634:36;;;;;;47561:458;;;47804:35;47825:14;47804:18;:35;:::i;:::-;47787:14;:52;47783:236;;;47856:16;;;:36;;47875:17;;47856:16;-1:-1:-1;;47856:36:0;;47875:17;47856:36;;47783:236;47970:16;;;:37;;-1:-1:-1;;47970:37:0;;;;;47783:236;48053:15;48031:19;;;:37;48167:16;;;;48232:23;;;;:11;:23;;;;;;;:40;;;48116:167;;;;;;48142:10;;48167:16;;;;;;-1:-1:-1;;;;;48198:19:0;;;;;;;48232:40;;48116:167;:::i;52555:164::-;-1:-1:-1;;;;;52680:31:0;;;;;;:20;:31;;;;;;;;;52673:38;;;;;;;;;;;;;;;;;52644:16;;52673:38;;;52680:31;52673:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52555:164;;;:::o;53079:262::-;53162:7;53235:23;;;:11;:23;;;;;53277:10;;53289:12;;;;53313:19;;;;53303:8;;;53269:64;;53162:7;;53180:12;;53162:7;;53235:23;;53277:10;;53289:12;;-1:-1:-1;;;;;53313:19:0;;;;53303:8;;53269:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53079:262;;;;;:::o;20723:547::-;20831:19;20852:27;20898:11;20911:14;20929:79;20964:8;20987:10;20929:20;:79::i;:::-;20897:111;;;;21024:6;21019:54;;21059:1;21047:14;;;;;;;;;;;;;;;;;;;;;21019:54;21105:47;21135:8;21145:6;21105:29;:47::i;:::-;21083:69;;21172:43;21185:8;21195:19;21172:12;:43::i;:::-;21163:52;;21226:36;;20723:547;;;;;:::o;28998:183::-;29099:7;29131:6;;:42;;-1:-1:-1;;;29131:42:0;;;;;13231:25:1;;;-1:-1:-1;;;;;29131:6:0;;;;:32;;13204:18:1;;29131:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29124:49;28998:183;-1:-1:-1;;28998:183:0:o;54395:1054::-;54502:7;54511:18;;:::i;:::-;-1:-1:-1;;54531:4:0;54592:20;;;:8;:20;;;;;;;;;54645:17;;54623:818;;;;;;;54696:12;;;;54623:818;;54727:12;;;;54623:818;;;;;;;54758:14;;;;54623:818;;;;;;;54791:6;;;;54623:818;;;;54816:12;;;;54623:818;;;;54847:15;;;:27;54623:818;;;;54893:23;;;;54623:818;;;;54935:28;;;;54623:818;;;;54982:8;;;:20;54623:818;;;;;;;;55021:16;;;;54623:818;;;;55056:21;;;;54623:818;;;;55096:12;;;:24;54623:818;;;;55139:20;;;;54623:818;;;;55178:25;;;;54623:818;;;;55222:15;;;:27;54623:818;;;;55268:23;;;;54623:818;;;;55310:28;;;;54623:818;;;;55368:11;;;54645:17;;54623:818;;55368:11;;;;;55394:9;;;;55418:12;;;;-1:-1:-1;;;;;55418:12:0;;54395:1054::o;21614:296::-;21744:27;21823:6;;:79;;-1:-1:-1;;;21823:79:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;21723:19:0;;21744:27;-1:-1:-1;;;;;21823:6:0;;:20;;14283:18:1;;21823:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21823:79:0;;;;;;;;;;;;:::i;:::-;21789:113;;;;-1:-1:-1;21614:296:0;-1:-1:-1;;;;21614:296:0:o;52436:111::-;52482:7;52536:2;52510:6;;;;;;;;;-1:-1:-1;;;;;52510:6:0;-1:-1:-1;;;;;52510:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;;;:::i;:::-;52502:37;;52436:111;:::o;30927:194::-;31072:6;;:41;;-1:-1:-1;;;31072:41:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;31035:12:0;;-1:-1:-1;;;;;31072:6:0;;:19;;14283:18:1;;31072:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31072:41:0;;;;;;;;;;;;:::i;29982:215::-;30103:7;30135:6;;:54;;-1:-1:-1;;;30135:54:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;30135:6:0;;;;:36;;14283:18:1;;30135:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48579:2266::-;48839:9;;48825:10;:23;;:41;;;;;48865:1;48852:10;:14;48825:41;48803:110;;;;-1:-1:-1;;;48803:110:0;;21393:2:1;48803:110:0;;;21375:21:1;21432:2;21412:18;;;21405:30;-1:-1:-1;;;21451:18:1;;;21444:49;21510:18;;48803:110:0;21365:169:1;48803:110:0;48924:22;48949:20;;;:8;:20;;;;;48988:19;;;;:24;48980:66;;;;-1:-1:-1;;;48980:66:0;;16908:2:1;48980:66:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:31;16966:18;;;16959:59;17035:18;;48980:66:0;16880:179:1;48980:66:0;49082:10;49066:27;;;;:15;;;:27;;;;;;;;49065:28;49057:65;;;;-1:-1:-1;;;49057:65:0;;19925:2:1;49057:65:0;;;19907:21:1;19964:2;19944:18;;;19937:30;20003:26;19983:18;;;19976:54;20047:18;;49057:65:0;19897:174:1;49057:65:0;49257:10;49241:27;;;;:15;;;:27;;;;;;:34;;-1:-1:-1;;49241:34:0;49271:4;49241:34;;;49310:5;;:27;;-1:-1:-1;;;49310:27:0;;;;;10257:74:1;;;;49241:27:0;;-1:-1:-1;;;;;49310:5:0;;;;:15;;10230:18:1;;49310:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49411:6;;:46;;-1:-1:-1;;;49411:46:0;;49446:10;49411:46;;;10257:74:1;49286:51:0;;-1:-1:-1;49351:22:0;;;;-1:-1:-1;;;;;49411:6:0;;:34;;10230:18:1;;49411:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49348:109;;;;;;;;;;49502:14;49485;:31;;;;:::i;:::-;49468:48;;;;:::i;:::-;;;49531:13;49527:1197;;;49600:13;49561:9;:22;;:35;;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;49664:6:0;;:65;;-1:-1:-1;;;49664:65:0;;49718:10;49664:65;;;10257:74:1;-1:-1:-1;;;;;49664:6:0;;;;:53;;10230:18:1;;49664:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49628:32;;;:101;;:32;;:101;;;;;:::i;:::-;;;;-1:-1:-1;49776:24:0;;-1:-1:-1;49789:10:0;49776:12;:24::i;:::-;49744:28;;;:56;;:28;;:56;;;;;:::i;:::-;;;;-1:-1:-1;;49833:12:0;;-1:-1:-1;;;;;49833:12:0;49819:10;:26;49815:107;;;49905:1;49866:9;:22;;:35;;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;49815:107:0;49527:1197;;;49943:9;49939:785;;;50007:13;49969:9;:22;;:34;;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;50070:6:0;;:65;;-1:-1:-1;;;50070:65:0;;50124:10;50070:65;;;10257:74:1;-1:-1:-1;;;;;50070:6:0;;;;:53;;10230:18:1;;50070:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50035:19;;;:100;;:31;;:100;;;;;:::i;:::-;;;;-1:-1:-1;50181:24:0;;-1:-1:-1;50194:10:0;50181:12;:24::i;:::-;50150:15;;;:55;;:27;;:55;;;;;:::i;:::-;;;;-1:-1:-1;;50238:12:0;;-1:-1:-1;;;;;50238:12:0;50224:10;:26;50220:106;;;50309:1;50271:9;:22;;:34;;;:39;;;;;;;:::i;49939:785::-;50392:13;50358:9;:22;;:30;;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;50451:6:0;;:79;;-1:-1:-1;;;50451:79:0;;50505:10;50451:79;;;10257:74:1;-1:-1:-1;;;;;50451:6:0;;;;:35;;10230:18:1;;50451:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50420:27;;;:110;;:27;;:110;;;;;:::i;:::-;;;;-1:-1:-1;50572:24:0;;-1:-1:-1;50585:10:0;50572:12;:24::i;:::-;50545:23;;;:51;;:23;;:51;;;;;:::i;:::-;;;;-1:-1:-1;;50629:12:0;;-1:-1:-1;;;;;50629:12:0;50615:10;:26;50611:102;;;50696:1;50662:9;:22;;:30;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;50611:102:0;50753:10;50734:30;;;;:18;:30;;;;;:32;;;;;;:::i;:::-;;;;-1:-1:-1;;50782:55:0;;;21940:25:1;;;22008:14;;22001:22;21996:2;21981:18;;21974:50;50811:10:0;22040:18:1;;;22033:83;22159:14;;22152:22;22147:2;22132:18;;22125:50;50782:55:0;;;;;;;21927:3:1;50782:55:0;;;48579:2266;;;;;;;:::o;29549:209::-;29667:7;29699:6;;:51;;-1:-1:-1;;;29699:51:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;29699:6:0;;;;:29;;14283:18:1;;29699:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22357:3213::-;22473:11;22486:14;22518;22535:35;22561:8;22535:25;:35::i;:::-;22518:52;-1:-1:-1;22585:11:0;22581:34;;22606:5;22613:1;22598:17;;;;;;;22581:34;22626:8;;;;:::i;:::-;;-1:-1:-1;22660:4:0;;-1:-1:-1;22645:12:0;;22626:8;22645:12;22914:45;22944:8;22626;22914:29;:45::i;:::-;22892:67;;22997:10;22974:19;:33;22970:56;;23017:5;23024:1;23009:17;;;;;;;;;;;;22970:56;23059:47;23089:8;23099:6;23059:29;:47::i;:::-;23037:69;;23143:10;23121:19;:32;23117:132;;;23232:5;23222:15;;23117:132;23339:7;23332:1374;;;23391:1;23374:13;23381:6;23374:4;:13;:::i;:::-;23373:19;;;;:::i;:::-;23363:29;;23429:97;23477:8;23504:7;23429:29;:97::i;:::-;23407:119;;23567:10;23545:19;:32;23541:1154;;;23647:17;23667:113;23719:8;23750:11;23760:1;23750:7;:11;:::i;23667:113::-;23647:133;;23816:10;23803:9;:23;23799:279;;23921:5;23911:15;;23799:279;;;24047:11;24057:1;24047:7;:11;:::i;:::-;24040:18;;23799:279;23541:1154;;;;24163:17;24183:113;24235:8;24266:11;:7;24276:1;24266:11;:::i;24183:113::-;24163:133;;24331:10;24319:9;:22;24315:365;;;24436:5;;-1:-1:-1;24464:9:0;;;;:::i;:::-;;;;24518;24496:31;;24315:365;;;24649:11;:7;24659:1;24649:11;:::i;:::-;24640:20;;24315:365;23541:1154;;23332:1374;;;24776:42;24788:8;24798:19;24776:11;:42::i;:::-;24771:792;;24890:4;24896:7;24882:22;;;;;;;;;;;;24771:792;25029:42;25041:8;25051:19;25029:11;:42::i;:::-;:62;;;;;25085:6;25075:7;:16;25029:62;25004:297;;;25126:9;;;;:::i;:::-;;;;25176:109;25228:8;25259:7;25176:29;:109::i;:::-;25154:131;;25004:297;;;25348:6;25337:7;:17;:63;;;;;25358:42;25370:8;25380:19;25358:11;:42::i;:::-;25315:153;;;25443:5;25450:1;25435:17;;;;;;;;;;;;25315:153;25537:4;25543:7;25529:22;;;;;;;;;;;;31754:649;31994:17;;:34;;-1:-1:-1;;;31994:34:0;;;;;13231:25:1;;;31867:13:0;;;;;;;;-1:-1:-1;;;;;31994:17:0;;;;:29;;13204:18:1;;31994:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31975:53;-1:-1:-1;32039:24:0;32102:81;31975:53;32153:19;:15;32171:1;32153:19;:::i;32102:81::-;32074:109;-1:-1:-1;32074:109:0;-1:-1:-1;32198:15:0;32194:66;;32238:1;32241;32244:3;32230:18;;;;;;;;;;32194:66;32270:18;32291:23;32302:11;32291:10;:23::i;:::-;32270:44;-1:-1:-1;32391:3:0;;-1:-1:-1;;;;31754:649:0;;;;;;:::o;40722:3544::-;40872:22;40897:20;;;:8;:20;;;;;40964:9;;40950:23;;;;;:41;;;40990:1;40977:10;:14;40950:41;40928:115;;;;-1:-1:-1;;;40928:115:0;;19213:2:1;40928:115:0;;;19195:21:1;19252:2;19232:18;;;19225:30;19291:26;19271:18;;;19264:54;19335:18;;40928:115:0;19185:174:1;40928:115:0;41063:18;;;;;;41062:19;41054:62;;;;-1:-1:-1;;;41054:62:0;;19566:2:1;41054:62:0;;;19548:21:1;19605:2;19585:18;;;19578:30;19644:32;19624:18;;;19617:60;19694:18;;41054:62:0;19538:180:1;41054:62:0;41157:1;41135:9;:19;;;:23;41127:56;;;;-1:-1:-1;;;41127:56:0;;21044:2:1;41127:56:0;;;21026:21:1;21083:2;21063:18;;;21056:30;21122:22;21102:18;;;21095:50;21162:18;;41127:56:0;21016:170:1;41127:56:0;41379:19;;;;41343:24;;41332:36;;;;:10;:36;;;;;:43;:66;41310:138;;;;-1:-1:-1;;;41310:138:0;;20278:2:1;41310:138:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:24;20336:18;;;20329:52;20398:18;;41310:138:0;20250:172:1;41310:138:0;41581:6;41558:9;:19;;;41540:15;:37;;;;:::i;:::-;:47;;41518:148;;;;-1:-1:-1;;;41518:148:0;;18793:2:1;41518:148:0;;;18775:21:1;18832:2;18812:18;;;18805:30;18871:34;18851:18;;;18844:62;-1:-1:-1;;;18922:18:1;;;18915:49;18981:19;;41518:148:0;18765:241:1;41518:148:0;41677:18;;;:25;;-1:-1:-1;;41677:25:0;41698:4;41677:25;;;:18;41744:23;;;:11;:23;;;;;;;;41795:20;;41778:38;;:16;:38;;;;;:40;;41744:23;;41778:40;;;:::i;:::-;;;;-1:-1:-1;41829:10:0;;-1:-1:-1;41829:10:0;41900:17;41880:16;;;;;;;;;:37;;;;;;-1:-1:-1;;;41880:37:0;;;;;;;;;;41876:2314;;;42093:24;;42082:36;;;;:10;:36;;;;;:43;;-1:-1:-1;42054:669:0;42144:6;;42054:669;;42229:24;;42218:36;;;;:10;:36;;;;;42255:6;42260:1;42255:2;:6;:::i;:::-;42218:44;;;;;;-1:-1:-1;;;42218:44:0;;;;;;;;;;;;;;;;;42208:54;;42293:8;:17;42302:7;42293:17;;;;;;;;;;;42281:29;;42451:2;42457:1;42451:7;42447:192;;;42483:5;;42524:19;;;;42570:26;;;;;42483:136;;-1:-1:-1;;;42483:136:0;;-1:-1:-1;;;;;42524:19:0;;;;;;42483:136;;;11251:74:1;;;;11341:18;;;11334:34;42483:5:0;;;:14;;11224:18:1;;42483:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42447:192;42657:5;;42672:19;;;;42693:13;;;;;42657:50;;-1:-1:-1;;;42657:50:0;;-1:-1:-1;;;;;42672:19:0;;;;;;42657:50;;;11251:74:1;;;;11341:18;;;11334:34;42657:5:0;;;:14;;11224:18:1;;42657:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42169:4:0;;;;:::i;:::-;;;;42054:669;;;41876:2314;;;42764:18;42744:16;;;;;;;;;:38;;;;;;-1:-1:-1;;;42744:38:0;;;;;;;;;;42740:1450;;;42966:24;;42955:36;;;;:10;:36;;;;;:43;;-1:-1:-1;42927:341:0;43017:6;;42927:341;;43102:24;;43091:36;;;;:10;:36;;;;;43128:6;43133:1;43128:2;:6;:::i;:::-;43091:44;;;;;;-1:-1:-1;;;43091:44:0;;;;;;;;;;;;;;;;;;;;;;43166:17;;;:8;:17;;;;;;;;43202:5;;43217:19;;;;43238:13;;;;;43202:50;;-1:-1:-1;;;43202:50:0;;-1:-1:-1;;;;;43217:19:0;;;;;;43202:50;;;11251:74:1;;;;11341:18;;;11334:34;;;;43166:17:0;;-1:-1:-1;43091:44:0;;-1:-1:-1;43202:5:0;;:14;;11224:18:1;;43202:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43042:4:0;;;;:::i;:::-;;;;42927:341;;;43348:5;;;43381:29;;;;43429:26;;;;;43348:122;;-1:-1:-1;;;43348:122:0;;-1:-1:-1;;;;;43381:29:0;;;43348:122;;;11251:74:1;;;;11341:18;;;11334:34;43348:5:0;;;:14;;11224:18:1;;43348:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42740:1450;;;43512:17;43492:16;;;;;;;;;:37;;;;;;-1:-1:-1;;;43492:37:0;;;;;;;;;;43488:702;;;43758:24;;43677:23;43747:36;;;:10;:36;;;;;:43;;-1:-1:-1;43719:323:0;43809:6;;43719:323;;43894:24;;43883:36;;;;:10;:36;;;;;43920:6;43925:1;43920:2;:6;:::i;:::-;43883:44;;;;;;-1:-1:-1;;;43883:44:0;;;;;;;;;;;;;;;;;43873:54;;43958:8;:17;43967:7;43958:17;;;;;;;;;;;43946:29;;44013:9;:13;;;43994:32;;;;;:::i;:::-;;-1:-1:-1;43834:4:0;;;;:::i;:::-;;;;43719:323;;;44075:26;;;;44056:45;;;;:::i;:::-;44116:5;;;44131:29;;;;44116:62;;-1:-1:-1;;;44116:62:0;;-1:-1:-1;;;;;44131:29:0;;;44116:62;;;11251:74:1;11341:18;;;11334:34;;;44056:45:0;;-1:-1:-1;44116:5:0;;:14;;11224:18:1;;44116:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43488:702;;44230:20;;;;:8;:20;;;;;;;:27;;;44205:53;;;;;;44230:20;;:27;;;;;;44205:53;:::i;:::-;;;;;;;;40722:3544;;;;;:::o;26781:1988::-;26979:22;;27096:16;;27137:89;27172:8;27195:20;27208:7;27195:10;:20;:::i;27137:89::-;27095:131;;;;27276:11;27271:86;;27312:14;;;27324:1;27312:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27328:16:0;;;27342:1;27328:16;;;;;;;;27304:41;;-1:-1:-1;27328:16:0;-1:-1:-1;27304:41:0;;-1:-1:-1;;27304:41:0;27271:86;27367:17;27467:43;27489:8;27499:10;27467:21;:43::i;:::-;27440:70;;-1:-1:-1;27440:70:0;-1:-1:-1;27440:70:0;27560:86;;27601:14;;;27613:1;27601:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27617:16:0;;;27631:1;27617:16;;;;;;;;27593:41;;-1:-1:-1;27617:16:0;-1:-1:-1;27593:41:0;;-1:-1:-1;;;27593:41:0;27560:86;27656:17;27688:14;27717:37;27771:9;27757:24;;;;;;-1:-1:-1;;;27757:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27757:24:0;;27717:64;;27859:439;27878:9;27866;:21;:61;;;;-1:-1:-1;27916:11:0;27907:6;27891:13;:9;27903:1;27891:13;:::i;:::-;:22;;;;:::i;:::-;:36;27866:61;27859:439;;;27944:27;27974:108;28022:8;28049:18;28061:6;28049:9;:18;:::i;27974:108::-;27944:138;;28102:42;28114:8;28124:19;28102:11;:42::i;:::-;28097:167;;28199:19;28165:20;28186:9;28165:31;;;;;;-1:-1:-1;;;28165:31:0;;;;;;;;;;;;;;;;;;:53;28237:11;;;;:::i;:::-;;;;28097:167;28278:8;;;;:::i;:::-;;;;27859:439;;;;28310:27;28352:9;28340:22;;;;;;-1:-1:-1;;;28340:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28310:52;;28373:33;28423:9;28409:24;;;;;;-1:-1:-1;;;28409:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28409:24:0;;28373:60;;28506:10;28501:211;28527:9;28522:2;:14;28501:211;;;28582:20;28619:2;28603:13;28615:1;28603:9;:13;:::i;:::-;:18;;;;:::i;:::-;28582:40;;;;;;-1:-1:-1;;;28582:40:0;;;;;;;;;;;;;;;28559:16;28576:2;28559:20;;;;;;-1:-1:-1;;;28559:20:0;;;;;;;;;;;;;;:63;;;;;28656:44;28669:8;28679:16;28696:2;28679:20;;;;;;-1:-1:-1;;;28679:20:0;;;;;;;;;;;;;;;28656:12;:44::i;:::-;28637:12;28650:2;28637:16;;;;;;-1:-1:-1;;;28637:16:0;;;;;;;;;;;;;;:63;;;;28538:4;;;;;:::i;:::-;;;;28501:211;;;-1:-1:-1;28730:12:0;;-1:-1:-1;28744:16:0;-1:-1:-1;;;;;;;26781:1988:0;;;;;;;;:::o;56446:1093::-;56517:21;56604:31;56637:18;56659:99;56687:19;;56739:8;56721:15;:26;;;;:::i;56659:99::-;56603:155;;-1:-1:-1;56603:155:0;-1:-1:-1;56773:14:0;;56769:763;;56804:30;56866:18;56837:92;;;;;;;;;;;;:::i;:::-;56804:125;;57029:10;57024:497;57050:13;:20;57045:2;:25;57024:497;;;57098:13;57113:24;57141:13;57155:2;57141:17;;;;;;-1:-1:-1;;;57141:17:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57141:44:0;57324:5;57212:144;;;;;;;-1:-1:-1;;;;;10275:55:1;;;;10257:74;;10245:2;10230:18;;10212:125;57212:144:0;;;;-1:-1:-1;;57212:144:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57212:144:0;-1:-1:-1;;;57212:144:0;;;57141:238;;;57212:144;57141:238;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57097:282;;;;57402:8;57398:108;;;57463:11;57452:34;;;;;;;;;;;;:::i;:::-;57435:51;;;;:::i;:::-;;;57398:108;57024:497;;57072:4;;;;;:::i;:::-;;;;57024:497;;;;56769:763;;56446:1093;;;;;:::o;32599:236::-;32686:15;;32719:109;32745:2;:9;32740:2;:14;32719:109;;;32809:2;32812;32809:6;;;;;;-1:-1:-1;;;32809:6:0;;;;;;;;;;;;;;;32787:13;:7;32797:3;32787:13;:::i;:::-;:29;;;;:::i;:::-;32777:39;-1:-1:-1;32756:4:0;;;;:::i;:::-;;;;32719:109;;;;32599:236;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:762:1;;118:3;111:4;103:6;99:17;95:27;85:2;;140:5;133;126:20;85:2;180:6;167:20;206:4;230:60;246:43;286:2;246:43;:::i;:::-;230:60;:::i;:::-;312:3;336:2;331:3;324:15;364:2;359:3;355:12;348:19;;399:2;391:6;387:15;451:3;446:2;440;437:1;433:10;425:6;421:23;417:32;414:41;411:2;;;472:5;465;458:20;411:2;498:5;512:235;526:2;523:1;520:9;512:235;;;597:3;584:17;614:28;636:5;614:28;:::i;:::-;655:18;;693:12;;;;725;;;;544:1;537:9;512:235;;;-1:-1:-1;765:5:1;;75:701;-1:-1:-1;;;;;;;75:701:1:o;781:512::-;;887:3;880:4;872:6;868:17;864:27;854:2;;909:5;902;895:20;854:2;942:6;936:13;968:18;964:2;961:26;958:2;;;990:18;;:::i;:::-;1034:55;1077:2;1058:13;;-1:-1:-1;;1054:27:1;1083:4;1050:38;1034:55;:::i;:::-;1114:2;1105:7;1098:19;1160:3;1153:4;1148:2;1140:6;1136:15;1132:26;1129:35;1126:2;;;1181:5;1174;1167:20;1126:2;1198:64;1259:2;1252:4;1243:7;1239:18;1232:4;1224:6;1220:17;1198:64;:::i;:::-;1280:7;844:449;-1:-1:-1;;;;844:449:1:o;1298:257::-;;1410:2;1398:9;1389:7;1385:23;1381:32;1378:2;;;1431:6;1423;1416:22;1378:2;1475:9;1462:23;1494:31;1519:5;1494:31;:::i;1560:261::-;;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1704:6;1696;1689:22;1651:2;1741:9;1735:16;1760:31;1785:5;1760:31;:::i;1826:1012::-;;1952:2;1995;1983:9;1974:7;1970:23;1966:32;1963:2;;;2016:6;2008;2001:22;1963:2;2054:9;2048:16;2087:18;2079:6;2076:30;2073:2;;;2124:6;2116;2109:22;2073:2;2152:22;;2205:4;2197:13;;2193:27;-1:-1:-1;2183:2:1;;2239:6;2231;2224:22;2183:2;2273;2267:9;2296:60;2312:43;2352:2;2312:43;:::i;2296:60::-;2378:3;2402:2;2397:3;2390:15;2430:2;2425:3;2421:12;2414:19;;2461:2;2457;2453:11;2509:7;2504:2;2498;2495:1;2491:10;2487:2;2483:19;2479:28;2476:41;2473:2;;;2535:6;2527;2520:22;2473:2;2562:6;2553:15;;2577:231;2591:2;2588:1;2585:9;2577:231;;;2655:3;2649:10;2672:31;2697:5;2672:31;:::i;:::-;2716:18;;2609:1;2602:9;;;;;2754:12;;;;2786;;2577:231;;;-1:-1:-1;2827:5:1;1932:906;-1:-1:-1;;;;;;;1932:906:1:o;2843:1430::-;;;;3058:2;3046:9;3037:7;3033:23;3029:32;3026:2;;;3079:6;3071;3064:22;3026:2;3124:9;3111:23;3153:18;3194:2;3186:6;3183:14;3180:2;;;3215:6;3207;3200:22;3180:2;3258:6;3247:9;3243:22;3233:32;;3303:7;3296:4;3292:2;3288:13;3284:27;3274:2;;3330:6;3322;3315:22;3274:2;3371;3358:16;3393:4;3417:60;3433:43;3473:2;3433:43;:::i;3417:60::-;3499:3;3523:2;3518:3;3511:15;3551:2;3546:3;3542:12;3535:19;;3582:2;3578;3574:11;3630:7;3625:2;3619;3616:1;3612:10;3608:2;3604:19;3600:28;3597:41;3594:2;;;3656:6;3648;3641:22;3594:2;3683:6;3674:15;;3698:163;3712:2;3709:1;3706:9;3698:163;;;3769:17;;3757:30;;3730:1;3723:9;;;;;3807:12;;;;3839;;3698:163;;;-1:-1:-1;3880:5:1;-1:-1:-1;;3923:18:1;;3910:32;;-1:-1:-1;;3954:16:1;;;3951:2;;;3988:6;3980;3973:22;3951:2;4016:60;4068:7;4057:8;4046:9;4042:24;4016:60;:::i;:::-;4006:70;;4129:2;4118:9;4114:18;4101:32;4085:48;;4158:2;4148:8;4145:16;4142:2;;;4179:6;4171;4164:22;4142:2;;4207:60;4259:7;4248:8;4237:9;4233:24;4207:60;:::i;:::-;4197:70;;;3016:1257;;;;;:::o;4278:255::-;;4398:2;4386:9;4377:7;4373:23;4369:32;4366:2;;;4419:6;4411;4404:22;4366:2;4456:9;4450:16;4475:28;4497:5;4475:28;:::i;4538:538::-;;;;4701:2;4689:9;4680:7;4676:23;4672:32;4669:2;;;4722:6;4714;4707:22;4669:2;4759:9;4753:16;4778:28;4800:5;4778:28;:::i;:::-;4874:2;4859:18;;4853:25;4825:5;;-1:-1:-1;4901:18:1;4890:30;;4887:2;;;4938:6;4930;4923:22;4887:2;4966:60;5018:7;5009:6;4998:9;4994:22;4966:60;:::i;:::-;4956:70;;;5066:2;5055:9;5051:18;5045:25;5035:35;;4659:417;;;;;:::o;5081:316::-;;;5218:2;5206:9;5197:7;5193:23;5189:32;5186:2;;;5239:6;5231;5224:22;5186:2;5276:9;5270:16;5295:28;5317:5;5295:28;:::i;:::-;5387:2;5372:18;;;;5366:25;5342:5;;5366:25;;-1:-1:-1;;;5176:221:1:o;5402:190::-;;5514:2;5502:9;5493:7;5489:23;5485:32;5482:2;;;5535:6;5527;5520:22;5482:2;-1:-1:-1;5563:23:1;;5472:120;-1:-1:-1;5472:120:1:o;5597:194::-;;5720:2;5708:9;5699:7;5695:23;5691:32;5688:2;;;5741:6;5733;5726:22;5688:2;-1:-1:-1;5769:16:1;;5678:113;-1:-1:-1;5678:113:1:o;5796:258::-;;;5925:2;5913:9;5904:7;5900:23;5896:32;5893:2;;;5946:6;5938;5931:22;5893:2;-1:-1:-1;;5974:23:1;;;6044:2;6029:18;;;6016:32;;-1:-1:-1;5883:171:1:o;6059:395::-;;;;;6222:3;6210:9;6201:7;6197:23;6193:33;6190:2;;;6244:6;6236;6229:22;6190:2;-1:-1:-1;;6272:23:1;;;6342:2;6327:18;;6314:32;;-1:-1:-1;6393:2:1;6378:18;;6365:32;;6444:2;6429:18;6416:32;;-1:-1:-1;6180:274:1;-1:-1:-1;6180:274:1:o;6459:355::-;;6591:2;6579:9;6570:7;6566:23;6562:32;6559:2;;;6612:6;6604;6597:22;6559:2;6650:9;6644:16;6683:18;6675:6;6672:30;6669:2;;;6720:6;6712;6705:22;6669:2;6748:60;6800:7;6791:6;6780:9;6776:22;6748:60;:::i;7213:325::-;;;7342:2;7330:9;7321:7;7317:23;7313:32;7310:2;;;7363:6;7355;7348:22;7310:2;7404:9;7391:23;7381:33;;7464:2;7453:9;7449:18;7436:32;7477:31;7502:5;7477:31;:::i;:::-;7527:5;7517:15;;;7300:238;;;;;:::o;7543:454::-;;;;7683:2;7671:9;7662:7;7658:23;7654:32;7651:2;;;7704:6;7696;7689:22;7651:2;7745:9;7732:23;7722:33;;7805:2;7794:9;7790:18;7777:32;7818:28;7840:5;7818:28;:::i;:::-;7865:5;-1:-1:-1;7922:2:1;7907:18;;7894:32;7935:30;7894:32;7935:30;:::i;:::-;7984:7;7974:17;;;7641:356;;;;;:::o;8002:626::-;;;;;;;;;8244:3;8232:9;8223:7;8219:23;8215:33;8212:2;;;8266:6;8258;8251:22;8212:2;-1:-1:-1;;8294:16:1;;8350:2;8335:18;;8329:25;8394:2;8379:18;;8373:25;8438:2;8423:18;;8417:25;8482:3;8467:19;;8461:26;8527:3;8512:19;;8506:26;8572:3;8557:19;;8551:26;8617:3;8602:19;;;8596:26;8294:16;;8329:25;;-1:-1:-1;8373:25:1;;8417;;-1:-1:-1;8461:26:1;-1:-1:-1;8506:26:1;;-1:-1:-1;8551:26:1;-1:-1:-1;8596:26:1;;-1:-1:-1;8202:426:1;-1:-1:-1;8202:426:1:o;8633:437::-;;8724:5;8718:12;8751:6;8746:3;8739:19;8777:4;8806:2;8801:3;8797:12;8790:19;;8843:2;8836:5;8832:14;8864:3;8876:169;8890:6;8887:1;8884:13;8876:169;;;8951:13;;8939:26;;8985:12;;;;9020:15;;;;8912:1;8905:9;8876:169;;;-1:-1:-1;9061:3:1;;8694:376;-1:-1:-1;;;;;8694:376:1:o;9075:257::-;;9154:5;9148:12;9181:6;9176:3;9169:19;9197:63;9253:6;9246:4;9241:3;9237:14;9230:4;9223:5;9219:16;9197:63;:::i;:::-;9314:2;9293:15;-1:-1:-1;;9289:29:1;9280:39;;;;9321:4;9276:50;;9124:208;-1:-1:-1;;9124:208:1:o;9337:238::-;9419:1;9412:5;9409:12;9399:2;;9464:10;9459:3;9455:20;9452:1;9445:31;9499:4;9496:1;9489:15;9527:4;9524:1;9517:15;9399:2;9551:18;;9389:186::o;9832:274::-;;9999:6;9993:13;10015:53;10061:6;10056:3;10049:4;10041:6;10037:17;10015:53;:::i;:::-;10084:16;;;;;9969:137;-1:-1:-1;;9969:137:1:o;11379:980::-;;11665:2;11654:9;11650:18;11695:2;11684:9;11677:21;11718:6;11753;11747:13;11784:6;11776;11769:22;11822:2;11811:9;11807:18;11800:25;;11884:2;11874:6;11871:1;11867:14;11856:9;11852:30;11848:39;11834:53;;11906:4;11945:2;11937:6;11933:15;11966:4;11979:254;11993:6;11990:1;11987:13;11979:254;;;12086:2;12082:7;12070:9;12062:6;12058:22;12054:36;12049:3;12042:49;12114:39;12146:6;12137;12131:13;12114:39;:::i;:::-;12104:49;-1:-1:-1;12211:12:1;;;;12176:15;;;;12015:1;12008:9;11979:254;;;11983:3;;12281:9;12273:6;12269:22;12264:2;12253:9;12249:18;12242:50;;;;12309:44;12346:6;12338;12309:44;:::i;:::-;12301:52;11626:733;-1:-1:-1;;;;;11626:733:1:o;12364:261::-;;12543:2;12532:9;12525:21;12563:56;12615:2;12604:9;12600:18;12592:6;12563:56;:::i;13267:864::-;13581:25;;;13568:3;13553:19;;13625:2;13647:18;;;13707:6;13267:864;13741:167;13755:4;13752:1;13749:11;13741:167;;;13814:13;;13802:26;;13848:12;;;;13883:15;;;;13775:1;13768:9;13741:167;;;13745:3;;;;13959:6;13952:14;13945:22;13939:3;13928:9;13924:19;13917:51;13977:55;14027:3;14016:9;14012:19;14004:6;13977:55;:::i;:::-;-1:-1:-1;;;;;14073:6:1;14069:55;14063:3;14052:9;14048:19;14041:84;13535:596;;;;;;;;:::o;14389:481::-;;14620:6;14609:9;14602:25;14663:6;14658:2;14647:9;14643:18;14636:34;14706:3;14701:2;14690:9;14686:18;14679:31;14727:45;14767:3;14756:9;14752:19;14744:6;14727:45;:::i;:::-;14719:53;;-1:-1:-1;;;;;14812:6:1;14808:55;14803:2;14792:9;14788:18;14781:83;14592:278;;;;;;;:::o;14875:217::-;;15022:2;15011:9;15004:21;15042:44;15082:2;15071:9;15067:18;15059:6;15042:44;:::i;15097:288::-;;15272:2;15261:9;15254:21;15292:44;15332:2;15321:9;15317:18;15309:6;15292:44;:::i;:::-;15284:52;;15372:6;15367:2;15356:9;15352:18;15345:34;15244:141;;;;;:::o;22631:281::-;22818:25;;;22806:2;22791:18;;22852:54;22902:2;22887:18;;22879:6;22852:54;:::i;22917:503::-;23161:25;;;23148:3;23133:19;;23195:54;23245:2;23230:18;;23222:6;23195:54;:::i;:::-;-1:-1:-1;;;;;23358:2:1;23350:6;23346:15;23341:2;23330:9;23326:18;23319:43;23410:2;23402:6;23398:15;23393:2;23382:9;23378:18;23371:43;;23115:305;;;;;;;:::o;23425:275::-;23496:2;23490:9;23561:2;23542:13;;-1:-1:-1;;23538:27:1;23526:40;;23596:18;23581:34;;23617:22;;;23578:62;23575:2;;;23643:18;;:::i;:::-;23679:2;23672:22;23470:230;;-1:-1:-1;23470:230:1:o;23705:183::-;;23798:18;23790:6;23787:30;23784:2;;;23820:18;;:::i;:::-;-1:-1:-1;23865:1:1;23861:14;23877:4;23857:25;;23774:114::o;23893:128::-;;23964:1;23960:6;23957:1;23954:13;23951:2;;;23970:18;;:::i;:::-;-1:-1:-1;24006:9:1;;23941:80::o;24026:217::-;;24092:1;24082:2;;-1:-1:-1;;;24117:31:1;;24171:4;24168:1;24161:15;24199:4;24124:1;24189:15;24082:2;-1:-1:-1;24228:9:1;;24072:171::o;24248:453::-;24344:6;24367:5;24381:314;24430:1;24467:2;24457:8;24454:16;24444:2;;24474:5;;;24444:2;24515:4;24510:3;24506:14;24500:4;24497:24;24494:2;;;24524:18;;:::i;:::-;24574:2;24564:8;24560:17;24557:2;;;24589:16;;;;24557:2;24668:17;;;;;24628:15;;24381:314;;24706:139;;24795:44;-1:-1:-1;;24822:8:1;24816:4;24850:922;24934:8;24924:2;;-1:-1:-1;24975:1:1;24989:5;;24924:2;25023:4;25013:2;;-1:-1:-1;25060:1:1;25074:5;;25013:2;25105:4;25123:1;25118:59;;;;25191:1;25186:183;;;;25098:271;;25118:59;25148:1;25139:10;;25162:5;;;25186:183;25223:3;25213:8;25210:17;25207:2;;;25230:18;;:::i;:::-;25286:1;25276:8;25272:16;25263:25;;25314:3;25307:5;25304:14;25301:2;;;25321:18;;:::i;:::-;25354:5;;;25098:271;;25453:2;25443:8;25440:16;25434:3;25428:4;25425:13;25421:36;25415:2;25405:8;25402:16;25397:2;25391:4;25388:12;25384:35;25381:77;25378:2;;;-1:-1:-1;25490:19:1;;;25525:14;;;25522:2;;;25542:18;;:::i;:::-;25575:5;;25378:2;25622:42;25660:3;25650:8;25644:4;25641:1;25622:42;:::i;:::-;25697:6;25692:3;25688:16;25679:7;25676:29;25673:2;;;25708:18;;:::i;:::-;25746:20;;24914:858;-1:-1:-1;;;;24914:858:1:o;25777:168::-;;25883:1;25879;25875:6;25871:14;25868:1;25865:21;25860:1;25853:9;25846:17;25842:45;25839:2;;;25890:18;;:::i;:::-;-1:-1:-1;25930:9:1;;25829:116::o;25950:125::-;;26018:1;26015;26012:8;26009:2;;;26023:18;;:::i;:::-;-1:-1:-1;26060:9:1;;25999:76::o;26080:258::-;26152:1;26162:113;26176:6;26173:1;26170:13;26162:113;;;26252:11;;;26246:18;26233:11;;;26226:39;26198:2;26191:10;26162:113;;;26293:6;26290:1;26287:13;26284:2;;;-1:-1:-1;;26328:1:1;26310:16;;26303:27;26133:205::o;26343:136::-;;26410:5;26400:2;;26419:18;;:::i;:::-;-1:-1:-1;;;26455:18:1;;26390:89::o;26484:380::-;26563:1;26559:12;;;;26606;;;26627:2;;26681:4;26673:6;26669:17;26659:27;;26627:2;26734;26726:6;26723:14;26703:18;26700:38;26697:2;;;26780:10;26775:3;26771:20;26768:1;26761:31;26815:4;26812:1;26805:15;26843:4;26840:1;26833:15;26869:135;;-1:-1:-1;;26929:17:1;;26926:2;;;26949:18;;:::i;:::-;-1:-1:-1;26996:1:1;26985:13;;26916:88::o;27009:127::-;27070:10;27065:3;27061:20;27058:1;27051:31;27101:4;27098:1;27091:15;27125:4;27122:1;27115:15;27141:127;27202:10;27197:3;27193:20;27190:1;27183:31;27233:4;27230:1;27223:15;27257:4;27254:1;27247:15;27273:154;-1:-1:-1;;;;;27352:5:1;27348:54;27341:5;27338:65;27328:2;;27417:1;27414;27407:12;27328:2;27318:109;:::o;27432:118::-;27518:5;27511:13;27504:21;27497:5;27494:32;27484:2;;27540:1;27537;27530:12
Swarm Source
ipfs://d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe5
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
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.