Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 36000516 | 2 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BondFixedTermSDA
Compiler Version
v0.8.15-1.0.1
ZkSolc Version
v1.5.15
Optimization Enabled:
Yes with Mode 3
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.15;
import {BondBaseSDA, IBondAggregator, Authority} from "./bases/BondBaseSDA.sol";
import {IBondTeller} from "./interfaces/IBondTeller.sol";
/// @title Bond Fixed-Term Sequential Dutch Auctioneer
/// @notice Bond Fixed-Term Sequential Dutch Auctioneer Contract
/// @dev Bond Protocol is a permissionless system to create Olympus-style bond markets
/// for any token pair. The markets do not require maintenance and will manage
/// bond prices based on activity. Bond issuers create BondMarkets that pay out
/// a Payout Token in exchange for deposited Quote Tokens. Users can purchase
/// future-dated Payout Tokens with Quote Tokens at the current market price and
/// receive Bond Tokens to represent their position while their bond vests.
/// Once the Bond Tokens vest, they can redeem it for the Quote Tokens.
///
/// @dev The Fixed-Term Auctioneer is an implementation of the
/// Bond Base Auctioneer contract specific to creating bond markets where
/// purchases vest in a fixed amount of time after purchased (rounded to the day).
///
/// @author Oighty, Zeus, Potted Meat, indigo
contract BondFixedTermSDA is BondBaseSDA {
/* ========== CONSTRUCTOR ========== */
constructor(
IBondTeller teller_,
IBondAggregator aggregator_,
address guardian_,
Authority authority_
) BondBaseSDA(teller_, aggregator_, guardian_, authority_) {}
/* ========== MARKET FUNCTIONS ========== */
/// @inheritdoc BondBaseSDA
function createMarket(bytes calldata params_) external override returns (uint256) {
// Decode params into the struct type expected by this auctioneer
MarketParams memory params = abi.decode(params_, (MarketParams));
// Check that the vesting parameter is valid for a fixed-term market
if (params.vesting != 0 && (params.vesting < 1 days || params.vesting > MAX_FIXED_TERM))
revert Auctioneer_InvalidParams();
// Create market and return market ID
return _createMarket(params);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
abstract contract Auth {
event OwnerUpdated(address indexed user, address indexed newOwner);
event AuthorityUpdated(address indexed user, Authority indexed newAuthority);
address public owner;
Authority public authority;
constructor(address _owner, Authority _authority) {
owner = _owner;
authority = _authority;
emit OwnerUpdated(msg.sender, _owner);
emit AuthorityUpdated(msg.sender, _authority);
}
modifier requiresAuth() virtual {
require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED");
_;
}
function isAuthorized(address user, bytes4 functionSig) internal view virtual returns (bool) {
Authority auth = authority; // Memoizing authority saves us a warm SLOAD, around 100 gas.
// Checking if the caller is the owner only after calling the authority saves gas in most cases, but be
// aware that this makes protected functions uncallable even to the owner if the authority is out of order.
return (address(auth) != address(0) && auth.canCall(user, address(this), functionSig)) || user == owner;
}
function setAuthority(Authority newAuthority) public virtual {
// We check if the caller is the owner first because we want to ensure they can
// always swap out the authority even if it's reverting or using up a lot of gas.
require(msg.sender == owner || authority.canCall(msg.sender, address(this), msg.sig));
authority = newAuthority;
emit AuthorityUpdated(msg.sender, newAuthority);
}
function setOwner(address newOwner) public virtual requiresAuth {
owner = newOwner;
emit OwnerUpdated(msg.sender, newOwner);
}
}
/// @notice A generic interface for a contract which provides authorization data to an Auth instance.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
interface Authority {
function canCall(
address user,
address target,
bytes4 functionSig
) external view returns (bool);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Gas optimized reentrancy protection for smart contracts.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
uint256 private locked = 1;
modifier nonReentrant() virtual {
require(locked == 1, "REENTRANCY");
locked = 2;
_;
locked = 1;
}
}// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.15;
import {ERC20} from "solmate/tokens/ERC20.sol";
import {ReentrancyGuard} from "solmate/utils/ReentrancyGuard.sol";
import {Auth, Authority} from "solmate/auth/Auth.sol";
import {IBondSDA, IBondAuctioneer} from "../interfaces/IBondSDA.sol";
import {IBondTeller} from "../interfaces/IBondTeller.sol";
import {IBondCallback} from "../interfaces/IBondCallback.sol";
import {IBondAggregator} from "../interfaces/IBondAggregator.sol";
import {TransferHelper} from "../lib/TransferHelper.sol";
import {FullMath} from "../lib/FullMath.sol";
/// @title Bond Sequential Dutch Auctioneer (SDA) v1.1
/// @notice Bond Sequential Dutch Auctioneer Base Contract
/// @dev Bond Protocol is a system to create Olympus-style bond markets
/// for any token pair. The markets do not require maintenance and will manage
/// bond prices based on activity. Bond issuers create BondMarkets that pay out
/// a Payout Token in exchange for deposited Quote Tokens. Users can purchase
/// future-dated Payout Tokens with Quote Tokens at the current market price and
/// receive Bond Tokens to represent their position while their bond vests.
/// Once the Bond Tokens vest, they can redeem it for the Quote Tokens.
///
/// @dev The Auctioneer contract allows users to create and manage bond markets.
/// All bond pricing logic and market data is stored in the Auctioneer.
/// A Auctioneer is dependent on a Teller to serve external users and
/// an Aggregator to register new markets. This implementation of the Auctioneer
/// uses a Sequential Dutch Auction pricing system to buy a target amount of quote
/// tokens or sell a target amount of payout tokens over the duration of a market.
///
/// @author Oighty, Zeus, Potted Meat, indigo
abstract contract BondBaseSDA is IBondSDA, Auth {
using TransferHelper for ERC20;
using FullMath for uint256;
/* ========== ERRORS ========== */
error Auctioneer_OnlyMarketOwner();
error Auctioneer_InitialPriceLessThanMin();
error Auctioneer_MarketNotActive();
error Auctioneer_MaxPayoutExceeded();
error Auctioneer_AmountLessThanMinimum();
error Auctioneer_NotEnoughCapacity();
error Auctioneer_InvalidCallback();
error Auctioneer_BadExpiry();
error Auctioneer_InvalidParams();
error Auctioneer_NotAuthorized();
error Auctioneer_NewMarketsNotAllowed();
/* ========== EVENTS ========== */
event MarketCreated(
uint256 indexed id,
address indexed payoutToken,
address indexed quoteToken,
uint48 vesting,
uint256 initialPrice
);
event MarketClosed(uint256 indexed id);
event Tuned(uint256 indexed id, uint256 oldControlVariable, uint256 newControlVariable);
event DefaultsUpdated(
uint32 defaultTuneInterval,
uint32 defaultTuneAdjustment,
uint32 minDebtDecayInterval,
uint32 minDepositInterval,
uint32 minMarketDuration,
uint32 minDebtBuffer
);
/* ========== STATE VARIABLES ========== */
/// @notice Main information pertaining to bond market
mapping(uint256 => BondMarket) public markets;
/// @notice Information used to control how a bond market changes
mapping(uint256 => BondTerms) public terms;
/// @notice Data needed for tuning bond market
mapping(uint256 => BondMetadata) public metadata;
/// @notice Control variable changes
mapping(uint256 => Adjustment) public adjustments;
/// @notice New address to designate as market owner. They must accept ownership to transfer permissions.
mapping(uint256 => address) public newOwners;
/// @notice Whether or not the auctioneer allows new markets to be created
/// @dev Changing to false will sunset the auctioneer after all active markets end
bool public allowNewMarkets;
/// @notice Whether or not the market creator is authorized to use a callback address
mapping(address => bool) public callbackAuthorized;
/// Sane defaults for tuning. Can be adjusted for a specific market via setters.
uint32 public defaultTuneInterval;
uint32 public defaultTuneAdjustment;
/// Minimum values for decay, deposit interval, market duration and debt buffer.
uint32 public minDebtDecayInterval;
uint32 public minDepositInterval;
uint32 public minMarketDuration;
uint32 public minDebtBuffer;
// A 'vesting' param longer than 50 years is considered a timestamp for fixed expiry.
uint48 internal constant MAX_FIXED_TERM = 52 weeks * 50;
uint48 internal constant FEE_DECIMALS = 1e5; // one percent equals 1000.
// BondAggregator contract with utility functions
IBondAggregator internal immutable _aggregator;
// BondTeller contract that handles interactions with users and issues tokens
IBondTeller internal immutable _teller;
constructor(
IBondTeller teller_,
IBondAggregator aggregator_,
address guardian_,
Authority authority_
) Auth(guardian_, authority_) {
_aggregator = aggregator_;
_teller = teller_;
defaultTuneInterval = 24 hours;
defaultTuneAdjustment = 6 hours;
minDebtDecayInterval = 3 days;
minDepositInterval = 1 hours;
minMarketDuration = 1 days;
minDebtBuffer = 10000; // 10%
allowNewMarkets = true;
}
/* ========== MARKET FUNCTIONS ========== */
/// @inheritdoc IBondAuctioneer
function createMarket(bytes calldata params_) external virtual returns (uint256);
/// @notice core market creation logic, see IBondSDA.MarketParams documentation
function _createMarket(MarketParams memory params_) internal returns (uint256) {
{
// Check that the auctioneer is allowing new markets to be created
if (!allowNewMarkets) revert Auctioneer_NewMarketsNotAllowed();
// Ensure params are in bounds
uint8 payoutTokenDecimals = params_.payoutToken.decimals();
uint8 quoteTokenDecimals = params_.quoteToken.decimals();
if (payoutTokenDecimals < 6 || payoutTokenDecimals > 18)
revert Auctioneer_InvalidParams();
if (quoteTokenDecimals < 6 || quoteTokenDecimals > 18)
revert Auctioneer_InvalidParams();
if (params_.scaleAdjustment < -24 || params_.scaleAdjustment > 24)
revert Auctioneer_InvalidParams();
// Restrict the use of a callback address unless allowed
if (!callbackAuthorized[msg.sender] && params_.callbackAddr != address(0))
revert Auctioneer_NotAuthorized();
// Start time must be zero or in the future
if (params_.start > 0 && params_.start < block.timestamp)
revert Auctioneer_InvalidParams();
}
// Unit to scale calculation for this market by to ensure reasonable values
// for price, debt, and control variable without under/overflows.
// See IBondSDA for more details.
//
// scaleAdjustment should be equal to (payoutDecimals - quoteDecimals) - ((payoutPriceDecimals - quotePriceDecimals) / 2)
uint256 scale;
unchecked {
scale = 10**uint8(36 + params_.scaleAdjustment);
}
if (params_.formattedInitialPrice < params_.formattedMinimumPrice)
revert Auctioneer_InitialPriceLessThanMin();
// Register new market on aggregator and get marketId
uint256 marketId = _aggregator.registerMarket(params_.payoutToken, params_.quoteToken);
uint32 debtDecayInterval;
{
// Check time bounds
if (
params_.duration < minMarketDuration ||
params_.depositInterval < minDepositInterval ||
params_.depositInterval > params_.duration
) revert Auctioneer_InvalidParams();
// The debt decay interval is how long it takes for price to drop to 0 from the last decay timestamp.
// In reality, a 50% drop is likely a guaranteed bond sale. Therefore, debt decay interval needs to be
// long enough to allow a bond to adjust if oversold. It also needs to be some multiple of deposit interval
// because you don't want to go from 100 to 0 during the time frame you expected to sell a single bond.
// A multiple of 5 is a sane default observed from running OP v1 bond markets.
uint32 userDebtDecay = params_.depositInterval * 5;
debtDecayInterval = minDebtDecayInterval > userDebtDecay
? minDebtDecayInterval
: userDebtDecay;
uint256 tuneIntervalCapacity = params_.capacity.mulDiv(
uint256(
params_.depositInterval > defaultTuneInterval
? params_.depositInterval
: defaultTuneInterval
),
uint256(params_.duration)
);
uint48 start = params_.start == 0 ? uint48(block.timestamp) : params_.start;
metadata[marketId] = BondMetadata({
lastTune: start,
lastDecay: start,
depositInterval: params_.depositInterval,
tuneInterval: params_.depositInterval > defaultTuneInterval
? params_.depositInterval
: defaultTuneInterval,
tuneAdjustmentDelay: defaultTuneAdjustment,
debtDecayInterval: debtDecayInterval,
tuneIntervalCapacity: tuneIntervalCapacity,
tuneBelowCapacity: params_.capacity - tuneIntervalCapacity,
lastTuneDebt: (
params_.capacityInQuote
? params_.capacity.mulDiv(scale, params_.formattedInitialPrice)
: params_.capacity
).mulDiv(uint256(debtDecayInterval), uint256(params_.duration))
});
}
// Initial target debt is equal to capacity scaled by the ratio of the debt decay interval and the length of the market.
// This is the amount of debt that should be decayed over the decay interval if no purchases are made.
// Note price should be passed in a specific format:
// price = (payoutPriceCoefficient / quotePriceCoefficient)
// * 10**(36 + scaleAdjustment + quoteDecimals - payoutDecimals + payoutPriceDecimals - quotePriceDecimals)
// See IBondSDA for more details and variable definitions.
uint256 targetDebt;
uint256 _maxPayout;
{
uint256 capacity = params_.capacityInQuote
? params_.capacity.mulDiv(scale, params_.formattedInitialPrice)
: params_.capacity;
targetDebt = capacity.mulDiv(uint256(debtDecayInterval), uint256(params_.duration));
// Max payout is the amount of capacity that should be utilized in a deposit
// interval. for example, if capacity is 1,000 TOKEN, there are 10 days to conclusion,
// and the preferred deposit interval is 1 day, max payout would be 100 TOKEN.
// Additionally, max payout is the maximum amount that a user can receive from a single
// purchase at that moment in time.
_maxPayout = capacity.mulDiv(
uint256(params_.depositInterval),
uint256(params_.duration)
);
}
markets[marketId] = BondMarket({
owner: msg.sender,
payoutToken: params_.payoutToken,
quoteToken: params_.quoteToken,
callbackAddr: params_.callbackAddr,
capacityInQuote: params_.capacityInQuote,
capacity: params_.capacity,
totalDebt: targetDebt,
minPrice: params_.formattedMinimumPrice,
maxPayout: _maxPayout,
purchased: 0,
sold: 0,
scale: scale
});
// Max debt serves as a circuit breaker for the market. let's say the quote token is a stablecoin,
// and that stablecoin depegs. without max debt, the market would continue to buy until it runs
// out of capacity. this is configurable with a 3 decimal buffer (1000 = 1% above initial price).
// Note that its likely advisable to keep this buffer wide.
// Note that the buffer is above 100%. i.e. 10% buffer = initial debt * 1.1
// 1e5 = 100,000. 10,000 / 100,000 = 10%.
// See IBondSDA.MarketParams for more information on determining a reasonable debt buffer.
uint256 minDebtBuffer_ = _maxPayout.mulDiv(FEE_DECIMALS, targetDebt) > minDebtBuffer
? _maxPayout.mulDiv(FEE_DECIMALS, targetDebt)
: minDebtBuffer;
uint256 maxDebt = targetDebt +
targetDebt.mulDiv(
uint256(params_.debtBuffer > minDebtBuffer_ ? params_.debtBuffer : minDebtBuffer_),
1e5
);
// The control variable is set as the ratio of price to the initial targetDebt, scaled to prevent under/overflows.
// It determines the price of the market as the debt decays and is tuned by the market based on user activity.
// See _tune() for more information.
//
// price = control variable * debt / scale
// therefore, control variable = price * scale / debt
uint256 controlVariable = params_.formattedInitialPrice.mulDiv(scale, targetDebt);
uint48 start = params_.start == 0 ? uint48(block.timestamp) : params_.start;
terms[marketId] = BondTerms({
controlVariable: controlVariable,
maxDebt: maxDebt,
start: start,
conclusion: start + uint48(params_.duration),
vesting: params_.vesting
});
emit MarketCreated(
marketId,
address(params_.payoutToken),
address(params_.quoteToken),
params_.vesting,
params_.formattedInitialPrice
);
return marketId;
}
/// @inheritdoc IBondAuctioneer
function setIntervals(uint256 id_, uint32[3] calldata intervals_) external override {
// Check that the market is live
if (!isLive(id_)) revert Auctioneer_InvalidParams();
// Check that the intervals are non-zero
if (intervals_[0] == 0 || intervals_[1] == 0 || intervals_[2] == 0)
revert Auctioneer_InvalidParams();
// Check that tuneInterval >= tuneAdjustmentDelay
if (intervals_[0] < intervals_[1]) revert Auctioneer_InvalidParams();
BondMetadata storage meta = metadata[id_];
// Check that tuneInterval >= depositInterval
if (intervals_[0] < meta.depositInterval) revert Auctioneer_InvalidParams();
// Check that debtDecayInterval >= minDebtDecayInterval
if (intervals_[2] < minDebtDecayInterval) revert Auctioneer_InvalidParams();
// Check that sender is market owner
BondMarket memory market = markets[id_];
if (msg.sender != market.owner) revert Auctioneer_OnlyMarketOwner();
// Update intervals
meta.tuneInterval = intervals_[0];
meta.tuneIntervalCapacity = market.capacity.mulDiv(
uint256(intervals_[0]),
uint256(terms[id_].conclusion) - block.timestamp
); // this will update tuneIntervalCapacity based on time remaining
meta.tuneBelowCapacity = market.capacity > meta.tuneIntervalCapacity
? market.capacity - meta.tuneIntervalCapacity
: 0;
meta.tuneAdjustmentDelay = intervals_[1];
meta.debtDecayInterval = intervals_[2];
}
/// @inheritdoc IBondAuctioneer
function pushOwnership(uint256 id_, address newOwner_) external override {
if (msg.sender != markets[id_].owner) revert Auctioneer_OnlyMarketOwner();
newOwners[id_] = newOwner_;
}
/// @inheritdoc IBondAuctioneer
function pullOwnership(uint256 id_) external override {
if (msg.sender != newOwners[id_]) revert Auctioneer_NotAuthorized();
markets[id_].owner = newOwners[id_];
}
/// @inheritdoc IBondAuctioneer
function setDefaults(uint32[6] memory defaults_) external override requiresAuth {
// Restricted to authorized addresses
// Validate inputs
// Check that defaultTuneInterval >= defaultTuneAdjustment
if (defaults_[0] < defaults_[1]) revert Auctioneer_InvalidParams();
// Check that defaultTuneInterval >= minDepositInterval
if (defaults_[0] < defaults_[3]) revert Auctioneer_InvalidParams();
// Check that minDepositInterval <= minMarketDuration
if (defaults_[3] > defaults_[4]) revert Auctioneer_InvalidParams();
// Check that minDebtDecayInterval >= 5 * minDepositInterval
if (defaults_[2] < defaults_[3] * 5) revert Auctioneer_InvalidParams();
// Update defaults
defaultTuneInterval = defaults_[0];
defaultTuneAdjustment = defaults_[1];
minDebtDecayInterval = defaults_[2];
minDepositInterval = defaults_[3];
minMarketDuration = defaults_[4];
minDebtBuffer = defaults_[5];
emit DefaultsUpdated(
defaultTuneInterval,
defaultTuneAdjustment,
minDebtDecayInterval,
minDepositInterval,
minMarketDuration,
minDebtBuffer
);
}
/// @inheritdoc IBondAuctioneer
function setAllowNewMarkets(bool status_) external override requiresAuth {
// Restricted to authorized addresses
allowNewMarkets = status_;
}
/// @inheritdoc IBondAuctioneer
function setCallbackAuthStatus(address creator_, bool status_) external override requiresAuth {
// Restricted to authorized addresses
callbackAuthorized[creator_] = status_;
}
/// @inheritdoc IBondAuctioneer
function closeMarket(uint256 id_) external override {
if (msg.sender != markets[id_].owner) revert Auctioneer_OnlyMarketOwner();
_close(id_);
}
/* ========== TELLER FUNCTIONS ========== */
/// @inheritdoc IBondAuctioneer
function purchaseBond(
uint256 id_,
uint256 amount_,
uint256 minAmountOut_
) external override returns (uint256 payout) {
if (msg.sender != address(_teller)) revert Auctioneer_NotAuthorized();
BondMarket storage market = markets[id_];
BondTerms memory term = terms[id_];
// If market uses a callback, check that owner is still callback authorized
if (market.callbackAddr != address(0) && !callbackAuthorized[market.owner])
revert Auctioneer_NotAuthorized();
// Check if market is live, if not revert
if (!isLive(id_)) revert Auctioneer_MarketNotActive();
uint256 price;
(price, payout) = _decayAndGetPrice(id_, amount_, uint48(block.timestamp)); // Debt and the control variable decay over time
// Payout must be greater than user inputted minimum
if (payout < minAmountOut_) revert Auctioneer_AmountLessThanMinimum();
// Markets have a max payout amount, capping size because deposits
// do not experience slippage. max payout is recalculated upon tuning
if (payout > market.maxPayout) revert Auctioneer_MaxPayoutExceeded();
// Update Capacity and Debt values
// Capacity is either the number of payout tokens that the market can sell
// (if capacity in quote is false),
//
// or the number of quote tokens that the market can buy
// (if capacity in quote is true)
// If amount/payout is greater than capacity remaining, revert
if (market.capacityInQuote ? amount_ > market.capacity : payout > market.capacity)
revert Auctioneer_NotEnoughCapacity();
// Capacity is decreased by the deposited or paid amount
market.capacity -= market.capacityInQuote ? amount_ : payout;
// Markets keep track of how many quote tokens have been
// purchased, and how many payout tokens have been sold
market.purchased += amount_;
market.sold += payout;
// Circuit breaker. If max debt is breached, the market is closed
if (term.maxDebt < market.totalDebt) {
_close(id_);
} else {
// If market will continue, the control variable is tuned to to expend remaining capacity over remaining market duration
_tune(id_, uint48(block.timestamp), price);
}
}
/* ========== INTERNAL DEPO FUNCTIONS ========== */
/// @notice Close a market
/// @dev Closing a market sets capacity to 0 and immediately stops bonding
function _close(uint256 id_) internal {
terms[id_].conclusion = uint48(block.timestamp);
markets[id_].capacity = 0;
emit MarketClosed(id_);
}
/// @notice Decay debt, and adjust control variable if there is an active change
/// @param id_ ID of market
/// @param amount_ Amount of quote tokens being purchased
/// @param time_ Current timestamp (saves gas when passed in)
/// @return marketPrice_ Current market price of bond, accounting for decay
/// @return payout_ Amount of payout tokens received at current price
function _decayAndGetPrice(
uint256 id_,
uint256 amount_,
uint48 time_
) internal returns (uint256 marketPrice_, uint256 payout_) {
BondMarket memory market = markets[id_];
// Debt is a time-decayed sum of tokens spent in a market
// Debt is added when deposits occur and removed over time
// |
// | debt falls with
// | / \ inactivity / \
// | / \ /\ / \
// | \ / \ / \
// | \ /\/
// | \ / and rises
// | with deposits
// |
// |------------------------------------| t
// Decay debt by the amount of time since the last decay
uint256 decayedDebt = currentDebt(id_);
markets[id_].totalDebt = decayedDebt;
// Control variable decay
// The bond control variable is continually tuned. When it is lowered (which
// lowers the market price), the change is carried out smoothly over time.
if (adjustments[id_].active) {
Adjustment storage adjustment = adjustments[id_];
(uint256 adjustBy, uint48 secondsSince, bool stillActive) = _controlDecay(id_);
terms[id_].controlVariable -= adjustBy;
if (stillActive) {
adjustment.change -= adjustBy;
adjustment.timeToAdjusted -= secondsSince;
adjustment.lastAdjustment = time_;
} else {
adjustment.active = false;
}
}
// Price is not allowed to be lower than the minimum price
marketPrice_ = _currentMarketPrice(id_);
uint256 minPrice = market.minPrice;
if (marketPrice_ < minPrice) marketPrice_ = minPrice;
// Payout for the deposit = amount / price
//
// where:
// payout = payout tokens out
// amount = quote tokens in
// price = quote tokens : payout token (i.e. 200 QUOTE : BASE), adjusted for scaling
payout_ = amount_.mulDiv(market.scale, marketPrice_);
// Cache storage variables to memory
uint256 debtDecayInterval = uint256(metadata[id_].debtDecayInterval);
uint256 lastTuneDebt = metadata[id_].lastTuneDebt;
uint256 lastDecay = uint256(metadata[id_].lastDecay);
// Set last decay timestamp based on size of purchase to linearize decay
uint256 lastDecayIncrement = debtDecayInterval.mulDivUp(payout_, lastTuneDebt);
metadata[id_].lastDecay += uint48(lastDecayIncrement);
// Update total debt following the purchase
// Goal is to have the same decayed debt post-purchase as pre-purchase so that price is the same as before purchase and then add new debt to increase price
// 1. Adjust total debt so that decayed debt is equal to the current debt after updating the last decay timestamp.
// This is the currentDebt function solved for totalDebt and adding lastDecayIncrement (the number of seconds lastDecay moves forward in time)
// to the number of seconds used to calculate the previous currentDebt.
// 2. Add the payout to the total debt to increase the price.
uint256 decayOffset = time_ > lastDecay
? (
debtDecayInterval > (time_ - lastDecay)
? debtDecayInterval - (time_ - lastDecay)
: 0
)
: debtDecayInterval + (lastDecay - time_);
markets[id_].totalDebt =
decayedDebt.mulDiv(debtDecayInterval, decayOffset + lastDecayIncrement) +
payout_ +
1; // add 1 to satisfy price inequality
}
/// @notice Auto-adjust control variable to hit capacity/spend target
/// @param id_ ID of market
/// @param time_ Timestamp (saves gas when passed in)
/// @param price_ Current price of the market
function _tune(
uint256 id_,
uint48 time_,
uint256 price_
) internal {
BondMetadata memory meta = metadata[id_];
BondMarket memory market = markets[id_];
BondTerms memory term = terms[id_];
// Market tunes in 2 situations:
// 1. If capacity has exceeded target since last tune adjustment and the market is oversold
// 2. If a tune interval has passed since last tune adjustment and the market is undersold
//
// Markets are created with a target capacity with the expectation that capacity will
// be utilized evenly over the duration of the market.
// The intuition with tuning is:
// - When the market is ahead of target capacity, we should tune based on capacity.
// - When the market is behind target capacity, we should tune based on time.
// Compute seconds remaining until market will conclude and total duration of market
uint256 timeRemaining = uint256(term.conclusion - time_);
uint256 duration = uint256(term.conclusion - term.start);
// Standardize capacity into an payout token amount
uint256 capacity = market.capacityInQuote
? market.capacity.mulDiv(market.scale, price_)
: market.capacity;
// Calculate initial capacity based on remaining capacity and amount sold/purchased up to this point
uint256 initialCapacity = capacity +
(market.capacityInQuote ? market.purchased.mulDiv(market.scale, price_) : market.sold);
// Calculate timeNeutralCapacity as the capacity expected to be sold up to this point and the current capacity
// Higher than initial capacity means the market is undersold, lower than initial capacity means the market is oversold
uint256 timeNeutralCapacity = initialCapacity.mulDiv(duration - timeRemaining, duration) +
capacity;
if (
(market.capacity < meta.tuneBelowCapacity && timeNeutralCapacity < initialCapacity) ||
(time_ >= meta.lastTune + meta.tuneInterval && timeNeutralCapacity > initialCapacity)
) {
// Calculate the correct payout to complete on time assuming each bond
// will be max size in the desired deposit interval for the remaining time
//
// i.e. market has 10 days remaining. deposit interval is 1 day. capacity
// is 10,000 TOKEN. max payout would be 1,000 TOKEN (10,000 * 1 / 10).
markets[id_].maxPayout = capacity.mulDiv(uint256(meta.depositInterval), timeRemaining);
// Calculate ideal target debt to satisty capacity in the remaining time
// The target debt is based on whether the market is under or oversold at this point in time
// This target debt will ensure price is reactive while ensuring the magnitude of being over/undersold
// doesn't cause larger fluctuations towards the end of the market.
//
// Calculate target debt from the timeNeutralCapacity and the ratio of debt decay interval and the length of the market
uint256 targetDebt = timeNeutralCapacity.mulDiv(
uint256(meta.debtDecayInterval),
duration
);
// Derive a new control variable from the target debt
uint256 newControlVariable = price_.mulDivUp(market.scale, targetDebt);
emit Tuned(id_, term.controlVariable, newControlVariable);
if (newControlVariable < term.controlVariable) {
// If decrease, control variable change will be carried out over the tune adjustment delay
// this is because price will be lowered
adjustments[id_] = Adjustment(
term.controlVariable - newControlVariable,
time_,
meta.tuneAdjustmentDelay,
true
);
} else {
// Tune up immediately
terms[id_].controlVariable = newControlVariable;
// Set current adjustment to inactive (e.g. if we are re-tuning early)
adjustments[id_].active = false;
}
metadata[id_].lastTune = time_;
metadata[id_].tuneBelowCapacity = market.capacity > meta.tuneIntervalCapacity
? market.capacity - meta.tuneIntervalCapacity
: 0;
metadata[id_].lastTuneDebt = targetDebt;
}
}
/* ========== INTERNAL VIEW FUNCTIONS ========== */
/// @notice Calculate current market price of payout token in quote tokens
/// @dev See marketPrice() in IBondSDA for explanation of price computation
/// @dev Uses info from storage because data has been updated before call (vs marketPrice())
/// @param id_ Market ID
/// @return Price for market in payout token decimals
function _currentMarketPrice(uint256 id_) internal view returns (uint256) {
BondMarket memory market = markets[id_];
return terms[id_].controlVariable.mulDivUp(market.totalDebt, market.scale);
}
/// @notice Amount to decay control variable by
/// @param id_ ID of market
/// @return decay change in control variable
/// @return secondsSince seconds since last change in control variable
/// @return active whether or not change remains active
function _controlDecay(uint256 id_)
internal
view
returns (
uint256 decay,
uint48 secondsSince,
bool active
)
{
Adjustment memory info = adjustments[id_];
if (!info.active) return (0, 0, false);
secondsSince = uint48(block.timestamp) - info.lastAdjustment;
active = secondsSince < info.timeToAdjusted;
decay = active
? info.change.mulDiv(uint256(secondsSince), uint256(info.timeToAdjusted))
: info.change;
}
/* ========== EXTERNAL VIEW FUNCTIONS ========== */
/// @inheritdoc IBondAuctioneer
function getMarketInfoForPurchase(uint256 id_)
external
view
returns (
address owner,
address callbackAddr,
ERC20 payoutToken,
ERC20 quoteToken,
uint48 vesting,
uint256 maxPayout_
)
{
BondMarket memory market = markets[id_];
return (
market.owner,
market.callbackAddr,
market.payoutToken,
market.quoteToken,
terms[id_].vesting,
maxPayout(id_)
);
}
/// @inheritdoc IBondSDA
function marketPrice(uint256 id_) public view override returns (uint256) {
uint256 price = currentControlVariable(id_).mulDivUp(currentDebt(id_), markets[id_].scale);
return (price > markets[id_].minPrice) ? price : markets[id_].minPrice;
}
/// @inheritdoc IBondAuctioneer
function marketScale(uint256 id_) external view override returns (uint256) {
return markets[id_].scale;
}
/// @inheritdoc IBondAuctioneer
function payoutFor(
uint256 amount_,
uint256 id_,
address referrer_
) public view override returns (uint256) {
// Calculate the payout for the given amount of tokens
uint256 fee = amount_.mulDiv(_teller.getFee(referrer_), 1e5);
uint256 payout = (amount_ - fee).mulDiv(markets[id_].scale, marketPrice(id_));
// Check that the payout is less than or equal to the maximum payout,
// Revert if not, otherwise return the payout
if (payout > maxPayout(id_)) {
revert Auctioneer_MaxPayoutExceeded();
} else {
return payout;
}
}
/// @inheritdoc IBondSDA
function maxPayout(uint256 id_) public view override returns (uint256) {
// Get current price
uint256 price = marketPrice(id_);
BondMarket memory market = markets[id_];
// Convert capacity to payout token units for comparison with max payout
uint256 capacity = market.capacityInQuote
? market.capacity.mulDiv(market.scale, price)
: market.capacity;
// Cap max payout at the remaining capacity
return market.maxPayout > capacity ? capacity : market.maxPayout;
}
/// @inheritdoc IBondAuctioneer
function maxAmountAccepted(uint256 id_, address referrer_) external view returns (uint256) {
// Calculate maximum amount of quote tokens that correspond to max bond size
// Maximum of the maxPayout and the remaining capacity converted to quote tokens
BondMarket memory market = markets[id_];
uint256 price = marketPrice(id_);
uint256 quoteCapacity = market.capacityInQuote
? market.capacity
: market.capacity.mulDiv(price, market.scale);
uint256 maxQuote = market.maxPayout.mulDiv(price, market.scale);
uint256 amountAccepted = quoteCapacity < maxQuote ? quoteCapacity : maxQuote;
// Take into account teller fees and return
// Estimate fee based on amountAccepted. Fee taken will be slightly larger than
// this given it will be taken off the larger amount, but this avoids rounding
// errors with trying to calculate the exact amount.
// Therefore, the maxAmountAccepted is slightly conservative.
uint256 estimatedFee = amountAccepted.mulDiv(_teller.getFee(referrer_), 1e5);
return amountAccepted + estimatedFee;
}
/// @inheritdoc IBondSDA
function currentDebt(uint256 id_) public view override returns (uint256) {
uint256 currentTime = block.timestamp;
// Don't decay debt prior to start time
if (currentTime < uint256(terms[id_].start)) return markets[id_].totalDebt;
BondMetadata memory meta = metadata[id_];
uint256 lastDecay = uint256(meta.lastDecay);
// Determine if decay should increase or decrease debt based on last decay time
// If last decay time is in the future, then debt should be increased
// If last decay time is in the past, then debt should be decreased
if (lastDecay > currentTime) {
uint256 secondsUntil;
unchecked {
secondsUntil = lastDecay - currentTime;
}
return
markets[id_].totalDebt.mulDiv(
uint256(meta.debtDecayInterval) + secondsUntil,
uint256(meta.debtDecayInterval)
);
} else {
uint256 secondsSince;
unchecked {
secondsSince = currentTime - lastDecay;
}
return
secondsSince > meta.debtDecayInterval
? 0
: markets[id_].totalDebt.mulDiv(
uint256(meta.debtDecayInterval) - secondsSince,
uint256(meta.debtDecayInterval)
);
}
}
/// @inheritdoc IBondSDA
function currentControlVariable(uint256 id_) public view override returns (uint256) {
(uint256 decay, , ) = _controlDecay(id_);
return terms[id_].controlVariable - decay;
}
/// @inheritdoc IBondAuctioneer
function isInstantSwap(uint256 id_) public view returns (bool) {
uint256 vesting = terms[id_].vesting;
return (vesting <= MAX_FIXED_TERM) ? vesting == 0 : vesting <= block.timestamp;
}
/// @inheritdoc IBondAuctioneer
function isLive(uint256 id_) public view override returns (bool) {
return (markets[id_].capacity != 0 &&
terms[id_].conclusion > uint48(block.timestamp) &&
terms[id_].start <= uint48(block.timestamp));
}
/// @inheritdoc IBondAuctioneer
function ownerOf(uint256 id_) external view override returns (address) {
return markets[id_].owner;
}
/// @inheritdoc IBondAuctioneer
function getTeller() external view override returns (IBondTeller) {
return _teller;
}
/// @inheritdoc IBondAuctioneer
function getAggregator() external view override returns (IBondAggregator) {
return _aggregator;
}
/// @inheritdoc IBondAuctioneer
function currentCapacity(uint256 id_) external view override returns (uint256) {
return markets[id_].capacity;
}
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.8.0;
import {ERC20} from "solmate/tokens/ERC20.sol";
import {IBondAuctioneer} from "../interfaces/IBondAuctioneer.sol";
import {IBondTeller} from "../interfaces/IBondTeller.sol";
interface IBondAggregator {
/// @notice Register a auctioneer with the aggregator
/// @notice Only Guardian
/// @param auctioneer_ Address of the Auctioneer to register
/// @dev A auctioneer must be registered with an aggregator to create markets
function registerAuctioneer(IBondAuctioneer auctioneer_) external;
/// @notice Register a new market with the aggregator
/// @notice Only registered depositories
/// @param payoutToken_ Token to be paid out by the market
/// @param quoteToken_ Token to be accepted by the market
/// @param marketId ID of the market being created
function registerMarket(ERC20 payoutToken_, ERC20 quoteToken_)
external
returns (uint256 marketId);
/// @notice Get the auctioneer for the provided market ID
/// @param id_ ID of Market
function getAuctioneer(uint256 id_) external view returns (IBondAuctioneer);
/// @notice Calculate current market price of payout token in quote tokens
/// @dev Accounts for debt and control variable decay since last deposit (vs _marketPrice())
/// @param id_ ID of market
/// @return Price for market (see the specific auctioneer for units)
//
// if price is below minimum price, minimum price is returned
// this is enforced on deposits by manipulating total debt (see _decay())
function marketPrice(uint256 id_) external view returns (uint256);
/// @notice Scale value to use when converting between quote token and payout token amounts with marketPrice()
/// @param id_ ID of market
/// @return Scaling factor for market in configured decimals
function marketScale(uint256 id_) external view returns (uint256);
/// @notice Payout due for amount of quote tokens
/// @dev Accounts for debt and control variable decay so it is up to date
/// @param amount_ Amount of quote tokens to spend
/// @param id_ ID of market
/// @param referrer_ Address of referrer, used to get fees to calculate accurate payout amount.
/// Inputting the zero address will take into account just the protocol fee.
/// @return amount of payout tokens to be paid
function payoutFor(
uint256 amount_,
uint256 id_,
address referrer_
) external view returns (uint256);
/// @notice Returns maximum amount of quote token accepted by the market
/// @param id_ ID of market
/// @param referrer_ Address of referrer, used to get fees to calculate accurate payout amount.
/// Inputting the zero address will take into account just the protocol fee.
function maxAmountAccepted(uint256 id_, address referrer_) external view returns (uint256);
/// @notice Does market send payout immediately
/// @param id_ Market ID to search for
function isInstantSwap(uint256 id_) external view returns (bool);
/// @notice Is a given market accepting deposits
/// @param id_ ID of market
function isLive(uint256 id_) external view returns (bool);
/// @notice Returns array of active market IDs within a range
/// @dev Should be used if length exceeds max to query entire array
function liveMarketsBetween(uint256 firstIndex_, uint256 lastIndex_)
external
view
returns (uint256[] memory);
/// @notice Returns an array of all active market IDs for a given quote token
/// @param token_ Address of token to query by
/// @param isPayout_ If true, search by payout token, else search for quote token
function liveMarketsFor(address token_, bool isPayout_)
external
view
returns (uint256[] memory);
/// @notice Returns an array of all active market IDs for a given owner
/// @param owner_ Address of owner to query by
/// @param firstIndex_ Market ID to start at
/// @param lastIndex_ Market ID to end at (non-inclusive)
function liveMarketsBy(
address owner_,
uint256 firstIndex_,
uint256 lastIndex_
) external view returns (uint256[] memory);
/// @notice Returns an array of all active market IDs for a given payout and quote token
/// @param payout_ Address of payout token
/// @param quote_ Address of quote token
function marketsFor(address payout_, address quote_) external view returns (uint256[] memory);
/// @notice Returns the market ID with the highest current payoutToken payout for depositing quoteToken
/// @param payout_ Address of payout token
/// @param quote_ Address of quote token
/// @param amountIn_ Amount of quote tokens to deposit
/// @param minAmountOut_ Minimum amount of payout tokens to receive as payout
/// @param maxExpiry_ Latest acceptable vesting timestamp for bond
/// Inputting the zero address will take into account just the protocol fee.
function findMarketFor(
address payout_,
address quote_,
uint256 amountIn_,
uint256 minAmountOut_,
uint256 maxExpiry_
) external view returns (uint256 id);
/// @notice Returns the Teller that services the market ID
function getTeller(uint256 id_) external view returns (IBondTeller);
/// @notice Returns current capacity of a market
function currentCapacity(uint256 id_) external view returns (uint256);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.8.0;
import {ERC20} from "solmate/tokens/ERC20.sol";
import {IBondTeller} from "../interfaces/IBondTeller.sol";
import {IBondAggregator} from "../interfaces/IBondAggregator.sol";
interface IBondAuctioneer {
/// @notice Creates a new bond market
/// @param params_ Configuration data needed for market creation, encoded in a bytes array
/// @dev See specific auctioneer implementations for details on encoding the parameters.
/// @return id ID of new bond market
function createMarket(bytes memory params_) external returns (uint256);
/// @notice Disable existing bond market
/// @notice Must be market owner
/// @param id_ ID of market to close
function closeMarket(uint256 id_) external;
/// @notice Exchange quote tokens for a bond in a specified market
/// @notice Must be teller
/// @param id_ ID of the Market the bond is being purchased from
/// @param amount_ Amount to deposit in exchange for bond (after fee has been deducted)
/// @param minAmountOut_ Minimum acceptable amount of bond to receive. Prevents frontrunning
/// @return payout Amount of payout token to be received from the bond
function purchaseBond(
uint256 id_,
uint256 amount_,
uint256 minAmountOut_
) external returns (uint256 payout);
/// @notice Set market intervals to different values than the defaults
/// @notice Must be market owner
/// @dev Changing the intervals could cause markets to behave in unexpected way
/// tuneInterval should be greater than tuneAdjustmentDelay
/// @param id_ Market ID
/// @param intervals_ Array of intervals (3)
/// 1. Tune interval - Frequency of tuning
/// 2. Tune adjustment delay - Time to implement downward tuning adjustments
/// 3. Debt decay interval - Interval over which debt should decay completely
function setIntervals(uint256 id_, uint32[3] calldata intervals_) external;
/// @notice Designate a new owner of a market
/// @notice Must be market owner
/// @dev Doesn't change permissions until newOwner calls pullOwnership
/// @param id_ Market ID
/// @param newOwner_ New address to give ownership to
function pushOwnership(uint256 id_, address newOwner_) external;
/// @notice Accept ownership of a market
/// @notice Must be market newOwner
/// @dev The existing owner must call pushOwnership prior to the newOwner calling this function
/// @param id_ Market ID
function pullOwnership(uint256 id_) external;
/// @notice Set the auctioneer defaults
/// @notice Must be policy
/// @param defaults_ Array of default values
/// 1. Tune interval - amount of time between tuning adjustments
/// 2. Tune adjustment delay - amount of time to apply downward tuning adjustments
/// 3. Minimum debt decay interval - minimum amount of time to let debt decay to zero
/// 4. Minimum deposit interval - minimum amount of time to wait between deposits
/// 5. Minimum market duration - minimum amount of time a market can be created for
/// 6. Minimum debt buffer - the minimum amount of debt over the initial debt to trigger a market shutdown
/// @dev The defaults set here are important to avoid edge cases in market behavior, e.g. a very short market reacts doesn't tune well
/// @dev Only applies to new markets that are created after the change
function setDefaults(uint32[6] memory defaults_) external;
/// @notice Change the status of the auctioneer to allow creation of new markets
/// @dev Setting to false and allowing active markets to end will sunset the auctioneer
/// @param status_ Allow market creation (true) : Disallow market creation (false)
function setAllowNewMarkets(bool status_) external;
/// @notice Change whether a market creator is allowed to use a callback address in their markets or not
/// @notice Must be guardian
/// @dev Callback is believed to be safe, but a whitelist is implemented to prevent abuse
/// @param creator_ Address of market creator
/// @param status_ Allow callback (true) : Disallow callback (false)
function setCallbackAuthStatus(address creator_, bool status_) external;
/* ========== VIEW FUNCTIONS ========== */
/// @notice Provides information for the Teller to execute purchases on a Market
/// @param id_ Market ID
/// @return owner Address of the market owner (tokens transferred from this address if no callback)
/// @return callbackAddr Address of the callback contract to get tokens for payouts
/// @return payoutToken Payout Token (token paid out) for the Market
/// @return quoteToken Quote Token (token received) for the Market
/// @return vesting Timestamp or duration for vesting, implementation-dependent
/// @return maxPayout Maximum amount of payout tokens you can purchase in one transaction
function getMarketInfoForPurchase(uint256 id_)
external
view
returns (
address owner,
address callbackAddr,
ERC20 payoutToken,
ERC20 quoteToken,
uint48 vesting,
uint256 maxPayout
);
/// @notice Calculate current market price of payout token in quote tokens
/// @param id_ ID of market
/// @return Price for market in configured decimals
//
// if price is below minimum price, minimum price is returned
function marketPrice(uint256 id_) external view returns (uint256);
/// @notice Scale value to use when converting between quote token and payout token amounts with marketPrice()
/// @param id_ ID of market
/// @return Scaling factor for market in configured decimals
function marketScale(uint256 id_) external view returns (uint256);
/// @notice Payout due for amount of quote tokens
/// @dev Accounts for debt and control variable decay so it is up to date
/// @param amount_ Amount of quote tokens to spend
/// @param id_ ID of market
/// @param referrer_ Address of referrer, used to get fees to calculate accurate payout amount.
/// Inputting the zero address will take into account just the protocol fee.
/// @return amount of payout tokens to be paid
function payoutFor(
uint256 amount_,
uint256 id_,
address referrer_
) external view returns (uint256);
/// @notice Returns maximum amount of quote token accepted by the market
/// @param id_ ID of market
/// @param referrer_ Address of referrer, used to get fees to calculate accurate payout amount.
/// Inputting the zero address will take into account just the protocol fee.
function maxAmountAccepted(uint256 id_, address referrer_) external view returns (uint256);
/// @notice Does market send payout immediately
/// @param id_ Market ID to search for
function isInstantSwap(uint256 id_) external view returns (bool);
/// @notice Is a given market accepting deposits
/// @param id_ ID of market
function isLive(uint256 id_) external view returns (bool);
/// @notice Returns the address of the market owner
/// @param id_ ID of market
function ownerOf(uint256 id_) external view returns (address);
/// @notice Returns the Teller that services the Auctioneer
function getTeller() external view returns (IBondTeller);
/// @notice Returns the Aggregator that services the Auctioneer
function getAggregator() external view returns (IBondAggregator);
/// @notice Returns current capacity of a market
function currentCapacity(uint256 id_) external view returns (uint256);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.8.0;
import {ERC20} from "solmate/tokens/ERC20.sol";
interface IBondCallback {
/// @notice Send payout tokens to Teller while allowing market owners to perform custom logic on received or paid out tokens
/// @notice Market ID on Teller must be whitelisted
/// @param id_ ID of the market
/// @param inputAmount_ Amount of quote tokens bonded to the market
/// @param outputAmount_ Amount of payout tokens to be paid out to the market
/// @dev Must transfer the output amount of payout tokens back to the Teller
/// @dev Should check that the quote tokens have been transferred to the contract in the _callback function
function callback(
uint256 id_,
uint256 inputAmount_,
uint256 outputAmount_
) external;
/// @notice Returns the number of quote tokens received and payout tokens paid out for a market
/// @param id_ ID of the market
/// @return in_ Amount of quote tokens bonded to the market
/// @return out_ Amount of payout tokens paid out to the market
function amountsForMarket(uint256 id_) external view returns (uint256 in_, uint256 out_);
/// @notice Whitelist a teller and market ID combination
/// @notice Must be callback owner
/// @param teller_ Address of the Teller contract which serves the market
/// @param id_ ID of the market
function whitelist(address teller_, uint256 id_) external;
/// @notice Remove a market ID on a teller from the whitelist
/// @dev Shutdown function in case there's an issue with the teller
/// @param teller_ Address of the Teller contract which serves the market
/// @param id_ ID of the market to remove from whitelist
function blacklist(address teller_, uint256 id_) external;
/// @notice Withdraw tokens from the callback and update balances
/// @notice Only callback owner
/// @param to_ Address of the recipient
/// @param token_ Address of the token to withdraw
/// @param amount_ Amount of tokens to withdraw
function withdraw(
address to_,
ERC20 token_,
uint256 amount_
) external;
/// @notice Deposit tokens to the callback and update balances
/// @notice Only callback owner
/// @param token_ Address of the token to deposit
/// @param amount_ Amount of tokens to deposit
function deposit(ERC20 token_, uint256 amount_) external;
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.8.0;
import {ERC20} from "solmate/tokens/ERC20.sol";
import {IBondAuctioneer} from "../interfaces/IBondAuctioneer.sol";
interface IBondSDA is IBondAuctioneer {
/// @notice Main information pertaining to bond market
struct BondMarket {
address owner; // market owner. sends payout tokens, receives quote tokens (defaults to creator)
ERC20 payoutToken; // token to pay depositors with
ERC20 quoteToken; // token to accept as payment
address callbackAddr; // address to call for any operations on bond purchase. Must inherit to IBondCallback.
bool capacityInQuote; // capacity limit is in payment token (true) or in payout (false, default)
uint256 capacity; // capacity remaining
uint256 totalDebt; // total payout token debt from market
uint256 minPrice; // minimum price (hard floor for the market)
uint256 maxPayout; // max payout tokens out in one order
uint256 sold; // payout tokens out
uint256 purchased; // quote tokens in
uint256 scale; // scaling factor for the market (see MarketParams struct)
}
/// @notice Information used to control how a bond market changes
struct BondTerms {
uint256 controlVariable; // scaling variable for price
uint256 maxDebt; // max payout token debt accrued
uint48 start; // timestamp when market starts
uint48 conclusion; // timestamp when market no longer offered
uint48 vesting; // length of time from deposit to expiry if fixed-term, vesting timestamp if fixed-expiry
}
/// @notice Data needed for tuning bond market
/// @dev Durations are stored in uint32 (not int32) and timestamps are stored in uint48, so is not subject to Y2K38 overflow
struct BondMetadata {
uint48 lastTune; // last timestamp when control variable was tuned
uint48 lastDecay; // last timestamp when market was created and debt was decayed
uint32 depositInterval; // target frequency of deposits
uint32 tuneInterval; // frequency of tuning
uint32 tuneAdjustmentDelay; // time to implement downward tuning adjustments
uint32 debtDecayInterval; // interval over which debt should decay completely
uint256 tuneIntervalCapacity; // capacity expected to be used during a tuning interval
uint256 tuneBelowCapacity; // capacity that the next tuning will occur at
uint256 lastTuneDebt; // target debt calculated at last tuning
}
/// @notice Control variable adjustment data
struct Adjustment {
uint256 change;
uint48 lastAdjustment;
uint48 timeToAdjusted; // how long until adjustment happens
bool active;
}
/// @notice Parameters to create a new bond market
/// @dev Note price should be passed in a specific format:
/// formatted price = (payoutPriceCoefficient / quotePriceCoefficient)
/// * 10**(36 + scaleAdjustment + quoteDecimals - payoutDecimals + payoutPriceDecimals - quotePriceDecimals)
/// where:
/// payoutDecimals - Number of decimals defined for the payoutToken in its ERC20 contract
/// quoteDecimals - Number of decimals defined for the quoteToken in its ERC20 contract
/// payoutPriceCoefficient - The coefficient of the payoutToken price in scientific notation (also known as the significant digits)
/// payoutPriceDecimals - The significand of the payoutToken price in scientific notation (also known as the base ten exponent)
/// quotePriceCoefficient - The coefficient of the quoteToken price in scientific notation (also known as the significant digits)
/// quotePriceDecimals - The significand of the quoteToken price in scientific notation (also known as the base ten exponent)
/// scaleAdjustment - see below
/// * In the above definitions, the "prices" need to have the same unit of account (i.e. both in OHM, $, ETH, etc.)
/// If price is not provided in this format, the market will not behave as intended.
/// @param params_ Encoded bytes array, with the following elements
/// @dev 0. Payout Token (token paid out)
/// @dev 1. Quote Token (token to be received)
/// @dev 2. Callback contract address, should conform to IBondCallback. If 0x00, tokens will be transferred from market.owner
/// @dev 3. Is Capacity in Quote Token?
/// @dev 4. Capacity (amount in quoteDecimals or amount in payoutDecimals)
/// @dev 5. Formatted initial price (see note above)
/// @dev 6. Formatted minimum price (see note above)
/// @dev 7. Debt buffer. Percent with 3 decimals. Percentage over the initial debt to allow the market to accumulate at anyone time.
/// @dev Works as a circuit breaker for the market in case external conditions incentivize massive buying (e.g. stablecoin depeg).
/// @dev Minimum is the greater of 10% or initial max payout as a percentage of capacity.
/// @dev If the value is too small, the market will not be able function normally and close prematurely.
/// @dev If the value is too large, the market will not circuit break when intended. The value must be > 10% but can exceed 100% if desired.
/// @dev A good heuristic to calculate a debtBuffer with is to determine the amount of capacity that you think is reasonable to be expended
/// @dev in a short duration as a percent, e.g. 25%. Then a reasonable debtBuffer would be: 0.25 * 1e3 * decayInterval / marketDuration
/// @dev where decayInterval = max(3 days, 5 * depositInterval) and marketDuration = conclusion - creation time.
/// @dev 8. Is fixed term ? Vesting length (seconds) : Vesting expiry (timestamp).
/// @dev A 'vesting' param longer than 50 years is considered a timestamp for fixed expiry.
/// @dev 9. Start Time of the Market (timestamp) - Allows starting a market in the future.
/// @dev If a start time is provided, the txn must be sent prior to the start time (functions as a deadline).
/// @dev If start time is not provided (i.e. 0), the market will start immediately.
/// @dev 10. Market Duration (seconds) - Duration of the market in seconds.
/// @dev 11. Deposit interval (seconds)
/// @dev 12. Market scaling factor adjustment, ranges from -24 to +24 within the configured market bounds.
/// @dev Should be calculated as: (payoutDecimals - quoteDecimals) - ((payoutPriceDecimals - quotePriceDecimals) / 2)
/// @dev Providing a scaling factor adjustment that doesn't follow this formula could lead to under or overflow errors in the market.
/// @return ID of new bond market
struct MarketParams {
ERC20 payoutToken;
ERC20 quoteToken;
address callbackAddr;
bool capacityInQuote;
uint256 capacity;
uint256 formattedInitialPrice;
uint256 formattedMinimumPrice;
uint32 debtBuffer;
uint48 vesting;
uint48 start;
uint32 duration;
uint32 depositInterval;
int8 scaleAdjustment;
}
/* ========== VIEW FUNCTIONS ========== */
/// @notice Calculate current market price of payout token in quote tokens
/// @dev Accounts for debt and control variable decay since last deposit (vs _marketPrice())
/// @param id_ ID of market
/// @return Price for market in configured decimals (see MarketParams)
//
// price is derived from the equation
//
// p = c * d
//
// where
// p = price
// c = control variable
// d = debt
//
// d -= ( d * (dt / l) )
//
// where
// dt = change in time
// l = length of program
//
// if price is below minimum price, minimum price is returned
// this is enforced on deposits by manipulating total debt (see _decay())
function marketPrice(uint256 id_) external view override returns (uint256);
/// @notice Calculate debt factoring in decay
/// @dev Accounts for debt decay since last deposit
/// @param id_ ID of market
/// @return Current debt for market in payout token decimals
function currentDebt(uint256 id_) external view returns (uint256);
/// @notice Up to date control variable
/// @dev Accounts for control variable adjustment
/// @param id_ ID of market
/// @return Control variable for market in payout token decimals
function currentControlVariable(uint256 id_) external view returns (uint256);
/// @notice Calculate max payout of the market in payout tokens
/// @dev Returns a dynamically calculated payout or the maximum set by the creator, whichever is less.
/// @param id_ ID of market
/// @return Current max payout for the market in payout tokens
function maxPayout(uint256 id_) external view returns (uint256);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.8.0;
import {ERC20} from "solmate/tokens/ERC20.sol";
interface IBondTeller {
/// @notice Exchange quote tokens for a bond in a specified market
/// @param recipient_ Address of recipient of bond. Allows deposits for other addresses
/// @param referrer_ Address of referrer who will receive referral fee. For frontends to fill.
/// Direct calls can use the zero address for no referrer fee.
/// @param id_ ID of the Market the bond is being purchased from
/// @param amount_ Amount to deposit in exchange for bond
/// @param minAmountOut_ Minimum acceptable amount of bond to receive. Prevents frontrunning
/// @return Amount of payout token to be received from the bond
/// @return Timestamp at which the bond token can be redeemed for the underlying token
function purchase(
address recipient_,
address referrer_,
uint256 id_,
uint256 amount_,
uint256 minAmountOut_
) external returns (uint256, uint48);
/// @notice Get current fee charged by the teller based on the combined protocol and referrer fee
/// @param referrer_ Address of the referrer
/// @return Fee in basis points (3 decimal places)
function getFee(address referrer_) external view returns (uint48);
/// @notice Set protocol fee
/// @notice Must be guardian
/// @param fee_ Protocol fee in basis points (3 decimal places)
function setProtocolFee(uint48 fee_) external;
/// @notice Set the discount for creating bond tokens from the base protocol fee
/// @dev The discount is subtracted from the protocol fee to determine the fee
/// when using create() to mint bond tokens without using an Auctioneer
/// @param discount_ Create Fee Discount in basis points (3 decimal places)
function setCreateFeeDiscount(uint48 discount_) external;
/// @notice Set your fee as a referrer to the protocol
/// @notice Fee is set for sending address
/// @param fee_ Referrer fee in basis points (3 decimal places)
function setReferrerFee(uint48 fee_) external;
/// @notice Claim fees accrued by sender in the input tokens and sends them to the provided address
/// @param tokens_ Array of tokens to claim fees for
/// @param to_ Address to send fees to
function claimFees(ERC20[] memory tokens_, address to_) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
uint256 twos = (type(uint256).max - denominator + 1) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
// Invert denominator mod 2**256
// Now that denominator is an odd number, it has an inverse
// modulo 2**256 such that denominator * inv = 1 mod 2**256.
// Compute the inverse by starting with a seed that is correct
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use Newton-Raphson iteration to improve the precision.
// Thanks to Hensel's lifting lemma, this also works in modular
// arithmetic, doubling the correct bits in each step.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
// Because the division is now exact we can divide by multiplying
// with the modular inverse of denominator. This will give us the
// correct result modulo 2**256. Since the precoditions guarantee
// that the outcome is less than 2**256, this is the final result.
// We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inv;
return result;
}
}
/// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
function mulDivUp(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
result = mulDiv(a, b, denominator);
unchecked {
if (mulmod(a, b, denominator) > 0) {
require(result < type(uint256).max);
result++;
}
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
import {ERC20} from "solmate/tokens/ERC20.sol";
/// @notice Safe ERC20 and ETH transfer library that safely handles missing return values.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol)
/// @author Taken from Solmate.
library TransferHelper {
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(ERC20.transferFrom.selector, from, to, amount)
);
require(
success &&
(data.length == 0 || abi.decode(data, (bool))) &&
address(token).code.length > 0,
"TRANSFER_FROM_FAILED"
);
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(ERC20.transfer.selector, to, amount)
);
require(
success &&
(data.length == 0 || abi.decode(data, (bool))) &&
address(token).code.length > 0,
"TRANSFER_FAILED"
);
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(ERC20.approve.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
}
// function safeTransferETH(address to, uint256 amount) internal {
// (bool success, ) = to.call{value: amount}(new bytes(0));
// require(success, "ETH_TRANSFER_FAILED");
// }
}{
"codegen": "yul",
"enableEraVMExtensions": false,
"evmVersion": "london",
"forceEVMLA": false,
"libraries": {},
"metadata": {},
"optimizer": {
"disable_system_request_memoization": true,
"enabled": true,
"mode": "3",
"size_fallback": false
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"remappings": [
"solmate/=lib/solmate/src/",
"clones/=lib/clones-with-immutable-args/src/",
"forge-std/=lib/forge-std/src/",
"clones-with-immutable-args/=lib/clones-with-immutable-args/src/",
"ds-test/=lib/clones-with-immutable-args/lib/ds-test/src/"
],
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IBondTeller","name":"teller_","type":"address"},{"internalType":"contract IBondAggregator","name":"aggregator_","type":"address"},{"internalType":"address","name":"guardian_","type":"address"},{"internalType":"contract Authority","name":"authority_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Auctioneer_AmountLessThanMinimum","type":"error"},{"inputs":[],"name":"Auctioneer_BadExpiry","type":"error"},{"inputs":[],"name":"Auctioneer_InitialPriceLessThanMin","type":"error"},{"inputs":[],"name":"Auctioneer_InvalidCallback","type":"error"},{"inputs":[],"name":"Auctioneer_InvalidParams","type":"error"},{"inputs":[],"name":"Auctioneer_MarketNotActive","type":"error"},{"inputs":[],"name":"Auctioneer_MaxPayoutExceeded","type":"error"},{"inputs":[],"name":"Auctioneer_NewMarketsNotAllowed","type":"error"},{"inputs":[],"name":"Auctioneer_NotAuthorized","type":"error"},{"inputs":[],"name":"Auctioneer_NotEnoughCapacity","type":"error"},{"inputs":[],"name":"Auctioneer_OnlyMarketOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"defaultTuneInterval","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"defaultTuneAdjustment","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"minDebtDecayInterval","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"minDepositInterval","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"minMarketDuration","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"minDebtBuffer","type":"uint32"}],"name":"DefaultsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"MarketClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint48","name":"vesting","type":"uint48"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"MarketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldControlVariable","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newControlVariable","type":"uint256"}],"name":"Tuned","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"uint256","name":"change","type":"uint256"},{"internalType":"uint48","name":"lastAdjustment","type":"uint48"},{"internalType":"uint48","name":"timeToAdjusted","type":"uint48"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowNewMarkets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"callbackAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"closeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params_","type":"bytes"}],"name":"createMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"currentCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"currentControlVariable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTuneAdjustment","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTuneInterval","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAggregator","outputs":[{"internalType":"contract IBondAggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"getMarketInfoForPurchase","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"callbackAddr","type":"address"},{"internalType":"contract ERC20","name":"payoutToken","type":"address"},{"internalType":"contract ERC20","name":"quoteToken","type":"address"},{"internalType":"uint48","name":"vesting","type":"uint48"},{"internalType":"uint256","name":"maxPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTeller","outputs":[{"internalType":"contract IBondTeller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isInstantSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"marketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"marketScale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"contract ERC20","name":"payoutToken","type":"address"},{"internalType":"contract ERC20","name":"quoteToken","type":"address"},{"internalType":"address","name":"callbackAddr","type":"address"},{"internalType":"bool","name":"capacityInQuote","type":"bool"},{"internalType":"uint256","name":"capacity","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"uint256","name":"purchased","type":"uint256"},{"internalType":"uint256","name":"scale","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"address","name":"referrer_","type":"address"}],"name":"maxAmountAccepted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"metadata","outputs":[{"internalType":"uint48","name":"lastTune","type":"uint48"},{"internalType":"uint48","name":"lastDecay","type":"uint48"},{"internalType":"uint32","name":"depositInterval","type":"uint32"},{"internalType":"uint32","name":"tuneInterval","type":"uint32"},{"internalType":"uint32","name":"tuneAdjustmentDelay","type":"uint32"},{"internalType":"uint32","name":"debtDecayInterval","type":"uint32"},{"internalType":"uint256","name":"tuneIntervalCapacity","type":"uint256"},{"internalType":"uint256","name":"tuneBelowCapacity","type":"uint256"},{"internalType":"uint256","name":"lastTuneDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDebtBuffer","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDebtDecayInterval","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDepositInterval","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMarketDuration","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"address","name":"referrer_","type":"address"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"pullOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"minAmountOut_","type":"uint256"}],"name":"purchaseBond","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status_","type":"bool"}],"name":"setAllowNewMarkets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator_","type":"address"},{"internalType":"bool","name":"status_","type":"bool"}],"name":"setCallbackAuthStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[6]","name":"defaults_","type":"uint32[6]"}],"name":"setDefaults","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint32[3]","name":"intervals_","type":"uint32[3]"}],"name":"setIntervals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint48","name":"start","type":"uint48"},{"internalType":"uint48","name":"conclusion","type":"uint48"},{"internalType":"uint48","name":"vesting","type":"uint48"}],"stateMutability":"view","type":"function"}]Contract Creation Code
9c4d535b00000000000000000000000000000000000000000000000000000000000000000100072148c77ef8dad5c3b36689d98278fe2d21d7a9220cb6b62c89cc7f4f52000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000006d0a03f4da16ec55af43c81221c8aaff9935ff38000000000000000000000000eff471291d390e4f0104971d5739e8e3b6e1ebed000000000000000000000000111111f26ab123764da895e1627bf9ba0b000a9700000000000000000000000054b1f74f414fd578f23ae42d68bae4935d87d43c
Deployed Bytecode
0x0001000000000002001c0000000000020000000000010355000000600310027000000681033001970000000100200190000000270000c13d0000008005000039000000400050043f000000040030008c00000f7f0000413d000000000201043b000000e0042002700000068c0040009c000000960000213d000006a80040009c000000be0000213d000006b60040009c000000ff0000213d000006bd0040009c000001bb0000a13d000006be0040009c000002df0000613d000006bf0040009c000003fe0000613d000006c00040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b19ff16c50000040f000000000001004b0000000001000039000000010100c039000005f60000013d0000000002000416000000000002004b00000f7f0000c13d0000001f023000390000068202200197000000c002200039000000400020043f0000001f0430018f0000068305300198000000c002500039000000380000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b000000340000c13d000000000004004b000000450000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000800030008c00000f7f0000413d000000c00400043d000006840040009c00000f7f0000213d000000e00100043d001400000001001d000006840010009c00000f7f0000213d000001000600043d000006840060009c00000f7f0000213d000001200100043d001300000001001d000006840010009c00000f7f0000213d000000000100041a0000068501100197000000000161019f000000000010041b0000000101000039000000000201041a000006850220019700000013022001af000000000021041b000000400100043d000006810010009c000006810100804100110040001002180000000001000414000006810010009c0000068101008041000000c00110021000000011011001af00000686011001c70000800d0200003900000003030000390000000005000411001200000004001d000006870400004119ff19f50000040f000000010020019000000f7f0000613d0000000001000414000006810010009c0000068101008041000000c00110021000000011011001af00000686011001c70000800d02000039000000030300003900000688040000410000000005000411000000130600002919ff19f50000040f0000001204000029000000010020019000000f7f0000613d0000001405000029000000800050043f000000a00040043f0000000901000039000000000201041a00000689022001970000068a022001c7000000000021041b0000000702000039000000000302041a000007120130019700000001011001bf000000000012041b0000014000000443000001600050044300000020010000390000018000100443000001a0004004430000010000100443000000020100003900000120001004430000068b0100004100001a000001042e0000068d0040009c000000ee0000213d0000069b0040009c000001150000213d000006a20040009c000001e60000a13d000006a30040009c000002ff0000613d000006a40040009c0000040b0000613d000006a50040009c00000f7f0000c13d0000000004000416000000000004004b00000f7f0000c13d000000440030008c00000f7f0000413d0000000403100370000000000303043b001400000003001d000006840030009c00000f7f0000213d0000002401100370000000000101043b001300000001001d000000010010008c00000f7f0000213d000006e702200197000000000100041119ff0fa10000040f19ff0f8d0000040f0000001401000029000000000010043f0000000801000039000000200010043f19ff19ca0000040f000000000301041a000007120230019700000013022001af0000056f0000013d000006a90040009c000001990000213d000006b00040009c000002070000a13d000006b10040009c0000030a0000613d000006b20040009c000004400000613d000006b30040009c00000f7f0000c13d0000000004000416000000000004004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d000006840010009c00000f7f0000213d000000000100041a00000684011001970000000003000411000000000013004b000005b60000c13d000000140300002900000684063001970000000101000039000000000201041a0000068502200197000000000232019f000000000021041b00140040005002180000000001000414000006810010009c0000068101008041000000c00110021000000014011001af00000686011001c70000800d0200003900000003030000390000068804000041000000000500041119ff19f50000040f000000010020019000000f7f0000613d000000140100002900001a000001042e0000068e0040009c000001ac0000213d000006950040009c000002150000a13d000006960040009c000003160000613d000006970040009c0000045b0000613d000006980040009c00000f7f0000c13d0000000001000416000000000001004b00000f7f0000c13d0000000901000039000000000101041a0000008001100270000005b20000013d000006b70040009c000002350000a13d000006b80040009c000003390000613d000006b90040009c000004620000613d000006ba0040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000006840010009c00000f7f0000213d000000000010043f0000000801000039000000200010043f19ff19ca0000040f000003030000013d0000069c0040009c000002420000a13d0000069d0040009c000003a80000613d0000069e0040009c0000046b0000613d0000069f0040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000640030008c00000f7f0000413d0000004402100370000000000202043b000006840020009c00000f7f0000213d0000002403100370000000000303043b001200000003001d0000000401100370000000000101043b001300000001001d0000000001000415001100000001001d000006dd01000041000000400300043d0000000000130435001400000003001d00000004013000390000000000210435000006c601000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006810010009c0000068101008041000000c001100210000006c7011001c7000080050200003919ff19fa0000040f000000010020019000000f810000613d000000000201043b0000001401000029000006810010009c000006810100804100000040011002100000000003000414000006810030009c0000068103008041000000c003300210000000000113019f000006de011001c7000006840220019719ff19fa0000040f00000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000140b00002900000000057b0019000001600000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000015c0000c13d000000000006004b0000016d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000006150000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006df0010009c000003330000213d0000000100200190000003330000c13d000000400010043f000000200030008c00000f7f0000413d00000000010b0433000006c40010009c00000f7f0000213d000000010200008a000000130020006b0000001302000029000000000200601900000000322100a90000008003300210000006e1033001970000008004200270000000000343019f000006e204200197000006e23530012a0000008003300210000000000343019f000006e2045000d1000000000034004b000000010550208a000006e203500197000000000323001900000013021000b9000000000323004b00000000040000390000000104004039000000000343004b000009200000c13d000006e40120012a0000092e0000013d000006aa0040009c0000024f0000a13d000006ab0040009c000003d10000613d000006ac0040009c000004de0000613d000006ad0040009c00000f7f0000c13d0000000001000416000000000001004b00000f7f0000c13d0000000001000412001a00000001001d001900200000003d0000800501000039000000440300003900000000040004150000001a0440008a000005850000013d0000068f0040009c0000027e0000a13d000006900040009c000003d60000613d000006910040009c000004ee0000613d000006920040009c00000f7f0000c13d0000000001000416000000000001004b00000f7f0000c13d0000000901000039000000000101041a0000002001100270000005b20000013d000006c10040009c000004f50000613d000006c20040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d000000000010043f0000000601000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000101041a00000684011001970000000002000411000000000012004b000007e80000c13d0000001401000029000000000010043f0000000601000039000000200010043f19ff19ca0000040f000000000101041a0000000202000039000000200020043f001406840010019b19ff19ca0000040f000000000201041a00000685022001970000056d0000013d000006a60040009c000004fe0000613d000006a70040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000101041a00000684011001970000000002000411000000000012004b000007b40000c13d000000140100002919ff102a0000040f000005700000013d000006b40040009c0000055c0000613d000006b50040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000201000039000003130000013d000006990040009c000005750000613d0000069a0040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000301000039000000200010043f19ff19ca0000040f0000000202100039000000000202041a0000000103100039000000000303041a000000000101041a000000800010043f000000a00030043f000006c401200197000000c00010043f0000003001200270000006c401100197000000e00010043f0000006001200270000006c401100197000001000010043f000006e00100004100001a000001042e000006bb0040009c0000057b0000613d000006bc0040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b19ff11070000040f000005f60000013d000006a00040009c0000058c0000613d000006a10040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b19ff14e90000040f000005f60000013d000006ae0040009c000005a60000613d000006af0040009c00000f7f0000c13d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b0000000201100039000000000101041a0000006001100270000006c401100197000006f40010009c000005f10000a13d001400000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b000000140010006b00000000010000390000000101002039000005f40000013d000006930040009c000005ad0000613d000006940040009c00000f7f0000c13d0000000001000416000000000001004b00000f7f0000c13d000000640030008c00000f7f0000413d000006c601000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000006810010009c0000068101008041000000c001100210000006c7011001c7000080050200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b00000684011001970000000002000411000000000012004b000007e80000c13d00000004010000390000000001100367000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b001400000001001d0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000006c90020009c000003330000213d000000000101043b000000a003200039000000400030043f000000000301041a00000000043204360000000103100039000000000303041a001200000004001d00000000003404350000000201100039000000000101041a0000004003200039000006c40410019700000000004304350000006003100270000006c4033001970000008004200039000000000034043500000060022000390000003001100270000006c401100197000000000012043500000014010000290000000301100039001300000001001d000000000101041a0000068400100198000007d50000c13d00000004010000390000000001100367000000000101043b19ff16c50000040f000000000001004b000007f00000c13d000000400100043d000006dc02000041000007ea0000013d0000000004000416000000000004004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d000006840010009c00000f7f0000213d000006e702200197000000000100041119ff0fa10000040f000000000001004b000005fd0000c13d000000400100043d00000044021000390000070e03000041000000000032043500000024021000390000000c0300003900000000003204350000070f020000410000000000210435000000040210003900000020030000390000000000320435000006810010009c0000068101008041000000400110021000000710011001c700001a01000104300000000001000416000000000001004b00000f7f0000c13d0000000701000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f000006c30100004100001a000001042e0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000601000039000000200010043f19ff19ca0000040f000005790000013d0000000002000416000000000002004b00000f7f0000c13d000000440030008c00000f7f0000413d0000000402100370000000000202043b001400000002001d0000002401100370000000000101043b001300000001001d000006840010009c00000f7f0000213d0000001401000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000006ca0020009c000006210000a13d0000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a01000104300000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000402100370000000000402043b000006df0040009c00000f7f0000213d0000002302400039000000000032004b00000f7f0000813d0000000402400039000000000521034f000000000505043b000006df0050009c00000f7f0000213d00000000045400190000002404400039000000000034004b00000f7f0000213d000001a00050008c00000f7f0000413d0000022003000039000000400030043f0000002003200039000000000231034f000000000202043b000006840020009c00000f7f0000213d000000800020043f0000002003300039000000000431034f000000000404043b000006840040009c00000f7f0000213d000000a00040043f0000002003300039000000000431034f000000000404043b000006840040009c00000f7f0000213d000000c00040043f0000002003300039000000000431034f000000000404043b000000010040008c00000f7f0000213d000000e00040043f0000002004300039000000000441034f000000000404043b000001000040043f0000004004300039000000000441034f000000000404043b000001200040043f0000006004300039000000000441034f000000000404043b000001400040043f0000008003300039000000000431034f000000000404043b000006810040009c00000f7f0000213d000001600040043f0000002004300039000000000341034f000000000303043b000006c40030009c00000f7f0000213d000001800030043f0000002004400039000000000541034f000000000505043b000006c40050009c00000f7f0000213d000001a00050043f0000002004400039000000000541034f000000000505043b000006810050009c00000f7f0000213d000001c00050043f0000002004400039000000000541034f000000000505043b000006810050009c00000f7f0000213d000001e00050043f0000002004400039000000000141034f000000000101043b0000008000100190000000800400008a00000000040060190000007f0510018f000000000454019f000000000041004b00000f7f0000c13d000002000010043f000000000003004b000009840000613d000006fb0130009a000006fc0010009c000009840000413d000006fd01000041000002200010043f000006fe0100004100001a01000104300000000002000416000000000002004b00000f7f0000c13d000000440030008c00000f7f0000413d0000000402100370000000000202043b001400000002001d0000002401100370000000000101043b001300000001001d000006840010009c00000f7f0000213d0000001401000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000101041a00000684011001970000000002000411000000000012004b000007b40000c13d0000001401000029000000000010043f0000000601000039000000200010043f19ff19ca0000040f000000000201041a000006850220019700000013030000290000056e0000013d0000000001000416000000000001004b00000f7f0000c13d000000000100041a000005880000013d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000401000039000000200010043f19ff19ca0000040f0000000302100039000000000202041a0000000203100039000000000303041a0000000104100039000000000404041a000000000101041a000006c405100197000000800050043f0000003005100270000006c405500197000000a00050043f00000060051002700000068105500197000000c00050043f00000080051002700000068105500197000000e00050043f000000a0051002700000068105500197000001000050043f000000c0011002700000068101100197000001200010043f000001400040043f000001600030043f000001800020043f000006c50100004100001a000001042e0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f19ff19ca0000040f0000000401100039000004ea0000013d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f19ff19ca0000040f0000000a02100039000000000202041a0000000903100039000000000303041a0000000804100039000000000404041a0000000705100039000000000505041a0000000606100039000000000606041a0000000507100039000000000707041a0000000408100039000000000808041a0000000309100039000000000909041a000000020a100039000000000a0a041a000000010b100039000000000b0b041a000000000101041a0000068401100197000000800010043f0000068401b00197000000a00010043f0000068401a00197000000c00010043f0000068401900197000000e00010043f000006cb009001980000000001000039000000010100c039000001000010043f000001200080043f000001400070043f000001600060043f000001800050043f000001a00040043f000001c00030043f000001e00020043f000006f20100004100001a000001042e0000000002000416000000000002004b00000f7f0000c13d000000840030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d19ff16c50000040f000000000001004b000004580000613d00000000020003670000002401200370000000000101043b000006810010009c00000f7f0000213d000000000001004b000004580000613d0000004403200370000000000303043b000006810030009c00000f7f0000213d000000000003004b000006ee0000c13d000000400100043d000006fd02000041000007ea0000013d0000000001000416000000000001004b00000f7f0000c13d0000000901000039000000000101041a0000006001100270000005b20000013d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b19ff13e00000040f000005f60000013d0000000004000416000000000004004b00000f7f0000c13d000000c40030008c00000f7f0000413d0000014003000039000000400030043f0000000403100370000000000303043b000006810030009c00000f7f0000213d000000800030043f0000002403100370000000000303043b000006810030009c00000f7f0000213d000000a00030043f0000004403100370000000000303043b000006810030009c00000f7f0000213d000000c00030043f0000006403100370000000000303043b000006810030009c00000f7f0000213d000000e00030043f0000008403100370000000000303043b000006810030009c00000f7f0000213d000001000030043f000000a401100370000000000101043b000006810010009c00000f7f0000213d000001200010043f000006e702200197000000000100041119ff0fa10000040f000000000001004b000002ee0000613d000000a00600043d0000068101600197000000800200043d0000068102200197000000000012004b000004580000413d000000e00300043d0000068105300197000000000052004b000004580000413d000001000700043d0000068104700197000000000045004b000004580000213d000006e80050009c000009300000213d000000c00800043d000006810580019700000005093000c90000068109900197000000000095004b000004580000413d0000002006600210000006e9066001970000000909000039000000000a09041a000006890aa0019700000000066a019f0000008007700210000006ea07700197000000600a300210000006eb0aa0019700000000077a019f000001200a00043d000000a00ba00210000006ec0bb001970000000007b7019f000000000667019f0000004007800210000006ed07700197000000000676019f000000000626019f000000000069041b0000068106a00197000000400700043d000000a008700039000000000068043500000080067000390000000000460435000006ee033001970000006004700039000000000034043500000040037000390000000000530435000000200370003900000000001304350000000000270435000006810070009c000006810700804100000040017002100000000002000414000006810020009c0000068102008041000000c002200210000000000112019f000006ef011001c70000800d020000390000000103000039000006f00400004119ff19f50000040f0000000100200190000005700000c13d00000f7f0000013d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000201000039000000200010043f19ff19ca0000040f0000000a01100039000000000101041a000000800010043f000006c30100004100001a000001042e0000000001000416000000000001004b00000f7f0000c13d0000000901000039000000000101041a0000004001100270000005b20000013d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b19ff161f0000040f000005f60000013d0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d000000000010043f0000000201000039000000200010043f19ff19ca0000040f000f00000001001d000000800100003919ff0f820000040f0000000f02000029000000000102041a0000068401100197001300000001001d000000800010043f0000000101200039000000000101041a0000068401100197001200000001001d000000a00010043f0000000201200039000000000101041a0000068401100197001100000001001d000000c00010043f0000000301200039000000000101041a0000068403100197001000000003001d000000e00030043f000006cb001001980000000001000039000000010100c039000001000010043f0000000401200039000000000101041a000001200010043f0000000501200039000000000101041a000001400010043f0000000601200039000000000101041a000001600010043f0000000701200039000000000101041a000001800010043f0000000801200039000000000101041a000001a00010043f0000000901200039000000000101041a000001c00010043f0000000a01200039000000000101041a000001e00010043f0000001401000029000000000010043f0000000301000039000000200010043f19ff19ca0000040f0000000201100039000000000101041a000f00000001001d000000140100002919ff13e00000040f000000400200043d0000002003200039000000100400002900000000004304350000004003200039000000120400002900000000004304350000006003200039000000110400002900000000004304350000000f030000290000006003300270000006c40330019700000080042000390000000000340435000000a003200039000000000013043500000013010000290000000000120435000006810020009c00000681020080410000004001200210000006f3011001c700001a000001042e0000000004000416000000000004004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b001400000001001d000000010010008c00000f7f0000213d000006e702200197000000000100041119ff0fa10000040f19ff0f8d0000040f0000000701000039000000000201041a00000712022001970000001403000029000000000232019f000000000021041b000000400100043d000006810010009c0000068101008041000000400110021000001a000001042e0000000001000416000000000001004b00000f7f0000c13d0000000101000039000000000101041a000005880000013d0000000001000416000000000001004b00000f7f0000c13d0000000001000412001c00000001001d001b00000000003d0000800501000039000000440300003900000000040004150000001c0440008a0000000504400210000006c60200004119ff19d70000040f0000068401100197000000800010043f000006c30100004100001a000001042e0000000002000416000000000002004b00000f7f0000c13d000000240030008c00000f7f0000413d0000000401100370000000000101043b000000000010043f0000000501000039000000200010043f19ff19ca0000040f0000000102100039000000000202041a000000000101041a000000800010043f000006c401200197000000a00010043f0000003001200270000006c401100197000000c00010043f000006cc002001980000000001000039000000010100c039000000e00010043f000006f10100004100001a000001042e0000000001000416000000000001004b00000f7f0000c13d0000000901000039000000000101041a000000a001100270000005b20000013d0000000001000416000000000001004b00000f7f0000c13d0000000901000039000000000101041a0000068101100197000000800010043f000006c30100004100001a000001042e0000000101000039000000000101041a000006f503000041000000800030043f00000000030004110000068403300197000000840030043f00000000030004100000068403300197000000a40030043f000006e702200197000000c40020043f00000000030004140000068402100197000006810030009c0000068103008041000000c001300210000006f6011001c719ff19fa0000040f00000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000005d80000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000005d40000c13d000000000006004b000005e50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000066b0000613d0000001f01400039000000600110018f00000080051001bf000000400050043f000000200030008c00000f7f0000413d000000800100043d000000010010008c000000d70000613d00000f7f0000013d000000000001004b0000000001000039000000010100c0390000071301100167000000010110018f000000400200043d0000000000120435000006810020009c00000681020080410000004001200210000006d8011001c700001a000001042e000000000100041a00000685011001970000001406000029000000000161019f000000000010041b000000400100043d000006810010009c000006810100804100130040001002180000000001000414000006810010009c0000068101008041000000c00110021000000013011001af00000686011001c70000800d0200003900000003030000390000068704000041000000000500041119ff19f50000040f000000010020019000000f7f0000613d000000130100002900001a000001042e0000001f0530018f0000068306300198000000400200043d0000000004620019000007c20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000061c0000c13d000007c20000013d000000000101043b0000018003200039000000400030043f000000000301041a000006840330019700000000033204360000000104100039000000000404041a000006840440019700000000004304350000000203100039000000000303041a0000068403300197000000400420003900000000003404350000000303100039000000000303041a000000600420003900000684053001970000000000540435000006cb003001980000000003000039000000010300c0390000008004200039001000000004001d00000000003404350000000403100039000000000303041a000000a004200039000f00000004001d00000000003404350000000503100039000000000303041a000000c00420003900000000003404350000000603100039000000000303041a000000e00420003900000000003404350000000703100039000000000303041a0000010004200039001100000004001d00000000003404350000000803100039000000000303041a000001200420003900000000003404350000000903100039000000000303041a0000014004200039000000000034043500000160022000390000000a01100039000000000101041a001200000002001d0000000000120435000000140100002919ff11070000040f0000000f020000290000000004020433000000000201001900000010010000290000000001010433000000000001004b000006890000c13d000000120100002900000000030104330000000001040019001000000002001d19ff17fc0000040f0000001002000029001400000001001d0000068a0000013d0000001f0530018f0000068306300198000000400200043d0000000004620019000006760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006720000c13d000000000005004b000006830000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006810020009c00000681020080410000004002200210000000000112019f00001a0100010430001400000004001d000000120100002900000000030104330000001101000029000000000101043319ff17fc0000040f000006dd02000041000000400300043d0000000000230435001200000003001d000000040230003900000013030000290000000000320435000006c60200004100000000002004430000000002000412000000040020044300000020020000390000002400200443001300000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c7011001c7000080050200003919ff19fa0000040f0000001304000029000000140040006b00000000030400190000001403004029000000010020019000000f810000613d001400000003001d000000000201043b0000001201000029000006810010009c000006810100804100000040011002100000000003000414000006810030009c0000068103008041000000c003300210000000000113019f000006de011001c7000006840220019719ff19fa0000040f00000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000120b00002900000000057b0019000006c80000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000006c40000c13d000000000006004b000006d50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000007b70000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006df0010009c000003330000213d0000000100200190000003330000c13d000000400010043f000000200030008c00000f7f0000413d00000000020b0433000006c40020009c00000f7f0000213d000000140100002919ff17c00000040f0000071302100167000000140020006b000009300000213d0000001401100029000005f60000013d0000006402200370000000000202043b000006810020009c00000f7f0000213d000000000002004b000004580000613d000000000031004b000004580000413d0000001401000029000000000010043f0000000401000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b001300000001001d00000000010003670000002402100370000000000202043b000006810020009c00000f7f0000213d0000001303000029000000000303041a00000060033002700000068103300197000000000032004b000004580000413d0000006401100370000000000101043b000006810010009c00000f7f0000213d0000000902000039000000000202041a00000040022002700000068102200197000000000021004b000004580000413d0000001401000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000006ca0020009c000003330000213d000000000101043b0000018003200039000000400030043f000000000301041a000006840330019700000000043204360000000105100039000000000505041a000006840550019700000000005404350000000204100039000000000404041a0000068404400197000000400520003900000000004504350000000304100039000000000404041a000000600520003900000684064001970000000000650435000006cb004001980000000004000039000000010400c039000000800520003900000000004504350000000404100039000000000504041a000000a004200039001200000004001d001100000005001d00000000005404350000000504100039000000000404041a000000c00520003900000000004504350000000604100039000000000404041a000000e00520003900000000004504350000000704100039000000000404041a000001000520003900000000004504350000000804100039000000000404041a000001200520003900000000004504350000000904100039000000000404041a0000014005200039000000000045043500000160022000390000000a01100039000000000101041a00000000001204350000000001000411000000000031004b000007b40000c13d00000024010000390000000001100367000000000101043b001000000001001d000006810010009c00000f7f0000213d000000100100002900000080011002100000001303000029000000000203041a000006f802200197000000000112019f000000000013041b0000001401000029000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b0000000201100039000000000101041a001400000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d00000014020000290000003002200270000006c402200197000000000101043b000000000312004b000009300000413d0000001101000029000000100200002919ff17fc0000040f00000013030000290000000102300039000000000012041b00000012020000290000000002020433000000000112004b00000000010040190000000202300039000000000012041b00000000010003670000004402100370000000000202043b000006810020009c00000f7f0000213d000000a0022002100000001304000029000000000304041a000006f903300197000000000223019f000000000024041b0000006401100370000000000101043b000006810010009c00000f7f0000213d000000c001100210000006fa02200197000000000112019f0000001302000029000000000012041b000005700000013d000000400100043d000006f702000041000007ea0000013d0000001f0530018f0000068306300198000000400200043d0000000004620019000007c20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007be0000c13d000000000005004b000007cf0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006810020009c00000681020080410000004002200210000000000121019f00001a01000104300000001401000029000000000101041a0000068401100197000000000010043f0000000801000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000101041a000000ff00100190000002d60000c13d000000400100043d00000711020000410000000000210435000006810010009c00000681010080410000004001100210000006da011001c700001a010001043000000004010000390000000001100367000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000006ca0020009c000003330000213d000000000101043b0000018003200039000000400030043f000000000301041a000006840330019700000000033204360000000104100039000000000404041a000006840440019700000000004304350000000203100039000000000303041a0000068403300197000000400420003900000000003404350000000303100039000000000303041a000000600420003900000684053001970000000000540435000006cb003001980000000003000039000000010300c039000000800420003900000000003404350000000403100039000000000303041a000000a00420003900000000003404350000000503100039000000000303041a000000c00420003900000000003404350000000603100039000000000303041a000000e004200039001000000004001d00000000003404350000000703100039000000000303041a000001000420003900000000003404350000000803100039000000000303041a000001200420003900000000003404350000000903100039000000000303041a0000014004200039000000000034043500000160022000390000000a01100039000000000101041a000f00000002001d000000000012043500000004010000390000000001100367000000000101043b19ff14e90000040f00000004020000390000000002200367000000000202043b000000000020043f0000000202000039000000200020043f001100000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b00000005011000390000001102000029000000000021041b0000000501000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000d00000001001d0000000101100039000e00000001001d000000000101041a000006cc00100198000009610000c13d00000004010000390000000001100367000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000006ca0020009c000003330000213d000000000101043b0000018003200039000000400030043f000000000301041a000006840330019700000000033204360000000104100039000000000404041a000006840440019700000000004304350000000203100039000000000303041a0000068403300197000000400420003900000000003404350000000303100039000000000303041a000000600420003900000684053001970000000000540435000006cb003001980000000003000039000000010300c039000000800420003900000000003404350000000403100039000000000303041a000000a00420003900000000003404350000000503100039000000000303041a000000c004200039000e00000004001d00000000003404350000000603100039000000000303041a000000e00420003900000000003404350000000703100039000000000303041a000001000420003900000000003404350000000803100039000000000303041a000001200420003900000000003404350000000903100039000000000303041a0000014004200039000000000034043500000160022000390000000a01100039000000000101041a000d00000002001d000000000012043500000004010000390000000001100367000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d0000000d0200002900000000030204330000000e020000290000000002020433000000000101043b000000000101041a19ff18b10000040f000000100200002900000000020204330000000003010019000000000021004b000000000302a0190000000f01000029000000000201043300000024010000390000000001100367000000000101043b000e00000003001d19ff17fc0000040f00000004030000390000000002300367000000000202043b000000000020043f000000200030043f001000000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b0000000302100039000000000302041a000000000101041a000c00000001001d000000c0011002700000068101100197000d00000001001d000000100200002919ff18b10000040f00000004030000390000000002300367000000000202043b000000000020043f000000200030043f000f00000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000201041a0000003003200270000006c4033001970000000f04000029000006c404400197000006c405400167000000000053004b000009300000213d00000000034300190000003003300210000006cd03300197000006ce02200197000000000223019f000000000021041b000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d0000000c020000290000003002200270000006c402200197000000000101043b000a00000001001d000c06c40010019b0000000c0120006b00000a6b0000a13d0000000002000415000000170220008a000b0005002002180000000d0210006b000000000100001900000a770000a13d000000000102001900000a700000013d000006e30030009c00000f7f0000213d0000001304000029000006e44040012a000006df01100197000006e41010012a00000000014100a9000006e41010012a000000000112004b000000010330408a0000000501100270000000fb02300210000000000112019f000006e5011000d10014001300100073000009360000813d0000070b01000041000000000010043f0000001101000039000000040010043f000006de0100004100001a01000104300000001201000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b0000000a01100039000000000101041a001300000001001d000000120100002919ff11070000040f00000000030100190000001401000029000000130200002919ff17fc0000040f001400000001001d000000120100002919ff13e00000040f0000001402000029000000000012004b000009560000a13d000000400100043d000006e602000041000007ea0000013d0000000003020019000000000100041500000011011000690000000001000002000000400100043d0000000000310435000006810010009c00000681010080410000004001100210000006d8011001c700001a000001042e00000004010000390000000001100367000000000101043b19ff10710000040f00000004040000390000000004400367000000000404043b000000000040043f0000000304000039000000200040043f000c00000001001d000a00000002001d000b00000003001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000201041a0000000c0220006c000009300000413d000000000021041b0000000b0000006b0000098c0000c13d0000000e01000029000000000101041a000006d2011001970000000e02000029000000000012041b000008630000013d0000000701000039000000000101041a000000ff00100190000009b20000c13d0000070d01000041000002200010043f000006fe0100004100001a01000104300000000d01000029000000000101041a0000000c0110006c000009300000413d0000000d02000029000000000012041b0000000a01000029000006c4021001970000000e01000029000000000101041a0000003003100270000006c403300197000000000223004b000009300000413d0000003002200210000006cd02200197000006ce01100197000000000112019f0000000e02000029000000000012041b000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b000006c4011001970000000e02000029000000000202041a000006d102200197000000000112019f000009810000013d000006ff01000041000002200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006fe011001c719ff19fa0000040f00000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000022005700039000002200a000039000009c90000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000009c50000c13d000000000006004b000009d60000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000a530000613d0000001f01400039000000600110018f0000022001100039001400000001001d000000400010043f000000200030008c00000f7f0000413d000002200100043d001300000001001d000000ff0010008c00000f7f0000213d000000a00200043d000006ff01000041000000140300002900000000001304350000000001000414000006810010009c0000068101008041000000c0011002100000004003300210000000000131019f000006da011001c7000006840220019719ff19fa0000040f00000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000001405700029000009ff0000613d000000000801034f0000001409000029000000008a08043c0000000009a90436000000000059004b000009fb0000c13d000000000006004b00000a0c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000a5f0000613d0000001f01400039000000600110018f0000001401100029000000400010043f000000200030008c00000f7f0000413d00000014020000290000000002020433000000ff0020008c00000f7f0000213d0000001303000029000000060330008a0000000c0030008c00000aa30000213d000000060220008a0000000d0020008c00000aa30000813d000002000200043d0000008000200190000000800300008a00000000030060190000007f0220018f000000000223019f0000001802200039000000300020008c00000aa30000213d0000000001000411000000000010043f0000000801000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b000000000101041a000000ff0010019000000a3c0000c13d000000c00100043d0000068400100198000007e80000c13d000001a00100043d001406c40010019c00000a4d0000613d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b000000140010006b000004580000413d000002000100043d0000002401100039000000ff0110019000000adf0000c13d001400010000003d00000ae80000013d0000001f0530018f0000068306300198000000400200043d0000000004620019000006760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000a5a0000c13d000006760000013d0000001f0530018f0000068306300198000000400200043d0000000004620019000006760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000a660000c13d000006760000013d0000000c0120006a00000713021001670000000d0020006b000009300000213d0000000d01100029000000010200008a0000000f0220014f0000000003000415000000180330008a000b000500300218000000000021004b000009300000213d0000000f0310002900000011010000290000000d0200002919ff17fc0000040f000000010300008a0011001000300153000000110010006c000009300000213d0000000b0200002900000005022002700000001003000029000000000231001f000f00000031001d000000010100008a0000000f0010006b000009300000613d00000004010000390000000001100367000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d0000000f020000290000000102200039000000000101043b0000000501100039000000000021041b00000000010003670000004402100370000000000202043b000000100020006b00000aa80000813d000000400100043d000006db02000041000007ea0000013d000006fd0200004100000000002104350000004001100210000006da011001c700001a010001043000000014020000290000000702200039000000000202041a000000100020006b000009530000213d00000014020000290000000402200039000000000302041a0000001304000029000000000404041a000006cb0040019800000ab60000c13d000000100400002900000ab80000013d0000002404100370000000000404043b000000000034004b0000000005000039000000010500203900000abf0000a13d000000400100043d000006d902000041000007ea0000013d0000000100500190000009300000c13d0000000003430049000000000032041b0000002402100370000000000202043b000007130520016700000014030000290000000903300039000000000403041a000000000054004b000009300000213d0000000002240019000000000023041b00000014020000290000000802200039000000000302041a000000110030006c000009300000213d0000001003300029000000000032041b0000000401100370000000000101043b00000014020000290000000502200039000000000202041a00000012030000290000000003030433000000000023004b00000cb50000813d19ff102a0000040f00000f7b0000013d0000000a02000039001400010000003d000000010010019000000000032200a9000000010200603900140014002000bd0000000101100272000000000203001900000ae10000c13d000000400100043d001300000001001d000001400100043d000001200200043d000000000012004b00000af60000813d0000070c0100004100000013020000290000000000120435000006810020009c00000681020080410000004001200210000006da011001c700001a0100010430000000a00100043d000006840110019700000013040000290000002402400039000000800300043d000000000012043500000700010000410000000000140435000006840130019700000004024000390000000000120435000006c60100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006810010009c0000068101008041000000c001100210000006c7011001c7000080050200003919ff19fa0000040f000000010020019000000f810000613d000000000201043b0000001301000029000006810010009c000006810100804100000040011002100000000003000414000006810030009c0000068103008041000000c003300210000000000113019f00000701011001c7000006840220019719ff19f50000040f00000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000130570002900000b2b0000613d000000000801034f0000001309000029000000008a08043c0000000009a90436000000000059004b00000b270000c13d000000000006004b00000b380000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000d770000613d0000001f01400039000000600210018f0000001301200029000000000021004b00000000020000390000000102004039000006df0010009c000003330000213d0000000100200190000003330000c13d000000400010043f000000200030008c00000f7f0000413d000001c00200043d00000681032001970000000902000039000000000202041a001000000002001d00000080022002700000068102200197000000000023004b000004590000413d000001e00200043d001106810020019b000000100200002900000060022002700000068102200197000000110020006b000004590000413d000000110030006b000004590000213d0000001101000029000007020010009c000009300000813d00000013010000290000000001010433001200000001001d00000010010000290000068102100197000000110020006b0000001102002029000001000100043d000d00000001001d000c00000002001d19ff17fc0000040f00000010020000290000004005200270000000110200002900000005022000c900000681032001970000068104500197000000000034004b000000000502a019001300000005001d000f00000001001d000001a00100043d000e06c40010019c00000b810000c13d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b000e06c40010019b0000000d020000290009000f00200074000009300000413d000001000100043d000000e00200043d000000000002004b00000b8b0000613d000001200300043d000000140200002919ff17fc0000040f000001c00300043d000000130200002900000681022001970000068103300197001300000002001d19ff17fc0000040f000000400200043d000d00000002001d000006d30020009c000003330000213d0000000d030000290000012002300039000000400020043f0000010002300039000b00000002001d0000000000120435000000e001300039000a00000001001d00000009020000290000000000210435000000c0023000390000000f01000029000900000002001d0000000000120435000000a0023000390000001301000029000f00000002001d00000000001204350000001001000029000000200110027000000681011001970000008002300039001000000002001d000000000012043500000060023000390000000c01000029000800000002001d000000000012043500000040023000390000001101000029000c00000002001d00000000001204350000000e010000290000000002130436001100000002001d00000000001204350000001201000029000000000010043f0000000401000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d0000000d020000290000000002020433000006c402200197000000000101043b000000000301041a000006e703300197000000000223019f000000110300002900000000030304330000003003300210000006cd03300197000000000223019f0000000c03000029000000000303043300000060033002100000070303300197000000000232019f000000080300002900000000030304330000008003300210000006ea03300197000000000232019f00000010030000290000000003030433000000a003300210000006ec03300197000000000232019f0000000f030000290000000003030433000000c0033002100000070403300197000000000232019f000000000021041b000000090200002900000000020204330000000103100039000000000023041b0000000a0200002900000000020204330000000203100039000000000023041b00000003011000390000000b020000290000000002020433000000000021041b000001000200043d000000e00100043d000000000001004b0000000001000039000000010100c039000b00000001001d00000bff0000613d000001200300043d0000000001020019000000140200002919ff17fc0000040f0000000002010019000001c00100043d0000068103100197001100000003001d001000000002001d0000000001020019000000130200002919ff17fc0000040f001300000001001d000001e00100043d00000681021001970000001001000029000000110300002919ff17fc0000040f001100000001001d000000400100043d001000000001001d000006ca0010009c000003330000213d00000010080000290000018001800039000000800200043d000000a00300043d000000c00400043d000001000500043d000001400600043d000000400010043f00000160078000390000001401000029000f00000007001d000000000017043500000100078000390000001101000029000e00000007001d0000000000170435000000e001800039000d00000001001d0000000000610435000000c0068000390000001301000029000c00000006001d0000000000160435000000a001800039000a00000001001d00000000005104350000008001800039000800000001001d0000000b05000029000000000051043500000684014001970000006004800039000700000004001d000000000014043500000684013001970000004003800039000600000003001d000000000013043500000684012001970000002002800039000500000002001d0000000000120435000000000100041100000000001804350000014001800039000b00000001001d00000000000104350000012001800039000900000001001d00000000000104350000001201000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000100200002900000000020204330000068402200197000000000101043b000000000301041a0000068503300197000000000223019f000000000021041b0000000502000029000000000202043300000684022001970000000103100039000000000403041a0000068504400197000000000224019f000000000023041b0000000602000029000000000202043300000684022001970000000203100039000000000403041a0000068504400197000000000224019f000000000023041b0000000702000029000000000202043300000684022001970000000303100039000000000403041a0000070504400197000000000224019f00000008040000290000000004040433000000000004004b00000706040000410000000004006019000000000242019f000000000023041b0000000a0200002900000000020204330000000403100039000000000023041b0000000c0200002900000000020204330000000503100039000000000023041b0000000d0200002900000000020204330000000603100039000000000023041b0000000e0200002900000000020204330000000703100039000000000023041b000000090200002900000000020204330000000803100039000000000023041b0000000b0200002900000000020204330000000903100039000000000023041b0000000a011000390000000f020000290000000002020433000000000021041b0000001101000029000000130200002919ff17200000040f0000000902000039000000000202041a000000a0022002700000068102200197000000000021004b00000c9f0000a13d0000001101000029000000130200002919ff17200000040f0000000002010019000001600100043d0000068103100197000000000023004b000000000302a019000000010100008a000000130010006b00000013020000290000000002006019000000000013004b0000000004030019000000000400601900000000522400a9000006e27450012a0000008006200270000007070050009c00000d830000213d0000008007700210000000000767019f000006e2084000d1000000000078004b000000010440208a00000d840000013d000000000010043f0000000401000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000b00000002001d000006d30020009c000003330000213d000000000101043b0000000b050000290000012002500039000000400020043f000000000201041a0000003003200270000006c40330019700000020045000390000000000340435000006c4032001970000000000350435000000c0032002700000068103300197000000a004500039000700000004001d0000000000340435000000a00320027000000681033001970000008004500039000800000004001d0000000000340435000000800320027000000681033001970000006004500039000500000004001d0000000000340435000000600220027000000681022001970000004003500039000600000003001d00000000002304350000000102100039000000000202041a000000c003500039000900000003001d00000000002304350000000202100039000000000202041a000000e003500039000400000003001d000000000023043500000100025000390000000301100039000000000101041a000000000012043500000004010000390000000001100367000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d000006ca0020009c000003330000213d000000000101043b0000018003200039000000400030043f000000000301041a000006840330019700000000033204360000000104100039000000000404041a000006840440019700000000004304350000000203100039000000000303041a0000068403300197000000400420003900000000003404350000000303100039000000000303041a000000600420003900000684053001970000000000540435000006cb003001980000000003000039000000010300c0390000008004200039000f00000004001d00000000003404350000000403100039000000000303041a000000a004200039001300000004001d00000000003404350000000503100039000000000303041a000000c00420003900000000003404350000000603100039000000000303041a000000e00420003900000000003404350000000703100039000000000303041a000001000420003900000000003404350000000803100039000000000303041a0000012004200039000300000004001d00000000003404350000000903100039000000000303041a0000014004200039000d00000004001d000000000034043500000160022000390000000a01100039000000000101041a001100000002001d000000000012043500000004010000390000000001100367000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000400200043d001200000002001d000006c90020009c000003330000213d000000000101043b0000001204000029000000a002400039000000400020043f000000000201041a00000000022404360000000103100039000000000303041a00000000003204350000000201100039000000000501041a0000006001500270000006c401100197000000800240003900000000001204350000004002400039000006c40150019700000000001204350000006003400039000200000005001d0000003002500270000100000002001d000006c40220019700000000002304350000000c0020006c000009300000413d000000000012004b000009300000413d00000013010000290000000001010433001400000001001d0000000f010000290000000001010433000000000001004b00000d920000c13d0000000301000029000000000101043300000d9f0000013d0000001f0530018f0000068306300198000000400200043d0000000004620019000006760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000d7e0000c13d000006760000013d000000010440008a0000008005500210000000000565019f000006e2044001970000000005450019000006e27450012a000006e206200197000007070050009c00000de50000213d0000008002700210000000000262019f000006e2074000d1000000000027004b000000010440208a00000de60000013d0000001101000029000000000201043300000014010000290000000e0300002919ff17fc0000040f0000000d02000029000000000302043300000011020000290000000002020433001400000001001d00000000010300190000000e0300002919ff17fc0000040f0000071302100167000000140020006b000009300000213d00000001040000290000000a0240006a000000020340006a000006c404200197000006c402300197000c00000002001d000300000004001d000000000242004b000009300000413d001400140000002d0000001401100029000a00000001001d0000000c0300002919ff17fc0000040f000000010200008a000000140220014f000000000021004b000009300000213d000f00140010002d0000000001000415000000160110008a000d0005001002180000000401000029000000000101043300000013020000290000000002020433000000000012004b00000dc40000813d0000000001000415000000150110008a000d0005001002180000000a020000290000000f0020006b00000df90000413d0000000b010000290000000001010433000b00000001001d000006c401100197000000050200002900000000020204330000068102200197000500000002001d000006c402200167000000000021004b000009300000213d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d00000005030000290000000b02300029000006c402200197000000000101043b000006c401100197000000000021004b00000df20000813d0000000d010000290000000501100270000000000100003f00000f7b0000013d000000010440008a00000013023000b90000008005500210000000000565019f000006e2044001970000000004450019000000000424004b00000000050000390000000105004039000000000454004b00000e860000c13d000006e40220012a00000e930000013d0000000a020000290000000f0020006b0000000d010000290000000501100270000000000100003f000000010100203f00000f7b0000a13d0000000601000029000000000101043300000681021001970000001401000029000000030300002919ff17fc0000040f00000004020000390000000002200367000000000202043b000000000020043f0000000202000039000000200020043f001400000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b00000007011000390000001402000029000000000021041b0000000701000029000000000101043300000681021001970000000f010000290000000c0300002919ff17fc0000040f0000001102000029000000000202043300000000030100190000000e01000029001100000003001d19ff18b10000040f00000012020000290000000002020433000000400300043d0000000002230436001400000001001d000000000012043500000004010000390000000001100367000000000501043b000006810030009c000006810300804100000040013002100000000002000414000006810020009c0000068102008041000000c002200210000000000112019f000006c8011001c70000800d020000390000000203000039000006d40400004119ff19f50000040f000000010020019000000f7f0000613d00000012010000290000000001010433000000140110006c00000f100000a13d000000400200043d001400000002001d000006d50020009c000003330000213d00000008020000290000000002020433000f00000002001d00000014030000290000008002300039000000400020043f0000000001130436001200000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d0000000f020000290000068102200197000000000101043b000000140400002900000060054000390000000103000039000f00000005001d00000000003504350000004003400039000e00000003001d0000000000230435000006c4011001970000001202000029000000000012043500000004010000390000000001100367000000000101043b000000000010043f0000000501000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d00000014020000290000000002020433000000000101043b000000000021041b00000012020000290000000002020433000006c4022001970000000101100039000000000301041a000006d603300197000000000223019f0000000e0300002900000000030304330000003003300210000006cd03300197000000000232019f0000000f030000290000000003030433000000000003004b000006d7030000410000000003006019000000000232019f00000f310000013d000006e30040009c00000f7f0000213d0000001305000029000006e45050012a000006e43030012a00000000035300a9000006e43030012a000000000232004b000000010440408a0000000502200270000000fb03400210000000000223019f000006e5022000d1001100000002001d000000110110014f000000130010006b000009300000213d000001200100043d0000001402000029000000130300002919ff17fc0000040f001000000001001d000001a00100043d000006c40110019800000eac0000c13d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b000006c401100197000001c00200043d0000068102200197000006c403200167000000000031004b000009300000213d000000400300043d001400000003001d000006c90030009c000003330000213d000000110400002900000013034000290000001406000029000000a004600039000001800500043d000000400040043f000006c4045001970000008005600039001300000005001d00000000004504350000000002120019000006c4022001970000006004600039001100000004001d00000000002404350000004002600039000f00000002001d000000000012043500000010010000290000000001160436001000000001001d00000000003104350000001201000029000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d00000014020000290000000002020433000000000101043b000000000021041b000000100200002900000000020204330000000103100039000000000023041b0000000f020000290000000002020433000006c4022001970000000201100039000000000301041a0000070803300197000000000223019f000000110300002900000000030304330000003003300210000006cd03300197000000000223019f0000001303000029000000000303043300000060033002100000070903300197000000000232019f000000000021041b000000400100043d0000002002100039000000a00300043d000000800400043d000001800500043d000001200600043d0000000000620435000006c4025001970000000000210435000006810010009c000006810100804100000040011002100000000002000414000006810020009c0000068102008041000000c002200210000000000112019f000006c8011001c7000006840640019700000684073001970000800d0200003900000004030000390000070a04000041000000120500002919ff19f50000040f000000010020019000000f7f0000613d000000400100043d000000120200002900000f7d0000013d00000004010000390000000001100367000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b0000001402000029000000000021041b0000000501000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b0000000101100039000000000201041a000006d202200197000000000021041b00000004020000390000000001200367000000000101043b000000000010043f000000200020043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b001400000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f000000010020019000000f810000613d000000000101043b000006c4011001970000001403000029000000000203041a000006d102200197000000000112019f000000000013041b00000009010000290000000001010433001400000001001d00000013010000290000000001010433001300000001001d00000004020000390000000001200367000000000101043b000000000010043f000000200020043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d0000001303000029000000140230006c0000000002004019000000000101043b0000000201100039000000000021041b0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010020019000000f7f0000613d000000000101043b00000003011000390000001102000029000000000021041b000000400100043d000000100200002900000000002104350000095c0000013d000000000100001900001a0100010430000000000001042f000007140010009c00000f870000813d0000018001100039000000400010043f000000000001042d0000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a0100010430000000000001004b00000f900000613d000000000001042d000000400100043d00000044021000390000070e03000041000000000032043500000024021000390000000c0300003900000000003204350000070f020000410000000000210435000000040210003900000020030000390000000000320435000006810010009c0000068101008041000000400110021000000710011001c700001a01000104300004000000000002000000000302001900000000050100190000000004000415000000040440008a00000005044002100000000101000039000000000201041a000006840220019800000ffc0000613d000006e701300197000000400400043d000200000004001d000000440340003900000000001304350000000001000410000006840110019700000024034000390000000000130435000006f5010000410000000000140435000100000005001d000006840150019700000004034000390000000000130435000006810040009c0000068101000041000000000104401900000040011002100000000003000414000006810030009c0000068103008041000000c003300210000000000113019f00000710011001c719ff19fa0000040f000000020b00002900000060031002700000068103300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900000fd50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000fd10000c13d000000000006004b00000fe20000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000010060000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000006df0010009c0000000105000029000010240000213d0000000100200190000010240000c13d000000400010043f0000001f0030008c0000000101000039000010040000a13d00000000020b0433000000010020008c000010040000213d0000000004000415000000030440008a0000000504400210000000000002004b00000ffc0000613d000000000001042d000000000200041a000000000252013f0000068400200198000000000100003900000001010060390000000502400270000000000201001f000000000001042d000000000100001900001a01000104300000001f0530018f0000068306300198000000400200043d0000000004620019000010110000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000100d0000c13d000000000005004b0000101e0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006810020009c00000681020080410000004002200210000000000112019f00001a01000104300000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a01000104300002000000000002000200000001001d000000000010043f0000000301000039000000200010043f000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f0000000100200190000010700000613d000000000101043b000100000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000001002001900000106e0000613d00000001020000290000003002200210000006cd02200197000000000101043b0000000201100039000000000301041a000006ce03300197000000000223019f000000000021041b0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000001002001900000106e0000613d000000000101043b0000000401100039000000000001041b000000400100043d000006810010009c000006810100804100000040011002100000000002000414000006810020009c0000068102008041000000c002200210000000000112019f00000686011001c70000800d0200003900000002030000390000071504000041000000020500002919ff19f50000040f00000001002001900000106e0000613d000000000001042d000000000100001900001a0100010430000000000001042f0003000000000002000000000010043f0000000501000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000010f80000613d000000400500043d000007160050009c000010fa0000813d000000000101043b0000008002500039000000400020043f000000000201041a00000000022504360000000101100039000000000101041a0000006003500039000006cc001001980000000004000039000000010400c0390000000000430435000006c403100197000000000032043500000040025000390000003001100270000006c4011001970000000000120435000010c70000613d000200000003001d000100000002001d000300000005001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f0000000100200190000011000000613d000000000101043b000006c401100197000000020210006c0000000301000029000011010000413d0000000001010433000006c40520019700000001030000290000000003030433000006c404300197000000000045004b000010c90000813d000007130010009c0000000003010019000000000300601900000000635300a900000080073002700000008006600210000000000676019f000006e207300197000006e26860012a0000008006600210000000000676019f000006e2078000d1000000000067004b000000010880208a000006e206800197000000000336001900000000065100a9000000000363004b00000000070000390000000107004039000000000373004b000010cb0000c13d00000000014600d90000000103000039000000000001042d000000000100001900000000020000190000000003000019000000000001042d000000000043004b000010f80000813d00000000504500d900000000104100d900000000015100a900000000704100d900000000014000890000000001140170000000000514c0d90000000005006019000000000476004b00000003065000c9000000020660015f00000000075600a9000000020770008900000000066700a900000000075600a9000000020770008900000000066700a9000000010330408a00000000075600a9000000020770008900000000066700a900000000075600a9000000020770008900000000066700a900000000075600a9000000020770008900000000066700a900000000055600a9000000020550008900000000056500a9000000000001004b000010f30000613d00000000041400d9000000000610008900000000011600d9000000010110003900000000033100a9000010f40000013d0000000004000019000000000134019f00000000011500a90000000103000039000000000001042d000000000100001900001a01000104300000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a0100010430000000000001042f0000070b01000041000000000010043f0000001101000039000000040010043f000006de0100004100001a01000104300005000000000002000500000001001d000000000010043f0000000501000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000013d10000613d000000400500043d000007160050009c000013da0000813d000000000101043b0000008002500039000000400020043f000000000201041a00000000022504360000000101100039000000000101041a0000006003500039000006cc001001980000000004000039000000010400c0390000000000430435000006c403100197000000000032043500000040025000390000003001100270000006c40110019700000000001204350000115d0000613d000300000003001d000200000002001d000400000005001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f0000000100200190000013d90000613d000000000101043b000006c401100197000000030110006c0000000402000029000013d30000413d0000000007020433000006c40310019700000002010000290000000001010433000006c402100197000000000023004b0000118a0000813d000007130070009c0000000001070019000000000100601900000000413100a900000080051002700000008004400210000000000454019f000006e205100197000006e24640012a0000008004400210000000000454019f000006e2056000d1000000000045004b000000010660208a000006e204600197000000000114001900000000043700a9000000000141004b00000000050000390000000105004039000000000151004b0000115f0000c13d00000000072400d90000118a0000013d00000000070000190000118a0000013d000000000021004b000013d10000813d00000000302300d900000000502700d900000000033500a900000000602300d900000000032000890000000003320170000000000532c0d90000000005006019000000000264004b00000003045000c9000000020440015f00000000065400a9000000020660008900000000044600a900000000065400a9000000020660008900000000044600a9000000010110408a00000000065400a9000000020660008900000000044600a900000000065400a9000000020660008900000000044600a900000000065400a9000000020660008900000000044600a900000000055400a9000000020550008900000000044500a9000000000003004b000011870000613d00000000023200d9000000000530008900000000033500d9000000010330003900000000011300a9000011880000013d0000000002000019000000000112019f00000000071400a9000400000007001d0000000501000029000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000004030000290000000100200190000013d10000613d000000000101043b000000000101041a0004000000310053000013d30000413d0000000501000029000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000013d10000613d000000000101043b0000000201100039000000000101041a000300000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f0000000100200190000013d90000613d0002000100000092000000000201043b0000000301000029000006c401100197000000000012004b0000000201000039000011ce0000813d000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000013d10000613d000000000101043b0000000501100039000000000101041a000012940000013d000300000002001d0000000401000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000013d10000613d000000400200043d000006d30020009c000013da0000213d000000000101043b0000012003200039000000400030043f000000000401041a000000a00340027000000681033001970000008005200039000000000035043500000080034002700000068103300197000000600520003900000000003504350000006003400270000006810330019700000040052000390000000000350435000006c40340019700000000053204360000003003400270000006c4033001970000000000350435000000c0044002700000068104400197000000a00720003900000000004704350000000105100039000000000505041a000000c00620003900000000005604350000000205100039000000000505041a000000e006200039000000000056043500000100022000390000000301100039000000000101041a00000000001204350000000301000029000000000213004b0000121e0000a13d000100000002001d000300000007001d0000000501000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000013d10000613d000000010500008a0000000104000029000000000354013f000000030200002900000000020204330000068102200197000000000032004b000013d30000213d0000000003420019000012370000013d0000000003310049000000000043004b00000000010000190000000202000039000012950000213d000100000003001d000300000007001d0000000501000029000000000010043f000000200020043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000013d10000613d000000030200002900000000020204330000068102200197000000010320006c000000010500008a000013d30000413d000000000101043b0000000501100039000000000401041a000000000053004b00000000010300190000000001006019000000000054004b0000000005040019000000000500601900000000611500a9000006e28560012a0000008007100270000007070060009c0000124b0000213d0000008008800210000000000878019f000006e2095000d1000000000089004b000000010550208a0000124c0000013d000000010550008a0000008006600210000000000676019f000006e2055001970000000007560019000006e25670012a000006e201100197000007070070009c0000125a0000213d0000008005500210000000000515019f000006e2086000d1000000000058004b000000010660208a0000125b0000013d000000010660008a00000000053400a90000008007700210000000000117019f000006e2066001970000000001610019000000000151004b00000000060000390000000106004039000000000161004b000012690000c13d000000000002004b000013d10000613d00000000012500d9000012940000013d000000000021004b000013d10000813d00000000402400d900000000302300d900000000034300a900000000602300d900000000032000890000000003320170000000000432c0d90000000004006019000000000265004b00000003054000c9000000020550015f00000000064500a9000000020660008900000000055600a900000000064500a9000000020660008900000000055600a9000000010110408a00000000064500a9000000020660008900000000055600a900000000064500a9000000020660008900000000055600a900000000064500a9000000020660008900000000055600a900000000044500a9000000020440008900000000045400a9000000000003004b000012910000613d00000000023200d9000000000530008900000000033500d9000000010330003900000000011300a9000012920000013d0000000002000019000000000112019f00000000011400a90000000202000039000300000001001d0000000501000029000000000010043f000000200020043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000003080000290000000100200190000013d10000613d000000010300008a000000040030006b00000004020000290000000002006019000000000038004b0000000003080019000000000300601900000000422300a9000006e26340012a0000008005200270000000000101043b000007070040009c000012b60000213d0000008006600210000000000656019f000006e2073000d1000000000067004b000000010330208a000012b70000013d000000010330008a0000000a011000390000008004400210000000000454019f000006e2033001970000000004340019000006e25340012a000006e202200197000007070040009c000012c60000213d0000008005500210000000000525019f000006e2063000d1000000000056004b000000010330208a000012c70000013d000000010330008a000000000101041a00000004058000b90000008004400210000000000224019f000006e2033001970000000002320019000000000252004b00000000030000390000000103004039000000000432004b0000132f0000c13d000000000001004b000013d10000613d00000000201800d900000004301000f9000000000c1500d9000006e20010009c000013b50000a13d00000000342300a9000000000031004b000013b90000a13d000007170010009c000000c0020000390000008002004039000000000521022f00000040020000390000008002004039000007180050009c000000200220808a0000002005508270000007190050009c000000100220808a0000001005508270000001000050008c000000080220808a0000000805508270000000100050008c00000000060500190000000406608270000000040060008c00000000070600190000000207708270000000020800008a0000000009700089000000020070008c0000000009088019000000100050008c000000040220808a000000040060008c000000020220808a0000000002290019000000ff0520018f00000000035301cf0000071305200167000000ff0550018f0000000106400270000000000556022f000000000653019f00000000012101cf000000800310027000000000983600d900000000052401cf0000008007500270000006e2041001970000130c0000013d0000000009390019000000010880008a000006e20090009c000013130000813d0000071a0080009c000013080000213d000000000a4800a9000000800b900210000000000b7b019f0000000000ba004b000013080000213d000006e20880019700000000081800a90000008006600210000000000676019f000000000686004900000000873600d9000006e2055001970000131f0000013d0000000008380019000000010770008a000006e20080009c000013260000813d0000071a0070009c0000131b0000213d00000000094700a9000000800a800210000000000a5a019f0000000000a9004b0000131b0000213d000006e20370019700000000011300a90000008003600210000000000353019f0000000001130049000000000121022f000000000001004b000013b90000c13d000013bb0000013d000000000014004b000013d10000813d00000000201800d900000004301000f9000006e20010009c000013380000213d00000000063200a900000000601600d90000138d0000013d00000000793200a9000000000071004b0000138e0000a13d000007170010009c000000c0060000390000008006004039000000000861022f00000040060000390000008006004039000007180080009c000000200660808a0000002008808270000007190080009c000000100660808a0000001008808270000001000080008c000000080660808a0000000808808270000000100080008c000000000a080019000000040aa082700000000400a0008c000000000b0a0019000000020bb08270000000020c00008a000000000db000890000000200b0008c000000000d0c8019000000100080008c000000040660808a0000000400a0008c000000020660808a00000000066d0019000000ff0860018f00000000078701cf0000071308600167000000ff0880018f000000010a90027000000000088a022f000000000b87019f00000000076101cf000000800870027000000000ed8b00d900000000096901cf000400000009001d000000800c900270000006e2097001970000136c0000013d000000000e8e0019000000010dd0008a000006e200e0009c000013730000813d0000071a00d0009c000013680000213d000000000f9d00a9000000800ae00210000000000aca019f0000000000af004b000013680000213d000006e20ad00197000000000a7a00a9000000800bb00210000000000bcb019f000000000bab004900000000dc8b00d9000000040a000029000006e20aa00197000013800000013d000000000d8d0019000000010cc0008a000006e200d0009c000013870000813d0000071a00c0009c0000137c0000213d000000000e9c00a9000000800fd00210000000000faf019f0000000000fe004b0000137c0000213d000006e208c0019700000000077800a90000008008b002100000000008a8019f0000000007780049000000000667022f000200000006001d00000000061000890000000006610170000000000761c0d90000000007006019000000020550006c00000003087000c9000000020880015f00000000097800a9000000020990008900000000088900a900000000097800a9000000020990008900000000088900a9000000010440408a00000000097800a9000000020990008900000000088900a900000000097800a9000000020990008900000000088900a900000000097800a9000000020990008900000000088900a900000000077800a9000000020770008900000000078700a9000000000006004b000013b00000613d00000000056500d9000000000860008900000000066800d9000000010660003900000000044600a9000013b10000013d0000000005000019000000000445019f000000000c4700a9000006e20010009c000012d90000213d00000000022300a900000000101200d9000000000001004b000013bb0000613d000000010cc0003a000013d10000613d00040000000c001d0000000501000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000001002001900000000402000029000013d10000613d000000000101043b0000000601100039000000000101041a000000000012004b000000000201a0190000000001020019000000000001042d000000000100001900001a01000104300000070b01000041000000000010043f0000001101000039000000040010043f000006de0100004100001a0100010430000000000001042f0000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a01000104300001000000000002000100000001001d19ff11070000040f0000000102000029000000000020043f0000000202000039000000200020043f000100000001001d0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f000000010f0000290000000100200190000014e10000613d000000400200043d000007140020009c000014e30000813d000000000301043b0000018001200039000000400010043f000000000103041a000006840110019700000000011204360000000104300039000000000404041a000006840440019700000000004104350000000201300039000000000101041a0000068401100197000000400420003900000000001404350000000301300039000000000101041a000000600420003900000684051001970000000000540435000006cb0010019800000080012000390000000004000039000000010400c03900000000004104350000000401300039000000000401041a000000a00120003900000000004104350000000501300039000000000101041a000000c00520003900000000001504350000000601300039000000000101041a000000e00520003900000000001504350000000701300039000000000101041a000001000520003900000000001504350000000805300039000000000505041a000001200620003900000000005604350000000905300039000000000505041a0000014006200039000000000056043500000160022000390000000a03300039000000000603041a00000000006204350000145a0000613d000000010500008a000000000054004b00000000020400190000000002006019000000000056004b0000000003060019000000000300601900000000722300a9000006e29370012a0000008008200270000007070070009c0000143d0000213d0000008009900210000000000989019f000006e20a3000d100000000009a004b000000010330208a0000143e0000013d000000010330008a0000008007700210000000000787019f000006e2033001970000000008370019000006e23780012a000006e202200197000007070080009c0000144c0000213d0000008003300210000000000323019f000006e2097000d1000000000039004b000000010770208a0000144d0000013d000000010770008a00000000034600a90000008008800210000000000228019f000006e2077001970000000002720019000000000232004b00000000070000390000000107004039000000000272004b0000145d0000c13d00000000000f004b000014e10000613d0000000004f300d9000000000041004b0000000001048019000000000001042d0000000000f2004b000014e10000813d0000000060f600d90000000040f400d9000006e200f0009c000014660000213d00000000044600a90000000050f400d9000014b90000013d00000000674600a900000000006f004b000014b90000a13d0000071700f0009c000000c004000039000000800400403900000000054f022f00000040040000390000008004004039000007180050009c000000200440808a0000002005508270000007190050009c000000100440808a0000001005508270000001000050008c000000080440808a0000000805508270000000100050008c00000000080500190000000408808270000000040080008c00000000090800190000000209908270000000020a00008a000000000b900089000000020090008c000000000b0a8019000000100050008c000000040440808a000000040080008c000000020440808a00000000044b0019000000ff0540018f00000000055601cf0000071306400167000000ff0660018f0000000108700270000000000668022f000000000965019f00000000054f01cf000000800650027000000000cb6900d900000000084701cf000000800a800270000006e207500197000014990000013d000000000c6c0019000000010bb0008a000006e200c0009c000014a00000813d0000071a00b0009c000014950000213d000000000d7b00a9000000800ec00210000000000eae019f0000000000ed004b000014950000213d000006e20bb00197000000000b5b00a900000080099002100000000009a9019f0000000009b9004900000000ba6900d9000006e208800197000014ac0000013d000000000b6b0019000000010aa0008a000006e200b0009c000014b30000813d0000071a00a0009c000014a80000213d000000000c7a00a9000000800db00210000000000d8d019f0000000000dc004b000014a80000213d000006e206a0019700000000055600a90000008006900210000000000686019f0000000005560049000000000545022f0000000004f0008900000000044f017000000000064fc0d90000000006006019000000000353004b00000003056000c9000000020550015f00000000076500a9000000020770008900000000055700a900000000076500a9000000020770008900000000055700a9000000010220408a00000000076500a9000000020770008900000000055700a900000000076500a9000000020770008900000000055700a900000000076500a9000000020770008900000000055700a900000000066500a9000000020660008900000000055600a9000000000004004b000014db0000613d00000000034300d9000000000640008900000000044600d9000000010440003900000000022400a9000014dc0000013d0000000003000019000000000223019f00000000042500a9000000000041004b0000000001048019000000000001042d000000000100001900001a01000104300000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a01000104300003000000000002000200000001001d000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000016100000613d000000000101043b0000000201100039000000000101041a000300000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f0000000100200190000016120000613d000000000201043b0000000301000029000006c401100197000000000012004b0000151a0000813d0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000016100000613d000000000101043b0000000501100039000000000101041a000000000001042d000300000002001d0000000401000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000016100000613d000000400200043d0000071b0020009c000016130000813d000000000101043b0000012003200039000000400030043f000000000401041a000000a00340027000000681033001970000008005200039000000000035043500000080034002700000068103300197000000600520003900000000003504350000006003400270000006810330019700000040052000390000000000350435000006c40340019700000000053204360000003003400270000006c4033001970000000000350435000000c0044002700000068104400197000000a00720003900000000004704350000000105100039000000000505041a000000c00620003900000000005604350000000205100039000000000505041a000000e006200039000000000056043500000100022000390000000301100039000000000101041a00000000001204350000000301000029000000000213004b0000157c0000a13d000100000002001d000300000007001d0000000201000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000016100000613d00000001040000290000071303400167000000030200002900000000020204330000068102200197000000000032004b000016190000213d0000000003420019000000000101043b0000000501100039000000000401041a000007130030009c00000000010300190000000001006019000007130040009c0000000005040019000000000500601900000000611500a9000006e28560012a0000008007100270000007070060009c000015a80000213d0000008008800210000000000878019f000006e2095000d1000000000089004b000000010550208a000015a90000013d0000000002310049000000000042004b00000000010000190000160f0000213d000100000002001d000300000007001d0000000201000029000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000016100000613d000000030200002900000000020204330000068102200197000000010320006c000016190000413d000000000101043b0000000501100039000000000401041a000007130030009c00000000050300190000000005006019000007130040009c0000000001040019000000000100601900000000615100a9000006e28560012a0000008007100270000007070060009c000015c60000213d0000008008800210000000000878019f000006e2095000d1000000000089004b000000010550208a000015c70000013d000000010550008a0000008006600210000000000676019f000006e2055001970000000007560019000006e25670012a000006e201100197000007070070009c000015b70000213d0000008005500210000000000515019f000006e2086000d1000000000058004b000000010660208a000015b80000013d000000010660008a00000000053400a90000008007700210000000000117019f000006e2066001970000000001610019000000000151004b00000000060000390000000106004039000000000161004b000015e40000c13d000000000002004b000016100000613d00000000012500d9000000000001042d000000010550008a0000008006600210000000000676019f000006e2055001970000000007560019000006e25670012a000006e201100197000007070070009c000015d50000213d0000008005500210000000000515019f000006e2086000d1000000000058004b000000010660208a000015d60000013d000000010660008a00000000053400a90000008007700210000000000117019f000006e2066001970000000001610019000000000151004b00000000060000390000000106004039000000000161004b000015e40000c13d000000000002004b000016100000613d00000000012500d9000000000001042d000000000021004b000016100000813d00000000402400d900000000302300d900000000034300a900000000602300d900000000032000890000000003320170000000000432c0d90000000004006019000000000265004b00000003054000c9000000020550015f00000000064500a9000000020660008900000000055600a900000000064500a9000000020660008900000000055600a9000000010110408a00000000064500a9000000020660008900000000055600a900000000064500a9000000020660008900000000055600a900000000064500a9000000020660008900000000055600a900000000044500a9000000020440008900000000045400a9000000000003004b0000160c0000613d00000000023200d9000000000530008900000000033500d9000000010330003900000000011300a90000160d0000013d0000000002000019000000000112019f00000000011400a9000000000001042d000000000100001900001a0100010430000000000001042f0000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a01000104300000070b01000041000000000010043f0000001101000039000000040010043f000006de0100004100001a01000104300004000000000002000400000001001d000000000010043f0000000501000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000016b60000613d000000400500043d000007160050009c000016be0000813d000000000101043b0000008002500039000000400020043f000000000201041a00000000022504360000000101100039000000000101041a0000006003500039000006cc001001980000000004000039000000010400c0390000000000430435000006c403100197000000000032043500000040025000390000003001100270000006c4011001970000000000120435000016750000613d000200000003001d000100000002001d000300000005001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f0000000100200190000016c40000613d000000000101043b000006c401100197000000020110006c0000000302000029000016b80000413d0000000007020433000006c40310019700000001010000290000000001010433000006c402100197000000000023004b000016a20000813d000007130070009c0000000001070019000000000100601900000000413100a900000080051002700000008004400210000000000454019f000006e205100197000006e24640012a0000008004400210000000000454019f000006e2056000d1000000000045004b000000010660208a000006e204600197000000000114001900000000043700a9000000000141004b00000000050000390000000105004039000000000151004b000016770000c13d00000000072400d9000016a20000013d0000000007000019000016a20000013d000000000021004b000016b60000813d00000000302300d900000000502700d900000000033500a900000000602300d900000000032000890000000003320170000000000532c0d90000000005006019000000000264004b00000003045000c9000000020440015f00000000065400a9000000020660008900000000044600a900000000065400a9000000020660008900000000044600a9000000010110408a00000000065400a9000000020660008900000000044600a900000000065400a9000000020660008900000000044600a900000000065400a9000000020660008900000000044600a900000000055400a9000000020550008900000000044500a9000000000003004b0000169f0000613d00000000023200d9000000000530008900000000033500d9000000010330003900000000011300a9000016a00000013d0000000002000019000000000112019f00000000071400a9000300000007001d0000000401000029000000000010043f0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000003030000290000000100200190000016b60000613d000000000101043b000000000101041a000000000131004b000016b80000413d000000000001042d000000000100001900001a01000104300000070b01000041000000000010043f0000001101000039000000040010043f000006de0100004100001a01000104300000070b01000041000000000010043f0000004101000039000000040010043f000006de0100004100001a0100010430000000000001042f0001000000000002000000000010043f0000000201000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000001002001900000171d0000613d000000000101043b0000000401100039000000000101041a000000000001004b0000171b0000613d0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000001002001900000171d0000613d000000000101043b0000000201100039000000000101041a000100000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f00000001002001900000171f0000613d000000000101043b000006c40110019700000001020000290000003002200270000006c402200197000000000012004b0000171b0000a13d0000000301000039000000200010043f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f00000001002001900000171d0000613d000000000101043b0000000201100039000000000101041a000100000001001d000006cf0100004100000000001004430000000001000414000006810010009c0000068101008041000000c001100210000006d0011001c70000800b0200003919ff19fa0000040f00000001002001900000171f0000613d0000000102000029000006c402200197000000000101043b000006c401100197000000000012004b0000000001000039000000010100a039000000010110018f000000000001042d000000010100018f000000000001042d000000000100001900001a0100010430000000000001042f000000010500008a000000000051004b00000000030100190000000003006019000006e4433000d100000080063002700000008004400210000000000464019f0000071c06300197000006e24740012a0000008004400210000000000464019f000006e2067000d1000000000046004b000000010770208a000006e2047001970000000003340019000006e4041000d1000000000343004b00000000060000390000000106004039000000000363004b0000173b0000c13d000000000002004b000017be0000613d00000000012400d9000000000001042d000000000023004b000017be0000813d000006e46020012900000000102100d9000006e20020009c000017440000213d00000000011600a900000000502100d9000017970000013d00000000671600a9000000000026004b000017970000813d000007170020009c000000c0010000390000008001004039000000000512022f00000040010000390000008001004039000007180050009c000000200110808a0000002005508270000007190050009c000000100110808a0000001005508270000001000050008c000000080110808a0000000805508270000000100050008c00000000080500190000000408808270000000040080008c00000000090800190000000209908270000000020a00008a000000000b900089000000020090008c000000000b0a8019000000100050008c000000040110808a000000040080008c000000020110808a00000000011b0019000000ff0510018f00000000055601cf0000071306100167000000ff0660018f0000000108700270000000000668022f000000000965019f00000000051201cf000000800650027000000000cb6900d900000000081701cf000000800a800270000006e207500197000017770000013d000000000c6c0019000000010bb0008a000006e200c0009c0000177e0000813d0000071a00b0009c000017730000213d000000000d7b00a9000000800ec00210000000000eae019f0000000000ed004b000017730000213d000006e20bb00197000000000b5b00a900000080099002100000000009a9019f0000000009b9004900000000ba6900d9000006e2088001970000178a0000013d000000000b6b0019000000010aa0008a000006e200b0009c000017910000813d0000071a00a0009c000017860000213d000000000c7a00a9000000800db00210000000000d8d019f0000000000dc004b000017860000213d000006e206a0019700000000055600a90000008006900210000000000686019f0000000005560049000000000515022f00000000012000890000000001210170000000000612c0d90000000006006019000000000254004b00000003046000c9000000020440015f00000000056400a9000000020550008900000000044500a900000000056400a9000000020550008900000000044500a9000000010330408a00000000056400a9000000020550008900000000044500a900000000056400a9000000020550008900000000044500a900000000056400a9000000020550008900000000044500a900000000056400a9000000020550008900000000044500a9000000000001004b000017bb0000613d00000000021200d9000000000510008900000000011500d9000000010110003900000000033100a9000000000132019f00000000011400a9000000000001042d000000000130019f00000000011400a9000000000001042d000000000100001900001a0100010430000007130010009c00000000040100190000000004006019000007130020009c0000000003020019000000000300601900000000534300a9000006e27450012a0000008006300270000007070050009c000017d10000213d0000008007700210000000000767019f000006e2084000d1000000000078004b000000010440208a000017d20000013d000000010440008a0000008005500210000000000565019f000006e2044001970000000005450019000006e27450012a000006e206300197000007070050009c000017e00000213d0000008003700210000000000363019f000006e2074000d1000000000037004b000000010440208a000017e10000013d000000010440008a00000000031200a90000008005500210000000000565019f000006e2044001970000000004450019000000000434004b00000000050000390000000105004039000000000454004b000017ed0000c13d000006e40130012a000000000001042d000006e40040009c000017fa0000813d000006e41010012a000006e42020012a00000000011200a9000006e41010012a000000000113004b000000010440408a0000000501100270000000fb02400210000000000112019f000006e5011000d1000000000001042d000000000100001900001a0100010430000000010600008a000000000061004b00000000040100190000000004006019000000000062004b0000000005020019000000000500601900000000744500a9000006e29570012a0000008008400270000007070070009c0000180e0000213d0000008009900210000000000989019f000006e20a5000d100000000009a004b000000010550208a0000180f0000013d000000010550008a0000008007700210000000000787019f000006e2055001970000000008570019000006e25780012a000006e204400197000007070080009c0000181d0000213d0000008005500210000000000545019f000006e2097000d1000000000059004b000000010770208a0000181e0000013d000000010770008a00000000051200a90000008008800210000000000448019f000006e2077001970000000004740019000000000454004b00000000070000390000000107004039000000000474004b0000182c0000c13d000000000003004b000018af0000613d00000000013500d9000000000001042d000000000034004b000018af0000813d00000000203200d900000000103100d9000006e20030009c000018350000213d00000000011200a900000000603100d9000018880000013d00000000271200a9000000000032004b000018880000813d000007170030009c000000c0010000390000008001004039000000000613022f00000040010000390000008001004039000007180060009c000000200110808a0000002006608270000007190060009c000000100110808a0000001006608270000001000060008c000000080110808a0000000806608270000000100060008c00000000080600190000000408808270000000040080008c00000000090800190000000209908270000000020a00008a000000000b900089000000020090008c000000000b0a8019000000100060008c000000040110808a000000040080008c000000020110808a00000000011b0019000000ff0610018f00000000026201cf0000071306100167000000ff0660018f0000000108700270000000000668022f000000000962019f00000000021301cf000000800620027000000000cb6900d900000000081701cf000000800a800270000006e207200197000018680000013d000000000c6c0019000000010bb0008a000006e200c0009c0000186f0000813d0000071a00b0009c000018640000213d000000000d7b00a9000000800ec00210000000000eae019f0000000000ed004b000018640000213d000006e20bb00197000000000b2b00a900000080099002100000000009a9019f0000000009b9004900000000ba6900d9000006e2088001970000187b0000013d000000000b6b0019000000010aa0008a000006e200b0009c000018820000813d0000071a00a0009c000018770000213d000000000c7a00a9000000800db00210000000000d8d019f0000000000dc004b000018770000213d000006e206a0019700000000022600a90000008006900210000000000686019f0000000002260049000000000612022f00000000013000890000000001310170000000000313c0d90000000003006019000000000265004b00000003053000c9000000020550015f00000000063500a9000000020660008900000000055600a900000000063500a9000000020660008900000000055600a9000000010440408a00000000063500a9000000020660008900000000055600a900000000063500a9000000020660008900000000055600a900000000063500a9000000020660008900000000055600a900000000033500a9000000020330008900000000035300a9000000000001004b000018ac0000613d00000000021200d9000000000510008900000000011500d9000000010110003900000000044100a9000000000142019f00000000011300a9000000000001042d000000000140019f00000000011300a9000000000001042d000000000100001900001a01000104300001000000000002000000010700008a000000000071004b00000000040100190000000004006019000000000072004b0000000005020019000000000500601900000000644500a9000006e29560012a0000008008400270000007070060009c000018c40000213d0000008009900210000000000989019f000006e20a5000d100000000009a004b000000010550208a000018c50000013d000000010550008a0000008006600210000000000686019f000006e2055001970000000008560019000006e26580012a000006e204400197000007070080009c000018d30000213d0000008006600210000000000646019f000006e2095000d1000000000069004b000000010550208a000018d40000013d000000010550008a00000000061200a90000008008800210000000000448019f000006e2055001970000000004540019000000000464004b00000000050000390000000105004039000000000554004b0000193b0000c13d000000000003004b000019c70000613d00000000203200d900000000403100d900000000013600d9000006e20030009c000019c00000a13d00000000454200a9000000000034004b000019c40000813d000007170030009c000000c0020000390000008002004039000000000623022f00000040020000390000008002004039000007180060009c000000200220808a0000002006608270000007190060009c000000100220808a0000001006608270000001000060008c000000080220808a0000000806608270000000100060008c00000000070600190000000407708270000000040070008c00000000080700190000000208808270000000020900008a000000000a800089000000020080008c000000000a098019000000100060008c000000040220808a000000040070008c000000020220808a00000000022a0019000000ff0620018f00000000046401cf0000071306200167000000ff0660018f0000000107500270000000000667022f000000000764019f00000000032301cf000000800430027000000000a94700d900000000062501cf0000008008600270000006e205300197000019180000013d000000000a4a0019000000010990008a000006e200a0009c0000191f0000813d0000071a0090009c000019140000213d000000000b5900a9000000800ca00210000000000c8c019f0000000000cb004b000019140000213d000006e20990019700000000093900a90000008007700210000000000787019f000000000797004900000000984700d9000006e2066001970000192b0000013d0000000009490019000000010880008a000006e20090009c000019320000813d0000071a0080009c000019270000213d000000000a5800a9000000800b900210000000000b6b019f0000000000ba004b000019270000213d000006e20480019700000000033400a90000008004700210000000000464019f0000000003340049000000000223022f000000000002004b000019c40000c13d000019c60000013d000000000035004b000019c70000813d00000000203200d900000000403100d9000006e20030009c000019440000213d00000000014200a900000000703100d9000019990000013d00000000894200a9000000000038004b000019990000813d000007170030009c000000c0010000390000008001004039000000000713022f00000040010000390000008001004039000007180070009c000000200110808a0000002007708270000007190070009c000000100110808a0000001007708270000001000070008c000000080110808a0000000807708270000000100070008c000000000a070019000000040aa082700000000400a0008c000000000b0a0019000000020bb08270000000020c00008a000000000db000890000000200b0008c000000000d0c8019000000100070008c000000040110808a0000000400a0008c000000020110808a00000000011d0019000000ff0710018f00000000077801cf0000071308100167000000ff0880018f000000010a90027000000000088a022f000000000b87019f00000000071301cf000000800870027000000000ed8b00d900000000091901cf000100000009001d000000800c900270000006e209700197000019780000013d000000000e8e0019000000010dd0008a000006e200e0009c0000197f0000813d0000071a00d0009c000019740000213d000000000f9d00a9000000800ae00210000000000aca019f0000000000af004b000019740000213d000006e20ad00197000000000a7a00a9000000800bb00210000000000bcb019f000000000bab004900000000dc8b00d9000000010a000029000006e20aa001970000198c0000013d000000000d8d0019000000010cc0008a000006e200d0009c000019930000813d0000071a00c0009c000019880000213d000000000e9c00a9000000800fd00210000000000faf019f0000000000fe004b000019880000213d000006e208c0019700000000077800a90000008008b002100000000008a8019f0000000007780049000000000717022f00000000013000890000000001310170000000000813c0d90000000008006019000000000676004b00000003078000c9000000020770015f00000000098700a9000000020990008900000000077900a900000000098700a9000000020990008900000000077900a9000000010550408a00000000098700a9000000020990008900000000077900a900000000098700a9000000020990008900000000077900a900000000098700a9000000020990008900000000077900a900000000088700a9000000020880008900000000077800a9000000000001004b000019bb0000613d00000000061600d9000000000810008900000000011800d9000000010110003900000000055100a9000019bc0000013d0000000006000019000000000156019f00000000011700a9000006e20030009c000018e50000213d00000000024200a900000000203200d9000000000002004b000019c60000613d000000010110003a000019c70000613d000000000001042d000000000100001900001a0100010430000000000001042f0000000001000414000006810010009c0000068101008041000000c001100210000006c8011001c7000080100200003919ff19fa0000040f0000000100200190000019d50000613d000000000101043b000000000001042d000000000100001900001a010001043000000000050100190000000000200443000000050030008c000019e50000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b000019dd0000413d000006810030009c000006810300804100000060013002100000000002000414000006810020009c0000068102008041000000c002200210000000000112019f0000071d011001c7000000000205001919ff19fa0000040f0000000100200190000019f40000613d000000000101043b000000000001042d000000000001042f000019f8002104210000000102000039000000000001042d0000000002000019000000000001042d000019fd002104230000000102000039000000000001042d0000000002000019000000000001042d000019ff0000043200001a000001042e00001a01000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76a3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198ffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000027100001518000000e100003f480000054600001518000000002000000000000000000000000000000c000000100000000000000000000000000000000000000000000000000000000000000000000000000acc5570b00000000000000000000000000000000000000000000000000000000bf7e214e00000000000000000000000000000000000000000000000000000000d9ccdc9200000000000000000000000000000000000000000000000000000000e3684e3800000000000000000000000000000000000000000000000000000000e3684e3900000000000000000000000000000000000000000000000000000000e922067300000000000000000000000000000000000000000000000000000000ea0aca3300000000000000000000000000000000000000000000000000000000d9ccdc9300000000000000000000000000000000000000000000000000000000e007fa9700000000000000000000000000000000000000000000000000000000c7bf8c9f00000000000000000000000000000000000000000000000000000000c7bf8ca000000000000000000000000000000000000000000000000000000000d204068700000000000000000000000000000000000000000000000000000000d2bee32300000000000000000000000000000000000000000000000000000000bf7e214f00000000000000000000000000000000000000000000000000000000c0aa0e8a00000000000000000000000000000000000000000000000000000000bc3b2b1100000000000000000000000000000000000000000000000000000000bcf6cde700000000000000000000000000000000000000000000000000000000bcf6cde800000000000000000000000000000000000000000000000000000000bd1f3a5e00000000000000000000000000000000000000000000000000000000bf48582b00000000000000000000000000000000000000000000000000000000bc3b2b1200000000000000000000000000000000000000000000000000000000bcb2966700000000000000000000000000000000000000000000000000000000afa9d3af00000000000000000000000000000000000000000000000000000000afa9d3b000000000000000000000000000000000000000000000000000000000b1283e7700000000000000000000000000000000000000000000000000000000bbbdd95a00000000000000000000000000000000000000000000000000000000acc5570c00000000000000000000000000000000000000000000000000000000ae418095000000000000000000000000000000000000000000000000000000005f77274d000000000000000000000000000000000000000000000000000000008973082b000000000000000000000000000000000000000000000000000000008da5cb5a000000000000000000000000000000000000000000000000000000008da5cb5b00000000000000000000000000000000000000000000000000000000946824cd000000000000000000000000000000000000000000000000000000009787d107000000000000000000000000000000000000000000000000000000008973082c000000000000000000000000000000000000000000000000000000008b098db3000000000000000000000000000000000000000000000000000000006729a41d000000000000000000000000000000000000000000000000000000006729a41e00000000000000000000000000000000000000000000000000000000699e17d9000000000000000000000000000000000000000000000000000000007a9e5e4b000000000000000000000000000000000000000000000000000000005f77274e000000000000000000000000000000000000000000000000000000006352211e000000000000000000000000000000000000000000000000000000003ad59dbb0000000000000000000000000000000000000000000000000000000053c7f8df0000000000000000000000000000000000000000000000000000000053c7f8e00000000000000000000000000000000000000000000000000000000057e333ba000000000000000000000000000000000000000000000000000000005dc4d16b000000000000000000000000000000000000000000000000000000003ad59dbc000000000000000000000000000000000000000000000000000000003adec5a70000000000000000000000000000000000000000000000000000000013af40340000000000000000000000000000000000000000000000000000000013af4035000000000000000000000000000000000000000000000000000000001c063a6c0000000000000000000000000000000000000000000000000000000027507458000000000000000000000000000000000000000000000000000000000a9d85eb0000000000000000000000000000000000000000000000000000000010b0531700000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff0000000000000000000000000000000000000120000000800000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f000000000000000000000000000000000000000000000000fffffffffffffe7f0000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff000000000000000000000000000000000000000000000000fffffffffffffedf78f9c01d72705dba80d6ce051d36a1f987bf2a3800fee938c111a2ae741e57d1000000000000000000000000000000000000000000000000ffffffffffffff7fffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f3383dc900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000074ec9d5b00000000000000000000000000000000000000000000000000000000a24c407400000000000000000000000000000000000000000000000000000000b88c9148000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000a000000080000000000000000000000000000000000000ffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000001869f00000000000000000000000000000000000000000000000000000000000186a058cd20afa2f05a708ede54b48d3ae685db76b3bb83cf2cf95d4e8fb00bcbe61d5c430eae00000000000000000000000000000000000000000000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000003fffffff0000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000003fffffff02000000000000000000000000000000000000c0000000000000000000000000bbc02fa2138d26ec5ecb379612618d1b291bf5140167f3028178080953459c5a0000000000000000000000000000000000000080000000800000000000000000000000000000000000000000000000000000018000000080000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000005dba2400b70096130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000008000000000000000004e1c8b5d00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000005db8d2813b596f5f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000002200000000000000000313ce56700000000000000000000000000000000000000000000000000000000b4359143000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000003333333400000000000000000000000000000000ffffffff00000000000000000000000000000000ffffffff000000000000000000000000000000000000000000000000ffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000fffffffffffffffffffffffffffffffe00000000000000000000000000000000ffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffff0000000000000000000000008235b14cd272b4e791960fe1118559bb7fed86934fcffeeae9b1175103b0756d4e487b71000000000000000000000000000000000000000000000000000000004496547d0000000000000000000000000000000000000000000000000000000064be3ffa00000000000000000000000000000000000000000000000000000000554e415554484f52495a4544000000000000000000000000000000000000000008c379a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000002c47703200000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000fffffffffffffe809dc30b8eda31a6a144e092e5de600955523a6a925cc15cc1d1b9b4872cfa6155000000000000000000000000000000000000000000000000ffffffffffffff8000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000fffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000fffffffffffffee000000000000000000000000000000000ffffffffffffffffffffffffffffffe00200000200000000000000000000000000000000000000000000000000000000000000000000000000a2646970667358221220913dd14e74e26640b72c995361f1d3ab6f95951a39f8c9b2ae17906ae0aabf5764736f6c6378247a6b736f6c633a312e352e31353b736f6c633a302e382e31353b6c6c766d3a312e302e310055
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006d0a03f4da16ec55af43c81221c8aaff9935ff38000000000000000000000000eff471291d390e4f0104971d5739e8e3b6e1ebed000000000000000000000000111111f26ab123764da895e1627bf9ba0b000a9700000000000000000000000054b1f74f414fd578f23ae42d68bae4935d87d43c
-----Decoded View---------------
Arg [0] : teller_ (address): 0x6D0A03f4da16eC55aF43c81221C8AAff9935Ff38
Arg [1] : aggregator_ (address): 0xefF471291D390E4f0104971D5739E8e3B6E1eBed
Arg [2] : guardian_ (address): 0x111111f26ab123764Da895e1627bf9Ba0b000a97
Arg [3] : authority_ (address): 0x54b1f74F414FD578F23AE42D68BaE4935d87D43c
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006d0a03f4da16ec55af43c81221c8aaff9935ff38
Arg [1] : 000000000000000000000000eff471291d390e4f0104971d5739e8e3b6e1ebed
Arg [2] : 000000000000000000000000111111f26ab123764da895e1627bf9ba0b000a97
Arg [3] : 00000000000000000000000054b1f74f414fd578f23ae42d68bae4935d87d43c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.