Overview
S Balance
S Value
$0.00Latest 25 from a total of 329,643 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Prices With ... | 61055831 | 50 secs ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61055762 | 2 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61055677 | 4 mins ago | IN | 0 S | 0.01087644 | ||||
| Set Prices With ... | 61055625 | 6 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61055562 | 8 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61055496 | 10 mins ago | IN | 0 S | 0.00988817 | ||||
| Set Prices With ... | 61055440 | 11 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61055355 | 13 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61055291 | 15 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61055219 | 17 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61055154 | 19 mins ago | IN | 0 S | 0.00988878 | ||||
| Set Prices With ... | 61055080 | 21 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61055013 | 23 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61054947 | 25 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61054879 | 27 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61054818 | 29 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61054777 | 30 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61054712 | 32 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61054648 | 34 mins ago | IN | 0 S | 0.0097724 | ||||
| Set Prices With ... | 61054596 | 35 mins ago | IN | 0 S | 0.00988768 | ||||
| Set Prices With ... | 61054532 | 37 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61054466 | 39 mins ago | IN | 0 S | 0.00988878 | ||||
| Set Prices With ... | 61054404 | 40 mins ago | IN | 0 S | 0.01087644 | ||||
| Set Prices With ... | 61054330 | 41 mins ago | IN | 0 S | 0.00988823 | ||||
| Set Prices With ... | 61054269 | 43 mins ago | IN | 0 S | 0.00988823 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FastPriceFeed
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at SonicScan.org on 2025-03-31
*/
// Sources flattened with hardhat v2.12.0 https://hardhat.org
// File contracts/oracle/interfaces/IFastPriceEvents.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IFastPriceEvents {
function emitPriceEvent(address _token, uint256 _price) external;
}
// File contracts/access/Governable.sol
pragma solidity 0.6.12;
contract Governable {
address public gov;
constructor() public {
gov = msg.sender;
}
modifier onlyGov() {
require(msg.sender == gov, "Governable: forbidden");
_;
}
function setGov(address _gov) external onlyGov {
gov = _gov;
}
}
// File contracts/oracle/interfaces/ISecondaryPriceFeed.sol
pragma solidity 0.6.12;
interface ISecondaryPriceFeed {
function getPrice(address _token, uint256 _referencePrice, bool _maximise) external view returns (uint256);
}
// File contracts/oracle/interfaces/IFastPriceFeed.sol
pragma solidity 0.6.12;
interface IFastPriceFeed {
function lastUpdatedAt() external view returns (uint256);
function lastUpdatedBlock() external view returns (uint256);
function setSigner(address _account, bool _isActive) external;
function setUpdater(address _account, bool _isActive) external;
function setPriceDuration(uint256 _priceDuration) external;
function setMaxPriceUpdateDelay(uint256 _maxPriceUpdateDelay) external;
function setSpreadBasisPointsIfInactive(uint256 _spreadBasisPointsIfInactive) external;
function setSpreadBasisPointsIfChainError(uint256 _spreadBasisPointsIfChainError) external;
function setMinBlockInterval(uint256 _minBlockInterval) external;
function setIsSpreadEnabled(bool _isSpreadEnabled) external;
function setMaxDeviationBasisPoints(uint256 _maxDeviationBasisPoints) external;
function setMaxCumulativeDeltaDiffs(address[] memory _tokens, uint256[] memory _maxCumulativeDeltaDiffs) external;
function setPriceDataInterval(uint256 _priceDataInterval) external;
function setVaultPriceFeed(address _vaultPriceFeed) external;
}
// File contracts/core/interfaces/IVaultPriceFeed.sol
pragma solidity 0.6.12;
interface IVaultPriceFeed {
function adjustmentBasisPoints(address _token) external view returns (uint256);
function isAdjustmentAdditive(address _token) external view returns (bool);
function setAdjustment(address _token, bool _isAdditive, uint256 _adjustmentBps) external;
function setUseV2Pricing(bool _useV2Pricing) external;
function setIsAmmEnabled(bool _isEnabled) external;
function setIsSecondaryPriceEnabled(bool _isEnabled) external;
function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external;
function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external;
function setFavorPrimaryPrice(bool _favorPrimaryPrice) external;
function setPriceSampleSpace(uint256 _priceSampleSpace) external;
function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external;
function getPrice(address _token, bool _maximise, bool _includeAmmPrice, bool _useSwapPricing) external view returns (uint256);
function getAmmPrice(address _token) external view returns (uint256);
function getLatestPrimaryPrice(address _token) external view returns (uint256);
function getPrimaryPrice(address _token, bool _maximise) external view returns (uint256);
function setTokenConfig(
address _token,
address _priceFeed,
uint256 _priceDecimals,
bool _isStrictStable
) external;
}
// File contracts/core/interfaces/IPositionRouter.sol
pragma solidity 0.6.12;
interface IPositionRouter {
function increasePositionRequestKeysStart() external returns (uint256);
function decreasePositionRequestKeysStart() external returns (uint256);
function executeIncreasePositions(uint256 _count, address payable _executionFeeReceiver) external;
function executeDecreasePositions(uint256 _count, address payable _executionFeeReceiver) external;
}
// File contracts/libraries/math/SafeMath.sol
pragma solidity 0.6.12;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File contracts/oracle/FastPriceFeed.sol
pragma solidity 0.6.12;
contract FastPriceFeed is ISecondaryPriceFeed, IFastPriceFeed, Governable {
using SafeMath for uint256;
// fit data in a uint256 slot to save gas costs
struct PriceDataItem {
uint160 refPrice; // Chainlink price
uint32 refTime; // last updated at time
uint32 cumulativeRefDelta; // cumulative Chainlink price delta
uint32 cumulativeFastDelta; // cumulative fast price delta
}
uint256 public constant PRICE_PRECISION = 10 ** 30;
uint256 public constant CUMULATIVE_DELTA_PRECISION = 10 * 1000 * 1000;
uint256 public constant MAX_REF_PRICE = type(uint160).max;
uint256 public constant MAX_CUMULATIVE_REF_DELTA = type(uint32).max;
uint256 public constant MAX_CUMULATIVE_FAST_DELTA = type(uint32).max;
// uint256(~0) is 256 bits of 1s
// shift the 1s by (256 - 32) to get (256 - 32) 0s followed by 32 1s
uint256 constant public BITMASK_32 = uint256(~0) >> (256 - 32);
uint256 public constant BASIS_POINTS_DIVISOR = 10000;
uint256 public constant MAX_PRICE_DURATION = 30 minutes;
bool public isInitialized;
bool public isSpreadEnabled = false;
address public vaultPriceFeed;
address public fastPriceEvents;
address public tokenManager;
address public positionRouter;
uint256 public override lastUpdatedAt;
uint256 public override lastUpdatedBlock;
uint256 public priceDuration;
uint256 public maxPriceUpdateDelay;
uint256 public spreadBasisPointsIfInactive;
uint256 public spreadBasisPointsIfChainError;
uint256 public minBlockInterval;
uint256 public maxTimeDeviation;
uint256 public priceDataInterval;
// allowed deviation from primary price
uint256 public maxDeviationBasisPoints;
uint256 public minAuthorizations;
uint256 public disableFastPriceVoteCount = 0;
mapping (address => bool) public isUpdater;
mapping (address => uint256) public prices;
mapping (address => PriceDataItem) public priceData;
mapping (address => uint256) public maxCumulativeDeltaDiffs;
mapping (address => bool) public isSigner;
mapping (address => bool) public disableFastPriceVotes;
// array of tokens used in setCompactedPrices, saves L1 calldata gas costs
address[] public tokens;
// array of tokenPrecisions used in setCompactedPrices, saves L1 calldata gas costs
// if the token price will be sent with 3 decimals, then tokenPrecision for that token
// should be 10 ** 3
uint256[] public tokenPrecisions;
event DisableFastPrice(address signer);
event EnableFastPrice(address signer);
event PriceData(address token, uint256 refPrice, uint256 fastPrice, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta);
event MaxCumulativeDeltaDiffExceeded(address token, uint256 refPrice, uint256 fastPrice, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta);
modifier onlySigner() {
require(isSigner[msg.sender], "FastPriceFeed: forbidden");
_;
}
modifier onlyUpdater() {
require(isUpdater[msg.sender], "FastPriceFeed: forbidden");
_;
}
modifier onlyTokenManager() {
require(msg.sender == tokenManager, "FastPriceFeed: forbidden");
_;
}
constructor(
uint256 _priceDuration,
uint256 _maxPriceUpdateDelay,
uint256 _minBlockInterval,
uint256 _maxDeviationBasisPoints,
address _fastPriceEvents,
address _tokenManager,
address _positionRouter
) public {
require(_priceDuration <= MAX_PRICE_DURATION, "FastPriceFeed: invalid _priceDuration");
priceDuration = _priceDuration;
maxPriceUpdateDelay = _maxPriceUpdateDelay;
minBlockInterval = _minBlockInterval;
maxDeviationBasisPoints = _maxDeviationBasisPoints;
fastPriceEvents = _fastPriceEvents;
tokenManager = _tokenManager;
positionRouter = _positionRouter;
}
function initialize(uint256 _minAuthorizations, address[] memory _signers, address[] memory _updaters) public onlyGov {
require(!isInitialized, "FastPriceFeed: already initialized");
isInitialized = true;
minAuthorizations = _minAuthorizations;
for (uint256 i = 0; i < _signers.length; i++) {
address signer = _signers[i];
isSigner[signer] = true;
}
for (uint256 i = 0; i < _updaters.length; i++) {
address updater = _updaters[i];
isUpdater[updater] = true;
}
}
function setSigner(address _account, bool _isActive) external override onlyGov {
isSigner[_account] = _isActive;
}
function setUpdater(address _account, bool _isActive) external override onlyGov {
isUpdater[_account] = _isActive;
}
function setFastPriceEvents(address _fastPriceEvents) external onlyGov {
fastPriceEvents = _fastPriceEvents;
}
function setVaultPriceFeed(address _vaultPriceFeed) external override onlyGov {
vaultPriceFeed = _vaultPriceFeed;
}
function setMaxTimeDeviation(uint256 _maxTimeDeviation) external onlyGov {
maxTimeDeviation = _maxTimeDeviation;
}
function setPriceDuration(uint256 _priceDuration) external override onlyGov {
require(_priceDuration <= MAX_PRICE_DURATION, "FastPriceFeed: invalid _priceDuration");
priceDuration = _priceDuration;
}
function setMaxPriceUpdateDelay(uint256 _maxPriceUpdateDelay) external override onlyGov {
maxPriceUpdateDelay = _maxPriceUpdateDelay;
}
function setSpreadBasisPointsIfInactive(uint256 _spreadBasisPointsIfInactive) external override onlyGov {
spreadBasisPointsIfInactive = _spreadBasisPointsIfInactive;
}
function setSpreadBasisPointsIfChainError(uint256 _spreadBasisPointsIfChainError) external override onlyGov {
spreadBasisPointsIfChainError = _spreadBasisPointsIfChainError;
}
function setMinBlockInterval(uint256 _minBlockInterval) external override onlyGov {
minBlockInterval = _minBlockInterval;
}
function setIsSpreadEnabled(bool _isSpreadEnabled) external override onlyGov {
isSpreadEnabled = _isSpreadEnabled;
}
function setLastUpdatedAt(uint256 _lastUpdatedAt) external onlyGov {
lastUpdatedAt = _lastUpdatedAt;
}
function setTokenManager(address _tokenManager) external onlyTokenManager {
tokenManager = _tokenManager;
}
function setMaxDeviationBasisPoints(uint256 _maxDeviationBasisPoints) external override onlyTokenManager {
maxDeviationBasisPoints = _maxDeviationBasisPoints;
}
function setMaxCumulativeDeltaDiffs(address[] memory _tokens, uint256[] memory _maxCumulativeDeltaDiffs) external override onlyTokenManager {
for (uint256 i = 0; i < _tokens.length; i++) {
address token = _tokens[i];
maxCumulativeDeltaDiffs[token] = _maxCumulativeDeltaDiffs[i];
}
}
function setPriceDataInterval(uint256 _priceDataInterval) external override onlyTokenManager {
priceDataInterval = _priceDataInterval;
}
function setMinAuthorizations(uint256 _minAuthorizations) external onlyTokenManager {
minAuthorizations = _minAuthorizations;
}
function setTokens(address[] memory _tokens, uint256[] memory _tokenPrecisions) external onlyGov {
require(_tokens.length == _tokenPrecisions.length, "FastPriceFeed: invalid lengths");
tokens = _tokens;
tokenPrecisions = _tokenPrecisions;
}
function setPrices(address[] memory _tokens, uint256[] memory _prices, uint256 _timestamp) external onlyUpdater {
bool shouldUpdate = _setLastUpdatedValues(_timestamp);
if (shouldUpdate) {
address _fastPriceEvents = fastPriceEvents;
address _vaultPriceFeed = vaultPriceFeed;
for (uint256 i = 0; i < _tokens.length; i++) {
address token = _tokens[i];
_setPrice(token, _prices[i], _vaultPriceFeed, _fastPriceEvents);
}
}
}
function setCompactedPrices(uint256[] memory _priceBitArray, uint256 _timestamp) external onlyUpdater {
bool shouldUpdate = _setLastUpdatedValues(_timestamp);
if (shouldUpdate) {
address _fastPriceEvents = fastPriceEvents;
address _vaultPriceFeed = vaultPriceFeed;
for (uint256 i = 0; i < _priceBitArray.length; i++) {
uint256 priceBits = _priceBitArray[i];
for (uint256 j = 0; j < 8; j++) {
uint256 index = i * 8 + j;
if (index >= tokens.length) { return; }
uint256 startBit = 32 * j;
uint256 price = (priceBits >> startBit) & BITMASK_32;
address token = tokens[i * 8 + j];
uint256 tokenPrecision = tokenPrecisions[i * 8 + j];
uint256 adjustedPrice = price.mul(PRICE_PRECISION).div(tokenPrecision);
_setPrice(token, adjustedPrice, _vaultPriceFeed, _fastPriceEvents);
}
}
}
}
function setPricesWithBits(uint256 _priceBits, uint256 _timestamp) external onlyUpdater {
_setPricesWithBits(_priceBits, _timestamp);
}
function setPricesWithBitsAndExecute(
uint256 _priceBits,
uint256 _timestamp,
uint256 _endIndexForIncreasePositions,
uint256 _endIndexForDecreasePositions,
uint256 _maxIncreasePositions,
uint256 _maxDecreasePositions
) external onlyUpdater {
_setPricesWithBits(_priceBits, _timestamp);
IPositionRouter _positionRouter = IPositionRouter(positionRouter);
uint256 maxEndIndexForIncrease = _positionRouter.increasePositionRequestKeysStart().add(_maxIncreasePositions);
uint256 maxEndIndexForDecrease = _positionRouter.decreasePositionRequestKeysStart().add(_maxDecreasePositions);
if (_endIndexForIncreasePositions > maxEndIndexForIncrease) {
_endIndexForIncreasePositions = maxEndIndexForIncrease;
}
if (_endIndexForDecreasePositions > maxEndIndexForDecrease) {
_endIndexForDecreasePositions = maxEndIndexForDecrease;
}
_positionRouter.executeIncreasePositions(_endIndexForIncreasePositions, payable(msg.sender));
_positionRouter.executeDecreasePositions(_endIndexForDecreasePositions, payable(msg.sender));
}
function disableFastPrice() external onlySigner {
require(!disableFastPriceVotes[msg.sender], "FastPriceFeed: already voted");
disableFastPriceVotes[msg.sender] = true;
disableFastPriceVoteCount = disableFastPriceVoteCount.add(1);
emit DisableFastPrice(msg.sender);
}
function enableFastPrice() external onlySigner {
require(disableFastPriceVotes[msg.sender], "FastPriceFeed: already enabled");
disableFastPriceVotes[msg.sender] = false;
disableFastPriceVoteCount = disableFastPriceVoteCount.sub(1);
emit EnableFastPrice(msg.sender);
}
// under regular operation, the fastPrice (prices[token]) is returned and there is no spread returned from this function,
// though VaultPriceFeed might apply its own spread
//
// if the fastPrice has not been updated within priceDuration then it is ignored and only _refPrice with a spread is used (spread: spreadBasisPointsIfInactive)
// in case the fastPrice has not been updated for maxPriceUpdateDelay then the _refPrice with a larger spread is used (spread: spreadBasisPointsIfChainError)
//
// there will be a spread from the _refPrice to the fastPrice in the following cases:
// - in case isSpreadEnabled is set to true
// - in case the maxDeviationBasisPoints between _refPrice and fastPrice is exceeded
// - in case watchers flag an issue
// - in case the cumulativeFastDelta exceeds the cumulativeRefDelta by the maxCumulativeDeltaDiff
function getPrice(address _token, uint256 _refPrice, bool _maximise) external override view returns (uint256) {
if (block.timestamp > lastUpdatedAt.add(maxPriceUpdateDelay)) {
if (_maximise) {
return _refPrice.mul(BASIS_POINTS_DIVISOR.add(spreadBasisPointsIfChainError)).div(BASIS_POINTS_DIVISOR);
}
return _refPrice.mul(BASIS_POINTS_DIVISOR.sub(spreadBasisPointsIfChainError)).div(BASIS_POINTS_DIVISOR);
}
if (block.timestamp > lastUpdatedAt.add(priceDuration)) {
if (_maximise) {
return _refPrice.mul(BASIS_POINTS_DIVISOR.add(spreadBasisPointsIfInactive)).div(BASIS_POINTS_DIVISOR);
}
return _refPrice.mul(BASIS_POINTS_DIVISOR.sub(spreadBasisPointsIfInactive)).div(BASIS_POINTS_DIVISOR);
}
uint256 fastPrice = prices[_token];
if (fastPrice == 0) { return _refPrice; }
uint256 diffBasisPoints = _refPrice > fastPrice ? _refPrice.sub(fastPrice) : fastPrice.sub(_refPrice);
diffBasisPoints = diffBasisPoints.mul(BASIS_POINTS_DIVISOR).div(_refPrice);
// create a spread between the _refPrice and the fastPrice if the maxDeviationBasisPoints is exceeded
// or if watchers have flagged an issue with the fast price
bool hasSpread = !favorFastPrice(_token) || diffBasisPoints > maxDeviationBasisPoints;
if (hasSpread) {
// return the higher of the two prices
if (_maximise) {
return _refPrice > fastPrice ? _refPrice : fastPrice;
}
// return the lower of the two prices
return _refPrice < fastPrice ? _refPrice : fastPrice;
}
return fastPrice;
}
function favorFastPrice(address _token) public view returns (bool) {
if (isSpreadEnabled) {
return false;
}
if (disableFastPriceVoteCount >= minAuthorizations) {
// force a spread if watchers have flagged an issue with the fast price
return false;
}
(/* uint256 prevRefPrice */, /* uint256 refTime */, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta) = getPriceData(_token);
if (cumulativeFastDelta > cumulativeRefDelta && cumulativeFastDelta.sub(cumulativeRefDelta) > maxCumulativeDeltaDiffs[_token]) {
// force a spread if the cumulative delta for the fast price feed exceeds the cumulative delta
// for the Chainlink price feed by the maxCumulativeDeltaDiff allowed
return false;
}
return true;
}
function getPriceData(address _token) public view returns (uint256, uint256, uint256, uint256) {
PriceDataItem memory data = priceData[_token];
return (uint256(data.refPrice), uint256(data.refTime), uint256(data.cumulativeRefDelta), uint256(data.cumulativeFastDelta));
}
function _setPricesWithBits(uint256 _priceBits, uint256 _timestamp) private {
bool shouldUpdate = _setLastUpdatedValues(_timestamp);
if (shouldUpdate) {
address _fastPriceEvents = fastPriceEvents;
address _vaultPriceFeed = vaultPriceFeed;
for (uint256 j = 0; j < 8; j++) {
uint256 index = j;
if (index >= tokens.length) { return; }
uint256 startBit = 32 * j;
uint256 price = (_priceBits >> startBit) & BITMASK_32;
address token = tokens[j];
uint256 tokenPrecision = tokenPrecisions[j];
uint256 adjustedPrice = price.mul(PRICE_PRECISION).div(tokenPrecision);
_setPrice(token, adjustedPrice, _vaultPriceFeed, _fastPriceEvents);
}
}
}
function _setPrice(address _token, uint256 _price, address _vaultPriceFeed, address _fastPriceEvents) private {
if (_vaultPriceFeed != address(0)) {
uint256 refPrice = IVaultPriceFeed(_vaultPriceFeed).getLatestPrimaryPrice(_token);
uint256 fastPrice = prices[_token];
(uint256 prevRefPrice, uint256 refTime, uint256 cumulativeRefDelta, uint256 cumulativeFastDelta) = getPriceData(_token);
if (prevRefPrice > 0) {
uint256 refDeltaAmount = refPrice > prevRefPrice ? refPrice.sub(prevRefPrice) : prevRefPrice.sub(refPrice);
uint256 fastDeltaAmount = fastPrice > _price ? fastPrice.sub(_price) : _price.sub(fastPrice);
// reset cumulative delta values if it is a new time window
if (refTime.div(priceDataInterval) != block.timestamp.div(priceDataInterval)) {
cumulativeRefDelta = 0;
cumulativeFastDelta = 0;
}
cumulativeRefDelta = cumulativeRefDelta.add(refDeltaAmount.mul(CUMULATIVE_DELTA_PRECISION).div(prevRefPrice));
cumulativeFastDelta = cumulativeFastDelta.add(fastDeltaAmount.mul(CUMULATIVE_DELTA_PRECISION).div(fastPrice));
}
if (cumulativeFastDelta > cumulativeRefDelta && cumulativeFastDelta.sub(cumulativeRefDelta) > maxCumulativeDeltaDiffs[_token]) {
emit MaxCumulativeDeltaDiffExceeded(_token, refPrice, fastPrice, cumulativeRefDelta, cumulativeFastDelta);
}
_setPriceData(_token, refPrice, cumulativeRefDelta, cumulativeFastDelta);
emit PriceData(_token, refPrice, fastPrice, cumulativeRefDelta, cumulativeFastDelta);
}
prices[_token] = _price;
_emitPriceEvent(_fastPriceEvents, _token, _price);
}
function _setPriceData(address _token, uint256 _refPrice, uint256 _cumulativeRefDelta, uint256 _cumulativeFastDelta) private {
require(_refPrice < MAX_REF_PRICE, "FastPriceFeed: invalid refPrice");
// skip validation of block.timestamp, it should only be out of range after the year 2100
require(_cumulativeRefDelta < MAX_CUMULATIVE_REF_DELTA, "FastPriceFeed: invalid cumulativeRefDelta");
require(_cumulativeFastDelta < MAX_CUMULATIVE_FAST_DELTA, "FastPriceFeed: invalid cumulativeFastDelta");
priceData[_token] = PriceDataItem(
uint160(_refPrice),
uint32(block.timestamp),
uint32(_cumulativeRefDelta),
uint32(_cumulativeFastDelta)
);
}
function _emitPriceEvent(address _fastPriceEvents, address _token, uint256 _price) private {
if (_fastPriceEvents == address(0)) {
return;
}
IFastPriceEvents(_fastPriceEvents).emitPriceEvent(_token, _price);
}
function _setLastUpdatedValues(uint256 _timestamp) private returns (bool) {
if (minBlockInterval > 0) {
require(block.number.sub(lastUpdatedBlock) >= minBlockInterval, "FastPriceFeed: minBlockInterval not yet passed");
}
uint256 _maxTimeDeviation = maxTimeDeviation;
require(_timestamp > block.timestamp.sub(_maxTimeDeviation), "FastPriceFeed: _timestamp below allowed range");
require(_timestamp < block.timestamp.add(_maxTimeDeviation), "FastPriceFeed: _timestamp exceeds allowed range");
// do not update prices if _timestamp is before the current lastUpdatedAt value
if (_timestamp < lastUpdatedAt) {
return false;
}
lastUpdatedAt = _timestamp;
lastUpdatedBlock = block.number;
return true;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"_priceDuration","type":"uint256"},{"internalType":"uint256","name":"_maxPriceUpdateDelay","type":"uint256"},{"internalType":"uint256","name":"_minBlockInterval","type":"uint256"},{"internalType":"uint256","name":"_maxDeviationBasisPoints","type":"uint256"},{"internalType":"address","name":"_fastPriceEvents","type":"address"},{"internalType":"address","name":"_tokenManager","type":"address"},{"internalType":"address","name":"_positionRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"DisableFastPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"EnableFastPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"refPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fastPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeRefDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeFastDelta","type":"uint256"}],"name":"MaxCumulativeDeltaDiffExceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"refPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fastPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeRefDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cumulativeFastDelta","type":"uint256"}],"name":"PriceData","type":"event"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BITMASK_32","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CUMULATIVE_DELTA_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CUMULATIVE_FAST_DELTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CUMULATIVE_REF_DELTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRICE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REF_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableFastPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableFastPriceVoteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"disableFastPriceVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableFastPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fastPriceEvents","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"favorFastPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_refPrice","type":"uint256"},{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getPriceData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAuthorizations","type":"uint256"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"address[]","name":"_updaters","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSpreadEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUpdater","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxCumulativeDeltaDiffs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDeviationBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceUpdateDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTimeDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAuthorizations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBlockInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceData","outputs":[{"internalType":"uint160","name":"refPrice","type":"uint160"},{"internalType":"uint32","name":"refTime","type":"uint32"},{"internalType":"uint32","name":"cumulativeRefDelta","type":"uint32"},{"internalType":"uint32","name":"cumulativeFastDelta","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceDataInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_priceBitArray","type":"uint256[]"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setCompactedPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fastPriceEvents","type":"address"}],"name":"setFastPriceEvents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSpreadEnabled","type":"bool"}],"name":"setIsSpreadEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastUpdatedAt","type":"uint256"}],"name":"setLastUpdatedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_maxCumulativeDeltaDiffs","type":"uint256[]"}],"name":"setMaxCumulativeDeltaDiffs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDeviationBasisPoints","type":"uint256"}],"name":"setMaxDeviationBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPriceUpdateDelay","type":"uint256"}],"name":"setMaxPriceUpdateDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTimeDeviation","type":"uint256"}],"name":"setMaxTimeDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAuthorizations","type":"uint256"}],"name":"setMinAuthorizations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBlockInterval","type":"uint256"}],"name":"setMinBlockInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceDataInterval","type":"uint256"}],"name":"setPriceDataInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceDuration","type":"uint256"}],"name":"setPriceDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceBits","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPricesWithBits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceBits","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_endIndexForIncreasePositions","type":"uint256"},{"internalType":"uint256","name":"_endIndexForDecreasePositions","type":"uint256"},{"internalType":"uint256","name":"_maxIncreasePositions","type":"uint256"},{"internalType":"uint256","name":"_maxDecreasePositions","type":"uint256"}],"name":"setPricesWithBitsAndExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_spreadBasisPointsIfChainError","type":"uint256"}],"name":"setSpreadBasisPointsIfChainError","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_spreadBasisPointsIfInactive","type":"uint256"}],"name":"setSpreadBasisPointsIfInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenManager","type":"address"}],"name":"setTokenManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_tokenPrecisions","type":"uint256[]"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setUpdater","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultPriceFeed","type":"address"}],"name":"setVaultPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spreadBasisPointsIfChainError","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spreadBasisPointsIfInactive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenPrecisions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526000805460ff60a81b1916815560105534801561002057600080fd5b5060405162002f2c38038062002f2c833981810160405260e081101561004557600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151600080546001600160a01b0319163317905594959394929391929091906107088711156100c65760405162461bcd60e51b815260040180806020018281038252602581526020018062002f076025913960400191505060405180910390fd5b600796909655600894909455600b92909255600e55600280546001600160a01b039283166001600160a01b031991821617909155600380549383169382169390931790925560048054919093169116179055612ddf80620001286000396000f3fe608060405234801561001057600080fd5b50600436106102e05760003560e01c806303b04936146102e557806303cd25711461031f57806303f4d7dc146103395780630604ddea146103de5780630e9272ea146103e6578063126082cf1461040a57806312d43a511461041257806314dd2dce1461041a578063162ac4e01461043757806317835d1c1461045d5780631a15339114610480578063238aafb7146104ae578063287800c9146104d45780632a709b14146104dc5780632e9cd94b146104e457806331cb610514610501578063392e53cd1461052f5780633aa08f861461053757806344c231931461053f5780634bd66c1c146103de5780634c0e31c81461055c5780634d11fb4a1461067f5780634f64b2be1461069c5780634fdfb086146106b957806354aea127146106df578063574ec1be146106e757806361ef161f14610722578063668d3d651461072a578063695d4184146107325780636c56fd051461073a5780636ccd47c414610760578063715c75361461076857806372279ba11461077057806374bfed89146107bc578063776d16c1146107c4578063782661bc146107e15780637cb2b79c146109065780637df73e271461092c5780637fbc79c6146109525780637fece36814610a7c578063807c9782146103de57806382553aad14610ab05780638b7677f414610acd57806395082d2514610aea578063a2b47c1614610af2578063a374242514610afa578063a6eca89614610b20578063b0a2566614610b28578063b3606b5614610b30578063b70c7b7014610b38578063c8390a4814610b55578063c84a912414610c78578063cab44b7614610c80578063ce98dfa814610cde578063cfad57a214610cfd578063cfed246b14610d23578063d6a153f114610d49578063d925351a14610d66578063de0d1b9414610d83578063dfb481c914610da0578063e64559ad14610da8578063e68a22c014610db0578063eeaa783a14610db8578063f90ce5ba14610dc0575b600080fd5b61030b600480360360208110156102fb57600080fd5b50356001600160a01b0316610dc8565b604080519115158252519081900360200190f35b610327610ddd565b60408051918252519081900360200190f35b6103dc6004803603604081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460208302840111600160201b8311171561039c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610de3915050565b005b610327610f5a565b6103ee610f62565b604080516001600160a01b039092168252519081900360200190f35b610327610f71565b6103ee610f77565b6103dc6004803603602081101561043057600080fd5b5035610f86565b6103dc6004803603602081101561044d57600080fd5b50356001600160a01b0316610fd8565b6103dc6004803603604081101561047357600080fd5b5080359060200135611047565b6103dc6004803603604081101561049657600080fd5b506001600160a01b03813516906020013515156110a3565b6103dc600480360360208110156104c457600080fd5b50356001600160a01b031661111b565b61032761118a565b6103ee611190565b6103dc600480360360208110156104fa57600080fd5b503561119f565b6103dc6004803603604081101561051757600080fd5b506001600160a01b03813516906020013515156111f1565b61030b611269565b610327611279565b6103dc6004803603602081101561055557600080fd5b503561127f565b6103dc6004803603604081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060e57600080fd5b82018360208201111561062057600080fd5b803590602001918460208302840111600160201b8311171561064157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b6103276004803603602081101561069557600080fd5b50356113bd565b6103ee600480360360208110156106b257600080fd5b50356113db565b61030b600480360360208110156106cf57600080fd5b50356001600160a01b0316611402565b610327611417565b6103dc600480360360c08110156106fd57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561141d565b6103ee61162c565b61032761163b565b61030b611641565b61030b6004803603602081101561075057600080fd5b50356001600160a01b0316611651565b6103dc6116dc565b6103276117ef565b6107966004803603602081101561078657600080fd5b50356001600160a01b03166117f5565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610327611873565b6103dc600480360360208110156107da57600080fd5b5035611879565b6103dc600480360360608110156107f757600080fd5b810190602081018135600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561089357600080fd5b8201836020820111156108a557600080fd5b803590602001918460208302840111600160201b831117156108c657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118cb915050565b6103dc6004803603602081101561091c57600080fd5b50356001600160a01b0316611999565b61030b6004803603602081101561094257600080fd5b50356001600160a01b0316611a08565b6103dc6004803603606081101561096857600080fd5b81359190810190604081016020820135600160201b81111561098957600080fd5b82018360208201111561099b57600080fd5b803590602001918460208302840111600160201b831117156109bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0b57600080fd5b820183602082011115610a1d57600080fd5b803590602001918460208302840111600160201b83111715610a3e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a1d945050505050565b61032760048036036060811015610a9257600080fd5b506001600160a01b0381351690602081013590604001351515611b76565b6103dc60048036036020811015610ac657600080fd5b5035611cfc565b6103dc60048036036020811015610ae357600080fd5b5035611d4e565b610327611da0565b610327611db0565b61032760048036036020811015610b1057600080fd5b50356001600160a01b0316611db7565b610327611dc9565b610327611dcf565b610327611dd5565b6103dc60048036036020811015610b4e57600080fd5b5035611ddb565b6103dc60048036036040811015610b6b57600080fd5b810190602081018135600160201b811115610b8557600080fd5b820183602082011115610b9757600080fd5b803590602001918460208302840111600160201b83111715610bb857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c0757600080fd5b820183602082011115610c1957600080fd5b803590602001918460208302840111600160201b83111715610c3a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e2d945050505050565b6103dc611ef7565b610ca660048036036020811015610c9657600080fd5b50356001600160a01b031661200e565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b6103dc60048036036020811015610cf457600080fd5b5035151561204d565b6103dc60048036036020811015610d1357600080fd5b50356001600160a01b03166120b8565b61032760048036036020811015610d3957600080fd5b50356001600160a01b0316612127565b6103dc60048036036020811015610d5f57600080fd5b5035612139565b6103dc60048036036020811015610d7c57600080fd5b503561218b565b6103dc60048036036020811015610d9957600080fd5b50356121dd565b61032761222f565b610327612235565b61032761223b565b6103ee612246565b610327612255565b60166020526000908152604090205460ff1681565b60075481565b3360009081526011602052604090205460ff16610e35576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b6000610e408261225b565b90508015610f54576002546001546001600160a01b03918216911660005b8551811015610f50576000868281518110610e7557fe5b6020026020010151905060005b6008811015610f4657601754600884028201908110610ea75750505050505050610f56565b60178054602084029185831c63ffffffff169160009190600889028701908110610ecd57fe5b6000918252602082200154601880546001600160a01b0390921693509060088a028801908110610ef957fe5b60009182526020822001549150610f2682610f208668327cb2734119d3b7a9601e1b612367565b906123c9565b9050610f3483828c8e612408565b505060019094019350610e8292505050565b5050600101610e5e565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314610fd3576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600555565b6000546001600160a01b03163314611025576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526011602052604090205460ff16611099576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b610f56828261269d565b6000546001600160a01b031633146110f0576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611168576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b6003546001600160a01b031681565b6003546001600160a01b031633146111ec576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b0316331461123e576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b600c5481565b6000546001600160a01b031633146112cc576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b61070881111561130d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c256025913960400191505060405180910390fd5b600755565b6003546001600160a01b0316331461135f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60005b8251811015610f5457600083828151811061137957fe5b6020026020010151905082828151811061138f57fe5b6020908102919091018101516001600160a01b03909216600090815260149091526040902055600101611362565b601881815481106113ca57fe5b600091825260209091200154905081565b601781815481106113e857fe5b6000918252602090912001546001600160a01b0316905081565b60116020526000908152604090205460ff1681565b60055481565b3360009081526011602052604090205460ff1661146f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b611479868661269d565b60048054604080516304dabc3160e51b815290516001600160a01b03909216926000926114f99287928692639b57862092808301926020929182900301818987803b1580156114c757600080fd5b505af11580156114db573d6000803e3d6000fd5b505050506040513d60208110156114f157600080fd5b505190612773565b9050600061153c84846001600160a01b0316631bca8cf06040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114c757600080fd5b90508187111561154a578196505b80861115611556578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561160957600080fd5b505af115801561161d573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff161561166c575060006116d7565b600f546010541061167f575060006116d7565b60008061168b846117f5565b93509350505081811180156116c057506001600160a01b0384166000908152601460205260409020546116be82846127cb565b115b156116d0576000925050506116d7565b6001925050505b919050565b3360009081526015602052604090205460ff1661172e576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff16611792576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601660205260409020805460ff191690556010546117b79060016127cb565b6010556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600e5481565b600080600080611803612b1d565b505050506001600160a01b039182166000908152601360209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60095481565b6000546001600160a01b031633146118c6576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600c55565b3360009081526011602052604090205460ff1661191d576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60006119288261225b565b90508015611993576002546001546001600160a01b03918216911660005b865181101561198f57600087828151811061195d57fe5b602002602001015190506119868188848151811061197757fe5b60200260200101518587612408565b50600101611946565b5050505b50505050565b6003546001600160a01b031633146119e6576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6000546001600160a01b03163314611a6a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611ab35760405162461bcd60e51b8152600401808060200182810382526022815260200180612d886022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600f8490555b8251811015611b1f576000838281518110611ae357fe5b6020908102919091018101516001600160a01b03166000908152601590915260409020805460ff19166001908117909155919091019050611acc565b5060005b8151811015611993576000828281518110611b3a57fe5b6020908102919091018101516001600160a01b03166000908152601190915260409020805460ff19166001908117909155919091019050611b23565b6000611b8f60085460055461277390919063ffffffff16565b421115611bea578115611bca57611bc3612710610f20611bbc600a5461271061277390919063ffffffff16565b8690612367565b9050611cf5565b611bc3612710610f20611bbc600a546127106127cb90919063ffffffff16565b600754600554611bf991612773565b421115611c46578115611c2657611bc3612710610f20611bbc60095461271061277390919063ffffffff16565b611bc3612710610f20611bbc6009546127106127cb90919063ffffffff16565b6001600160a01b03841660009081526012602052604090205480611c6d5783915050611cf5565b6000818511611c8557611c8082866127cb565b611c8f565b611c8f85836127cb565b9050611ca185610f2083612710612367565b90506000611cae87611651565b1580611cbb5750600e5482115b90508015611cef578415611ce257828611611cd65782611cd8565b855b9350505050611cf5565b828610611cd65782611cd8565b50909150505b9392505050565b6003546001600160a01b03163314611d49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b03163314611d9b576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600855565b68327cb2734119d3b7a9601e1b81565b6298968081565b60146020526000908152604090205481565b600a5481565b60105481565b600b5481565b6000546001600160a01b03163314611e28576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600955565b6000546001600160a01b03163314611e7a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b8051825114611ed0576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611ee3906017906020850190612b44565b508051610f54906018906020840190612ba9565b3360009081526015602052604090205460ff16611f49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff1615611fad576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601660205260409020805460ff19166001908117909155601054611fd691612773565b6010556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6013602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461209a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314612105576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205481565b6000546001600160a01b03163314612186576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600b55565b6003546001600160a01b031633146121d8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331461222a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600a55565b600d5481565b60085481565b6001600160a01b0381565b6001546001600160a01b031681565b60065481565b600b54600090156122b457600b546006546122779043906127cb565b10156122b45760405162461bcd60e51b815260040180806020018281038252602e815260200180612d31602e913960400191505060405180910390fd5b600c546122c142826127cb565b83116122fe5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d04602d913960400191505060405180910390fd5b6123084282612773565b83106123455760405162461bcd60e51b815260040180806020018281038252602f815260200180612cb4602f913960400191505060405180910390fd5b6005548310156123595760009150506116d7565b505060055543600655600190565b600082612376575060006123c3565b8282028284828161238357fe5b04146123c05760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce36021913960400191505060405180910390fd5b90505b92915050565b60006123c083836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061280d565b6001600160a01b03821615612677576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561246657600080fd5b505afa15801561247a573d6000803e3d6000fd5b505050506040513d602081101561249057600080fd5b50516001600160a01b0386166000908152601260205260408120549192508080806124ba8a6117f5565b935093509350935060008411156125815760008487116124e3576124de85886127cb565b6124ed565b6124ed87866127cb565b905060008a8711612507576125028b886127cb565b612511565b612511878c6127cb565b9050612528600d54426123c990919063ffffffff16565b600d546125369087906123c9565b146125445760009350600092505b61255f61255887610f208562989680612367565b8590612773565b935061257c61257588610f208462989680612367565b8490612773565b925050505b81811180156125b057506001600160a01b038a166000908152601460205260409020546125ae82846127cb565b115b1561260d57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b6126198a8784846128af565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601260205260409020839055611993818585612a45565b60006126a88261225b565b90508015610f54576002546001546001600160a01b03918216911660005b6008811015610f5057601754819081106126e4575050505050610f56565b60178054602084029189831c63ffffffff1691600091908690811061270557fe5b6000918252602082200154601880546001600160a01b039092169350908790811061272c57fe5b6000918252602082200154915061275382610f208668327cb2734119d3b7a9601e1b612367565b905061276183828a8c612408565b5050600190940193506126c692505050565b6000828201838110156123c0576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60006123c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac3565b600081836128995760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561285e578181015183820152602001612846565b50505050905090810190601f16801561288b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816128a557fe5b0495945050505050565b6001600160a01b03831061290a576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff821061294c5760405162461bcd60e51b8152600401808060200182810382526029815260200180612d5f6029913960400191505060405180910390fd5b63ffffffff811061298e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612c4a602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601390965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612a5857610f54565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612aaf57600080fd5b505af115801561198f573d6000803e3d6000fd5b60008184841115612b155760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561285e578181015183820152602001612846565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612b99579160200282015b82811115612b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b64565b50612ba5929150612bf0565b5090565b828054828255906000526020600020908101928215612be4579160200282015b82811115612be4578251825591602001919060010190612bc9565b50612ba5929150612c0f565b5b80821115612ba55780546001600160a01b0319168155600101612bf1565b5b80821115612ba55760008155600101612c1056fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a2646970667358221220d3110679483ab3acb24dfa1e6bd202506bda4fca5ed6353387fda5a7de366c8664736f6c634300060c0033466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000c0136b64e95697f8d22d77f702ef139a08536df2000000000000000000000000b1dd2fdb023cb54b7cc2a0f5d9e8d47a9f7723ce00000000000000000000000077f480fdb7100d096c2de1876c1f4960fa488246
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e05760003560e01c806303b04936146102e557806303cd25711461031f57806303f4d7dc146103395780630604ddea146103de5780630e9272ea146103e6578063126082cf1461040a57806312d43a511461041257806314dd2dce1461041a578063162ac4e01461043757806317835d1c1461045d5780631a15339114610480578063238aafb7146104ae578063287800c9146104d45780632a709b14146104dc5780632e9cd94b146104e457806331cb610514610501578063392e53cd1461052f5780633aa08f861461053757806344c231931461053f5780634bd66c1c146103de5780634c0e31c81461055c5780634d11fb4a1461067f5780634f64b2be1461069c5780634fdfb086146106b957806354aea127146106df578063574ec1be146106e757806361ef161f14610722578063668d3d651461072a578063695d4184146107325780636c56fd051461073a5780636ccd47c414610760578063715c75361461076857806372279ba11461077057806374bfed89146107bc578063776d16c1146107c4578063782661bc146107e15780637cb2b79c146109065780637df73e271461092c5780637fbc79c6146109525780637fece36814610a7c578063807c9782146103de57806382553aad14610ab05780638b7677f414610acd57806395082d2514610aea578063a2b47c1614610af2578063a374242514610afa578063a6eca89614610b20578063b0a2566614610b28578063b3606b5614610b30578063b70c7b7014610b38578063c8390a4814610b55578063c84a912414610c78578063cab44b7614610c80578063ce98dfa814610cde578063cfad57a214610cfd578063cfed246b14610d23578063d6a153f114610d49578063d925351a14610d66578063de0d1b9414610d83578063dfb481c914610da0578063e64559ad14610da8578063e68a22c014610db0578063eeaa783a14610db8578063f90ce5ba14610dc0575b600080fd5b61030b600480360360208110156102fb57600080fd5b50356001600160a01b0316610dc8565b604080519115158252519081900360200190f35b610327610ddd565b60408051918252519081900360200190f35b6103dc6004803603604081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460208302840111600160201b8311171561039c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610de3915050565b005b610327610f5a565b6103ee610f62565b604080516001600160a01b039092168252519081900360200190f35b610327610f71565b6103ee610f77565b6103dc6004803603602081101561043057600080fd5b5035610f86565b6103dc6004803603602081101561044d57600080fd5b50356001600160a01b0316610fd8565b6103dc6004803603604081101561047357600080fd5b5080359060200135611047565b6103dc6004803603604081101561049657600080fd5b506001600160a01b03813516906020013515156110a3565b6103dc600480360360208110156104c457600080fd5b50356001600160a01b031661111b565b61032761118a565b6103ee611190565b6103dc600480360360208110156104fa57600080fd5b503561119f565b6103dc6004803603604081101561051757600080fd5b506001600160a01b03813516906020013515156111f1565b61030b611269565b610327611279565b6103dc6004803603602081101561055557600080fd5b503561127f565b6103dc6004803603604081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060e57600080fd5b82018360208201111561062057600080fd5b803590602001918460208302840111600160201b8311171561064157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b6103276004803603602081101561069557600080fd5b50356113bd565b6103ee600480360360208110156106b257600080fd5b50356113db565b61030b600480360360208110156106cf57600080fd5b50356001600160a01b0316611402565b610327611417565b6103dc600480360360c08110156106fd57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561141d565b6103ee61162c565b61032761163b565b61030b611641565b61030b6004803603602081101561075057600080fd5b50356001600160a01b0316611651565b6103dc6116dc565b6103276117ef565b6107966004803603602081101561078657600080fd5b50356001600160a01b03166117f5565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610327611873565b6103dc600480360360208110156107da57600080fd5b5035611879565b6103dc600480360360608110156107f757600080fd5b810190602081018135600160201b81111561081157600080fd5b82018360208201111561082357600080fd5b803590602001918460208302840111600160201b8311171561084457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561089357600080fd5b8201836020820111156108a557600080fd5b803590602001918460208302840111600160201b831117156108c657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118cb915050565b6103dc6004803603602081101561091c57600080fd5b50356001600160a01b0316611999565b61030b6004803603602081101561094257600080fd5b50356001600160a01b0316611a08565b6103dc6004803603606081101561096857600080fd5b81359190810190604081016020820135600160201b81111561098957600080fd5b82018360208201111561099b57600080fd5b803590602001918460208302840111600160201b831117156109bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0b57600080fd5b820183602082011115610a1d57600080fd5b803590602001918460208302840111600160201b83111715610a3e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a1d945050505050565b61032760048036036060811015610a9257600080fd5b506001600160a01b0381351690602081013590604001351515611b76565b6103dc60048036036020811015610ac657600080fd5b5035611cfc565b6103dc60048036036020811015610ae357600080fd5b5035611d4e565b610327611da0565b610327611db0565b61032760048036036020811015610b1057600080fd5b50356001600160a01b0316611db7565b610327611dc9565b610327611dcf565b610327611dd5565b6103dc60048036036020811015610b4e57600080fd5b5035611ddb565b6103dc60048036036040811015610b6b57600080fd5b810190602081018135600160201b811115610b8557600080fd5b820183602082011115610b9757600080fd5b803590602001918460208302840111600160201b83111715610bb857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c0757600080fd5b820183602082011115610c1957600080fd5b803590602001918460208302840111600160201b83111715610c3a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e2d945050505050565b6103dc611ef7565b610ca660048036036020811015610c9657600080fd5b50356001600160a01b031661200e565b604080516001600160a01b03909516855263ffffffff9384166020860152918316848301529091166060830152519081900360800190f35b6103dc60048036036020811015610cf457600080fd5b5035151561204d565b6103dc60048036036020811015610d1357600080fd5b50356001600160a01b03166120b8565b61032760048036036020811015610d3957600080fd5b50356001600160a01b0316612127565b6103dc60048036036020811015610d5f57600080fd5b5035612139565b6103dc60048036036020811015610d7c57600080fd5b503561218b565b6103dc60048036036020811015610d9957600080fd5b50356121dd565b61032761222f565b610327612235565b61032761223b565b6103ee612246565b610327612255565b60166020526000908152604090205460ff1681565b60075481565b3360009081526011602052604090205460ff16610e35576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b6000610e408261225b565b90508015610f54576002546001546001600160a01b03918216911660005b8551811015610f50576000868281518110610e7557fe5b6020026020010151905060005b6008811015610f4657601754600884028201908110610ea75750505050505050610f56565b60178054602084029185831c63ffffffff169160009190600889028701908110610ecd57fe5b6000918252602082200154601880546001600160a01b0390921693509060088a028801908110610ef957fe5b60009182526020822001549150610f2682610f208668327cb2734119d3b7a9601e1b612367565b906123c9565b9050610f3483828c8e612408565b505060019094019350610e8292505050565b5050600101610e5e565b5050505b505b5050565b63ffffffff81565b6002546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b03163314610fd3576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600555565b6000546001600160a01b03163314611025576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526011602052604090205460ff16611099576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b610f56828261269d565b6000546001600160a01b031633146110f0576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611168576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5481565b6003546001600160a01b031681565b6003546001600160a01b031633146111ec576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600d55565b6000546001600160a01b0316331461123e576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600054600160a01b900460ff1681565b600c5481565b6000546001600160a01b031633146112cc576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b61070881111561130d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c256025913960400191505060405180910390fd5b600755565b6003546001600160a01b0316331461135f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60005b8251811015610f5457600083828151811061137957fe5b6020026020010151905082828151811061138f57fe5b6020908102919091018101516001600160a01b03909216600090815260149091526040902055600101611362565b601881815481106113ca57fe5b600091825260209091200154905081565b601781815481106113e857fe5b6000918252602090912001546001600160a01b0316905081565b60116020526000908152604090205460ff1681565b60055481565b3360009081526011602052604090205460ff1661146f576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b611479868661269d565b60048054604080516304dabc3160e51b815290516001600160a01b03909216926000926114f99287928692639b57862092808301926020929182900301818987803b1580156114c757600080fd5b505af11580156114db573d6000803e3d6000fd5b505050506040513d60208110156114f157600080fd5b505190612773565b9050600061153c84846001600160a01b0316631bca8cf06040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114c757600080fd5b90508187111561154a578196505b80861115611556578095505b60408051629a208160e81b81526004810189905233602482015290516001600160a01b03851691639a20810091604480830192600092919082900301818387803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b50506040805163f3883d8b60e01b8152600481018a905233602482015290516001600160a01b038716935063f3883d8b9250604480830192600092919082900301818387803b15801561160957600080fd5b505af115801561161d573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160a01b031681565b61070881565b600054600160a81b900460ff1681565b60008054600160a81b900460ff161561166c575060006116d7565b600f546010541061167f575060006116d7565b60008061168b846117f5565b93509350505081811180156116c057506001600160a01b0384166000908152601460205260409020546116be82846127cb565b115b156116d0576000925050506116d7565b6001925050505b919050565b3360009081526015602052604090205460ff1661172e576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff16611792576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20616c726561647920656e61626c65640000604482015290519081900360640190fd5b336000908152601660205260409020805460ff191690556010546117b79060016127cb565b6010556040805133815290517f9fe0c305c33aa92757a537936872a60be0d91549a4303cc99fd8b7fce8a002759181900360200190a1565b600e5481565b600080600080611803612b1d565b505050506001600160a01b039182166000908152601360209081526040918290208251608081018452905494851680825263ffffffff600160a01b87048116938301849052600160c01b87048116948301859052600160e01b909604909516606090910181905293949093919250565b60095481565b6000546001600160a01b031633146118c6576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600c55565b3360009081526011602052604090205460ff1661191d576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b60006119288261225b565b90508015611993576002546001546001600160a01b03918216911660005b865181101561198f57600087828151811061195d57fe5b602002602001015190506119868188848151811061197757fe5b60200260200101518587612408565b50600101611946565b5050505b50505050565b6003546001600160a01b031633146119e6576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6000546001600160a01b03163314611a6a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600054600160a01b900460ff1615611ab35760405162461bcd60e51b8152600401808060200182810382526022815260200180612d886022913960400191505060405180910390fd5b6000805460ff60a01b1916600160a01b178155600f8490555b8251811015611b1f576000838281518110611ae357fe5b6020908102919091018101516001600160a01b03166000908152601590915260409020805460ff19166001908117909155919091019050611acc565b5060005b8151811015611993576000828281518110611b3a57fe5b6020908102919091018101516001600160a01b03166000908152601190915260409020805460ff19166001908117909155919091019050611b23565b6000611b8f60085460055461277390919063ffffffff16565b421115611bea578115611bca57611bc3612710610f20611bbc600a5461271061277390919063ffffffff16565b8690612367565b9050611cf5565b611bc3612710610f20611bbc600a546127106127cb90919063ffffffff16565b600754600554611bf991612773565b421115611c46578115611c2657611bc3612710610f20611bbc60095461271061277390919063ffffffff16565b611bc3612710610f20611bbc6009546127106127cb90919063ffffffff16565b6001600160a01b03841660009081526012602052604090205480611c6d5783915050611cf5565b6000818511611c8557611c8082866127cb565b611c8f565b611c8f85836127cb565b9050611ca185610f2083612710612367565b90506000611cae87611651565b1580611cbb5750600e5482115b90508015611cef578415611ce257828611611cd65782611cd8565b855b9350505050611cf5565b828610611cd65782611cd8565b50909150505b9392505050565b6003546001600160a01b03163314611d49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600e55565b6000546001600160a01b03163314611d9b576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600855565b68327cb2734119d3b7a9601e1b81565b6298968081565b60146020526000908152604090205481565b600a5481565b60105481565b600b5481565b6000546001600160a01b03163314611e28576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600955565b6000546001600160a01b03163314611e7a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b8051825114611ed0576040805162461bcd60e51b815260206004820152601e60248201527f466173745072696365466565643a20696e76616c6964206c656e677468730000604482015290519081900360640190fd5b8151611ee3906017906020850190612b44565b508051610f54906018906020840190612ba9565b3360009081526015602052604090205460ff16611f49576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b3360009081526016602052604090205460ff1615611fad576040805162461bcd60e51b815260206004820152601c60248201527b11985cdd141c9a58d9519959590e88185b1c9958591e481d9bdd195960221b604482015290519081900360640190fd5b336000908152601660205260409020805460ff19166001908117909155601054611fd691612773565b6010556040805133815290517f4c0c5fabf50e808e3bc8d19577d305e3a7163eea7e8a74a50caa8896694cd44b9181900360200190a1565b6013602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b6000546001600160a01b0316331461209a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314612105576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205481565b6000546001600160a01b03163314612186576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600b55565b6003546001600160a01b031633146121d8576040805162461bcd60e51b81526020600482015260186024820152600080516020612c94833981519152604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331461222a576040805162461bcd60e51b81526020600482015260156024820152600080516020612c74833981519152604482015290519081900360640190fd5b600a55565b600d5481565b60085481565b6001600160a01b0381565b6001546001600160a01b031681565b60065481565b600b54600090156122b457600b546006546122779043906127cb565b10156122b45760405162461bcd60e51b815260040180806020018281038252602e815260200180612d31602e913960400191505060405180910390fd5b600c546122c142826127cb565b83116122fe5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d04602d913960400191505060405180910390fd5b6123084282612773565b83106123455760405162461bcd60e51b815260040180806020018281038252602f815260200180612cb4602f913960400191505060405180910390fd5b6005548310156123595760009150506116d7565b505060055543600655600190565b600082612376575060006123c3565b8282028284828161238357fe5b04146123c05760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce36021913960400191505060405180910390fd5b90505b92915050565b60006123c083836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061280d565b6001600160a01b03821615612677576000826001600160a01b03166356bf9de4866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561246657600080fd5b505afa15801561247a573d6000803e3d6000fd5b505050506040513d602081101561249057600080fd5b50516001600160a01b0386166000908152601260205260408120549192508080806124ba8a6117f5565b935093509350935060008411156125815760008487116124e3576124de85886127cb565b6124ed565b6124ed87866127cb565b905060008a8711612507576125028b886127cb565b612511565b612511878c6127cb565b9050612528600d54426123c990919063ffffffff16565b600d546125369087906123c9565b146125445760009350600092505b61255f61255887610f208562989680612367565b8590612773565b935061257c61257588610f208462989680612367565b8490612773565b925050505b81811180156125b057506001600160a01b038a166000908152601460205260409020546125ae82846127cb565b115b1561260d57604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517fe582322b389ad06b2bbf619cd6da3f16a288ec873ea0fa6df4d72f3d9480b4479181900360a00190a15b6126198a8784846128af565b604080516001600160a01b038c16815260208101889052808201879052606081018490526080810183905290517f23b9387f81fca646aac1dc4487ede045c65f5f7445482906565f01e05afdb3a89181900360a00190a15050505050505b6001600160a01b0384166000908152601260205260409020839055611993818585612a45565b60006126a88261225b565b90508015610f54576002546001546001600160a01b03918216911660005b6008811015610f5057601754819081106126e4575050505050610f56565b60178054602084029189831c63ffffffff1691600091908690811061270557fe5b6000918252602082200154601880546001600160a01b039092169350908790811061272c57fe5b6000918252602082200154915061275382610f208668327cb2734119d3b7a9601e1b612367565b905061276183828a8c612408565b5050600190940193506126c692505050565b6000828201838110156123c0576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60006123c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac3565b600081836128995760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561285e578181015183820152602001612846565b50505050905090810190601f16801561288b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816128a557fe5b0495945050505050565b6001600160a01b03831061290a576040805162461bcd60e51b815260206004820152601f60248201527f466173745072696365466565643a20696e76616c696420726566507269636500604482015290519081900360640190fd5b63ffffffff821061294c5760405162461bcd60e51b8152600401808060200182810382526029815260200180612d5f6029913960400191505060405180910390fd5b63ffffffff811061298e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612c4a602a913960400191505060405180910390fd5b604080516080810182526001600160a01b03948516815263ffffffff4281166020808401918252958216838501908152948216606084019081529787166000908152601390965292909420905181549251935196518516600160e01b026001600160e01b03978616600160c01b0263ffffffff60c01b1995909616600160a01b0263ffffffff60a01b19929097166001600160a01b0319909416939093171694909417919091169190911792909216919091179055565b6001600160a01b038316612a5857610f54565b826001600160a01b031663e0409c7183836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612aaf57600080fd5b505af115801561198f573d6000803e3d6000fd5b60008184841115612b155760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561285e578181015183820152602001612846565b505050900390565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054828255906000526020600020908101928215612b99579160200282015b82811115612b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b64565b50612ba5929150612bf0565b5090565b828054828255906000526020600020908101928215612be4579160200282015b82811115612be4578251825591602001919060010190612bc9565b50612ba5929150612c0f565b5b80821115612ba55780546001600160a01b0319168155600101612bf1565b5b80821115612ba55760008155600101612c1056fe466173745072696365466565643a20696e76616c6964205f70726963654475726174696f6e466173745072696365466565643a20696e76616c69642063756d756c61746976654661737444656c7461476f7665726e61626c653a20666f7262696464656e0000000000000000000000466173745072696365466565643a20666f7262696464656e0000000000000000466173745072696365466565643a205f74696d657374616d70206578636565647320616c6c6f7765642072616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466173745072696365466565643a205f74696d657374616d702062656c6f7720616c6c6f7765642072616e6765466173745072696365466565643a206d696e426c6f636b496e74657276616c206e6f742079657420706173736564466173745072696365466565643a20696e76616c69642063756d756c617469766552656644656c7461466173745072696365466565643a20616c726561647920696e697469616c697a6564a2646970667358221220d3110679483ab3acb24dfa1e6bd202506bda4fca5ed6353387fda5a7de366c8664736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000c0136b64e95697f8d22d77f702ef139a08536df2000000000000000000000000b1dd2fdb023cb54b7cc2a0f5d9e8d47a9f7723ce00000000000000000000000077f480fdb7100d096c2de1876c1f4960fa488246
-----Decoded View---------------
Arg [0] : _priceDuration (uint256): 300
Arg [1] : _maxPriceUpdateDelay (uint256): 3600
Arg [2] : _minBlockInterval (uint256): 1
Arg [3] : _maxDeviationBasisPoints (uint256): 250
Arg [4] : _fastPriceEvents (address): 0xc0136b64E95697f8d22D77f702EF139a08536df2
Arg [5] : _tokenManager (address): 0xB1dD2Fdb023cB54b7cc2a0f5D9e8d47a9F7723ce
Arg [6] : _positionRouter (address): 0x77F480fdB7100d096c2de1876C1f4960Fa488246
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [4] : 000000000000000000000000c0136b64e95697f8d22d77f702ef139a08536df2
Arg [5] : 000000000000000000000000b1dd2fdb023cb54b7cc2a0f5d9e8d47a9f7723ce
Arg [6] : 00000000000000000000000077f480fdb7100d096c2de1876c1f4960fa488246
Deployed Bytecode Sourcemap
9605:19835:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11777:54;;;;;;;;;;;;;;;;-1:-1:-1;11777:54:0;-1:-1:-1;;;;;11777:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;11024:28;;;:::i;:::-;;;;;;;;;;;;;;;;17884:1090;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17884:1090:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17884:1090:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17884:1090:0;;-1:-1:-1;;17884:1090:0;;;-1:-1:-1;17884:1090:0;;-1:-1:-1;;17884:1090:0:i;:::-;;10247:67;;;:::i;10818:30::-;;;:::i;:::-;;;;-1:-1:-1;;;;;10818:30:0;;;;;;;;;;;;;;10581:52;;;:::i;396:18::-;;;:::i;15972:116::-;;;;;;;;;;;;;;;;-1:-1:-1;15972:116:0;;:::i;14515:122::-;;;;;;;;;;;;;;;;-1:-1:-1;14515:122:0;-1:-1:-1;;;;;14515:122:0;;:::i;18982:149::-;;;;;;;;;;;;;;;;-1:-1:-1;18982:149:0;;;;;;;:::i;14377:130::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14377:130:0;;;;;;;;;;:::i;14645:127::-;;;;;;;;;;;;;;;;-1:-1:-1;14645:127:0;-1:-1:-1;;;;;14645:127:0;;:::i;11411:32::-;;;:::i;10857:27::-;;;:::i;16747:150::-;;;;;;;;;;;;;;;;-1:-1:-1;16747:150:0;;:::i;14241:128::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14241:128:0;;;;;;;;;;:::i;10706:25::-;;;:::i;11238:31::-;;;:::i;14916:222::-;;;;;;;;;;;;;;;;-1:-1:-1;14916:222:0;;:::i;16407:332::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16407:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16407:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16407:332:0;;;;;;;;-1:-1:-1;16407:332:0;;-1:-1:-1;;;;;16407:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16407:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16407:332:0;;-1:-1:-1;16407:332:0;;-1:-1:-1;;;;;16407:332:0:i;12157:32::-;;;;;;;;;;;;;;;;-1:-1:-1;12157:32:0;;:::i;11920:23::-;;;;;;;;;;;;;;;;-1:-1:-1;11920:23:0;;:::i;11503:42::-;;;;;;;;;;;;;;;;-1:-1:-1;11503:42:0;-1:-1:-1;;;;;11503:42:0;;:::i;10931:37::-;;;:::i;19139:1194::-;;;;;;;;;;;;;;;;-1:-1:-1;19139:1194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10893:29::-;;;:::i;10642:55::-;;;:::i;10738:35::-;;;:::i;23670:868::-;;;;;;;;;;;;;;;;-1:-1:-1;23670:868:0;-1:-1:-1;;;;;23670:868:0;;:::i;20659:310::-;;;:::i;11364:38::-;;;:::i;24546:293::-;;;;;;;;;;;;;;;;-1:-1:-1;24546:293:0;-1:-1:-1;;;;;24546:293:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11100:42;;;:::i;14780:128::-;;;;;;;;;;;;;;;;-1:-1:-1;14780:128:0;;:::i;17334:542::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17334:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17334:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17334:542:0;;;;;;;;-1:-1:-1;17334:542:0;;-1:-1:-1;;;;;17334:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17334:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17334:542:0;;-1:-1:-1;;17334:542:0;;;-1:-1:-1;17334:542:0;;-1:-1:-1;;17334:542:0:i;16096:121::-;;;;;;;;;;;;;;;;-1:-1:-1;16096:121:0;-1:-1:-1;;;;;16096:121:0;;:::i;11729:41::-;;;;;;;;;;;;;;;;-1:-1:-1;11729:41:0;-1:-1:-1;;;;;11729:41:0;;:::i;13646:587::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13646:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13646:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13646:587:0;;;;;;;;-1:-1:-1;13646:587:0;;-1:-1:-1;;;;;13646:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13646:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13646:587:0;;-1:-1:-1;13646:587:0;;-1:-1:-1;;;;;13646:587:0:i;21879:1783::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21879:1783:0;;;;;;;;;;;;;;;:::i;16225:174::-;;;;;;;;;;;;;;;;-1:-1:-1;16225:174:0;;:::i;15146:149::-;;;;;;;;;;;;;;;;-1:-1:-1;15146:149:0;;:::i;10046:50::-;;;:::i;10105:69::-;;;:::i;11661:59::-;;;;;;;;;;;;;;;;-1:-1:-1;11661:59:0;-1:-1:-1;;;;;11661:59:0;;:::i;11149:44::-;;;:::i;11450:::-;;;:::i;11200:31::-;;;:::i;15303:181::-;;;;;;;;;;;;;;;;-1:-1:-1;15303:181:0;;:::i;17054:272::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17054:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17054:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17054:272:0;;;;;;;;-1:-1:-1;17054:272:0;;-1:-1:-1;;;;;17054:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17054:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17054:272:0;;-1:-1:-1;17054:272:0;;-1:-1:-1;;;;;17054:272:0:i;20341:310::-;;;:::i;11603:51::-;;;;;;;;;;;;;;;;-1:-1:-1;11603:51:0;-1:-1:-1;;;;;11603:51:0;;:::i;:::-;;;;-1:-1:-1;;;;;11603:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15834:130;;;;;;;;;;;;;;;;-1:-1:-1;15834:130:0;;;;:::i;596:76::-;;;;;;;;;;;;;;;;-1:-1:-1;596:76:0;-1:-1:-1;;;;;596:76:0;;:::i;11554:42::-;;;;;;;;;;;;;;;;-1:-1:-1;11554:42:0;-1:-1:-1;;;;;11554:42:0;;:::i;15689:137::-;;;;;;;;;;;;;;;;-1:-1:-1;15689:137:0;;:::i;16905:141::-;;;;;;;;;;;;;;;;-1:-1:-1;16905:141:0;;:::i;15492:189::-;;;;;;;;;;;;;;;;-1:-1:-1;15492:189:0;;:::i;11278:32::-;;;:::i;11059:34::-;;;:::i;10183:57::-;;;:::i;10782:29::-;;;:::i;10975:40::-;;;:::i;11777:54::-;;;;;;;;;;;;;;;:::o;11024:28::-;;;;:::o;17884:1090::-;12742:10;12732:21;;;;:9;:21;;;;;;;;12724:58;;;;;-1:-1:-1;;;12724:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12724:58:0;;;;;;;;;;;;;;;17997:17:::1;18017:33;18039:10;18017:21;:33::i;:::-;17997:53;;18067:12;18063:904;;;18123:15;::::0;;18179:14;-1:-1:-1;;;;;18123:15:0;;::::1;::::0;18179:14:::1;18096:24;18210:746;18234:14;:21;18230:1;:25;18210:746;;;18281:17;18301:14;18316:1;18301:17;;;;;;;;;;;;;;18281:37;;18344:9;18339:602;18363:1;18359;:5;18339:602;;;18455:6;:13:::0;18414:1:::1;18410:5:::0;::::1;:9:::0;::::1;::::0;18446:22;::::1;18442:39;;18472:7;;;;;;;;;18442:39;18646:6;:17:::0;;18524:2:::1;:6:::0;::::1;::::0;18570:21;;::::1;10547:25:::0;18569:36:::1;::::0;18505:16:::1;::::0;18646:6;18657:1:::1;18653:5:::0;::::1;:9:::0;::::1;::::0;18646:17;::::1;;;;;;::::0;;;::::1;::::0;;::::1;::::0;18711:15:::1;:26:::0;;-1:-1:-1;;;;;18646:17:0;;::::1;::::0;-1:-1:-1;18711:15:0;18731:1:::1;18727:5:::0;::::1;:9:::0;::::1;::::0;18711:26;::::1;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;18784:46:0::1;18711:26:::0;18784::::1;:5:::0;-1:-1:-1;;;18784:9:0::1;:26::i;:::-;:30:::0;::::1;:46::i;:::-;18760:70;;18855:66;18865:5;18872:13;18887:15;18904:16;18855:9;:66::i;:::-;-1:-1:-1::0;;18366:3:0::1;::::0;;::::1;::::0;-1:-1:-1;18339:602:0::1;::::0;-1:-1:-1;;;18339:602:0::1;;-1:-1:-1::0;;18257:3:0::1;;18210:746;;;;18063:904;;;12793:1;;17884:1090:::0;;:::o;10247:67::-;10298:16;10247:67;:::o;10818:30::-;;;-1:-1:-1;;;;;10818:30:0;;:::o;10581:52::-;10628:5;10581:52;:::o;396:18::-;;;-1:-1:-1;;;;;396:18:0;;:::o;15972:116::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;16050:13:::1;:30:::0;15972:116::o;14515:122::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;14595:15:::1;:34:::0;;-1:-1:-1;;;;;;14595:34:0::1;-1:-1:-1::0;;;;;14595:34:0;;;::::1;::::0;;;::::1;::::0;;14515:122::o;18982:149::-;12742:10;12732:21;;;;:9;:21;;;;;;;;12724:58;;;;;-1:-1:-1;;;12724:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12724:58:0;;;;;;;;;;;;;;;19081:42:::1;19100:10;19112;19081:18;:42::i;14377:130::-:0;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14468:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:31;;-1:-1:-1;;14468:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14377:130::o;14645:127::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;14732:14:::1;:32:::0;;-1:-1:-1;;;;;;14732:32:0::1;-1:-1:-1::0;;;;;14732:32:0;;;::::1;::::0;;;::::1;::::0;;14645:127::o;11411:32::-;;;;:::o;10857:27::-;;;-1:-1:-1;;;;;10857:27:0;;:::o;16747:150::-;12871:12;;-1:-1:-1;;;;;12871:12:0;12857:10;:26;12849:63;;;;;-1:-1:-1;;;12849:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12849:63:0;;;;;;;;;;;;;;;16851:17:::1;:38:::0;16747:150::o;14241:128::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14331:18:0;;;::::1;;::::0;;;:8:::1;:18;::::0;;;;:30;;-1:-1:-1;;14331:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14241:128::o;10706:25::-;;;-1:-1:-1;;;10706:25:0;;;;;:::o;11238:31::-;;;;:::o;14916:222::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;10687:10:::1;15011:14;:36;;15003:86;;;;-1:-1:-1::0;;;15003:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15100:13;:30:::0;14916:222::o;16407:332::-;12871:12;;-1:-1:-1;;;;;12871:12:0;12857:10;:26;12849:63;;;;;-1:-1:-1;;;12849:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12849:63:0;;;;;;;;;;;;;;;16564:9:::1;16559:173;16583:7;:14;16579:1;:18;16559:173;;;16619:13;16635:7;16643:1;16635:10;;;;;;;;;;;;;;16619:26;;16693:24;16718:1;16693:27;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;16660:30:0;;::::1;;::::0;;;:23:::1;:30:::0;;;;;;:60;16599:3:::1;;16559:173;;12157:32:::0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12157:32:0;:::o;11920:23::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11920:23:0;;-1:-1:-1;11920:23:0;:::o;11503:42::-;;;;;;;;;;;;;;;:::o;10931:37::-;;;;:::o;19139:1194::-;12742:10;12732:21;;;;:9;:21;;;;;;;;12724:58;;;;;-1:-1:-1;;;12724:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12724:58:0;;;;;;;;;;;;;;;19449:42:::1;19468:10;19480;19449:18;:42::i;:::-;19554:14;::::0;;19613:50:::1;::::0;;-1:-1:-1;;;19613:50:0;;;;-1:-1:-1;;;;;19554:14:0;;::::1;::::0;19504:31:::1;::::0;19613:77:::1;::::0;19668:21;;19554:14;;19613:48:::1;::::0;:50;;::::1;::::0;::::1;::::0;;;;;;;19504:31;19554:14;19613:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19613:50:0;;:54:::1;:77::i;:::-;19580:110;;19701:30;19734:77;19789:21;19734:15;-1:-1:-1::0;;;;;19734:48:0::1;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:77;19701:110;;19860:22;19828:29;:54;19824:141;;;19931:22;19899:54;;19824:141;20013:22;19981:29;:54;19977:141;;;20084:22;20052:54;;19977:141;20130:92;::::0;;-1:-1:-1;;;20130:92:0;;::::1;::::0;::::1;::::0;;;20210:10:::1;20130:92:::0;;;;;;-1:-1:-1;;;;;20130:40:0;::::1;::::0;::::1;::::0;:92;;;;;-1:-1:-1;;20130:92:0;;;;;;;-1:-1:-1;20130:40:0;:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20233:92:0::1;::::0;;-1:-1:-1;;;20233:92:0;;::::1;::::0;::::1;::::0;;;20313:10:::1;20233:92:::0;;;;;;-1:-1:-1;;;;;20233:40:0;::::1;::::0;-1:-1:-1;20233:40:0::1;::::0;-1:-1:-1;20233:92:0;;;;;-1:-1:-1;;20233:92:0;;;;;;;-1:-1:-1;20233:40:0;:92;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12793:1;;;19139:1194:::0;;;;;;:::o;10893:29::-;;;-1:-1:-1;;;;;10893:29:0;;:::o;10642:55::-;10687:10;10642:55;:::o;10738:35::-;;;-1:-1:-1;;;10738:35:0;;;;;:::o;23670:868::-;23731:4;23752:15;;-1:-1:-1;;;23752:15:0;;;;23748:60;;;-1:-1:-1;23791:5:0;23784:12;;23748:60;23853:17;;23824:25;;:46;23820:176;;-1:-1:-1;23979:5:0;23972:12;;23820:176;24060:26;24088:27;24119:20;24132:6;24119:12;:20::i;:::-;24008:131;;;;;;24176:18;24154:19;:40;:121;;;;-1:-1:-1;;;;;;24244:31:0;;;;;;:23;:31;;;;;;24198:43;:19;24222:18;24198:23;:43::i;:::-;:77;24154:121;24150:357;;;24490:5;24483:12;;;;;;24150:357;24526:4;24519:11;;;;23670:868;;;;:::o;20659:310::-;12622:10;12613:20;;;;:8;:20;;;;;;;;12605:57;;;;;-1:-1:-1;;;12605:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12605:57:0;;;;;;;;;;;;;;;20747:10:::1;20725:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;20717:76;;;::::0;;-1:-1:-1;;;20717:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20826:10;20840:5;20804:33:::0;;;:21:::1;:33;::::0;;;;:41;;-1:-1:-1;;20804:41:0::1;::::0;;20884:25:::1;::::0;:32:::1;::::0;20804:41;20884:29:::1;:32::i;:::-;20856:25;:60:::0;20934:27:::1;::::0;;20950:10:::1;20934:27:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;20659:310::o:0;11364:38::-;;;;:::o;24546:293::-;24605:7;24614;24623;24632;24652:25;;:::i;:::-;-1:-1:-1;;;;;;;;;24680:17:0;;;;;;;:9;:17;;;;;;;;;24652:45;;;;;;;;;;;;;;;;-1:-1:-1;;;24652:45:0;;;;;;;;;;-1:-1:-1;;;24652:45:0;;;;;;;;;;-1:-1:-1;;;24652:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;24546:293:0:o;11100:42::-;;;;:::o;14780:128::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;14864:16:::1;:36:::0;14780:128::o;17334:542::-;12742:10;12732:21;;;;:9;:21;;;;;;;;12724:58;;;;;-1:-1:-1;;;12724:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12724:58:0;;;;;;;;;;;;;;;17457:17:::1;17477:33;17499:10;17477:21;:33::i;:::-;17457:53;;17527:12;17523:346;;;17583:15;::::0;;17639:14;-1:-1:-1;;;;;17583:15:0;;::::1;::::0;17639:14:::1;17556:24;17670:188;17694:7;:14;17690:1;:18;17670:188;;;17734:13;17750:7;17758:1;17750:10;;;;;;;;;;;;;;17734:26;;17779:63;17789:5;17796:7;17804:1;17796:10;;;;;;;;;;;;;;17808:15;17825:16;17779:9;:63::i;:::-;-1:-1:-1::0;17710:3:0::1;;17670:188;;;;17523:346;;;12793:1;17334:542:::0;;;:::o;16096:121::-;12871:12;;-1:-1:-1;;;;;12871:12:0;12857:10;:26;12849:63;;;;;-1:-1:-1;;;12849:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12849:63:0;;;;;;;;;;;;;;;16181:12:::1;:28:::0;;-1:-1:-1;;;;;;16181:28:0::1;-1:-1:-1::0;;;;;16181:28:0;;;::::1;::::0;;;::::1;::::0;;16096:121::o;11729:41::-;;;;;;;;;;;;;;;:::o;13646:587::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;13784:13:::1;::::0;-1:-1:-1;;;13784:13:0;::::1;;;13783:14;13775:61;;;;-1:-1:-1::0;;;13775:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13847:13;:20:::0;;-1:-1:-1;;;;13847:20:0::1;-1:-1:-1::0;;;13847:20:0::1;::::0;;13880:17:::1;:38:::0;;;13931:139:::1;13955:8;:15;13951:1;:19;13931:139;;;13992:14;14009:8;14018:1;14009:11;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14035:16:0::1;;::::0;;;:8:::1;:16:::0;;;;;;:23;;-1:-1:-1;;14035:23:0::1;14054:4;14035:23:::0;;::::1;::::0;;;13972:3;;;::::1;::::0;-1:-1:-1;13931:139:0::1;;;;14087:9;14082:144;14106:9;:16;14102:1;:20;14082:144;;;14144:15;14162:9;14172:1;14162:12;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14189:18:0::1;;::::0;;;:9:::1;:18:::0;;;;;;:25;;-1:-1:-1;;14189:25:0::1;14210:4;14189:25:::0;;::::1;::::0;;;14124:3;;;::::1;::::0;-1:-1:-1;14082:144:0::1;;21879:1783:::0;21980:7;22022:38;22040:19;;22022:13;;:17;;:38;;;;:::i;:::-;22004:15;:56;22000:361;;;22081:9;22077:153;;;22118:96;10628:5;22118:70;22132:55;22157:29;;10628:5;22132:24;;:55;;;;:::i;:::-;22118:9;;:13;:70::i;:96::-;22111:103;;;;22077:153;22253:96;10628:5;22253:70;22267:55;22292:29;;10628:5;22267:24;;:55;;;;:::i;22000:361::-;22413:13;;22395;;:32;;:17;:32::i;:::-;22377:15;:50;22373:351;;;22448:9;22444:151;;;22485:94;10628:5;22485:68;22499:53;22524:27;;10628:5;22499:24;;:53;;;;:::i;22444:151::-;22618:94;10628:5;22618:68;22632:53;22657:27;;10628:5;22632:24;;:53;;;;:::i;22373:351::-;-1:-1:-1;;;;;22756:14:0;;22736:17;22756:14;;;:6;:14;;;;;;22785;22781:41;;22810:9;22803:16;;;;;22781:41;22834:23;22872:9;22860;:21;:75;;22911:24;:9;22925;22911:13;:24::i;:::-;22860:75;;;22884:24;:9;22898;22884:13;:24::i;:::-;22834:101;-1:-1:-1;22964:56:0;23010:9;22964:41;22834:101;10628:5;22964:19;:41::i;:56::-;22946:74;;23213:14;23231:22;23246:6;23231:14;:22::i;:::-;23230:23;:68;;;;23275:23;;23257:15;:41;23230:68;23213:85;;23315:9;23311:315;;;23397:9;23393:102;;;23446:9;23434;:21;:45;;23470:9;23434:45;;;23458:9;23434:45;23427:52;;;;;;;23393:102;23581:9;23569;:21;:45;;23605:9;23569:45;;23311:315;-1:-1:-1;23645:9:0;;-1:-1:-1;;21879:1783:0;;;;;;:::o;16225:174::-;12871:12;;-1:-1:-1;;;;;12871:12:0;12857:10;:26;12849:63;;;;;-1:-1:-1;;;12849:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12849:63:0;;;;;;;;;;;;;;;16341:23:::1;:50:::0;16225:174::o;15146:149::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;15245:19:::1;:42:::0;15146:149::o;10046:50::-;-1:-1:-1;;;10046:50:0;:::o;10105:69::-;10158:16;10105:69;:::o;11661:59::-;;;;;;;;;;;;;:::o;11149:44::-;;;;:::o;11450:::-;;;;:::o;11200:31::-;;;;:::o;15303:181::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;15418:27:::1;:58:::0;15303:181::o;17054:272::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;17188:16:::1;:23;17170:7;:14;:41;17162:84;;;::::0;;-1:-1:-1;;;17162:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17257:16:::0;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;17284:34:0;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;20341:310::-:0;12622:10;12613:20;;;;:8;:20;;;;;;;;12605:57;;;;;-1:-1:-1;;;12605:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12605:57:0;;;;;;;;;;;;;;;20431:10:::1;20409:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;20408:34;20400:75;;;::::0;;-1:-1:-1;;;20400:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20400:75:0;;;;;;;;;;;;;::::1;;20508:10;20486:33;::::0;;;:21:::1;:33;::::0;;;;:40;;-1:-1:-1;;20486:40:0::1;20522:4;20486:40:::0;;::::1;::::0;;;20565:25:::1;::::0;:32:::1;::::0;:29:::1;:32::i;:::-;20537:25;:60:::0;20615:28:::1;::::0;;20632:10:::1;20615:28:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;20341:310::o:0;11603:51::-;;;;;;;;;;;;-1:-1:-1;;;;;11603:51:0;;;;-1:-1:-1;;;11603:51:0;;;;;-1:-1:-1;;;11603:51:0;;;;;-1:-1:-1;;;11603:51:0;;;;;:::o;15834:130::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;15922:15:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;15922:34:0::1;-1:-1:-1::0;;;;15922:34:0;;::::1;::::0;;;::::1;::::0;;15834:130::o;596:76::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;654:3:::1;:10:::0;;-1:-1:-1;;;;;;654:10:0::1;-1:-1:-1::0;;;;;654:10:0;;;::::1;::::0;;;::::1;::::0;;596:76::o;11554:42::-;;;;;;;;;;;;;:::o;15689:137::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;15782:16:::1;:36:::0;15689:137::o;16905:141::-;12871:12;;-1:-1:-1;;;;;12871:12:0;12857:10;:26;12849:63;;;;;-1:-1:-1;;;12849:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12849:63:0;;;;;;;;;;;;;;;17000:17:::1;:38:::0;16905:141::o;15492:189::-;539:3;;-1:-1:-1;;;;;539:3:0;525:10;:17;517:51;;;;;-1:-1:-1;;;517:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;517:51:0;;;;;;;;;;;;;;;15611:29:::1;:62:::0;15492:189::o;11278:32::-;;;;:::o;11059:34::-;;;;:::o;10183:57::-;-1:-1:-1;;;;;10183:57:0;:::o;10782:29::-;;;-1:-1:-1;;;;;10782:29:0;;:::o;10975:40::-;;;;:::o;28603:834::-;28692:16;;28671:4;;28692:20;28688:166;;28775:16;;28754;;28737:34;;:12;;:16;:34::i;:::-;:54;;28729:113;;;;-1:-1:-1;;;28729:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28894:16;;28942:38;:15;28894:16;28942:19;:38::i;:::-;28929:10;:51;28921:109;;;;-1:-1:-1;;;28921:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29062:38;:15;29082:17;29062:19;:38::i;:::-;29049:10;:51;29041:111;;;;-1:-1:-1;;;29041:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29271:13;;29258:10;:26;29254:71;;;29308:5;29301:12;;;;;29254:71;-1:-1:-1;;29337:13:0;:26;29393:12;29374:16;:31;29425:4;;28603:834::o;6422:471::-;6480:7;6725:6;6721:47;;-1:-1:-1;6755:1:0;6748:8;;6721:47;6792:5;;;6796:1;6792;:5;:1;6816:5;;;;;:10;6808:56;;;;-1:-1:-1;;;6808:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6884:1;-1:-1:-1;6422:471:0;;;;;:::o;7369:132::-;7427:7;7454:39;7458:1;7461;7454:39;;;;;;;;;;;;;-1:-1:-1;;;7454:39:0;;;:3;:39::i;25716:1857::-;-1:-1:-1;;;;;25841:29:0;;;25837:1633;;25887:16;25922:15;-1:-1:-1;;;;;25906:54:0;;25961:6;25906:62;;;;;;;;;;;;;-1:-1:-1;;;;;25906:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25906:62:0;-1:-1:-1;;;;;26003:14:0;;25983:17;26003:14;;;:6;25906:62;26003:14;;;;;25906:62;;-1:-1:-1;25983:17:0;;;26133:20;26010:6;26133:12;:20::i;:::-;26034:119;;;;;;;;26189:1;26174:12;:16;26170:818;;;26211:22;26247:12;26236:8;:23;:81;;26291:26;:12;26308:8;26291:16;:26::i;:::-;26236:81;;;26262:26;:8;26275:12;26262;:26::i;:::-;26211:106;;26336:23;26374:6;26362:9;:18;:66;;26407:21;:6;26418:9;26407:10;:21::i;:::-;26362:66;;;26383:21;:9;26397:6;26383:13;:21::i;:::-;26336:92;;26564:38;26584:17;;26564:15;:19;;:38;;;;:::i;:::-;26542:17;;26530:30;;:7;;:11;:30::i;:::-;:72;26526:189;;26648:1;26627:22;;26694:1;26672:23;;26526:189;26756:88;26779:64;26830:12;26779:46;:14;10158:16;26779:18;:46::i;:64::-;26756:18;;:22;:88::i;:::-;26735:109;-1:-1:-1;26885:87:0;26909:62;26961:9;26909:47;:15;10158:16;26909:19;:47::i;:62::-;26885:19;;:23;:87::i;:::-;26863:109;;26170:818;;;27030:18;27008:19;:40;:121;;;;-1:-1:-1;;;;;;27098:31:0;;;;;;:23;:31;;;;;;27052:43;:19;27076:18;27052:23;:43::i;:::-;:77;27008:121;27004:267;;;27155:100;;;-1:-1:-1;;;;;27155:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27004:267;27287:72;27301:6;27309:8;27319:18;27339:19;27287:13;:72::i;:::-;27379:79;;;-1:-1:-1;;;;;27379:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25837:1633;;;;;;;-1:-1:-1;;;;;27482:14:0;;;;;;:6;:14;;;;;:23;;;27516:49;27532:16;27489:6;27499;27516:15;:49::i;24847:861::-;24934:17;24954:33;24976:10;24954:21;:33::i;:::-;24934:53;;25004:12;25000:701;;;25060:15;;;25116:14;-1:-1:-1;;;;;25060:15:0;;;;25116:14;25033:24;25147:543;25171:1;25167;:5;25147:543;;;25247:6;:13;25214:1;;25238:22;;25234:39;;25264:7;;;;;;;25234:39;25427:6;:9;;25312:2;:6;;;25354:22;;;10547:25;25353:37;;25293:16;;25427:6;25317:1;;25427:9;;;;;;;;;;;;;;;25480:15;:18;;-1:-1:-1;;;;;25427:9:0;;;;-1:-1:-1;25480:15:0;25496:1;;25480:18;;;;;;;;;;;;;;;;-1:-1:-1;25541:46:0;25480:18;25541:26;:5;-1:-1:-1;;;25541:9:0;:26::i;:46::-;25517:70;;25608:66;25618:5;25625:13;25640:15;25657:16;25608:9;:66::i;:::-;-1:-1:-1;;25174:3:0;;;;;-1:-1:-1;25147:543:0;;-1:-1:-1;;;25147:543:0;5068:181;5126:7;5158:5;;;5182:6;;;;5174:46;;;;;-1:-1:-1;;;5174:46:0;;;;;;;;;;;;-1:-1:-1;;;5174:46:0;;;;;;;;;;;;;;5532:136;5590:7;5617:43;5621:1;5624;5617:43;;;;;;;;;;;;;;;;;:3;:43::i;7997:278::-;8083:7;8118:12;8111:5;8103:28;;;;-1:-1:-1;;;8103:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8142:9;8158:1;8154;:5;;;;;;;7997:278;-1:-1:-1;;;;;7997:278:0:o;27581:750::-;-1:-1:-1;;;;;27725:25:0;;27717:69;;;;;-1:-1:-1;;;27717:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10298:16;27904:46;;27896:100;;;;-1:-1:-1;;;27896:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10373:16;28015:48;;28007:103;;;;-1:-1:-1;;;28007:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28143:180;;;;;;;;-1:-1:-1;;;;;28143:180:0;;;;;;28211:15;28143:180;;;;;;;;;;;;;;;;;;;;;;;;;;;28123:17;;;-1:-1:-1;28123:17:0;;;:9;:17;;;;;;;:200;;;;;;;;;;;;-1:-1:-1;;;28123:200:0;-1:-1:-1;;;;;28123:200:0;;;-1:-1:-1;;;28123:200:0;-1:-1:-1;;;;28123:200:0;;;;-1:-1:-1;;;28123:200:0;-1:-1:-1;;;;28123:200:0;;;;-1:-1:-1;;;;;;28123:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27581:750::o;28339:256::-;-1:-1:-1;;;;;28445:30:0;;28441:69;;28492:7;;28441:69;28539:16;-1:-1:-1;;;;;28522:49:0;;28572:6;28580;28522:65;;;;;;;;;;;;;-1:-1:-1;;;;;28522:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5971:192;6057:7;6093:12;6085:6;;;;6077:29;;;;-1:-1:-1;;;6077:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6129:5:0;;;5971:192::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://d3110679483ab3acb24dfa1e6bd202506bda4fca5ed6353387fda5a7de366c86
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.