Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12294921 | 1291 days ago | IN | 0 ETH | 0.3963102 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DSP
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-23 */ // File: contracts/lib/InitializableOwnable.sol /* Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0 */ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; /** * @title Ownable * @author DODO Breeder * * @notice Ownership related functions */ contract InitializableOwnable { address public _OWNER_; address public _NEW_OWNER_; bool internal _INITIALIZED_; // ============ Events ============ event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // ============ Modifiers ============ modifier notInitialized() { require(!_INITIALIZED_, "DODO_INITIALIZED"); _; } modifier onlyOwner() { require(msg.sender == _OWNER_, "NOT_OWNER"); _; } // ============ Functions ============ function initOwner(address newOwner) public notInitialized { _INITIALIZED_ = true; _OWNER_ = newOwner; } function transferOwnership(address newOwner) public onlyOwner { emit OwnershipTransferPrepared(_OWNER_, newOwner); _NEW_OWNER_ = newOwner; } function claimOwnership() public { require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM"); emit OwnershipTransferred(_OWNER_, _NEW_OWNER_); _OWNER_ = _NEW_OWNER_; _NEW_OWNER_ = address(0); } } // File: contracts/lib/FeeRateModel.sol interface IFeeRateImpl { function getFeeRate(address pool, address trader) external view returns (uint256); } interface IFeeRateModel { function getFeeRate(address trader) external view returns (uint256); } contract FeeRateModel is InitializableOwnable { address public feeRateImpl; function setFeeProxy(address _feeRateImpl) public onlyOwner { feeRateImpl = _feeRateImpl; } function getFeeRate(address trader) external view returns (uint256) { if(feeRateImpl == address(0)) return 0; return IFeeRateImpl(feeRateImpl).getFeeRate(msg.sender,trader); } } // File: contracts/intf/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } // File: contracts/lib/SafeMath.sol /** * @title SafeMath * @author DODO Breeder * * @notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; } function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } // File: contracts/lib/DecimalMath.sol /** * @title DecimalMath * @author DODO Breeder * * @notice Functions for fixed point number with 18 decimals */ library DecimalMath { using SafeMath for uint256; uint256 internal constant ONE = 10**18; uint256 internal constant ONE2 = 10**36; function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d) / (10**18); } function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d).divCeil(10**18); } function divFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).div(d); } function divCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).divCeil(d); } function reciprocalFloor(uint256 target) internal pure returns (uint256) { return uint256(10**36).div(target); } function reciprocalCeil(uint256 target) internal pure returns (uint256) { return uint256(10**36).divCeil(target); } } // File: contracts/lib/DODOMath.sol /** * @title DODOMath * @author DODO Breeder * * @notice Functions for complex calculating. Including ONE Integration and TWO Quadratic solutions */ library DODOMath { using SafeMath for uint256; /* Integrate dodo curve from V1 to V2 require V0>=V1>=V2>0 res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1) let V1-V2=delta res = i*delta*(1-k+k(V0^2/V1/V2)) i is the price of V-res trading pair support k=1 & k=0 case [round down] */ function _GeneralIntegrate( uint256 V0, uint256 V1, uint256 V2, uint256 i, uint256 k ) internal pure returns (uint256) { require(V0 > 0, "TARGET_IS_ZERO"); uint256 fairAmount = i.mul(V1.sub(V2)); // i*delta if (k == 0) { return fairAmount.div(DecimalMath.ONE); } uint256 V0V0V1V2 = DecimalMath.divFloor(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.ONE.sub(k).add(penalty).mul(fairAmount).div(DecimalMath.ONE2); } /* Follow the integration function above i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Assume Q2=Q0, Given Q1 and deltaB, solve Q0 i is the price of delta-V trading pair give out target of V support k=1 & k=0 case [round down] */ function _SolveQuadraticFunctionForTarget( uint256 V1, uint256 delta, uint256 i, uint256 k ) internal pure returns (uint256) { if (V1 == 0) { return 0; } if (k == 0) { return V1.add(DecimalMath.mulFloor(i, delta)); } // V0 = V1*(1+(sqrt-1)/2k) // sqrt = √(1+4kidelta/V1) // premium = 1+(sqrt-1)/2k // uint256 sqrt = (4 * k).mul(i).mul(delta).div(V1).add(DecimalMath.ONE2).sqrt(); uint256 sqrt; uint256 ki = (4 * k).mul(i); if (ki == 0) { sqrt = DecimalMath.ONE; } else if ((ki * delta) / ki == delta) { sqrt = (ki * delta).div(V1).add(DecimalMath.ONE2).sqrt(); } else { sqrt = ki.div(V1).mul(delta).add(DecimalMath.ONE2).sqrt(); } uint256 premium = DecimalMath.divFloor(sqrt.sub(DecimalMath.ONE), k * 2).add(DecimalMath.ONE); // V0 is greater than or equal to V1 according to the solution return DecimalMath.mulFloor(V1, premium); } /* Follow the integration expression above, we have: i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Given Q1 and deltaB, solve Q2 This is a quadratic function and the standard version is aQ2^2 + bQ2 + c = 0, where a=1-k -b=(1-k)Q1-kQ0^2/Q1+i*deltaB c=-kQ0^2 and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k) note: another root is negative, abondan if deltaBSig=true, then Q2>Q1, user sell Q and receive B if deltaBSig=false, then Q2<Q1, user sell B and receive Q return |Q1-Q2| as we only support sell amount as delta, the deltaB is always negative the input ideltaB is actually -ideltaB in the equation i is the price of delta-V trading pair support k=1 & k=0 case [round down] */ function _SolveQuadraticFunctionForTrade( uint256 V0, uint256 V1, uint256 delta, uint256 i, uint256 k ) internal pure returns (uint256) { require(V0 > 0, "TARGET_IS_ZERO"); if (delta == 0) { return 0; } if (k == 0) { return DecimalMath.mulFloor(i, delta) > V1 ? V1 : DecimalMath.mulFloor(i, delta); } if (k == DecimalMath.ONE) { // if k==1 // Q2=Q1/(1+ideltaBQ1/Q0/Q0) // temp = ideltaBQ1/Q0/Q0 // Q2 = Q1/(1+temp) // Q1-Q2 = Q1*(1-1/(1+temp)) = Q1*(temp/(1+temp)) // uint256 temp = i.mul(delta).mul(V1).div(V0.mul(V0)); uint256 temp; uint256 idelta = i.mul(delta); if (idelta == 0) { temp = 0; } else if ((idelta * V1) / idelta == V1) { temp = (idelta * V1).div(V0.mul(V0)); } else { temp = delta.mul(V1).div(V0).mul(i).div(V0); } return V1.mul(temp).div(temp.add(DecimalMath.ONE)); } // calculate -b value and sig // b = kQ0^2/Q1-i*deltaB-(1-k)Q1 // part1 = (1-k)Q1 >=0 // part2 = kQ0^2/Q1-i*deltaB >=0 // bAbs = abs(part1-part2) // if part1>part2 => b is negative => bSig is false // if part2>part1 => b is positive => bSig is true uint256 part2 = k.mul(V0).div(V1).mul(V0).add(i.mul(delta)); // kQ0^2/Q1-i*deltaB uint256 bAbs = DecimalMath.ONE.sub(k).mul(V1); // (1-k)Q1 bool bSig; if (bAbs >= part2) { bAbs = bAbs - part2; bSig = false; } else { bAbs = part2 - bAbs; bSig = true; } bAbs = bAbs.div(DecimalMath.ONE); // calculate sqrt uint256 squareRoot = DecimalMath.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(k, V0).mul(V0) ); // 4(1-k)kQ0^2 squareRoot = bAbs.mul(bAbs).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0) // final res uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k) uint256 numerator; if (bSig) { numerator = squareRoot.sub(bAbs); } else { numerator = bAbs.add(squareRoot); } uint256 V2 = DecimalMath.divCeil(numerator, denominator); if (V2 > V1) { return 0; } else { return V1 - V2; } } } // File: contracts/lib/PMMPricing.sol /** * @title Pricing * @author DODO Breeder * * @notice DODO Pricing model */ library PMMPricing { using SafeMath for uint256; enum RState {ONE, ABOVE_ONE, BELOW_ONE} struct PMMState { uint256 i; uint256 K; uint256 B; uint256 Q; uint256 B0; uint256 Q0; RState R; } // ============ buy & sell ============ function sellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns (uint256 receiveQuoteAmount, RState newR) { if (state.R == RState.ONE) { // case 1: R=1 // R falls below one receiveQuoteAmount = _ROneSellBaseToken(state, payBaseAmount); newR = RState.BELOW_ONE; } else if (state.R == RState.ABOVE_ONE) { uint256 backToOnePayBase = state.B0.sub(state.B); uint256 backToOneReceiveQuote = state.Q.sub(state.Q0); // case 2: R>1 // complex case, R status depends on trading amount if (payBaseAmount < backToOnePayBase) { // case 2.1: R status do not change receiveQuoteAmount = _RAboveSellBaseToken(state, payBaseAmount); newR = RState.ABOVE_ONE; if (receiveQuoteAmount > backToOneReceiveQuote) { // [Important corner case!] may enter this branch when some precision problem happens. And consequently contribute to negative spare quote amount // to make sure spare quote>=0, mannually set receiveQuote=backToOneReceiveQuote receiveQuoteAmount = backToOneReceiveQuote; } } else if (payBaseAmount == backToOnePayBase) { // case 2.2: R status changes to ONE receiveQuoteAmount = backToOneReceiveQuote; newR = RState.ONE; } else { // case 2.3: R status changes to BELOW_ONE receiveQuoteAmount = backToOneReceiveQuote.add( _ROneSellBaseToken(state, payBaseAmount.sub(backToOnePayBase)) ); newR = RState.BELOW_ONE; } } else { // state.R == RState.BELOW_ONE // case 3: R<1 receiveQuoteAmount = _RBelowSellBaseToken(state, payBaseAmount); newR = RState.BELOW_ONE; } } function sellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns (uint256 receiveBaseAmount, RState newR) { if (state.R == RState.ONE) { receiveBaseAmount = _ROneSellQuoteToken(state, payQuoteAmount); newR = RState.ABOVE_ONE; } else if (state.R == RState.ABOVE_ONE) { receiveBaseAmount = _RAboveSellQuoteToken(state, payQuoteAmount); newR = RState.ABOVE_ONE; } else { uint256 backToOnePayQuote = state.Q0.sub(state.Q); uint256 backToOneReceiveBase = state.B.sub(state.B0); if (payQuoteAmount < backToOnePayQuote) { receiveBaseAmount = _RBelowSellQuoteToken(state, payQuoteAmount); newR = RState.BELOW_ONE; if (receiveBaseAmount > backToOneReceiveBase) { receiveBaseAmount = backToOneReceiveBase; } } else if (payQuoteAmount == backToOnePayQuote) { receiveBaseAmount = backToOneReceiveBase; newR = RState.ONE; } else { receiveBaseAmount = backToOneReceiveBase.add( _ROneSellQuoteToken(state, payQuoteAmount.sub(backToOnePayQuote)) ); newR = RState.ABOVE_ONE; } } } // ============ R = 1 cases ============ function _ROneSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { // in theory Q2 <= targetQuoteTokenAmount // however when amount is close to 0, precision problems may cause Q2 > targetQuoteTokenAmount return DODOMath._SolveQuadraticFunctionForTrade( state.Q0, state.Q0, payBaseAmount, state.i, state.K ); } function _ROneSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.B0, state.B0, payQuoteAmount, DecimalMath.reciprocalFloor(state.i), state.K ); } // ============ R < 1 cases ============ function _RBelowSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._GeneralIntegrate( state.Q0, state.Q.add(payQuoteAmount), state.Q, DecimalMath.reciprocalFloor(state.i), state.K ); } function _RBelowSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.Q0, state.Q, payBaseAmount, state.i, state.K ); } // ============ R > 1 cases ============ function _RAboveSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { return DODOMath._GeneralIntegrate( state.B0, state.B.add(payBaseAmount), state.B, state.i, state.K ); } function _RAboveSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.B0, state.B, payQuoteAmount, DecimalMath.reciprocalFloor(state.i), state.K ); } // ============ Helper functions ============ function adjustedTarget(PMMState memory state) internal pure { if (state.R == RState.BELOW_ONE) { state.Q0 = DODOMath._SolveQuadraticFunctionForTarget( state.Q, state.B.sub(state.B0), state.i, state.K ); } else if (state.R == RState.ABOVE_ONE) { state.B0 = DODOMath._SolveQuadraticFunctionForTarget( state.B, state.Q.sub(state.Q0), DecimalMath.reciprocalFloor(state.i), state.K ); } } function getMidPrice(PMMState memory state) internal pure returns (uint256) { if (state.R == RState.BELOW_ONE) { uint256 R = DecimalMath.divFloor(state.Q0.mul(state.Q0).div(state.Q), state.Q); R = DecimalMath.ONE.sub(state.K).add(DecimalMath.mulFloor(state.K, R)); return DecimalMath.divFloor(state.i, R); } else { uint256 R = DecimalMath.divFloor(state.B0.mul(state.B0).div(state.B), state.B); R = DecimalMath.ONE.sub(state.K).add(DecimalMath.mulFloor(state.K, R)); return DecimalMath.mulFloor(state.i, R); } } } // File: contracts/lib/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/lib/ReentrancyGuard.sol /** * @title ReentrancyGuard * @author DODO Breeder * * @notice Protect functions from Reentrancy Attack */ contract ReentrancyGuard { // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations // zero-state of _ENTERED_ is false bool private _ENTERED_; modifier preventReentrant() { require(!_ENTERED_, "REENTRANT"); _ENTERED_ = true; _; _ENTERED_ = false; } } // File: contracts/DODOStablePool/impl/DSPStorage.sol contract DSPStorage is ReentrancyGuard { using SafeMath for uint256; bool internal _DSP_INITIALIZED_; bool public _IS_OPEN_TWAP_ = false; // ============ Core Address ============ address public _MAINTAINER_; IERC20 public _BASE_TOKEN_; IERC20 public _QUOTE_TOKEN_; uint112 public _BASE_RESERVE_; uint112 public _QUOTE_RESERVE_; uint32 public _BLOCK_TIMESTAMP_LAST_; uint256 public _BASE_PRICE_CUMULATIVE_LAST_; uint112 public _BASE_TARGET_; uint112 public _QUOTE_TARGET_; uint32 public _RState_; // ============ Shares (ERC20) ============ string public symbol; uint8 public decimals; string public name; uint256 public totalSupply; mapping(address => uint256) internal _SHARES_; mapping(address => mapping(address => uint256)) internal _ALLOWED_; // ================= Permit ====================== bytes32 public DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public nonces; // ============ Variables for Pricing ============ IFeeRateModel public _MT_FEE_RATE_MODEL_; uint256 public _LP_FEE_RATE_; uint256 public _K_; uint256 public _I_; // ============ Helper Functions ============ function getPMMState() public view returns (PMMPricing.PMMState memory state) { state.i = _I_; state.K = _K_; state.B = _BASE_RESERVE_; state.Q = _QUOTE_RESERVE_; state.B0 = _BASE_TARGET_; // will be calculated in adjustedTarget state.Q0 = _QUOTE_TARGET_; state.R = PMMPricing.RState(_RState_); PMMPricing.adjustedTarget(state); } function getPMMStateForCall() external view returns ( uint256 i, uint256 K, uint256 B, uint256 Q, uint256 B0, uint256 Q0, uint256 R ) { PMMPricing.PMMState memory state = getPMMState(); i = state.i; K = state.K; B = state.B; Q = state.Q; B0 = state.B0; Q0 = state.Q0; R = uint256(state.R); } function getMidPrice() public view returns (uint256 midPrice) { return PMMPricing.getMidPrice(getPMMState()); } } // File: contracts/DODOStablePool/impl/DSPVault.sol contract DSPVault is DSPStorage { using SafeMath for uint256; using SafeERC20 for IERC20; // ============ Events ============ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event Mint(address indexed user, uint256 value); event Burn(address indexed user, uint256 value); // ============ View Functions ============ function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve) { baseReserve = _BASE_RESERVE_; quoteReserve = _QUOTE_RESERVE_; } function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate) { lpFeeRate = _LP_FEE_RATE_; mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(user); } // ============ Asset In ============ function getBaseInput() public view returns (uint256 input) { return _BASE_TOKEN_.balanceOf(address(this)).sub(uint256(_BASE_RESERVE_)); } function getQuoteInput() public view returns (uint256 input) { return _QUOTE_TOKEN_.balanceOf(address(this)).sub(uint256(_QUOTE_RESERVE_)); } // ============ TWAP UPDATE =========== function _twapUpdate() internal { uint32 blockTimestamp = uint32(block.timestamp % 2**32); uint32 timeElapsed = blockTimestamp - _BLOCK_TIMESTAMP_LAST_; if (timeElapsed > 0 && _BASE_RESERVE_ != 0 && _QUOTE_RESERVE_ != 0) { _BASE_PRICE_CUMULATIVE_LAST_ += getMidPrice() * timeElapsed; } _BLOCK_TIMESTAMP_LAST_ = blockTimestamp; } // ============ Set States ============ function _setReserve(uint256 baseReserve, uint256 quoteReserve) internal { require(baseReserve <= uint112(-1) && quoteReserve <= uint112(-1), "OVERFLOW"); _BASE_RESERVE_ = uint112(baseReserve); _QUOTE_RESERVE_ = uint112(quoteReserve); if (_IS_OPEN_TWAP_) _twapUpdate(); } function _sync() internal { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); require(baseBalance <= uint112(-1) && quoteBalance <= uint112(-1), "OVERFLOW"); if (baseBalance != _BASE_RESERVE_) { _BASE_RESERVE_ = uint112(baseBalance); } if (quoteBalance != _QUOTE_RESERVE_) { _QUOTE_RESERVE_ = uint112(quoteBalance); } if (_IS_OPEN_TWAP_) _twapUpdate(); } function sync() external preventReentrant { _sync(); } function correctRState() public { if (_RState_ == uint32(PMMPricing.RState.BELOW_ONE) && _BASE_RESERVE_<_BASE_TARGET_) { _RState_ = uint32(PMMPricing.RState.ONE); _BASE_TARGET_ = _BASE_RESERVE_; _QUOTE_TARGET_ = _QUOTE_RESERVE_; } if (_RState_ == uint32(PMMPricing.RState.ABOVE_ONE) && _QUOTE_RESERVE_<_QUOTE_TARGET_) { _RState_ = uint32(PMMPricing.RState.ONE); _BASE_TARGET_ = _BASE_RESERVE_; _QUOTE_TARGET_ = _QUOTE_RESERVE_; } } // ============ Asset Out ============ function _transferBaseOut(address to, uint256 amount) internal { if (amount > 0) { _BASE_TOKEN_.safeTransfer(to, amount); } } function _transferQuoteOut(address to, uint256 amount) internal { if (amount > 0) { _QUOTE_TOKEN_.safeTransfer(to, amount); } } // ============ Shares (ERC20) ============ /** * @dev transfer token for a specified address * @param to The address to transfer to. * @param amount The amount to be transferred. */ function transfer(address to, uint256 amount) public returns (bool) { require(amount <= _SHARES_[msg.sender], "BALANCE_NOT_ENOUGH"); _SHARES_[msg.sender] = _SHARES_[msg.sender].sub(amount); _SHARES_[to] = _SHARES_[to].add(amount); emit Transfer(msg.sender, to, amount); return true; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the the balance of. * @return balance An uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) external view returns (uint256 balance) { return _SHARES_[owner]; } /** * @dev Transfer tokens from one address to another * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param amount uint256 the amount of tokens to be transferred */ function transferFrom( address from, address to, uint256 amount ) public returns (bool) { require(amount <= _SHARES_[from], "BALANCE_NOT_ENOUGH"); require(amount <= _ALLOWED_[from][msg.sender], "ALLOWANCE_NOT_ENOUGH"); _SHARES_[from] = _SHARES_[from].sub(amount); _SHARES_[to] = _SHARES_[to].add(amount); _ALLOWED_[from][msg.sender] = _ALLOWED_[from][msg.sender].sub(amount); emit Transfer(from, to, amount); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * @param spender The address which will spend the funds. * @param amount The amount of tokens to be spent. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(msg.sender, spender, amount); return true; } function _approve( address owner, address spender, uint256 amount ) private { _ALLOWED_[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Function to check the amount of tokens that an owner _ALLOWED_ to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view returns (uint256) { return _ALLOWED_[owner][spender]; } function _mint(address user, uint256 value) internal { require(value > 1000, "MINT_AMOUNT_NOT_ENOUGH"); _SHARES_[user] = _SHARES_[user].add(value); totalSupply = totalSupply.add(value); emit Mint(user, value); emit Transfer(address(0), user, value); } function _burn(address user, uint256 value) internal { _SHARES_[user] = _SHARES_[user].sub(value); totalSupply = totalSupply.sub(value); emit Burn(user, value); emit Transfer(user, address(0), value); } // ============================ Permit ====================================== function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "DODO_DSP_LP: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline ) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require( recoveredAddress != address(0) && recoveredAddress == owner, "DODO_DSP_LP: INVALID_SIGNATURE" ); _approve(owner, spender, value); } } // File: contracts/intf/IDODOCallee.sol interface IDODOCallee { function DVMSellShareCall( address sender, uint256 burnShareAmount, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DVMFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DPPFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DSPFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function CPCancelCall( address sender, uint256 amount, bytes calldata data ) external; function CPClaimBidCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; } // File: contracts/DODOStablePool/impl/DSPTrader.sol contract DSPTrader is DSPVault { using SafeMath for uint256; // ============ Events ============ event DODOSwap( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, address trader, address receiver ); event DODOFlashLoan(address borrower, address assetTo, uint256 baseAmount, uint256 quoteAmount); event RChange(PMMPricing.RState newRState); // ============ Trade Functions ============ function sellBase(address to) external preventReentrant returns (uint256 receiveQuoteAmount) { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 baseInput = baseBalance.sub(uint256(_BASE_RESERVE_)); uint256 mtFee; uint256 newBaseTarget; PMMPricing.RState newRState; (receiveQuoteAmount, mtFee, newRState, newBaseTarget) = querySellBase(tx.origin, baseInput); _transferQuoteOut(to, receiveQuoteAmount); _transferQuoteOut(_MAINTAINER_, mtFee); // update TARGET if (_RState_ != uint32(newRState)) { require(newBaseTarget <= uint112(-1), "OVERFLOW"); _BASE_TARGET_ = uint112(newBaseTarget); _RState_ = uint32(newRState); emit RChange(newRState); } _setReserve(baseBalance, _QUOTE_TOKEN_.balanceOf(address(this))); emit DODOSwap( address(_BASE_TOKEN_), address(_QUOTE_TOKEN_), baseInput, receiveQuoteAmount, msg.sender, to ); } function sellQuote(address to) external preventReentrant returns (uint256 receiveBaseAmount) { uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 quoteInput = quoteBalance.sub(uint256(_QUOTE_RESERVE_)); uint256 mtFee; uint256 newQuoteTarget; PMMPricing.RState newRState; (receiveBaseAmount, mtFee, newRState, newQuoteTarget) = querySellQuote( tx.origin, quoteInput ); _transferBaseOut(to, receiveBaseAmount); _transferBaseOut(_MAINTAINER_, mtFee); // update TARGET if (_RState_ != uint32(newRState)) { require(newQuoteTarget <= uint112(-1), "OVERFLOW"); _QUOTE_TARGET_ = uint112(newQuoteTarget); _RState_ = uint32(newRState); emit RChange(newRState); } _setReserve(_BASE_TOKEN_.balanceOf(address(this)), quoteBalance); emit DODOSwap( address(_QUOTE_TOKEN_), address(_BASE_TOKEN_), quoteInput, receiveBaseAmount, msg.sender, to ); } function flashLoan( uint256 baseAmount, uint256 quoteAmount, address assetTo, bytes calldata data ) external preventReentrant { _transferBaseOut(assetTo, baseAmount); _transferQuoteOut(assetTo, quoteAmount); if (data.length > 0) IDODOCallee(assetTo).DSPFlashLoanCall(msg.sender, baseAmount, quoteAmount, data); uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); // no input -> pure loss require( baseBalance >= _BASE_RESERVE_ || quoteBalance >= _QUOTE_RESERVE_, "FLASH_LOAN_FAILED" ); // sell quote case // quote input + base output if (baseBalance < _BASE_RESERVE_) { uint256 quoteInput = quoteBalance.sub(uint256(_QUOTE_RESERVE_)); ( uint256 receiveBaseAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newQuoteTarget ) = querySellQuote(tx.origin, quoteInput); // revert if quoteBalance<quoteReserve require( uint256(_BASE_RESERVE_).sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED" ); _transferBaseOut(_MAINTAINER_, mtFee); if (_RState_ != uint32(newRState)) { require(newQuoteTarget <= uint112(-1), "OVERFLOW"); _QUOTE_TARGET_ = uint112(newQuoteTarget); _RState_ = uint32(newRState); emit RChange(newRState); } emit DODOSwap( address(_QUOTE_TOKEN_), address(_BASE_TOKEN_), quoteInput, receiveBaseAmount, msg.sender, assetTo ); } // sell base case // base input + quote output if (quoteBalance < _QUOTE_RESERVE_) { uint256 baseInput = baseBalance.sub(uint256(_BASE_RESERVE_)); ( uint256 receiveQuoteAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newBaseTarget ) = querySellBase(tx.origin, baseInput); // revert if baseBalance<baseReserve require( uint256(_QUOTE_RESERVE_).sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED" ); _transferQuoteOut(_MAINTAINER_, mtFee); if (_RState_ != uint32(newRState)) { require(newBaseTarget <= uint112(-1), "OVERFLOW"); _BASE_TARGET_ = uint112(newBaseTarget); _RState_ = uint32(newRState); emit RChange(newRState); } emit DODOSwap( address(_BASE_TOKEN_), address(_QUOTE_TOKEN_), baseInput, receiveQuoteAmount, msg.sender, assetTo ); } _sync(); emit DODOFlashLoan(msg.sender, assetTo, baseAmount, quoteAmount); } // ============ Query Functions ============ function querySellBase(address trader, uint256 payBaseAmount) public view returns ( uint256 receiveQuoteAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newBaseTarget ) { PMMPricing.PMMState memory state = getPMMState(); (receiveQuoteAmount, newRState) = PMMPricing.sellBaseToken(state, payBaseAmount); uint256 lpFeeRate = _LP_FEE_RATE_; uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); mtFee = DecimalMath.mulFloor(receiveQuoteAmount, mtFeeRate); receiveQuoteAmount = receiveQuoteAmount .sub(DecimalMath.mulFloor(receiveQuoteAmount, lpFeeRate)) .sub(mtFee); newBaseTarget = state.B0; } function querySellQuote(address trader, uint256 payQuoteAmount) public view returns ( uint256 receiveBaseAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newQuoteTarget ) { PMMPricing.PMMState memory state = getPMMState(); (receiveBaseAmount, newRState) = PMMPricing.sellQuoteToken(state, payQuoteAmount); uint256 lpFeeRate = _LP_FEE_RATE_; uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); mtFee = DecimalMath.mulFloor(receiveBaseAmount, mtFeeRate); receiveBaseAmount = receiveBaseAmount .sub(DecimalMath.mulFloor(receiveBaseAmount, lpFeeRate)) .sub(mtFee); newQuoteTarget = state.Q0; } } // File: contracts/DODOStablePool/impl/DSPFunding.sol contract DSPFunding is DSPVault { // ============ Events ============ event BuyShares(address to, uint256 increaseShares, uint256 totalShares); event SellShares(address payer, address to, uint256 decreaseShares, uint256 totalShares); // ============ Buy & Sell Shares ============ // buy shares [round down] function buyShares(address to) external preventReentrant returns ( uint256 shares, uint256 baseInput, uint256 quoteInput ) { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 baseReserve = _BASE_RESERVE_; uint256 quoteReserve = _QUOTE_RESERVE_; baseInput = baseBalance.sub(baseReserve); quoteInput = quoteBalance.sub(quoteReserve); require(baseInput > 0, "NO_BASE_INPUT"); // Round down when withdrawing. Therefore, never be a situation occuring balance is 0 but totalsupply is not 0 // But May Happen,reserve >0 But totalSupply = 0 if (totalSupply == 0) { // case 1. initial supply shares = quoteBalance < DecimalMath.mulFloor(baseBalance, _I_) ? DecimalMath.divFloor(quoteBalance, _I_) : baseBalance; _BASE_TARGET_ = uint112(shares); _QUOTE_TARGET_ = uint112(DecimalMath.mulFloor(shares, _I_)); } else if (baseReserve > 0 && quoteReserve > 0) { // case 2. normal case uint256 baseInputRatio = DecimalMath.divFloor(baseInput, baseReserve); uint256 quoteInputRatio = DecimalMath.divFloor(quoteInput, quoteReserve); uint256 mintRatio = quoteInputRatio < baseInputRatio ? quoteInputRatio : baseInputRatio; shares = DecimalMath.mulFloor(totalSupply, mintRatio); _BASE_TARGET_ = uint112(uint256(_BASE_TARGET_).add(DecimalMath.mulFloor(uint256(_BASE_TARGET_), mintRatio))); _QUOTE_TARGET_ = uint112(uint256(_QUOTE_TARGET_).add(DecimalMath.mulFloor(uint256(_QUOTE_TARGET_), mintRatio))); } _mint(to, shares); _setReserve(baseBalance, quoteBalance); emit BuyShares(to, shares, _SHARES_[to]); } // sell shares [round down] function sellShares( uint256 shareAmount, address to, uint256 baseMinAmount, uint256 quoteMinAmount, bytes calldata data, uint256 deadline ) external preventReentrant returns (uint256 baseAmount, uint256 quoteAmount) { require(deadline >= block.timestamp, "TIME_EXPIRED"); require(shareAmount <= _SHARES_[msg.sender], "DLP_NOT_ENOUGH"); uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 totalShares = totalSupply; baseAmount = baseBalance.mul(shareAmount).div(totalShares); quoteAmount = quoteBalance.mul(shareAmount).div(totalShares); _BASE_TARGET_ = uint112(uint256(_BASE_TARGET_).sub(uint256(_BASE_TARGET_).mul(shareAmount).divCeil(totalShares))); _QUOTE_TARGET_ = uint112(uint256(_QUOTE_TARGET_).sub(uint256(_QUOTE_TARGET_).mul(shareAmount).divCeil(totalShares))); require( baseAmount >= baseMinAmount && quoteAmount >= quoteMinAmount, "WITHDRAW_NOT_ENOUGH" ); _burn(msg.sender, shareAmount); _transferBaseOut(to, baseAmount); _transferQuoteOut(to, quoteAmount); _sync(); if (data.length > 0) { //Same as DVM IDODOCallee(to).DVMSellShareCall( msg.sender, shareAmount, baseAmount, quoteAmount, data ); } emit SellShares(msg.sender, to, shareAmount, _SHARES_[msg.sender]); } } // File: contracts/DODOStablePool/impl/DSP.sol /** * @title DODO StablePool * @author DODO Breeder * * @notice DODOStablePool initialization */ contract DSP is DSPTrader, DSPFunding { function init( address maintainer, address baseTokenAddress, address quoteTokenAddress, uint256 lpFeeRate, address mtFeeRateModel, uint256 i, uint256 k, bool isOpenTWAP ) external { require(!_DSP_INITIALIZED_, "DSP_INITIALIZED"); _DSP_INITIALIZED_ = true; require(baseTokenAddress != quoteTokenAddress, "BASE_QUOTE_CAN_NOT_BE_SAME"); _BASE_TOKEN_ = IERC20(baseTokenAddress); _QUOTE_TOKEN_ = IERC20(quoteTokenAddress); require(i > 0 && i <= 10**36); _I_ = i; require(k <= 10**18); _K_ = k; _LP_FEE_RATE_ = lpFeeRate; _MT_FEE_RATE_MODEL_ = IFeeRateModel(mtFeeRateModel); _MAINTAINER_ = maintainer; _IS_OPEN_TWAP_ = isOpenTWAP; if (isOpenTWAP) _BLOCK_TIMESTAMP_LAST_ = uint32(block.timestamp % 2**32); string memory connect = "_"; string memory suffix = "DLP"; name = string(abi.encodePacked(suffix, connect, addressToShortString(address(this)))); symbol = "DLP"; decimals = _BASE_TOKEN_.decimals(); // ============================== Permit ==================================== uint256 chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( // keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f, keccak256(bytes(name)), keccak256(bytes("1")), chainId, address(this) ) ); // ========================================================================== } function addressToShortString(address _addr) public pure returns (string memory) { bytes32 value = bytes32(uint256(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(8); for (uint256 i = 0; i < 4; i++) { str[i * 2] = alphabet[uint8(value[i + 12] >> 4)]; str[1 + i * 2] = alphabet[uint8(value[i + 12] & 0x0f)]; } return string(str); } // ============ Version Control ============ function version() external pure returns (string memory) { return "DSP 1.0.1"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"increaseShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalShares","type":"uint256"}],"name":"BuyShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"address","name":"assetTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"name":"DODOFlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DODOSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PMMPricing.RState","name":"newRState","type":"uint8"}],"name":"RChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"decreaseShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalShares","type":"uint256"}],"name":"SellShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_PRICE_CUMULATIVE_LAST_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_RESERVE_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TARGET_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCK_TIMESTAMP_LAST_","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_IS_OPEN_TWAP_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_I_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_K_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LP_FEE_RATE_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAINTAINER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MT_FEE_RATE_MODEL_","outputs":[{"internalType":"contract IFeeRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_RESERVE_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TARGET_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_RState_","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addressToShortString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"buyShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"baseInput","type":"uint256"},{"internalType":"uint256","name":"quoteInput","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"correctRState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"address","name":"assetTo","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseInput","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"midPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPMMState","outputs":[{"components":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint256","name":"Q","type":"uint256"},{"internalType":"uint256","name":"B0","type":"uint256"},{"internalType":"uint256","name":"Q0","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"R","type":"uint8"}],"internalType":"struct PMMPricing.PMMState","name":"state","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPMMStateForCall","outputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint256","name":"Q","type":"uint256"},{"internalType":"uint256","name":"B0","type":"uint256"},{"internalType":"uint256","name":"Q0","type":"uint256"},{"internalType":"uint256","name":"R","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuoteInput","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserFeeRate","outputs":[{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"mtFeeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultReserve","outputs":[{"internalType":"uint256","name":"baseReserve","type":"uint256"},{"internalType":"uint256","name":"quoteReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maintainer","type":"address"},{"internalType":"address","name":"baseTokenAddress","type":"address"},{"internalType":"address","name":"quoteTokenAddress","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"address","name":"mtFeeRateModel","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payBaseAmount","type":"uint256"}],"name":"querySellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"newRState","type":"uint8"},{"internalType":"uint256","name":"newBaseTarget","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payQuoteAmount","type":"uint256"}],"name":"querySellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"newRState","type":"uint8"},{"internalType":"uint256","name":"newQuoteTarget","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shareAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"baseMinAmount","type":"uint256"},{"internalType":"uint256","name":"quoteMinAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"sellShares","outputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040526000805462ff00001916905534801561001c57600080fd5b506146ae8061002c6000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c80637d72150411610167578063d4b97046116100ce578063ee27c68911610087578063ee27c6891461053d578063f6b06e7014610545578063f811d6921461054d578063fd1ed7e914610555578063fe24cb7f14610570578063fff6cae91461057857610295565b8063d4b97046146104ec578063d505accf146104f4578063dd62ed3e14610507578063dd93f59a1461051a578063e539ef491461052d578063ec2fd46d1461053557610295565b8063ab44a7a311610120578063ab44a7a31461049b578063b56ceaa6146104a3578063bbf5ce78146104b6578063bd6015b4146104be578063bf357dae146104d1578063d0a494e4146104d957610295565b80637d7215041461043b5780637ecebe0014610443578063880a4d871461045657806395d89b411461046b578063a382d1b914610473578063a9059cbb1461048857610295565b8063440966091161020b57806366410a21116101c457806366410a21146103cd57806370a08231146103f057806371f9100c1461040357806373d74cf81461040b57806377f586571461041357806379a048761461042857610295565b8063440966091461036b5780634a248d2a1461037e5780634c85b425146103865780635039972a146103a857806354fd4d50146103bd57806365f6fcbb146103c557610295565b80632df6cb481161025d5780632df6cb481461031357806330adf81f1461031b578063313ce5671461032357806336223ce9146103385780633644e5151461034e5780634322ec831461035657610295565b806306fdde031461029a578063095ea7b3146102b857806317101940146102d857806318160ddd146102eb57806323b872dd14610300575b600080fd5b6102a2610580565b6040516102af91906140db565b60405180910390f35b6102cb6102c6366004613c99565b61060e565b6040516102af9190614034565b6102a26102e6366004613b13565b610625565b6102f361074f565b6040516102af919061403f565b6102cb61030e366004613beb565b610755565b6102cb6108d9565b6102f36108e8565b61032b61090c565b6040516102af91906145a1565b610340610915565b6040516102af929190614511565b6102f3610930565b61035e610936565b6040516102af9190613f0a565b610340610379366004613b13565b61094c565b61035e6109d7565b610399610394366004613b13565b6109e6565b6040516102af9392919061454a565b6103bb6103b6366004613b62565b610d7b565b005b6102a26110b8565b6102f36110dc565b6103e06103db366004613c99565b611183565b6040516102af949392919061451f565b6102f36103fe366004613b13565b611271565b6102f361128c565b6103bb6112d8565b61041b6113d5565b6040516102af91906144fd565b6103e0610436366004613c99565b6113eb565b61041b6114cc565b6102f3610451366004613b13565b6114db565b61045e6114ed565b6040516102af9190614590565b6102a2611500565b61047b61155b565b6040516102af91906144a7565b6102cb610496366004613c99565b6115e8565b6102f36116b7565b6103406104b1366004613cf7565b6116bd565b61041b611abb565b6102f36104cc366004613b13565b611ad1565b61045e611d82565b6103bb6104e7366004613d71565b611d95565b61035e612382565b6103bb610502366004613c2b565b612391565b6102f3610515366004613b2e565b612500565b6102f3610528366004613b13565b61252b565b61041b6127c6565b6102f36127d5565b6102f36127db565b61035e6127ed565b6102f36127fc565b61055d612802565b6040516102af9796959493929190614560565b6102f3612865565b6103bb61286b565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106065780601f106105db57610100808354040283529160200191610606565b820191906000526020600020905b8154815290600101906020018083116105e957829003601f168201915b505050505081565b600061061b3384846128af565b5060015b92915050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160088082528184019093526060926001600160a01b0385169291849160208201818036833701905050905060005b6004811015610744578260048583600c016020811061069657fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106106b657fe5b602001015160f81c60f81b8282600202815181106106d057fe5b60200101906001600160f81b031916908160001a905350828482600c01602081106106f757fe5b825191901a600f1690811061070857fe5b602001015160f81c60f81b82826002026001018151811061072557fe5b60200101906001600160f81b031916908160001a90535060010161067b565b50925050505b919050565b60095481565b6001600160a01b0383166000908152600a60205260408120548211156107965760405162461bcd60e51b815260040161078d90614375565b60405180910390fd5b6001600160a01b0384166000908152600b602090815260408083203384529091529020548211156107d95760405162461bcd60e51b815260040161078d90614192565b6001600160a01b0384166000908152600a6020526040902054610802908363ffffffff61291716565b6001600160a01b038086166000908152600a60205260408082209390935590851681522054610837908363ffffffff61293f16565b6001600160a01b038085166000908152600a60209081526040808320949094559187168152600b8252828120338252909152205461087b908363ffffffff61291716565b6001600160a01b038086166000818152600b60209081526040808320338452909152908190209390935591519085169190600080516020614619833981519152906108c790869061403f565b60405180910390a35060019392505050565b60005462010000900460ff1681565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60075460ff1681565b6003546001600160701b0380821692600160701b9092041690565b600c5481565b600054630100000090046001600160a01b031681565b600f54600e54604051638198edbf60e01b81526000916001600160a01b031690638198edbf90610980908690600401613f0a565b60206040518083038186803b15801561099857600080fd5b505afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190613cdf565b9050915091565b6001546001600160a01b031681565b600080548190819060ff1615610a0e5760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a0823190610a4b903090600401613f0a565b60206040518083038186803b158015610a6357600080fd5b505afa158015610a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9b9190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610ad1903090600401613f0a565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190613cdf565b6003549091506001600160701b0380821691600160701b900416610b4b848363ffffffff61291716565b9550610b5d838263ffffffff61291716565b945060008611610b7f5760405162461bcd60e51b815260040161078d906142ae565b600954610c0157610b928460115461296b565b8310610b9e5783610baa565b610baa83601154612995565b600580546001600160701b0319166001600160701b038316179055601154909750610bd690889061296b565b6005600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610cfd565b600082118015610c115750600081115b15610cfd576000610c228784612995565b90506000610c308784612995565b90506000828210610c415782610c43565b815b9050610c516009548261296b565b600554909a50610c8690610c6e906001600160701b03168361296b565b6005546001600160701b03169063ffffffff61293f16565b600580546001600160701b0319166001600160701b039283161790819055610cd391610cba91600160701b9004168361296b565b600554600160701b90046001600160701b03169061293f565b6005600e6101000a8154816001600160701b0302191690836001600160701b031602179055505050505b610d0788886129b3565b610d118484612aad565b6001600160a01b0388166000908152600a6020526040908190205490517f1c172440bdebb59cd92a7f08f4227903a3305ab6f880cb25f93eddb66843a10291610d5d918b918b91614013565b60405180910390a150506000805460ff191690555092949193509150565b600054610100900460ff1615610da35760405162461bcd60e51b815260040161078d9061410e565b6000805461ff0019166101001790556001600160a01b038781169087161415610dde5760405162461bcd60e51b815260040161078d90614242565b600180546001600160a01b03808a166001600160a01b03199283161790925560028054928916929091169190911790558215801590610e2c57506ec097ce7bc90715b34b9f10000000008311155b610e3557600080fd5b6011839055670de0b6b3a7640000821115610e4f57600080fd5b6010829055600f859055600e80546001600160a01b038087166001600160a01b0319909216919091179091556000805483158015620100000262ff000019948d166301000000026301000000600160b81b03199093169290921793909316179055610ed257600380546001600160e01b03164263ffffffff16600160e01b021790555b60408051808201825260018152605f60f81b602080830191909152825180840190935260038352620444c560ec1b90830152908082610f1030610625565b604051602001610f2293929190613eaa565b60405160208183030381529060405260089080519060200190610f469291906139dd565b50604080518082019091526003808252620444c560ec1b6020909201918252610f71916006916139dd565b50600160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc057600080fd5b505afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff89190613dd8565b6007805460ff191660ff9290921691909117905560405146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9061103f90600890613e3a565b60408051918290038220828201825260018352603160f81b602093840152905161109093927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69186913091016140af565b60408051601f198184030181529190528051602090910120600c555050505050505050505050565b60408051808201909152600981526844535020312e302e3160b81b60208201525b90565b6003546001546040516370a0823160e01b815260009261117e926001600160701b03909116916001600160a01b03909116906370a0823190611122903090600401613f0a565b60206040518083038186803b15801561113a57600080fd5b505afa15801561114e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111729190613cdf565b9063ffffffff61291716565b905090565b600080600080611191613a5b565b61119961155b565b90506111a58187612b3d565b600f54600e54604051638198edbf60e01b8152939850919550916000916001600160a01b031690638198edbf906111e0908c90600401613f0a565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190613cdf565b905061123c878261296b565b955061125c8661117261124f8a8661296b565b8a9063ffffffff61291716565b96508260a00151935050505092959194509250565b6001600160a01b03166000908152600a602052604090205490565b6003546002546040516370a0823160e01b815260009261117e92600160701b9091046001600160701b0316916001600160a01b03909116906370a0823190611122903090600401613f0a565b60055463ffffffff600160e01b90910416600214801561130857506005546003546001600160701b039182169116105b1561135057600580546003546001600160701b03808216600160701b600160e01b0390931692909217600160701b600160e01b031916600160701b9182900492909216021790555b60055463ffffffff600160e01b90910416600114801561138b57506005546003546001600160701b03600160701b9283900481169290910416105b156113d357600580546003546001600160701b03808216600160701b600160e01b0390931692909217600160701b600160e01b031916600160701b9182900492909216021790555b565b600554600160701b90046001600160701b031681565b6000806000806113f9613a5b565b61140161155b565b905061140d8187612c43565b600f54600e54604051638198edbf60e01b8152939850919550916000916001600160a01b031690638198edbf90611448908c90600401613f0a565b60206040518083038186803b15801561146057600080fd5b505afa158015611474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114989190613cdf565b90506114a4878261296b565b95506114b78661117261124f8a8661296b565b96508260800151935050505092959194509250565b6003546001600160701b031681565b600d6020526000908152604090205481565b600354600160e01b900463ffffffff1681565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106065780601f106105db57610100808354040283529160200191610606565b611563613a5b565b601154815260105460208201526003546001600160701b038082166040840152600160701b918290048116606084015260055480821660808501529182041660a0830152600160e01b900463ffffffff1660028111156115bf57fe5b8160c0019060028111156115cf57fe5b908160028111156115dc57fe5b9052506110d981612d44565b336000908152600a60205260408120548211156116175760405162461bcd60e51b815260040161078d90614375565b336000908152600a6020526040902054611637908363ffffffff61291716565b336000908152600a6020526040808220929092556001600160a01b03851681522054611669908363ffffffff61293f16565b6001600160a01b0384166000818152600a6020526040908190209290925590513390600080516020614619833981519152906116a690869061403f565b60405180910390a350600192915050565b600f5481565b60008054819060ff16156116e35760405162461bcd60e51b815260040161078d9061421f565b6000805460ff19166001179055428310156117105760405162461bcd60e51b815260040161078d9061445e565b336000908152600a602052604090205489111561173f5760405162461bcd60e51b815260040161078d9061434d565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611770903090600401613f0a565b60206040518083038186803b15801561178857600080fd5b505afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c09190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906117f6903090600401613f0a565b60206040518083038186803b15801561180e57600080fd5b505afa158015611822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118469190613cdf565b60095490915061186c81611860858f63ffffffff612dee16565b9063ffffffff612e2816565b945061188281611860848f63ffffffff612dee16565b93506118e06118c8826118bc8f600560009054906101000a90046001600160701b03166001600160701b0316612dee90919063ffffffff16565b9063ffffffff612e5216565b6005546001600160701b03169063ffffffff61291716565b600560006101000a8154816001600160701b0302191690836001600160701b0316021790555061195761193e826118bc8f6005600e9054906101000a90046001600160701b03166001600160701b0316612dee90919063ffffffff16565b600554600160701b90046001600160701b031690612917565b6005600e6101000a8154816001600160701b0302191690836001600160701b0316021790555089851015801561198d5750888410155b6119a95760405162461bcd60e51b815260040161078d90614320565b6119b3338d612e7f565b6119bd8b86612f4c565b6119c78b85612f6f565b6119cf612f92565b8615611a3e578a6001600160a01b0316632411d338338e88888d8d6040518763ffffffff1660e01b8152600401611a0b96959493929190613f80565b600060405180830381600087803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b505050505b7f55caccde83781f39bfc1296eff45655b6496729443a7d48958b18b3b685600a5338c8e600a6000336001600160a01b03166001600160a01b0316815260200190815260200160002054604051611a989493929190613f1e565b60405180910390a150506000805460ff1916905550909890975095505050505050565b600354600160701b90046001600160701b031681565b6000805460ff1615611af55760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a0823190611b32903090600401613f0a565b60206040518083038186803b158015611b4a57600080fd5b505afa158015611b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b829190613cdf565b600354909150600090611ba59083906001600160701b031663ffffffff61291716565b90506000806000611bb632856113eb565b9298509094509092509050611bcb8787612f6f565b600054611be890630100000090046001600160a01b031684612f6f565b806002811115611bf457fe5b600554600160e01b900463ffffffff908116911614611ca1576001600160701b03821115611c345760405162461bcd60e51b815260040161078d906143a1565b600580546001600160701b0319166001600160701b038416179055806002811115611c5b57fe5b6005601c6101000a81548163ffffffff021916908363ffffffff16021790555060008051602061463983398151915281604051611c98919061409a565b60405180910390a15b6002546040516370a0823160e01b8152611d2c9187916001600160a01b03909116906370a0823190611cd7903090600401613f0a565b60206040518083038186803b158015611cef57600080fd5b505afa158015611d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d279190613cdf565b612aad565b60015460025460405160008051602061465983398151915292611d65926001600160a01b039182169291169088908b9033908e90613fc0565b60405180910390a150506000805460ff1916905550919392505050565b600554600160e01b900463ffffffff1681565b60005460ff1615611db85760405162461bcd60e51b815260040161078d9061421f565b6000805460ff19166001179055611dcf8386612f4c565b611dd98385612f6f565b8015611e465760405163d5b9979760e01b81526001600160a01b0384169063d5b9979790611e139033908990899088908890600401613f47565b600060405180830381600087803b158015611e2d57600080fd5b505af1158015611e41573d6000803e3d6000fd5b505050505b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611e77903090600401613f0a565b60206040518083038186803b158015611e8f57600080fd5b505afa158015611ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec79190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190611efd903090600401613f0a565b60206040518083038186803b158015611f1557600080fd5b505afa158015611f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4d9190613cdf565b6003549091506001600160701b031682101580611f7c5750600354600160701b90046001600160701b03168110155b611f985760405162461bcd60e51b815260040161078d90614137565b6003546001600160701b031682101561216257600354600090611fcc908390600160701b90046001600160701b0316612917565b9050600080600080611fde3286611183565b600354939750919550935091508490612006906001600160701b03168963ffffffff61291716565b11156120245760405162461bcd60e51b815260040161078d90614137565b60005461204190630100000090046001600160a01b031684612f4c565b81600281111561204d57fe5b600554600160e01b900463ffffffff908116911614612103576001600160701b0381111561208d5760405162461bcd60e51b815260040161078d906143a1565b60058054600160701b600160e01b031916600160701b6001600160701b038416021790558160028111156120bd57fe5b6005601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614639833981519152826040516120fa919061409a565b60405180910390a15b600080516020614659833981519152600260009054906101000a90046001600160a01b0316600160009054906101000a90046001600160a01b03168787338f60405161215496959493929190613fc0565b60405180910390a150505050505b600354600160701b90046001600160701b031681101561232a5760035460009061219c9084906001600160701b031663ffffffff61291716565b90506000806000806121ae32866113eb565b6003549397509195509350915084906121d790600160701b90046001600160701b031688612917565b11156121f55760405162461bcd60e51b815260040161078d90614137565b60005461221290630100000090046001600160a01b031684612f6f565b81600281111561221e57fe5b600554600160e01b900463ffffffff9081169116146122cb576001600160701b0381111561225e5760405162461bcd60e51b815260040161078d906143a1565b600580546001600160701b0319166001600160701b03831617905581600281111561228557fe5b6005601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614639833981519152826040516122c2919061409a565b60405180910390a15b600080516020614659833981519152600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168787338f60405161231c96959493929190613fc0565b60405180910390a150505050505b612332612f92565b7f0b82e93068db15abd9fbb2682c65462ea8a0a10582dce93a5664818e296f54eb338689896040516123679493929190613f1e565b60405180910390a150506000805460ff191690555050505050565b6002546001600160a01b031681565b428410156123b15760405162461bcd60e51b815260040161078d906143c3565b600c546001600160a01b0388166000908152600d602090815260408083208054600181019091559051929392612412927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d9101614048565b60405160208183030381529060405280519060200120604051602001612439929190613eef565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051612476949392919061407c565b6020604051602081039080840390855afa158015612498573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906124ce5750886001600160a01b0316816001600160a01b0316145b6124ea5760405162461bcd60e51b815260040161078d906141e8565b6124f58989896128af565b505050505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b6000805460ff161561254f5760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660011781556002546040516370a0823160e01b81526001600160a01b03909116906370a082319061258c903090600401613f0a565b60206040518083038186803b1580156125a457600080fd5b505afa1580156125b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dc9190613cdf565b600354909150600090612600908390600160701b90046001600160701b0316612917565b905060008060006126113285611183565b92985090945090925090506126268787612f4c565b60005461264390630100000090046001600160a01b031684612f4c565b80600281111561264f57fe5b600554600160e01b900463ffffffff908116911614612705576001600160701b0382111561268f5760405162461bcd60e51b815260040161078d906143a1565b60058054600160701b600160e01b031916600160701b6001600160701b038516021790558060028111156126bf57fe5b6005601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614639833981519152816040516126fc919061409a565b60405180910390a15b6001546040516370a0823160e01b815261278d916001600160a01b0316906370a0823190612737903090600401613f0a565b60206040518083038186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127879190613cdf565b86612aad565b60025460015460405160008051602061465983398151915292611d65926001600160a01b039182169291169088908b9033908e90613fc0565b6005546001600160701b031681565b60105481565b600061117e6127e861155b565b61315a565b600e546001600160a01b031681565b60115481565b6000806000806000806000612815613a5b565b61281d61155b565b905080600001519750806020015196508060400151955080606001519450806080015193508060a0015192508060c00151600281111561285957fe5b91505090919293949596565b60045481565b60005460ff161561288e5760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660011790556128a3612f92565b6000805460ff19169055565b6001600160a01b038084166000818152600b602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061290a90859061403f565b60405180910390a3505050565b6000828211156129395760405162461bcd60e51b815260040161078d906142fd565b50900390565b6000828201838110156129645760405162461bcd60e51b815260040161078d906143f1565b9392505050565b6000670de0b6b3a7640000612986848463ffffffff612dee16565b8161298d57fe5b049392505050565b60006129648261186085670de0b6b3a764000063ffffffff612dee16565b6103e881116129d45760405162461bcd60e51b815260040161078d90614162565b6001600160a01b0382166000908152600a60205260409020546129fd908263ffffffff61293f16565b6001600160a01b0383166000908152600a6020526040902055600954612a29908263ffffffff61293f16565b6009556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590612a6790849061403f565b60405180910390a2816001600160a01b031660006001600160a01b031660008051602061461983398151915283604051612aa1919061403f565b60405180910390a35050565b6001600160701b038211801590612acb57506001600160701b038111155b612ae75760405162461bcd60e51b815260040161078d906143a1565b600380546001600160701b03838116600160701b02600160701b600160e01b03199186166001600160701b0319909316929092171617905560005460ff620100009091041615612b3957612b3961324c565b5050565b600080808460c001516002811115612b5157fe5b1415612b6c57612b6184846132e1565b915060019050612c3c565b60018460c001516002811115612b7e57fe5b1415612b8e57612b618484613308565b6000612bab85606001518660a0015161291790919063ffffffff16565b90506000612bca8660800151876040015161291790919063ffffffff16565b905081851015612bf557612bde8686613325565b93506002925080841115612bf0578093505b612c39565b81851415612c095780935060009250612c39565b612c32612c2587612c20888663ffffffff61291716565b6132e1565b829063ffffffff61293f16565b9350600192505b50505b9250929050565b600080808460c001516002811115612c5757fe5b1415612c7257612c678484613360565b915060029050612c3c565b60018460c001516002811115612c8457fe5b1415612d2f576000612ca78560400151866080015161291790919063ffffffff16565b90506000612cc68660a00151876060015161291790919063ffffffff16565b905081851015612cf157612cda868661337f565b93506001925080841115612cec578093505b612d28565b81851415612d055780935060009250612d28565b612d21612c2587612d1c888663ffffffff61291716565b613360565b9350600292505b5050612c3c565b612d3984846133b1565b946002945092505050565b60028160c001516002811115612d5657fe5b1415612d9557612d8b8160600151612d7f8360800151846040015161291790919063ffffffff16565b835160208501516133d0565b60a0820152612deb565b60018160c001516002811115612da757fe5b1415612deb57612de58160400151612dd08360a00151846060015161291790919063ffffffff16565b8351612ddb906134f6565b84602001516133d0565b60808201525b50565b600082612dfd5750600061061f565b82820282848281612e0a57fe5b04146129645760405162461bcd60e51b815260040161078d90614484565b6000808211612e495760405162461bcd60e51b815260040161078d906142d5565b81838161298d57fe5b600080612e5f8484612e28565b905082810284038015612e775750600101905061061f565b50905061061f565b6001600160a01b0382166000908152600a6020526040902054612ea8908263ffffffff61291716565b6001600160a01b0383166000908152600a6020526040902055600954612ed4908263ffffffff61291716565b6009556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590612f1290849061403f565b60405180910390a260006001600160a01b0316826001600160a01b031660008051602061461983398151915283604051612aa1919061403f565b8015612b3957600154612b39906001600160a01b0316838363ffffffff61351716565b8015612b3957600254612b39906001600160a01b0316838363ffffffff61351716565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612fc3903090600401613f0a565b60206040518083038186803b158015612fdb57600080fd5b505afa158015612fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130139190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190613049903090600401613f0a565b60206040518083038186803b15801561306157600080fd5b505afa158015613075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130999190613cdf565b90506001600160701b0382118015906130b957506001600160701b038111155b6130d55760405162461bcd60e51b815260040161078d906143a1565b6003546001600160701b0316821461310357600380546001600160701b0319166001600160701b0384161790555b600354600160701b90046001600160701b031681146131415760038054600160701b600160e01b031916600160701b6001600160701b038416021790555b60005462010000900460ff1615612b3957612b3961324c565b600060028260c00151600281111561316e57fe5b14156131f957606082015160a08301516000916131a49161319a9190611860908063ffffffff612dee16565b8460600151612995565b90506131e16131b784602001518361296b565b60208501516131d590670de0b6b3a76400009063ffffffff61291716565b9063ffffffff61293f16565b90506131f1836000015182612995565b91505061074a565b604082015160808301516000916132299161321f9190611860908063ffffffff612dee16565b8460400151612995565b905061323c6131b784602001518361296b565b90506131f183600001518261296b565b60035463ffffffff42811691600160e01b9004811682039081161580159061327e57506003546001600160701b031615155b801561329b5750600354600160701b90046001600160701b031615155b156132bb578063ffffffff166132af6127db565b60048054919092020190555b506003805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b600061296483608001518460800151846132fe87600001516134f6565b8760200151613572565b600061296483608001518460400151846132fe87600001516134f6565b60006129648360a0015161334684866060015161293f90919063ffffffff16565b60608601518651613356906134f6565b87602001516137f2565b60006129648360a001518460a001518486600001518760200151613572565b600061296483608001516133a084866040015161293f90919063ffffffff16565b6040860151865160208801516137f2565b60006129648360a0015184606001518486600001518760200151613572565b6000846133df575060006134ee565b81613405576133fe6133f1848661296b565b869063ffffffff61293f16565b90506134ee565b60008061341b600485028663ffffffff612dee16565b90508061343257670de0b6b3a764000091506134b2565b85818783028161343e57fe5b0414156134795761347261346d6ec097ce7bc90715b34b9f10000000006131d5848a028b63ffffffff612e2816565b6138cb565b91506134b2565b6134af61346d6ec097ce7bc90715b34b9f10000000006131d5896134a3868d63ffffffff612e2816565b9063ffffffff612dee16565b91505b60006134dc670de0b6b3a76400006131d56134d3868363ffffffff61291716565b88600202612995565b90506134e8888261296b565b93505050505b949350505050565b600061061f6ec097ce7bc90715b34b9f10000000008363ffffffff612e2816565b61356d8363a9059cbb60e01b8484604051602401613536929190613ffa565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613902565b505050565b60008086116135935760405162461bcd60e51b815260040161078d906141c0565b836135a0575060006137e9565b816135cd57846135b0848661296b565b116135c4576135bf838561296b565b6135c6565b845b90506137e9565b670de0b6b3a764000082141561368d576000806135f0858763ffffffff612dee16565b9050806136005760009150613659565b86818883028161360c57fe5b04141561363c57613635613626898063ffffffff612dee16565b8289029063ffffffff612e2816565b9150613659565b61365688611860876134a383838c8e63ffffffff612dee16565b91505b61368461367483670de0b6b3a764000063ffffffff61293f16565b611860898563ffffffff612dee16565b925050506137e9565b60006136ba6136a2858763ffffffff612dee16565b6131d5896134a38a611860898463ffffffff612dee16565b905060006136da876134a3670de0b6b3a76400008763ffffffff61291716565b905060008282106136f0575081900360006136f6565b50810360015b61370e82670de0b6b3a764000063ffffffff612e2816565b9150600061374561373260046134a3670de0b6b3a76400008a63ffffffff61291716565b6137408c6134a38a8f61296b565b61296b565b905061375e61346d826131d5868063ffffffff612dee16565b9050600061377f60026134a3670de0b6b3a76400008a63ffffffff61291716565b9050600083156137a057613799838663ffffffff61291716565b90506137b3565b6137b0858463ffffffff61293f16565b90505b60006137bf82846139bf565b90508b8111156137d95760009750505050505050506137e9565b8b0396506137e995505050505050565b95945050505050565b60008086116138135760405162461bcd60e51b815260040161078d906141c0565b6000613835613828878763ffffffff61291716565b859063ffffffff612dee16565b90508261385c5761385481670de0b6b3a764000063ffffffff612e2816565b9150506137e9565b600061387b613875886118608b8063ffffffff612dee16565b87612995565b90506000613889858361296b565b90506138be6ec097ce7bc90715b34b9f1000000000611860856134a3856131d5670de0b6b3a76400008c63ffffffff61291716565b9998505050505050505050565b80600160028204015b818110156138fc578091506002818285816138eb57fe5b0401816138f457fe5b0490506138d4565b50919050565b60006060836001600160a01b03168360405161391e9190613e1e565b6000604051808303816000865af19150503d806000811461395b576040519150601f19603f3d011682016040523d82523d6000602084013e613960565b606091505b5091509150816139825760405162461bcd60e51b815260040161078d90614279565b8051156139b9578080602001905181019061399d9190613cc3565b6139b95760405162461bcd60e51b815260040161078d90614414565b50505050565b6000612964826118bc85670de0b6b3a764000063ffffffff612dee16565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1e57805160ff1916838001178555613a4b565b82800160010185558215613a4b579182015b82811115613a4b578251825591602001919060010190613a30565b50613a57929150613aa2565b5090565b6040518060e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160006002811115613a9d57fe5b905290565b6110d991905b80821115613a575760008155600101613aa8565b80356001600160a01b038116811461061f57600080fd5b60008083601f840112613ae4578182fd5b50813567ffffffffffffffff811115613afb578182fd5b602083019150836020828501011115612c3c57600080fd5b600060208284031215613b24578081fd5b6129648383613abc565b60008060408385031215613b40578081fd5b613b4a8484613abc565b9150613b598460208501613abc565b90509250929050565b600080600080600080600080610100898b031215613b7e578384fd5b613b888a8a613abc565b9750613b978a60208b01613abc565b9650613ba68a60408b01613abc565b955060608901359450613bbc8a60808b01613abc565b935060a0890135925060c0890135915060e0890135613bda816145fb565b809150509295985092959890939650565b600080600060608486031215613bff578283fd5b8335613c0a816145e6565b92506020840135613c1a816145e6565b929592945050506040919091013590565b600080600080600080600060e0888a031215613c45578283fd5b613c4f8989613abc565b9650613c5e8960208a01613abc565b955060408801359450606088013593506080880135613c7c81614609565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613cab578182fd5b613cb58484613abc565b946020939093013593505050565b600060208284031215613cd4578081fd5b8151612964816145fb565b600060208284031215613cf0578081fd5b5051919050565b600080600080600080600060c0888a031215613d11578283fd5b873596506020880135613d23816145e6565b95506040880135945060608801359350608088013567ffffffffffffffff811115613d4c578384fd5b613d588a828b01613ad3565b989b979a5095989497959660a090950135949350505050565b600080600080600060808688031215613d88578081fd5b8535945060208601359350613da08760408801613abc565b9250606086013567ffffffffffffffff811115613dbb578182fd5b613dc788828901613ad3565b969995985093965092949392505050565b600060208284031215613de9578081fd5b815161296481614609565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008251613e308184602087016145ba565b9190910192915050565b6000808354600180821660008114613e595760018114613e7057613e9f565b60ff198316865260028304607f1686019350613e9f565b600283048786526020808720875b83811015613e975781548a820152908501908201613e7e565b505050860193505b509195945050505050565b60008451613ebc8184602089016145ba565b8451908301613ecf8282602089016145ba565b8451918101613ee28382602089016145ba565b9091019695505050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b600060018060a01b038716825285602083015284604083015260806060830152613f75608083018486613df4565b979650505050505050565b600060018060a01b038816825286602083015285604083015284606083015260a06080830152613fb460a083018486613df4565b98975050505050505050565b6001600160a01b0396871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b602081016140a7836145af565b825292915050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60006020825282518060208401526140fa8160408501602087016145ba565b601f01601f19169190910160400192915050565b6020808252600f908201526e1114d417d253925512505312569151608a1b604082015260600190565b60208082526011908201527011931054d217d313d05397d19052531151607a1b604082015260600190565b60208082526016908201527509a929ca8be829a9eaa9ca8be9c9ea8be8a9c9eaa8e960531b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b6020808252600e908201526d5441524745545f49535f5a45524f60901b604082015260600190565b6020808252601e908201527f444f444f5f4453505f4c503a20494e56414c49445f5349474e41545552450000604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252601a908201527f424153455f51554f54455f43414e5f4e4f545f42455f53414d45000000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600d908201526c1393d7d09054d157d253941555609a1b604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252601390820152720ae92a89088a482aebe9c9ea8be8a9c9eaa8e9606b1b604082015260600190565b6020808252600e908201526d08898a0be9c9ea8be8a9c9eaa8e960931b604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600890820152674f564552464c4f5760c01b604082015260600190565b6020808252601490820152731113d113d7d114d417d3140e881156141254915160621b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600c908201526b1512535157d156141254915160a21b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a08301526144f260c08401516145af565b60c083015292915050565b6001600160701b0391909116815260200190565b918252602082015260400190565b8481526020810184905260808101614536846145af565b604083015282606083015295945050505050565b9283526020830191909152604082015260600190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b806003811061074a57fe5b60005b838110156145d55781810151838201526020016145bd565b838111156139b95750506000910152565b6001600160a01b0381168114612deb57600080fd5b8015158114612deb57600080fd5b60ff81168114612deb57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdf176ad18be4f9f32efaa32f06e9d1175476504739a745f1399a6d3fa4b75917c2c0245e056d5fb095f04cd6373bc770802ebd1e6c918eb78fdef843cdb37b0fa26469706673582212207e43fe3c65a0960d957dd6869ff0e588f6bfb9fc4f4aaec6c20405c858f3167e64736f6c63430006090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102955760003560e01c80637d72150411610167578063d4b97046116100ce578063ee27c68911610087578063ee27c6891461053d578063f6b06e7014610545578063f811d6921461054d578063fd1ed7e914610555578063fe24cb7f14610570578063fff6cae91461057857610295565b8063d4b97046146104ec578063d505accf146104f4578063dd62ed3e14610507578063dd93f59a1461051a578063e539ef491461052d578063ec2fd46d1461053557610295565b8063ab44a7a311610120578063ab44a7a31461049b578063b56ceaa6146104a3578063bbf5ce78146104b6578063bd6015b4146104be578063bf357dae146104d1578063d0a494e4146104d957610295565b80637d7215041461043b5780637ecebe0014610443578063880a4d871461045657806395d89b411461046b578063a382d1b914610473578063a9059cbb1461048857610295565b8063440966091161020b57806366410a21116101c457806366410a21146103cd57806370a08231146103f057806371f9100c1461040357806373d74cf81461040b57806377f586571461041357806379a048761461042857610295565b8063440966091461036b5780634a248d2a1461037e5780634c85b425146103865780635039972a146103a857806354fd4d50146103bd57806365f6fcbb146103c557610295565b80632df6cb481161025d5780632df6cb481461031357806330adf81f1461031b578063313ce5671461032357806336223ce9146103385780633644e5151461034e5780634322ec831461035657610295565b806306fdde031461029a578063095ea7b3146102b857806317101940146102d857806318160ddd146102eb57806323b872dd14610300575b600080fd5b6102a2610580565b6040516102af91906140db565b60405180910390f35b6102cb6102c6366004613c99565b61060e565b6040516102af9190614034565b6102a26102e6366004613b13565b610625565b6102f361074f565b6040516102af919061403f565b6102cb61030e366004613beb565b610755565b6102cb6108d9565b6102f36108e8565b61032b61090c565b6040516102af91906145a1565b610340610915565b6040516102af929190614511565b6102f3610930565b61035e610936565b6040516102af9190613f0a565b610340610379366004613b13565b61094c565b61035e6109d7565b610399610394366004613b13565b6109e6565b6040516102af9392919061454a565b6103bb6103b6366004613b62565b610d7b565b005b6102a26110b8565b6102f36110dc565b6103e06103db366004613c99565b611183565b6040516102af949392919061451f565b6102f36103fe366004613b13565b611271565b6102f361128c565b6103bb6112d8565b61041b6113d5565b6040516102af91906144fd565b6103e0610436366004613c99565b6113eb565b61041b6114cc565b6102f3610451366004613b13565b6114db565b61045e6114ed565b6040516102af9190614590565b6102a2611500565b61047b61155b565b6040516102af91906144a7565b6102cb610496366004613c99565b6115e8565b6102f36116b7565b6103406104b1366004613cf7565b6116bd565b61041b611abb565b6102f36104cc366004613b13565b611ad1565b61045e611d82565b6103bb6104e7366004613d71565b611d95565b61035e612382565b6103bb610502366004613c2b565b612391565b6102f3610515366004613b2e565b612500565b6102f3610528366004613b13565b61252b565b61041b6127c6565b6102f36127d5565b6102f36127db565b61035e6127ed565b6102f36127fc565b61055d612802565b6040516102af9796959493929190614560565b6102f3612865565b6103bb61286b565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106065780601f106105db57610100808354040283529160200191610606565b820191906000526020600020905b8154815290600101906020018083116105e957829003601f168201915b505050505081565b600061061b3384846128af565b5060015b92915050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160088082528184019093526060926001600160a01b0385169291849160208201818036833701905050905060005b6004811015610744578260048583600c016020811061069657fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106106b657fe5b602001015160f81c60f81b8282600202815181106106d057fe5b60200101906001600160f81b031916908160001a905350828482600c01602081106106f757fe5b825191901a600f1690811061070857fe5b602001015160f81c60f81b82826002026001018151811061072557fe5b60200101906001600160f81b031916908160001a90535060010161067b565b50925050505b919050565b60095481565b6001600160a01b0383166000908152600a60205260408120548211156107965760405162461bcd60e51b815260040161078d90614375565b60405180910390fd5b6001600160a01b0384166000908152600b602090815260408083203384529091529020548211156107d95760405162461bcd60e51b815260040161078d90614192565b6001600160a01b0384166000908152600a6020526040902054610802908363ffffffff61291716565b6001600160a01b038086166000908152600a60205260408082209390935590851681522054610837908363ffffffff61293f16565b6001600160a01b038085166000908152600a60209081526040808320949094559187168152600b8252828120338252909152205461087b908363ffffffff61291716565b6001600160a01b038086166000818152600b60209081526040808320338452909152908190209390935591519085169190600080516020614619833981519152906108c790869061403f565b60405180910390a35060019392505050565b60005462010000900460ff1681565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60075460ff1681565b6003546001600160701b0380821692600160701b9092041690565b600c5481565b600054630100000090046001600160a01b031681565b600f54600e54604051638198edbf60e01b81526000916001600160a01b031690638198edbf90610980908690600401613f0a565b60206040518083038186803b15801561099857600080fd5b505afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190613cdf565b9050915091565b6001546001600160a01b031681565b600080548190819060ff1615610a0e5760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a0823190610a4b903090600401613f0a565b60206040518083038186803b158015610a6357600080fd5b505afa158015610a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9b9190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610ad1903090600401613f0a565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190613cdf565b6003549091506001600160701b0380821691600160701b900416610b4b848363ffffffff61291716565b9550610b5d838263ffffffff61291716565b945060008611610b7f5760405162461bcd60e51b815260040161078d906142ae565b600954610c0157610b928460115461296b565b8310610b9e5783610baa565b610baa83601154612995565b600580546001600160701b0319166001600160701b038316179055601154909750610bd690889061296b565b6005600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610cfd565b600082118015610c115750600081115b15610cfd576000610c228784612995565b90506000610c308784612995565b90506000828210610c415782610c43565b815b9050610c516009548261296b565b600554909a50610c8690610c6e906001600160701b03168361296b565b6005546001600160701b03169063ffffffff61293f16565b600580546001600160701b0319166001600160701b039283161790819055610cd391610cba91600160701b9004168361296b565b600554600160701b90046001600160701b03169061293f565b6005600e6101000a8154816001600160701b0302191690836001600160701b031602179055505050505b610d0788886129b3565b610d118484612aad565b6001600160a01b0388166000908152600a6020526040908190205490517f1c172440bdebb59cd92a7f08f4227903a3305ab6f880cb25f93eddb66843a10291610d5d918b918b91614013565b60405180910390a150506000805460ff191690555092949193509150565b600054610100900460ff1615610da35760405162461bcd60e51b815260040161078d9061410e565b6000805461ff0019166101001790556001600160a01b038781169087161415610dde5760405162461bcd60e51b815260040161078d90614242565b600180546001600160a01b03808a166001600160a01b03199283161790925560028054928916929091169190911790558215801590610e2c57506ec097ce7bc90715b34b9f10000000008311155b610e3557600080fd5b6011839055670de0b6b3a7640000821115610e4f57600080fd5b6010829055600f859055600e80546001600160a01b038087166001600160a01b0319909216919091179091556000805483158015620100000262ff000019948d166301000000026301000000600160b81b03199093169290921793909316179055610ed257600380546001600160e01b03164263ffffffff16600160e01b021790555b60408051808201825260018152605f60f81b602080830191909152825180840190935260038352620444c560ec1b90830152908082610f1030610625565b604051602001610f2293929190613eaa565b60405160208183030381529060405260089080519060200190610f469291906139dd565b50604080518082019091526003808252620444c560ec1b6020909201918252610f71916006916139dd565b50600160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc057600080fd5b505afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff89190613dd8565b6007805460ff191660ff9290921691909117905560405146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9061103f90600890613e3a565b60408051918290038220828201825260018352603160f81b602093840152905161109093927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69186913091016140af565b60408051601f198184030181529190528051602090910120600c555050505050505050505050565b60408051808201909152600981526844535020312e302e3160b81b60208201525b90565b6003546001546040516370a0823160e01b815260009261117e926001600160701b03909116916001600160a01b03909116906370a0823190611122903090600401613f0a565b60206040518083038186803b15801561113a57600080fd5b505afa15801561114e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111729190613cdf565b9063ffffffff61291716565b905090565b600080600080611191613a5b565b61119961155b565b90506111a58187612b3d565b600f54600e54604051638198edbf60e01b8152939850919550916000916001600160a01b031690638198edbf906111e0908c90600401613f0a565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190613cdf565b905061123c878261296b565b955061125c8661117261124f8a8661296b565b8a9063ffffffff61291716565b96508260a00151935050505092959194509250565b6001600160a01b03166000908152600a602052604090205490565b6003546002546040516370a0823160e01b815260009261117e92600160701b9091046001600160701b0316916001600160a01b03909116906370a0823190611122903090600401613f0a565b60055463ffffffff600160e01b90910416600214801561130857506005546003546001600160701b039182169116105b1561135057600580546003546001600160701b03808216600160701b600160e01b0390931692909217600160701b600160e01b031916600160701b9182900492909216021790555b60055463ffffffff600160e01b90910416600114801561138b57506005546003546001600160701b03600160701b9283900481169290910416105b156113d357600580546003546001600160701b03808216600160701b600160e01b0390931692909217600160701b600160e01b031916600160701b9182900492909216021790555b565b600554600160701b90046001600160701b031681565b6000806000806113f9613a5b565b61140161155b565b905061140d8187612c43565b600f54600e54604051638198edbf60e01b8152939850919550916000916001600160a01b031690638198edbf90611448908c90600401613f0a565b60206040518083038186803b15801561146057600080fd5b505afa158015611474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114989190613cdf565b90506114a4878261296b565b95506114b78661117261124f8a8661296b565b96508260800151935050505092959194509250565b6003546001600160701b031681565b600d6020526000908152604090205481565b600354600160e01b900463ffffffff1681565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106065780601f106105db57610100808354040283529160200191610606565b611563613a5b565b601154815260105460208201526003546001600160701b038082166040840152600160701b918290048116606084015260055480821660808501529182041660a0830152600160e01b900463ffffffff1660028111156115bf57fe5b8160c0019060028111156115cf57fe5b908160028111156115dc57fe5b9052506110d981612d44565b336000908152600a60205260408120548211156116175760405162461bcd60e51b815260040161078d90614375565b336000908152600a6020526040902054611637908363ffffffff61291716565b336000908152600a6020526040808220929092556001600160a01b03851681522054611669908363ffffffff61293f16565b6001600160a01b0384166000818152600a6020526040908190209290925590513390600080516020614619833981519152906116a690869061403f565b60405180910390a350600192915050565b600f5481565b60008054819060ff16156116e35760405162461bcd60e51b815260040161078d9061421f565b6000805460ff19166001179055428310156117105760405162461bcd60e51b815260040161078d9061445e565b336000908152600a602052604090205489111561173f5760405162461bcd60e51b815260040161078d9061434d565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611770903090600401613f0a565b60206040518083038186803b15801561178857600080fd5b505afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c09190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906117f6903090600401613f0a565b60206040518083038186803b15801561180e57600080fd5b505afa158015611822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118469190613cdf565b60095490915061186c81611860858f63ffffffff612dee16565b9063ffffffff612e2816565b945061188281611860848f63ffffffff612dee16565b93506118e06118c8826118bc8f600560009054906101000a90046001600160701b03166001600160701b0316612dee90919063ffffffff16565b9063ffffffff612e5216565b6005546001600160701b03169063ffffffff61291716565b600560006101000a8154816001600160701b0302191690836001600160701b0316021790555061195761193e826118bc8f6005600e9054906101000a90046001600160701b03166001600160701b0316612dee90919063ffffffff16565b600554600160701b90046001600160701b031690612917565b6005600e6101000a8154816001600160701b0302191690836001600160701b0316021790555089851015801561198d5750888410155b6119a95760405162461bcd60e51b815260040161078d90614320565b6119b3338d612e7f565b6119bd8b86612f4c565b6119c78b85612f6f565b6119cf612f92565b8615611a3e578a6001600160a01b0316632411d338338e88888d8d6040518763ffffffff1660e01b8152600401611a0b96959493929190613f80565b600060405180830381600087803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b505050505b7f55caccde83781f39bfc1296eff45655b6496729443a7d48958b18b3b685600a5338c8e600a6000336001600160a01b03166001600160a01b0316815260200190815260200160002054604051611a989493929190613f1e565b60405180910390a150506000805460ff1916905550909890975095505050505050565b600354600160701b90046001600160701b031681565b6000805460ff1615611af55760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a0823190611b32903090600401613f0a565b60206040518083038186803b158015611b4a57600080fd5b505afa158015611b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b829190613cdf565b600354909150600090611ba59083906001600160701b031663ffffffff61291716565b90506000806000611bb632856113eb565b9298509094509092509050611bcb8787612f6f565b600054611be890630100000090046001600160a01b031684612f6f565b806002811115611bf457fe5b600554600160e01b900463ffffffff908116911614611ca1576001600160701b03821115611c345760405162461bcd60e51b815260040161078d906143a1565b600580546001600160701b0319166001600160701b038416179055806002811115611c5b57fe5b6005601c6101000a81548163ffffffff021916908363ffffffff16021790555060008051602061463983398151915281604051611c98919061409a565b60405180910390a15b6002546040516370a0823160e01b8152611d2c9187916001600160a01b03909116906370a0823190611cd7903090600401613f0a565b60206040518083038186803b158015611cef57600080fd5b505afa158015611d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d279190613cdf565b612aad565b60015460025460405160008051602061465983398151915292611d65926001600160a01b039182169291169088908b9033908e90613fc0565b60405180910390a150506000805460ff1916905550919392505050565b600554600160e01b900463ffffffff1681565b60005460ff1615611db85760405162461bcd60e51b815260040161078d9061421f565b6000805460ff19166001179055611dcf8386612f4c565b611dd98385612f6f565b8015611e465760405163d5b9979760e01b81526001600160a01b0384169063d5b9979790611e139033908990899088908890600401613f47565b600060405180830381600087803b158015611e2d57600080fd5b505af1158015611e41573d6000803e3d6000fd5b505050505b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611e77903090600401613f0a565b60206040518083038186803b158015611e8f57600080fd5b505afa158015611ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec79190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190611efd903090600401613f0a565b60206040518083038186803b158015611f1557600080fd5b505afa158015611f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4d9190613cdf565b6003549091506001600160701b031682101580611f7c5750600354600160701b90046001600160701b03168110155b611f985760405162461bcd60e51b815260040161078d90614137565b6003546001600160701b031682101561216257600354600090611fcc908390600160701b90046001600160701b0316612917565b9050600080600080611fde3286611183565b600354939750919550935091508490612006906001600160701b03168963ffffffff61291716565b11156120245760405162461bcd60e51b815260040161078d90614137565b60005461204190630100000090046001600160a01b031684612f4c565b81600281111561204d57fe5b600554600160e01b900463ffffffff908116911614612103576001600160701b0381111561208d5760405162461bcd60e51b815260040161078d906143a1565b60058054600160701b600160e01b031916600160701b6001600160701b038416021790558160028111156120bd57fe5b6005601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614639833981519152826040516120fa919061409a565b60405180910390a15b600080516020614659833981519152600260009054906101000a90046001600160a01b0316600160009054906101000a90046001600160a01b03168787338f60405161215496959493929190613fc0565b60405180910390a150505050505b600354600160701b90046001600160701b031681101561232a5760035460009061219c9084906001600160701b031663ffffffff61291716565b90506000806000806121ae32866113eb565b6003549397509195509350915084906121d790600160701b90046001600160701b031688612917565b11156121f55760405162461bcd60e51b815260040161078d90614137565b60005461221290630100000090046001600160a01b031684612f6f565b81600281111561221e57fe5b600554600160e01b900463ffffffff9081169116146122cb576001600160701b0381111561225e5760405162461bcd60e51b815260040161078d906143a1565b600580546001600160701b0319166001600160701b03831617905581600281111561228557fe5b6005601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614639833981519152826040516122c2919061409a565b60405180910390a15b600080516020614659833981519152600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168787338f60405161231c96959493929190613fc0565b60405180910390a150505050505b612332612f92565b7f0b82e93068db15abd9fbb2682c65462ea8a0a10582dce93a5664818e296f54eb338689896040516123679493929190613f1e565b60405180910390a150506000805460ff191690555050505050565b6002546001600160a01b031681565b428410156123b15760405162461bcd60e51b815260040161078d906143c3565b600c546001600160a01b0388166000908152600d602090815260408083208054600181019091559051929392612412927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d9101614048565b60405160208183030381529060405280519060200120604051602001612439929190613eef565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051612476949392919061407c565b6020604051602081039080840390855afa158015612498573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906124ce5750886001600160a01b0316816001600160a01b0316145b6124ea5760405162461bcd60e51b815260040161078d906141e8565b6124f58989896128af565b505050505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b6000805460ff161561254f5760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660011781556002546040516370a0823160e01b81526001600160a01b03909116906370a082319061258c903090600401613f0a565b60206040518083038186803b1580156125a457600080fd5b505afa1580156125b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125dc9190613cdf565b600354909150600090612600908390600160701b90046001600160701b0316612917565b905060008060006126113285611183565b92985090945090925090506126268787612f4c565b60005461264390630100000090046001600160a01b031684612f4c565b80600281111561264f57fe5b600554600160e01b900463ffffffff908116911614612705576001600160701b0382111561268f5760405162461bcd60e51b815260040161078d906143a1565b60058054600160701b600160e01b031916600160701b6001600160701b038516021790558060028111156126bf57fe5b6005601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614639833981519152816040516126fc919061409a565b60405180910390a15b6001546040516370a0823160e01b815261278d916001600160a01b0316906370a0823190612737903090600401613f0a565b60206040518083038186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127879190613cdf565b86612aad565b60025460015460405160008051602061465983398151915292611d65926001600160a01b039182169291169088908b9033908e90613fc0565b6005546001600160701b031681565b60105481565b600061117e6127e861155b565b61315a565b600e546001600160a01b031681565b60115481565b6000806000806000806000612815613a5b565b61281d61155b565b905080600001519750806020015196508060400151955080606001519450806080015193508060a0015192508060c00151600281111561285957fe5b91505090919293949596565b60045481565b60005460ff161561288e5760405162461bcd60e51b815260040161078d9061421f565b6000805460ff191660011790556128a3612f92565b6000805460ff19169055565b6001600160a01b038084166000818152600b602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061290a90859061403f565b60405180910390a3505050565b6000828211156129395760405162461bcd60e51b815260040161078d906142fd565b50900390565b6000828201838110156129645760405162461bcd60e51b815260040161078d906143f1565b9392505050565b6000670de0b6b3a7640000612986848463ffffffff612dee16565b8161298d57fe5b049392505050565b60006129648261186085670de0b6b3a764000063ffffffff612dee16565b6103e881116129d45760405162461bcd60e51b815260040161078d90614162565b6001600160a01b0382166000908152600a60205260409020546129fd908263ffffffff61293f16565b6001600160a01b0383166000908152600a6020526040902055600954612a29908263ffffffff61293f16565b6009556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590612a6790849061403f565b60405180910390a2816001600160a01b031660006001600160a01b031660008051602061461983398151915283604051612aa1919061403f565b60405180910390a35050565b6001600160701b038211801590612acb57506001600160701b038111155b612ae75760405162461bcd60e51b815260040161078d906143a1565b600380546001600160701b03838116600160701b02600160701b600160e01b03199186166001600160701b0319909316929092171617905560005460ff620100009091041615612b3957612b3961324c565b5050565b600080808460c001516002811115612b5157fe5b1415612b6c57612b6184846132e1565b915060019050612c3c565b60018460c001516002811115612b7e57fe5b1415612b8e57612b618484613308565b6000612bab85606001518660a0015161291790919063ffffffff16565b90506000612bca8660800151876040015161291790919063ffffffff16565b905081851015612bf557612bde8686613325565b93506002925080841115612bf0578093505b612c39565b81851415612c095780935060009250612c39565b612c32612c2587612c20888663ffffffff61291716565b6132e1565b829063ffffffff61293f16565b9350600192505b50505b9250929050565b600080808460c001516002811115612c5757fe5b1415612c7257612c678484613360565b915060029050612c3c565b60018460c001516002811115612c8457fe5b1415612d2f576000612ca78560400151866080015161291790919063ffffffff16565b90506000612cc68660a00151876060015161291790919063ffffffff16565b905081851015612cf157612cda868661337f565b93506001925080841115612cec578093505b612d28565b81851415612d055780935060009250612d28565b612d21612c2587612d1c888663ffffffff61291716565b613360565b9350600292505b5050612c3c565b612d3984846133b1565b946002945092505050565b60028160c001516002811115612d5657fe5b1415612d9557612d8b8160600151612d7f8360800151846040015161291790919063ffffffff16565b835160208501516133d0565b60a0820152612deb565b60018160c001516002811115612da757fe5b1415612deb57612de58160400151612dd08360a00151846060015161291790919063ffffffff16565b8351612ddb906134f6565b84602001516133d0565b60808201525b50565b600082612dfd5750600061061f565b82820282848281612e0a57fe5b04146129645760405162461bcd60e51b815260040161078d90614484565b6000808211612e495760405162461bcd60e51b815260040161078d906142d5565b81838161298d57fe5b600080612e5f8484612e28565b905082810284038015612e775750600101905061061f565b50905061061f565b6001600160a01b0382166000908152600a6020526040902054612ea8908263ffffffff61291716565b6001600160a01b0383166000908152600a6020526040902055600954612ed4908263ffffffff61291716565b6009556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca590612f1290849061403f565b60405180910390a260006001600160a01b0316826001600160a01b031660008051602061461983398151915283604051612aa1919061403f565b8015612b3957600154612b39906001600160a01b0316838363ffffffff61351716565b8015612b3957600254612b39906001600160a01b0316838363ffffffff61351716565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612fc3903090600401613f0a565b60206040518083038186803b158015612fdb57600080fd5b505afa158015612fef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130139190613cdf565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190613049903090600401613f0a565b60206040518083038186803b15801561306157600080fd5b505afa158015613075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130999190613cdf565b90506001600160701b0382118015906130b957506001600160701b038111155b6130d55760405162461bcd60e51b815260040161078d906143a1565b6003546001600160701b0316821461310357600380546001600160701b0319166001600160701b0384161790555b600354600160701b90046001600160701b031681146131415760038054600160701b600160e01b031916600160701b6001600160701b038416021790555b60005462010000900460ff1615612b3957612b3961324c565b600060028260c00151600281111561316e57fe5b14156131f957606082015160a08301516000916131a49161319a9190611860908063ffffffff612dee16565b8460600151612995565b90506131e16131b784602001518361296b565b60208501516131d590670de0b6b3a76400009063ffffffff61291716565b9063ffffffff61293f16565b90506131f1836000015182612995565b91505061074a565b604082015160808301516000916132299161321f9190611860908063ffffffff612dee16565b8460400151612995565b905061323c6131b784602001518361296b565b90506131f183600001518261296b565b60035463ffffffff42811691600160e01b9004811682039081161580159061327e57506003546001600160701b031615155b801561329b5750600354600160701b90046001600160701b031615155b156132bb578063ffffffff166132af6127db565b60048054919092020190555b506003805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b600061296483608001518460800151846132fe87600001516134f6565b8760200151613572565b600061296483608001518460400151846132fe87600001516134f6565b60006129648360a0015161334684866060015161293f90919063ffffffff16565b60608601518651613356906134f6565b87602001516137f2565b60006129648360a001518460a001518486600001518760200151613572565b600061296483608001516133a084866040015161293f90919063ffffffff16565b6040860151865160208801516137f2565b60006129648360a0015184606001518486600001518760200151613572565b6000846133df575060006134ee565b81613405576133fe6133f1848661296b565b869063ffffffff61293f16565b90506134ee565b60008061341b600485028663ffffffff612dee16565b90508061343257670de0b6b3a764000091506134b2565b85818783028161343e57fe5b0414156134795761347261346d6ec097ce7bc90715b34b9f10000000006131d5848a028b63ffffffff612e2816565b6138cb565b91506134b2565b6134af61346d6ec097ce7bc90715b34b9f10000000006131d5896134a3868d63ffffffff612e2816565b9063ffffffff612dee16565b91505b60006134dc670de0b6b3a76400006131d56134d3868363ffffffff61291716565b88600202612995565b90506134e8888261296b565b93505050505b949350505050565b600061061f6ec097ce7bc90715b34b9f10000000008363ffffffff612e2816565b61356d8363a9059cbb60e01b8484604051602401613536929190613ffa565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613902565b505050565b60008086116135935760405162461bcd60e51b815260040161078d906141c0565b836135a0575060006137e9565b816135cd57846135b0848661296b565b116135c4576135bf838561296b565b6135c6565b845b90506137e9565b670de0b6b3a764000082141561368d576000806135f0858763ffffffff612dee16565b9050806136005760009150613659565b86818883028161360c57fe5b04141561363c57613635613626898063ffffffff612dee16565b8289029063ffffffff612e2816565b9150613659565b61365688611860876134a383838c8e63ffffffff612dee16565b91505b61368461367483670de0b6b3a764000063ffffffff61293f16565b611860898563ffffffff612dee16565b925050506137e9565b60006136ba6136a2858763ffffffff612dee16565b6131d5896134a38a611860898463ffffffff612dee16565b905060006136da876134a3670de0b6b3a76400008763ffffffff61291716565b905060008282106136f0575081900360006136f6565b50810360015b61370e82670de0b6b3a764000063ffffffff612e2816565b9150600061374561373260046134a3670de0b6b3a76400008a63ffffffff61291716565b6137408c6134a38a8f61296b565b61296b565b905061375e61346d826131d5868063ffffffff612dee16565b9050600061377f60026134a3670de0b6b3a76400008a63ffffffff61291716565b9050600083156137a057613799838663ffffffff61291716565b90506137b3565b6137b0858463ffffffff61293f16565b90505b60006137bf82846139bf565b90508b8111156137d95760009750505050505050506137e9565b8b0396506137e995505050505050565b95945050505050565b60008086116138135760405162461bcd60e51b815260040161078d906141c0565b6000613835613828878763ffffffff61291716565b859063ffffffff612dee16565b90508261385c5761385481670de0b6b3a764000063ffffffff612e2816565b9150506137e9565b600061387b613875886118608b8063ffffffff612dee16565b87612995565b90506000613889858361296b565b90506138be6ec097ce7bc90715b34b9f1000000000611860856134a3856131d5670de0b6b3a76400008c63ffffffff61291716565b9998505050505050505050565b80600160028204015b818110156138fc578091506002818285816138eb57fe5b0401816138f457fe5b0490506138d4565b50919050565b60006060836001600160a01b03168360405161391e9190613e1e565b6000604051808303816000865af19150503d806000811461395b576040519150601f19603f3d011682016040523d82523d6000602084013e613960565b606091505b5091509150816139825760405162461bcd60e51b815260040161078d90614279565b8051156139b9578080602001905181019061399d9190613cc3565b6139b95760405162461bcd60e51b815260040161078d90614414565b50505050565b6000612964826118bc85670de0b6b3a764000063ffffffff612dee16565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1e57805160ff1916838001178555613a4b565b82800160010185558215613a4b579182015b82811115613a4b578251825591602001919060010190613a30565b50613a57929150613aa2565b5090565b6040518060e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160006002811115613a9d57fe5b905290565b6110d991905b80821115613a575760008155600101613aa8565b80356001600160a01b038116811461061f57600080fd5b60008083601f840112613ae4578182fd5b50813567ffffffffffffffff811115613afb578182fd5b602083019150836020828501011115612c3c57600080fd5b600060208284031215613b24578081fd5b6129648383613abc565b60008060408385031215613b40578081fd5b613b4a8484613abc565b9150613b598460208501613abc565b90509250929050565b600080600080600080600080610100898b031215613b7e578384fd5b613b888a8a613abc565b9750613b978a60208b01613abc565b9650613ba68a60408b01613abc565b955060608901359450613bbc8a60808b01613abc565b935060a0890135925060c0890135915060e0890135613bda816145fb565b809150509295985092959890939650565b600080600060608486031215613bff578283fd5b8335613c0a816145e6565b92506020840135613c1a816145e6565b929592945050506040919091013590565b600080600080600080600060e0888a031215613c45578283fd5b613c4f8989613abc565b9650613c5e8960208a01613abc565b955060408801359450606088013593506080880135613c7c81614609565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613cab578182fd5b613cb58484613abc565b946020939093013593505050565b600060208284031215613cd4578081fd5b8151612964816145fb565b600060208284031215613cf0578081fd5b5051919050565b600080600080600080600060c0888a031215613d11578283fd5b873596506020880135613d23816145e6565b95506040880135945060608801359350608088013567ffffffffffffffff811115613d4c578384fd5b613d588a828b01613ad3565b989b979a5095989497959660a090950135949350505050565b600080600080600060808688031215613d88578081fd5b8535945060208601359350613da08760408801613abc565b9250606086013567ffffffffffffffff811115613dbb578182fd5b613dc788828901613ad3565b969995985093965092949392505050565b600060208284031215613de9578081fd5b815161296481614609565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008251613e308184602087016145ba565b9190910192915050565b6000808354600180821660008114613e595760018114613e7057613e9f565b60ff198316865260028304607f1686019350613e9f565b600283048786526020808720875b83811015613e975781548a820152908501908201613e7e565b505050860193505b509195945050505050565b60008451613ebc8184602089016145ba565b8451908301613ecf8282602089016145ba565b8451918101613ee28382602089016145ba565b9091019695505050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b600060018060a01b038716825285602083015284604083015260806060830152613f75608083018486613df4565b979650505050505050565b600060018060a01b038816825286602083015285604083015284606083015260a06080830152613fb460a083018486613df4565b98975050505050505050565b6001600160a01b0396871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b602081016140a7836145af565b825292915050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60006020825282518060208401526140fa8160408501602087016145ba565b601f01601f19169190910160400192915050565b6020808252600f908201526e1114d417d253925512505312569151608a1b604082015260600190565b60208082526011908201527011931054d217d313d05397d19052531151607a1b604082015260600190565b60208082526016908201527509a929ca8be829a9eaa9ca8be9c9ea8be8a9c9eaa8e960531b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b6020808252600e908201526d5441524745545f49535f5a45524f60901b604082015260600190565b6020808252601e908201527f444f444f5f4453505f4c503a20494e56414c49445f5349474e41545552450000604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252601a908201527f424153455f51554f54455f43414e5f4e4f545f42455f53414d45000000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600d908201526c1393d7d09054d157d253941555609a1b604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252601390820152720ae92a89088a482aebe9c9ea8be8a9c9eaa8e9606b1b604082015260600190565b6020808252600e908201526d08898a0be9c9ea8be8a9c9eaa8e960931b604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600890820152674f564552464c4f5760c01b604082015260600190565b6020808252601490820152731113d113d7d114d417d3140e881156141254915160621b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600c908201526b1512535157d156141254915160a21b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a08301526144f260c08401516145af565b60c083015292915050565b6001600160701b0391909116815260200190565b918252602082015260400190565b8481526020810184905260808101614536846145af565b604083015282606083015295945050505050565b9283526020830191909152604082015260600190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b806003811061074a57fe5b60005b838110156145d55781810151838201526020016145bd565b838111156139b95750506000910152565b6001600160a01b0381168114612deb57600080fd5b8015158114612deb57600080fd5b60ff81168114612deb57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdf176ad18be4f9f32efaa32f06e9d1175476504739a745f1399a6d3fa4b75917c2c0245e056d5fb095f04cd6373bc770802ebd1e6c918eb78fdef843cdb37b0fa26469706673582212207e43fe3c65a0960d957dd6869ff0e588f6bfb9fc4f4aaec6c20405c858f3167e64736f6c63430006090033
Deployed Bytecode Sourcemap
49116:2532:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25956:18;;;:::i;:::-;;;;;;;;;;;;;;;;33497:150;;;;;;;;;:::i;:::-;;;;;;;;51040:451;;;;;;;;;:::i;25983:26::-;;;:::i;:::-;;;;;;;;32722:525;;;;;;;;;:::i;25373:34::-;;;:::i;26344:117::-;;;:::i;25928:21::-;;;:::i;:::-;;;;;;;;28362:181;;;:::i;:::-;;;;;;;;;26201:31;;;:::i;25469:27::-;;;:::i;:::-;;;;;;;;28551:234;;;;;;;;;:::i;25505:26::-;;;:::i;45282:1973::-;;;;;;;;;:::i;:::-;;;;;;;;;;49161:1871;;;;;;;;;:::i;:::-;;51551:94;;;:::i;28838:152::-;;;:::i;44073:797::-;;;;;;;;;:::i;:::-;;;;;;;;;;;32312:115;;;;;;;;;:::i;28998:155::-;;;:::i;30593:538::-;;;:::i;25783:29::-;;;:::i;:::-;;;;;;;;43268:797;;;;;;;;;:::i;25574:29::-;;;:::i;26468:41::-;;;;;;;;;:::i;25647:36::-;;;:::i;:::-;;;;;;;;25901:20;;;:::i;26765:407::-;;;:::i;:::-;;;;;;;;31744:336;;;;;;;;;:::i;26625:28::-;;;:::i;47296:1649::-;;;;;;;;;:::i;25610:30::-;;;:::i;37695:1110::-;;;;;;;;;:::i;25819:22::-;;;:::i;39976:3232::-;;;;;;;;;:::i;25538:27::-;;;:::i;34990:1077::-;;;;;;;;;:::i;34205:132::-;;;;;;;;;:::i;38813:1155::-;;;;;;;;;:::i;25748:28::-;;;:::i;26660:18::-;;;:::i;27688:125::-;;;:::i;26576:40::-;;;:::i;26685:18::-;;;:::i;27180:500::-;;;:::i;:::-;;;;;;;;;;;;;;25696:43;;;:::i;30517:68::-;;;:::i;25956:18::-;;;;;;;;;;;;;;;-1:-1:-1;;25956:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33497:150::-;33563:4;33580:37;33589:10;33601:7;33610:6;33580:8;:37::i;:::-;-1:-1:-1;33635:4:0;33497:150;;;;;:::o;51040:451::-;51182:42;;;;;;;;;;;-1:-1:-1;;;51182:42:0;;;;51256:12;;51266:1;51256:12;;;;;;;;;51106:13;;-1:-1:-1;;;;;51156:14:0;;;51182:42;51106:13;;51256:12;;;;;;;;;;-1:-1:-1;;51237:31:0;-1:-1:-1;51284:9:0;51279:176;51303:1;51299;:5;51279:176;;;51339:8;51371:1;51354:5;51360:1;51364:2;51360:6;51354:13;;;;;;;;;;-1:-1:-1;;;;;51354:18:0;;;;51348:25;;51339:35;;;;;;;;;;;;;;;;;;51326:3;51330:1;51334;51330:5;51326:10;;;;;;;;;;;:48;-1:-1:-1;;;;;51326:48:0;;;;;;;;;51406:8;51421:5;51427:1;51431:2;51427:6;51421:13;;;;;;;51406:37;;51421:13;;;51437:4;51415:27;;51406:37;;;;;;;;;;;;;;51389:3;51397:1;51401;51397:5;51393:1;:9;51389:14;;;;;;;;;;;:54;-1:-1:-1;;;;;51389:54:0;;;;;;;;-1:-1:-1;51306:3:0;;51279:176;;;-1:-1:-1;51479:3:0;-1:-1:-1;;;51040:451:0;;;;:::o;25983:26::-;;;;:::o;32722:525::-;-1:-1:-1;;;;;32871:14:0;;32836:4;32871:14;;;:8;:14;;;;;;32861:24;;;32853:55;;;;-1:-1:-1;;;32853:55:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32937:15:0;;;;;;:9;:15;;;;;;;;32953:10;32937:27;;;;;;;;32927:37;;;32919:70;;;;-1:-1:-1;;;32919:70:0;;;;;;;;;-1:-1:-1;;;;;33019:14:0;;;;;;:8;:14;;;;;;:26;;33038:6;33019:26;:18;:26;:::i;:::-;-1:-1:-1;;;;;33002:14:0;;;;;;;:8;:14;;;;;;:43;;;;33071:12;;;;;;;:24;;33088:6;33071:24;:16;:24;:::i;:::-;-1:-1:-1;;;;;33056:12:0;;;;;;;:8;:12;;;;;;;;:39;;;;33136:15;;;;;:9;:15;;;;;33152:10;33136:27;;;;;;;:39;;33168:6;33136:39;:31;:39;:::i;:::-;-1:-1:-1;;;;;33106:15:0;;;;;;;:9;:15;;;;;;;;33122:10;33106:27;;;;;;;;;:69;;;;33191:26;;;;;;33106:15;-1:-1:-1;;;;;;;;;;;33191:26:0;;;33210:6;;33191:26;;;;;;;;;;-1:-1:-1;33235:4:0;32722:525;;;;;:::o;25373:34::-;;;;;;;;;:::o;26344:117::-;26395:66;26344:117;:::o;25928:21::-;;;;;;:::o;28362:181::-;28480:14;;-1:-1:-1;;;;;28480:14:0;;;;-1:-1:-1;;;28520:15:0;;;;;28362:181::o;26201:31::-;;;;:::o;25469:27::-;;;;;;-1:-1:-1;;;;;25469:27:0;;:::o;28551:234::-;28705:13;;28741:19;;:36;;-1:-1:-1;;;28741:36:0;;28639:17;;-1:-1:-1;;;;;28741:19:0;;:30;;:36;;28772:4;;28741:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28729:48;;28551:234;;;:::o;25505:26::-;;;-1:-1:-1;;;;;25505:26:0;;:::o;45282:1973::-;45389:14;25088:9;;45389:14;;;;25088:9;;25087:10;25079:32;;;;-1:-1:-1;;;25079:32:0;;;;;;;;;25122:9;:16;;-1:-1:-1;;25122:16:0;25134:4;25122:16;;;;;45518:12;:37:::1;::::0;-1:-1:-1;;;45518:37:0;;-1:-1:-1;;;;;45518:12:0;;::::1;::::0;:22:::1;::::0;:37:::1;::::0;45549:4:::1;::::0;45518:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45589:13;::::0;:38:::1;::::0;-1:-1:-1;;;45589:38:0;;45496:59;;-1:-1:-1;45566:20:0::1;::::0;-1:-1:-1;;;;;45589:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;45621:4:::1;::::0;45589:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45660:14;::::0;45566:61;;-1:-1:-1;;;;;;45660:14:0;;::::1;::::0;-1:-1:-1;;;45708:15:0;::::1;;45748:28;:11:::0;45660:14;45748:28:::1;:15;:28;:::i;:::-;45736:40:::0;-1:-1:-1;45800:30:0::1;:12:::0;45817;45800:30:::1;:16;:30;:::i;:::-;45787:43;;45861:1;45849:9;:13;45841:39;;;;-1:-1:-1::0;;;45841:39:0::1;;;;;;;;;46077:11;::::0;46073:1047:::1;;46173:38;46194:11;46207:3;;46173:20;:38::i;:::-;46158:12;:53;:143;;46290:11;46158:143;;;46231:39;46252:12;46266:3;;46231:20;:39::i;:::-;46316:13;:31:::0;;-1:-1:-1;;;;;;46316:31:0::1;-1:-1:-1::0;;;;;46316:31:0;::::1;;::::0;;46416:3:::1;::::0;46316:31;;-1:-1:-1;46387:33:0::1;::::0;46316:31;;46387:20:::1;:33::i;:::-;46362:14;;:59;;;;;-1:-1:-1::0;;;;;46362:59:0::1;;;;;-1:-1:-1::0;;;;;46362:59:0::1;;;;;;46073:1047;;;46457:1;46443:11;:15;:35;;;;;46477:1;46462:12;:16;46443:35;46439:681;;;46531:22;46556:44;46577:9;46588:11;46556:20;:44::i;:::-;46531:69;;46615:23;46641:46;46662:10;46674:12;46641:20;:46::i;:::-;46615:72;;46702:17;46740:14;46722:15;:32;:67;;46775:14;46722:67;;;46757:15;46722:67;46702:87;;46813:44;46834:11;;46847:9;46813:20;:44::i;:::-;46954:13;::::0;46804:53;;-1:-1:-1;46898:83:0::1;::::0;46925:55:::1;::::0;-1:-1:-1;;;;;46954:13:0::1;46970:9:::0;46925:20:::1;:55::i;:::-;46906:13;::::0;-1:-1:-1;;;;;46906:13:0::1;::::0;46898:83:::1;:26;:83;:::i;:::-;46874:13;:108:::0;;-1:-1:-1;;;;;;46874:108:0::1;-1:-1:-1::0;;;;;46874:108:0;;::::1;;::::0;;;;47022:85:::1;::::0;47050:56:::1;::::0;-1:-1:-1;;;47079:14:0;::::1;;47096:9:::0;47050:20:::1;:56::i;:::-;47030:14;::::0;-1:-1:-1;;;47030:14:0;::::1;-1:-1:-1::0;;;;;47030:14:0::1;::::0;47022:27:::1;:85::i;:::-;46997:14;;:111;;;;;-1:-1:-1::0;;;;;46997:111:0::1;;;;;-1:-1:-1::0;;;;;46997:111:0::1;;;;;;46439:681;;;;47130:17;47136:2;47140:6;47130:5;:17::i;:::-;47158:38;47170:11;47183:12;47158:11;:38::i;:::-;-1:-1:-1::0;;;;;47234:12:0;::::1;;::::0;;;:8:::1;:12;::::0;;;;;;;47212:35;;::::1;::::0;::::1;::::0;47222:2;;47226:6;;47212:35:::1;;;;;;;;;;-1:-1:-1::0;;25173:5:0;25161:17;;-1:-1:-1;;25161:17:0;;;-1:-1:-1;45282:1973:0;;;;-1:-1:-1;45282:1973:0;-1:-1:-1;45282:1973:0:o;49161:1871::-;49438:17;;;;;;;49437:18;49429:46;;;;-1:-1:-1;;;49429:46:0;;;;;;;;;49486:17;:24;;-1:-1:-1;;49486:24:0;;;;;-1:-1:-1;;;;;49539:37:0;;;;;;;;49531:76;;;;-1:-1:-1;;;49531:76:0;;;;;;;;;49618:12;:39;;-1:-1:-1;;;;;49618:39:0;;;-1:-1:-1;;;;;;49618:39:0;;;;;;;49668:13;:41;;;;;;;;;;;;;;;49730:5;;;;;:20;;;49744:6;49739:1;:11;;49730:20;49722:29;;;;;;49762:3;:7;;;49795:6;49790:11;;;49782:20;;;;;;49813:3;:7;;;49833:13;:25;;;49869:19;:51;;-1:-1:-1;;;;;49869:51:0;;;-1:-1:-1;;;;;;49869:51:0;;;;;;;;;;-1:-1:-1;49931:25:0;;49969:27;;;;;;-1:-1:-1;;49931:25:0;;;;;-1:-1:-1;;;;;;49931:25:0;;;;;;;49969:27;;;;;;;50007:72;;50023:22;:56;;-1:-1:-1;;;;;50023:56:0;50055:15;:23;;-1:-1:-1;;;50023:56:0;;;;50007:72;50092:27;;;;;;;;;;;-1:-1:-1;;;50092:27:0;;;;;;;;50130:28;;;;;;;;;;;-1:-1:-1;;;50130:28:0;;;;50092:27;50130:28;50092:27;50219:35;50248:4;50219:20;:35::i;:::-;50185:70;;;;;;;;;;;;;;;;;;;;;;;;50171:4;:85;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50267:14:0;;;;;;;;;;;;;-1:-1:-1;;;50267:14:0;;;;;;;;;:6;;:14;:::i;:::-;;50303:12;;;;;;;;;-1:-1:-1;;;;;50303:12:0;-1:-1:-1;;;;;50303:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50292:8;:34;;-1:-1:-1;;50292:34:0;;;;;;;;;;;;50791:22;;50487:9;;50706:66;;50791:22;;50807:4;;50791:22;;;;;;;;;;;;50842:10;;;;;;;;-1:-1:-1;;;50842:10:0;;;;;50560:366;;;;;50832:21;;50872:7;;50906:4;;50560:366;;;;;;;-1:-1:-1;;50560:366:0;;;;;;;;;50536:401;;50560:366;50536:401;;;;50517:16;:420;-1:-1:-1;;;;;;;;;;;49161:1871:0:o;51551:94::-;51619:18;;;;;;;;;;;;-1:-1:-1;;;51619:18:0;;;;51551:94;;:::o;28838:152::-;28966:14;;;28916:12;:37;;-1:-1:-1;;;28916:37:0;;28883:13;;28916:66;;-1:-1:-1;;;;;28966:14:0;;;;-1:-1:-1;;;;;28916:12:0;;;;:22;;:37;;28947:4;;28916:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;:66;:41;:66;:::i;:::-;28909:73;;28838:152;:::o;44073:797::-;44199:25;44239:13;44267:27;44309:22;44359:32;;:::i;:::-;44394:13;:11;:13::i;:::-;44359:48;;44451;44477:5;44484:14;44451:25;:48::i;:::-;44532:13;;44576:19;;:38;;-1:-1:-1;;;44576:38:0;;44418:81;;-1:-1:-1;44418:81:0;;-1:-1:-1;44532:13:0;44512:17;;-1:-1:-1;;;;;44576:19:0;;:30;;:38;;44607:6;;44576:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44556:58;;44633:50;44654:17;44673:9;44633:20;:50::i;:::-;44625:58;;44714:112;44820:5;44714:87;44750:50;44771:17;44790:9;44750:20;:50::i;:::-;44714:17;;:87;:35;:87;:::i;:112::-;44694:132;;44854:5;:8;;;44837:25;;44073:797;;;;;;;;;;:::o;32312:115::-;-1:-1:-1;;;;;32404:15:0;32369;32404;;;:8;:15;;;;;;;32312:115::o;28998:155::-;29128:15;;29077:13;;:38;;-1:-1:-1;;;29077:38:0;;29044:13;;29077:68;;-1:-1:-1;;;29128:15:0;;;-1:-1:-1;;;;;29128:15:0;;-1:-1:-1;;;;;29077:13:0;;;;:23;;:38;;29109:4;;29077:38;;;;30593:538;30640:8;;:47;-1:-1:-1;;;30640:8:0;;;;30659:27;30640:47;:79;;;;-1:-1:-1;30706:13:0;;30691:14;;-1:-1:-1;;;;;30706:13:0;;;30691:14;;:28;30640:79;30636:238;;;30734:8;:40;;30803:14;;-1:-1:-1;;;;;30803:14:0;;;-1:-1:-1;;;;;;;30787:30:0;;;;;;;-1:-1:-1;;;;;;;;30830:32:0;-1:-1:-1;;;30847:15:0;;;;;;;;30830:32;;;;30636:238;30888:8;;:47;-1:-1:-1;;;30888:8:0;;;;30907:27;30888:47;:81;;;;-1:-1:-1;30955:14:0;;30939:15;;-1:-1:-1;;;;;;;;30955:14:0;;;;;;30939:15;;;;;:30;30888:81;30884:240;;;30984:8;:40;;31053:14;;-1:-1:-1;;;;;31053:14:0;;;-1:-1:-1;;;;;;;31037:30:0;;;;;;;-1:-1:-1;;;;;;;;31080:32:0;-1:-1:-1;;;31097:15:0;;;;;;;;31080:32;;;;30884:240;30593:538::o;25783:29::-;;;-1:-1:-1;;;25783:29:0;;-1:-1:-1;;;;;25783:29:0;;:::o;43268:797::-;43392:26;43433:13;43461:27;43503:21;43552:32;;:::i;:::-;43587:13;:11;:13::i;:::-;43552:48;;43645:46;43670:5;43677:13;43645:24;:46::i;:::-;43724:13;;43768:19;;:38;;-1:-1:-1;;;43768:38:0;;43611:80;;-1:-1:-1;43611:80:0;;-1:-1:-1;43724:13:0;43704:17;;-1:-1:-1;;;;;43768:19:0;;:30;;:38;;43799:6;;43768:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43748:58;;43825:51;43846:18;43866:9;43825:20;:51::i;:::-;43817:59;;43908:114;44016:5;43908:89;43945:51;43966:18;43986:9;43945:20;:51::i;43908:114::-;43887:135;;44049:5;:8;;;44033:24;;43268:797;;;;;;;;;;:::o;25574:29::-;;;-1:-1:-1;;;;;25574:29:0;;:::o;26468:41::-;;;;;;;;;;;;;:::o;25647:36::-;;;-1:-1:-1;;;25647:36:0;;;;;:::o;25901:20::-;;;;;;;;;;;;;;;-1:-1:-1;;25901:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26765:407;26809:32;;:::i;:::-;26864:3;;26854:13;;26888:3;;26878:7;;;:13;26912:14;;-1:-1:-1;;;;;26912:14:0;;;26902:7;;;:24;-1:-1:-1;;;26947:15:0;;;;;;26937:7;;;:25;26984:13;;;;;26973:8;;;:24;27059:14;;;;27048:8;;;:25;-1:-1:-1;;;27112:8:0;;;;27094:27;;;;;;;;27084:5;:7;;:37;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27132:32:0;27158:5;27132:25;:32::i;31744:336::-;31850:10;31806:4;31841:20;;;:8;:20;;;;;;31831:30;;;31823:61;;;;-1:-1:-1;;;31823:61:0;;;;;;;;;31929:10;31920:20;;;;:8;:20;;;;;;:32;;31945:6;31920:32;:24;:32;:::i;:::-;31906:10;31897:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;31978:12:0;;;;;;:24;;31995:6;31978:24;:16;:24;:::i;:::-;-1:-1:-1;;;;;31963:12:0;;;;;;:8;:12;;;;;;;:39;;;;32018:32;;32027:10;;-1:-1:-1;;;;;;;;;;;32018:32:0;;;32043:6;;32018:32;;;;;;;;;;-1:-1:-1;32068:4:0;31744:336;;;;:::o;26625:28::-;;;;:::o;47296:1649::-;47531:18;25088:9;;47531:18;;25088:9;;25087:10;25079:32;;;;-1:-1:-1;;;25079:32:0;;;;;;;;;25122:9;:16;;-1:-1:-1;;25122:16:0;25134:4;25122:16;;;47603:15:::1;47591:27:::0;::::1;;47583:52;;;;-1:-1:-1::0;;;47583:52:0::1;;;;;;;;;47678:10;47669:20;::::0;;;:8:::1;:20;::::0;;;;;47654:35;::::1;;47646:62;;;;-1:-1:-1::0;;;47646:62:0::1;;;;;;;;;47743:12;::::0;:37:::1;::::0;-1:-1:-1;;;47743:37:0;;47721:19:::1;::::0;-1:-1:-1;;;;;47743:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;47774:4:::1;::::0;47743:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47814:13;::::0;:38:::1;::::0;-1:-1:-1;;;47814:38:0;;47721:59;;-1:-1:-1;47791:20:0::1;::::0;-1:-1:-1;;;;;47814:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;47846:4:::1;::::0;47814:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47885:11;::::0;47791:61;;-1:-1:-1;47922:45:0::1;47885:11:::0;47922:28:::1;:11:::0;47938;47922:28:::1;:15;:28;:::i;:::-;:32:::0;:45:::1;:32;:45;:::i;:::-;47909:58:::0;-1:-1:-1;47992:46:0::1;48026:11:::0;47992:29:::1;:12:::0;48009:11;47992:29:::1;:16;:29;:::i;:46::-;47978:60;;48075:88;48102:60;48150:11;48102:39;48129:11;48110:13;;;;;;;;;-1:-1:-1::0;;;;;48110:13:0::1;-1:-1:-1::0;;;;;48102:22:0::1;:26;;:39;;;;:::i;:::-;:47:::0;:60:::1;:47;:60;:::i;:::-;48083:13;::::0;-1:-1:-1;;;;;48083:13:0::1;::::0;48075:88:::1;:26;:88;:::i;:::-;48051:13;;:113;;;;;-1:-1:-1::0;;;;;48051:113:0::1;;;;;-1:-1:-1::0;;;;;48051:113:0::1;;;;;;48200:90;48228:61;48277:11;48228:40;48256:11;48236:14;;;;;;;;;-1:-1:-1::0;;;;;48236:14:0::1;-1:-1:-1::0;;;;;48228:23:0::1;:27;;:40;;;;:::i;:61::-;48208:14;::::0;-1:-1:-1;;;48208:14:0;::::1;-1:-1:-1::0;;;;;48208:14:0::1;::::0;48200:27:::1;:90::i;:::-;48175:14;;:116;;;;;-1:-1:-1::0;;;;;48175:116:0::1;;;;;-1:-1:-1::0;;;;;48175:116:0::1;;;;;;48340:13;48326:10;:27;;:60;;;;;48372:14;48357:11;:29;;48326:60;48304:129;;;;-1:-1:-1::0;;;48304:129:0::1;;;;;;;;;48446:30;48452:10;48464:11;48446:5;:30::i;:::-;48487:32;48504:2;48508:10;48487:16;:32::i;:::-;48530:34;48548:2;48552:11;48530:17;:34::i;:::-;48575:7;:5;:7::i;:::-;48599:15:::0;;48595:264:::1;;48671:2;-1:-1:-1::0;;;;;48659:32:0::1;;48710:10;48739:11;48769:10;48798:11;48828:4;;48659:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48595:264;48876:61;48887:10;48899:2;48903:11;48916:8;:20;48925:10;-1:-1:-1::0;;;;;48916:20:0::1;-1:-1:-1::0;;;;;48916:20:0::1;;;;;;;;;;;;;48876:61;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;25173:5:0;25161:17;;-1:-1:-1;;25161:17:0;;;-1:-1:-1;47296:1649:0;;;;-1:-1:-1;47296:1649:0;-1:-1:-1;;;;;;47296:1649:0:o;25610:30::-;;;-1:-1:-1;;;25610:30:0;;-1:-1:-1;;;;;25610:30:0;;:::o;37695:1110::-;37760:26;25088:9;;;;25087:10;25079:32;;;;-1:-1:-1;;;25079:32:0;;;;;;;;;25122:9;:16;;-1:-1:-1;;25122:16:0;25134:4;25122:16;;;;;37821:12;:37:::1;::::0;-1:-1:-1;;;37821:37:0;;-1:-1:-1;;;;;37821:12:0;;::::1;::::0;:22:::1;::::0;:37:::1;::::0;37852:4:::1;::::0;37821:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37913:14;::::0;37799:59;;-1:-1:-1;37869:17:0::1;::::0;37889:40:::1;::::0;37799:59;;-1:-1:-1;;;;;37913:14:0::1;37889:40;:15;:40;:::i;:::-;37869:60;;37940:13;37964:21:::0;37996:27:::1;38090:35;38104:9;38115;38090:13;:35::i;:::-;38034:91:::0;;-1:-1:-1;38034:91:0;;-1:-1:-1;38034:91:0;;-1:-1:-1;38034:91:0;-1:-1:-1;38138:41:0::1;38156:2:::0;38034:91;38138:17:::1;:41::i;:::-;38208:12;::::0;38190:38:::1;::::0;38208:12;;::::1;-1:-1:-1::0;;;;;38208:12:0::1;38222:5:::0;38190:17:::1;:38::i;:::-;38290:9;38283:17;;;;;;;;38271:8;::::0;-1:-1:-1;;;38271:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;38267:245;;-1:-1:-1::0;;;;;38325:28:0;::::1;;38317:49;;;;-1:-1:-1::0;;;38317:49:0::1;;;;;;;;;38381:13;:38:::0;;-1:-1:-1;;;;;;38381:38:0::1;-1:-1:-1::0;;;;;38381:38:0;::::1;;::::0;;38452:9;38445:17:::1;::::0;::::1;;;;;;38434:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;38490:9:0::1;38482:18;;;;;;;;;;;;;;;38267:245;38549:13;::::0;:38:::1;::::0;-1:-1:-1;;;38549:38:0;;38524:64:::1;::::0;38536:11;;-1:-1:-1;;;;;38549:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;38581:4:::1;::::0;38549:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38524:11;:64::i;:::-;38637:12;::::0;38673:13:::1;::::0;38606:191:::1;::::0;-1:-1:-1;;;;;;;;;;;38606:191:0;::::1;::::0;-1:-1:-1;;;;;38637:12:0;;::::1;::::0;38673:13;::::1;::::0;38702:9;;38726:18;;38759:10:::1;::::0;38784:2;;38606:191:::1;;;;;;;;;;-1:-1:-1::0;;25173:5:0;25161:17;;-1:-1:-1;;25161:17:0;;;-1:-1:-1;37695:1110:0;;;-1:-1:-1;;;37695:1110:0:o;25819:22::-;;;-1:-1:-1;;;25819:22:0;;;;;:::o;39976:3232::-;25088:9;;;;25087:10;25079:32;;;;-1:-1:-1;;;25079:32:0;;;;;;;;;25122:9;:16;;-1:-1:-1;;25122:16:0;25134:4;25122:16;;;40154:37:::1;40171:7:::0;40180:10;40154:16:::1;:37::i;:::-;40202:39;40220:7;40229:11;40202:17;:39::i;:::-;40258:15:::0;;40254:114:::1;;40288:80;::::0;-1:-1:-1;;;40288:80:0;;-1:-1:-1;;;;;40288:37:0;::::1;::::0;::::1;::::0;:80:::1;::::0;40326:10:::1;::::0;40338;;40350:11;;40363:4;;;;40288:80:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40254:114;40403:12;::::0;:37:::1;::::0;-1:-1:-1;;;40403:37:0;;40381:19:::1;::::0;-1:-1:-1;;;;;40403:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;40434:4:::1;::::0;40403:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40474:13;::::0;:38:::1;::::0;-1:-1:-1;;;40474:38:0;;40381:59;;-1:-1:-1;40451:20:0::1;::::0;-1:-1:-1;;;;;40474:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;40506:4:::1;::::0;40474:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40596:14;::::0;40451:61;;-1:-1:-1;;;;;;40596:14:0::1;40581:29:::0;::::1;;::::0;:64:::1;;-1:-1:-1::0;40630:15:0::1;::::0;-1:-1:-1;;;40630:15:0;::::1;-1:-1:-1::0;;;;;40630:15:0::1;40614:31:::0;::::1;;40581:64;40559:131;;;;-1:-1:-1::0;;;40559:131:0::1;;;;;;;;;40787:14;::::0;-1:-1:-1;;;;;40787:14:0::1;40773:28:::0;::::1;40769:1131;;;40864:15;::::0;40818:18:::1;::::0;40839:42:::1;::::0;:12;;-1:-1:-1;;;40864:15:0;::::1;-1:-1:-1::0;;;;;40864:15:0::1;40839:16;:42::i;:::-;40818:63;;40915:25;40959:13:::0;40991:27:::1;41037:22:::0;41077:37:::1;41092:9;41103:10;41077:14;:37::i;:::-;41202:14;::::0;40896:218;;-1:-1:-1;40896:218:0;;-1:-1:-1;40896:218:0;-1:-1:-1;40896:218:0;-1:-1:-1;40896:218:0;;41194:40:::1;::::0;-1:-1:-1;;;;;41202:14:0::1;41222:11:::0;41194:40:::1;:27;:40;:::i;:::-;:61;;41168:140;;;;-1:-1:-1::0;;;41168:140:0::1;;;;;;;;;41342:12;::::0;41325:37:::1;::::0;41342:12;;::::1;-1:-1:-1::0;;;;;41342:12:0::1;41356:5:::0;41325:16:::1;:37::i;:::-;41400:9;41393:17;;;;;;;;41381:8;::::0;-1:-1:-1;;;41381:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;41377:268;;-1:-1:-1::0;;;;;41439:29:0;::::1;;41431:50;;;;-1:-1:-1::0;;;41431:50:0::1;;;;;;;;;41500:14;:40:::0;;-1:-1:-1;;;;;;;;41500:40:0::1;-1:-1:-1::0;;;;;;;;41500:40:0;::::1;;;::::0;;41577:9;41570:17:::1;::::0;::::1;;;;;;41559:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;41619:9:0::1;41611:18;;;;;;;;;;;;;;;41377:268;-1:-1:-1::0;;;;;;;;;;;41699:13:0::1;;;;;;;;;-1:-1:-1::0;;;;;41699:13:0::1;41740:12;;;;;;;;;-1:-1:-1::0;;;;;41740:12:0::1;41772:10;41801:17;41837:10;41866:7;41664:224;;;;;;;;;;;;;;;;;;;;40769:1131;;;;;;41996:15;::::0;-1:-1:-1;;;41996:15:0;::::1;-1:-1:-1::0;;;;;41996:15:0::1;41981:30:::0;::::1;41977:1127;;;42072:14;::::0;42028:17:::1;::::0;42048:40:::1;::::0;:11;;-1:-1:-1;;;;;42072:14:0::1;42048:40;:15;:40;:::i;:::-;42028:60;;42122:26;42167:13:::0;42199:27:::1;42245:21:::0;42284:35:::1;42298:9;42309;42284:13;:35::i;:::-;42405:15;::::0;42103:216;;-1:-1:-1;42103:216:0;;-1:-1:-1;42103:216:0;-1:-1:-1;42103:216:0;-1:-1:-1;42103:216:0;;42397:42:::1;::::0;-1:-1:-1;;;42405:15:0;::::1;-1:-1:-1::0;;;;;42405:15:0::1;42426:12:::0;42397:28:::1;:42::i;:::-;:64;;42371:143;;;;-1:-1:-1::0;;;42371:143:0::1;;;;;;;;;42549:12;::::0;42531:38:::1;::::0;42549:12;;::::1;-1:-1:-1::0;;;;;42549:12:0::1;42563:5:::0;42531:17:::1;:38::i;:::-;42607:9;42600:17;;;;;;;;42588:8;::::0;-1:-1:-1;;;42588:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;42584:265;;-1:-1:-1::0;;;;;42646:28:0;::::1;;42638:49;;;;-1:-1:-1::0;;;42638:49:0::1;;;;;;;;;42706:13;:38:::0;;-1:-1:-1;;;;;;42706:38:0::1;-1:-1:-1::0;;;;;42706:38:0;::::1;;::::0;;42781:9;42774:17:::1;::::0;::::1;;;;;;42763:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;42823:9:0::1;42815:18;;;;;;;;;;;;;;;42584:265;-1:-1:-1::0;;;;;;;;;;;42903:12:0::1;;;;;;;;;-1:-1:-1::0;;;;;42903:12:0::1;42943:13;;;;;;;;;-1:-1:-1::0;;;;;42943:13:0::1;42976:9;43004:18;43041:10;43070:7;42868:224;;;;;;;;;;;;;;;;;;;;41977:1127;;;;;;43116:7;:5;:7::i;:::-;43141:59;43155:10;43167:7;43176:10;43188:11;43141:59;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;25173:5:0;25161:17;;-1:-1:-1;;25161:17:0;;;-1:-1:-1;;;;;39976:3232:0:o;25538:27::-;;;-1:-1:-1;;;;;25538:27:0;;:::o;34990:1077::-;35212:15;35200:8;:27;;35192:60;;;;-1:-1:-1;;;35192:60:0;;;;;;;;;35393:16;;-1:-1:-1;;;;;35665:13:0;;35263:14;35665:13;;;:6;:13;;;;;;;;:15;;;;;;;;35468:278;;35263:14;;35393:16;35468:278;;26395:66;;35555:5;;35591:7;;35629:5;;35665:15;35711:8;;35468:278;;;;;;;;;;;;;;;;35432:337;;;;;;35321:467;;;;;;;;;;;;;;;;;;;;;;;35293:510;;;;;;35263:540;;35814:24;35841:26;35851:6;35859:1;35862;35865;35841:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35841:26:0;;-1:-1:-1;;35841:26:0;;;-1:-1:-1;;;;;;;35900:30:0;;;;;;:59;;;35954:5;-1:-1:-1;;;;;35934:25:0;:16;-1:-1:-1;;;;;35934:25:0;;35900:59;35878:139;;;;-1:-1:-1;;;35878:139:0;;;;;;;;;36028:31;36037:5;36044:7;36053:5;36028:8;:31::i;:::-;34990:1077;;;;;;;;;:::o;34205:132::-;-1:-1:-1;;;;;34304:16:0;;;34277:7;34304:16;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;34205:132::o;38813:1155::-;38879:25;25088:9;;;;25087:10;25079:32;;;;-1:-1:-1;;;25079:32:0;;;;;;;;;25122:9;:16;;-1:-1:-1;;25122:16:0;25134:4;25122:16;;;38940:13:::1;::::0;:38:::1;::::0;-1:-1:-1;;;38940:38:0;;-1:-1:-1;;;;;38940:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;38972:4:::1;::::0;38940:38:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39035:15;::::0;38917:61;;-1:-1:-1;38989:18:0::1;::::0;39010:42:::1;::::0;38917:61;;-1:-1:-1;;;39035:15:0;::::1;-1:-1:-1::0;;;;;39035:15:0::1;39010:16;:42::i;:::-;38989:63;;39063:13;39087:22:::0;39120:27:::1;39214:74;39243:9;39267:10;39214:14;:74::i;:::-;39158:130:::0;;-1:-1:-1;39158:130:0;;-1:-1:-1;39158:130:0;;-1:-1:-1;39158:130:0;-1:-1:-1;39301:39:0::1;39318:2:::0;39158:130;39301:16:::1;:39::i;:::-;39368:12;::::0;39351:37:::1;::::0;39368:12;;::::1;-1:-1:-1::0;;;;;39368:12:0::1;39382:5:::0;39351:16:::1;:37::i;:::-;39450:9;39443:17;;;;;;;;39431:8;::::0;-1:-1:-1;;;39431:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;39427:248;;-1:-1:-1::0;;;;;39485:29:0;::::1;;39477:50;;;;-1:-1:-1::0;;;39477:50:0::1;;;;;;;;;39542:14;:40:::0;;-1:-1:-1;;;;;;;;39542:40:0::1;-1:-1:-1::0;;;;;;;;39542:40:0;::::1;;;::::0;;39615:9;39608:17:::1;::::0;::::1;;;;;;39597:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;39653:9:0::1;39645:18;;;;;;;;;;;;;;;39427:248;39699:12;::::0;:37:::1;::::0;-1:-1:-1;;;39699:37:0;;39687:64:::1;::::0;-1:-1:-1;;;;;39699:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;39730:4:::1;::::0;39699:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39738:12;39687:11;:64::i;:::-;39800:13;::::0;;39837:12;39769:191:::1;::::0;-1:-1:-1;;;;;;;;;;;39769:191:0;::::1;::::0;-1:-1:-1;;;;;39800:13:0;;::::1;::::0;39837:12;::::1;::::0;39865:10;;39890:17;;39922:10:::1;::::0;39947:2;;39769:191:::1;;25748:28:::0;;;-1:-1:-1;;;;;25748:28:0;;:::o;26660:18::-;;;;:::o;27688:125::-;27732:16;27768:37;27791:13;:11;:13::i;:::-;27768:22;:37::i;26576:40::-;;;-1:-1:-1;;;;;26576:40:0;;:::o;26685:18::-;;;;:::o;27180:500::-;27274:9;27298;27322;27346;27370:10;27395;27420:9;27457:32;;:::i;:::-;27492:13;:11;:13::i;:::-;27457:48;;27520:5;:7;;;27516:11;;27542:5;:7;;;27538:11;;27564:5;:7;;;27560:11;;27586:5;:7;;;27582:11;;27609:5;:8;;;27604:13;;27633:5;:8;;;27628:13;;27664:5;:7;;;27656:16;;;;;;;;27652:20;;27180:500;;;;;;;;:::o;25696:43::-;;;;:::o;30517:68::-;25088:9;;;;25087:10;25079:32;;;;-1:-1:-1;;;25079:32:0;;;;;;;;;25122:9;:16;;-1:-1:-1;;25122:16:0;25134:4;25122:16;;;30570:7:::1;:5;:7::i;:::-;25173:5:::0;25161:17;;-1:-1:-1;;25161:17:0;;;30517:68::o;33655:209::-;-1:-1:-1;;;;;33774:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;;:34;;;33824:32;;;;;33802:6;;33824:32;;;;;;;;;;33655:209;;;:::o;5551:137::-;5609:7;5642:1;5637;:6;;5629:28;;;;-1:-1:-1;;;5629:28:0;;;;;;;;;-1:-1:-1;5675:5:0;;;5551:137::o;5696:161::-;5754:7;5786:5;;;5810:6;;;;5802:28;;;;-1:-1:-1;;;5802:28:0;;;;;;;;;5848:1;5696:161;-1:-1:-1;;;5696:161:0:o;6400:127::-;6468:7;6512:6;6495:13;:6;6506:1;6495:13;:10;:13;:::i;:::-;:24;;;;;;;6400:127;-1:-1:-1;;;6400:127:0:o;6674:128::-;6742:7;6769:25;6792:1;6769:18;:6;6780;6769:18;:10;:18;:::i;34345:301::-;34425:4;34417:5;:12;34409:47;;;;-1:-1:-1;;;34409:47:0;;;;;;;;;-1:-1:-1;;;;;34484:14:0;;;;;;:8;:14;;;;;;:25;;34503:5;34484:25;:18;:25;:::i;:::-;-1:-1:-1;;;;;34467:14:0;;;;;;:8;:14;;;;;:42;34534:11;;:22;;34550:5;34534:22;:15;:22;:::i;:::-;34520:11;:36;34572:17;;-1:-1:-1;;;;;34572:17:0;;;;;;;34583:5;;34572:17;;;;;;;;;;34626:4;-1:-1:-1;;;;;34605:33:0;34622:1;-1:-1:-1;;;;;34605:33:0;-1:-1:-1;;;;;;;;;;;34632:5:0;34605:33;;;;;;;;;;;;;;;34345:301;;:::o;29654:314::-;-1:-1:-1;;;;;29746:26:0;;;;;:57;;-1:-1:-1;;;;;;29776:27:0;;;29746:57;29738:78;;;;-1:-1:-1;;;29738:78:0;;;;;;;;;29827:14;:37;;-1:-1:-1;;;;;29875:39:0;;;-1:-1:-1;;;29875:39:0;-1:-1:-1;;;;;;;;29827:37:0;;;-1:-1:-1;;;;;;29827:37:0;;;;;;;29875:39;;;;29827:14;29931;;;;;;;29927:33;;;29947:13;:11;:13::i;:::-;29654:314;;:::o;15831:1389::-;15952:25;;;16012:5;:7;;;:21;;;;;;;;;16008:1205;;;16070:42;16090:5;16097:14;16070:19;:42::i;:::-;16050:62;;16134:16;16127:23;;16008:1205;;;16183:16;16172:5;:7;;;:27;;;;;;;;;16168:1045;;;16236:44;16258:5;16265:14;16236:21;:44::i;16168:1045::-;16351:25;16379:21;16392:5;:7;;;16379:5;:8;;;:12;;:21;;;;:::i;:::-;16351:49;;16415:28;16446:21;16458:5;:8;;;16446:5;:7;;;:11;;:21;;;;:::i;:::-;16415:52;;16503:17;16486:14;:34;16482:720;;;16561:44;16583:5;16590:14;16561:21;:44::i;:::-;16541:64;;16631:16;16624:23;;16690:20;16670:17;:40;16666:129;;;16755:20;16735:40;;16666:129;16482:720;;;16838:17;16820:14;:35;16816:386;;;16896:20;16876:40;;16942:10;16935:17;;16816:386;;;17013:131;17060:65;17080:5;17087:37;:14;17106:17;17087:37;:18;:37;:::i;:::-;17060:19;:65::i;:::-;17013:20;;:131;:24;:131;:::i;:::-;16993:151;;17170:16;17163:23;;16816:386;16168:1045;;;15831:1389;;;;;:::o;13774:2049::-;13893:26;;;13954:5;:7;;;:21;;;;;;;;;13950:1866;;;14075:40;14094:5;14101:13;14075:18;:40::i;:::-;14054:61;;14137:16;14130:23;;13950:1866;;;14186:16;14175:5;:7;;;:27;;;;;;;;;14171:1645;;;14219:24;14246:21;14259:5;:7;;;14246:5;:8;;;:12;;:21;;;;:::i;:::-;14219:48;;14282:29;14314:21;14326:5;:8;;;14314:5;:7;;;:11;;:21;;;;:::i;:::-;14282:53;;14463:16;14447:13;:32;14443:1156;;;14574:42;14595:5;14602:13;14574:20;:42::i;:::-;14553:63;;14642:16;14635:23;;14702:21;14681:18;:42;14677:402;;;15038:21;15017:42;;14677:402;14443:1156;;;15121:16;15104:13;:33;15100:499;;;15233:21;15212:42;;15280:10;15273:17;;15100:499;;;15412:129;15460:62;15479:5;15486:35;:13;15504:16;15486:35;:17;:35;:::i;:::-;15460:18;:62::i;15412:129::-;15391:150;;15567:16;15560:23;;15100:499;14171:1645;;;;;15724:42;15745:5;15752:13;15724:20;:42::i;:::-;15703:63;15788:16;;-1:-1:-1;13774:2049:0;-1:-1:-1;;;13774:2049:0:o;20213:604::-;20300:16;20289:5;:7;;;:27;;;;;;;;;20285:525;;;20344:174;20404:5;:7;;;20430:21;20442:5;:8;;;20430:5;:7;;;:11;;:21;;;;:::i;:::-;20470:7;;20496;;;;20344:41;:174::i;:::-;20333:8;;;:185;20285:525;;;20551:16;20540:5;:7;;;:27;;;;;;;;;20536:274;;;20595:203;20655:5;:7;;;20681:21;20693:5;:8;;;20681:5;:7;;;:11;;:21;;;;:::i;:::-;20749:7;;20721:36;;:27;:36::i;:::-;20776:5;:7;;;20595:41;:203::i;:::-;20584:8;;;:214;20536:274;20213:604;:::o;4872:226::-;4930:7;4954:6;4950:47;;-1:-1:-1;4984:1:0;4977:8;;4950:47;5021:5;;;5025:1;5021;:5;:1;5045:5;;;;;:10;5037:32;;;;-1:-1:-1;;;5037:32:0;;;;;;;;5106:141;5164:7;5196:1;5192;:5;5184:32;;;;-1:-1:-1;;;5184:32:0;;;;;;;;;5238:1;5234;:5;;;;5255:288;5317:7;5337:16;5356:9;5360:1;5363;5356:3;:9::i;:::-;5337:28;-1:-1:-1;5400:12:0;;;5396:16;;5427:13;;5423:113;;-1:-1:-1;5475:1:0;5464:12;;-1:-1:-1;5457:19:0;;5423:113;-1:-1:-1;5516:8:0;-1:-1:-1;5509:15:0;;34654:243;-1:-1:-1;;;;;34735:14:0;;;;;;:8;:14;;;;;;:25;;34754:5;34735:25;:18;:25;:::i;:::-;-1:-1:-1;;;;;34718:14:0;;;;;;:8;:14;;;;;:42;34785:11;;:22;;34801:5;34785:22;:15;:22;:::i;:::-;34771:11;:36;34823:17;;-1:-1:-1;;;;;34823:17:0;;;;;;;34834:5;;34823:17;;;;;;;;;;34879:1;-1:-1:-1;;;;;34856:33:0;34865:4;-1:-1:-1;;;;;34856:33:0;-1:-1:-1;;;;;;;;;;;34883:5:0;34856:33;;;;;;;31185:161;31263:10;;31259:80;;31290:12;;:37;;-1:-1:-1;;;;;31290:12:0;31316:2;31320:6;31290:37;:25;:37;:::i;31354:163::-;31433:10;;31429:81;;31460:13;;:38;;-1:-1:-1;;;;;31460:13:0;31487:2;31491:6;31460:38;:26;:38;:::i;29976:533::-;30035:12;;:37;;-1:-1:-1;;;30035:37:0;;30013:19;;-1:-1:-1;;;;;30035:12:0;;:22;;:37;;30066:4;;30035:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30106:13;;:38;;-1:-1:-1;;;30106:38:0;;30013:59;;-1:-1:-1;30083:20:0;;-1:-1:-1;;;;;30106:13:0;;;;:23;;:38;;30138:4;;30106:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30083:61;-1:-1:-1;;;;;;30163:26:0;;;;;:57;;-1:-1:-1;;;;;;30193:27:0;;;30163:57;30155:78;;;;-1:-1:-1;;;30155:78:0;;;;;;;;;30263:14;;-1:-1:-1;;;;;30263:14:0;30248:29;;30244:99;;30294:14;:37;;-1:-1:-1;;;;;;30294:37:0;-1:-1:-1;;;;;30294:37:0;;;;;30244:99;30373:15;;-1:-1:-1;;;30373:15:0;;-1:-1:-1;;;;;30373:15:0;30357:31;;30353:103;;30405:15;:39;;-1:-1:-1;;;;;;;;30405:39:0;-1:-1:-1;;;;;;;;30405:39:0;;;;;;30353:103;30472:14;;;;;;;30468:33;;;30488:13;:11;:13::i;20825:621::-;20892:7;20927:16;20916:5;:7;;;:27;;;;;;;;;20912:527;;;21020:7;;;;21006:8;;;;20960:9;;20972:66;;20993:35;;21020:7;20993:22;;21006:8;20993:22;:12;:22;:::i;:35::-;21030:5;:7;;;20972:20;:66::i;:::-;20960:78;;21057:66;21090:32;21111:5;:7;;;21120:1;21090:20;:32::i;:::-;21077:7;;;;21057:28;;6339:6;;21057:28;:19;:28;:::i;:::-;:32;:66;:32;:66;:::i;:::-;21053:70;;21145:32;21166:5;:7;;;21175:1;21145:20;:32::i;:::-;21138:39;;;;;20912:527;21270:7;;;;21256:8;;;;21210:9;;21222:66;;21243:35;;21270:7;21243:22;;21256:8;21243:22;:12;:22;:::i;:35::-;21280:5;:7;;;21222:20;:66::i;:::-;21210:78;;21307:66;21340:32;21361:5;:7;;;21370:1;21340:20;:32::i;21307:66::-;21303:70;;21395:32;21416:5;:7;;;21425:1;21395:20;:32::i;29208:391::-;29355:22;;29282:23;:15;:23;;;-1:-1:-1;;;29355:22:0;;;;29338:39;;;29392:15;;;;;;:38;;-1:-1:-1;29411:14:0;;-1:-1:-1;;;;;29411:14:0;:19;;29392:38;:62;;;;-1:-1:-1;29434:15:0;;-1:-1:-1;;;29434:15:0;;-1:-1:-1;;;;;29434:15:0;:20;;29392:62;29388:154;;;29519:11;29503:27;;:13;:11;:13::i;:::-;29471:28;:59;;29503:27;;;;29471:59;;;29388:154;-1:-1:-1;29552:22:0;:39;;;;;;-1:-1:-1;;;29552:39:0;-1:-1:-1;;;;;29552:39:0;;;;;;;;;29208:391::o;17854:446::-;17994:7;18069:223;18128:5;:8;;;18155:5;:8;;;18182:14;18215:36;18243:5;:7;;;18215:27;:36::i;:::-;18270:5;:7;;;18069:40;:223::i;19705:447::-;19847:7;19922:222;19981:5;:8;;;20008:5;:7;;;20034:14;20067:36;20095:5;:7;;;20067:27;:36::i;18356:446::-;18498:7;18573:221;18618:5;:8;;;18645:27;18657:14;18645:5;:7;;;:11;;:27;;;;:::i;:::-;18691:7;;;;18745;;18717:36;;:27;:36::i;:::-;18772:5;:7;;;18573:26;:221::i;17276:570::-;17414:7;17645:193;17704:5;:8;;;17731:5;:8;;;17758:13;17790:5;:7;;;17816:5;:7;;;17645:40;:193::i;19282:415::-;19422:7;19498:191;19543:5;:8;;;19570:26;19582:13;19570:5;:7;;;:11;;:26;;;;:::i;:::-;19615:7;;;;19641;;19667;;;;19498:26;:191::i;18810:416::-;18950:7;19026:192;19085:5;:8;;;19112:5;:7;;;19138:13;19170:5;:7;;;19196:5;:7;;;19026:40;:192::i;8711:1111::-;8868:7;8892;8888:48;;-1:-1:-1;8923:1:0;8916:8;;8888:48;8950:6;8946:84;;8980:38;8987:30;9008:1;9011:5;8987:20;:30::i;:::-;8980:2;;:38;:6;:38;:::i;:::-;8973:45;;;;8946:84;9241:12;;9277:14;9278:1;:5;;9289:1;9277:14;:11;:14;:::i;:::-;9264:27;-1:-1:-1;9306:7:0;9302:273;;6339:6;9330:22;;9302:273;;;9395:5;9389:2;9380:5;9375:2;:10;9374:17;;;;;;:26;9370:205;;;9424:49;:42;6385:6;9424:20;9425:10;;;9441:2;9424:20;:16;:20;:::i;:42::-;:47;:49::i;:::-;9417:56;;9370:205;;;9513:50;:43;6385:6;9513:21;9528:5;9513:10;:2;9520;9513:10;:6;:10;:::i;:::-;:14;:21;:14;:21;:::i;:50::-;9506:57;;9370:205;9585:15;9616:75;6339:6;9616:54;9637:25;:4;6339:6;9637:25;:8;:25;:::i;:::-;9664:1;9668;9664:5;9616:20;:54::i;:75::-;9585:106;;9781:33;9802:2;9806:7;9781:20;:33::i;:::-;9774:40;;;;;8711:1111;;;;;;;:::o;6949:126::-;7013:7;7040:27;7048:6;7060;7040:27;:19;:27;:::i;22023:211::-;22140:86;22160:5;22190:23;;;22215:2;22219:5;22167:58;;;;;;;;;;;;;;-1:-1:-1;;22167:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22167:58:0;-1:-1:-1;;;;;;22167:58:0;;;;;;;;;;22140:19;:86::i;:::-;22023:211;;;:::o;10676:2627::-;10853:7;10886:1;10881:2;:6;10873:33;;;;-1:-1:-1;;;10873:33:0;;;;;;;;;10921:10;10917:51;;-1:-1:-1;10955:1:0;10948:8;;10917:51;10984:6;10980:119;;11047:2;11014:30;11035:1;11038:5;11014:20;:30::i;:::-;:35;:73;;11057:30;11078:1;11081:5;11057:20;:30::i;:::-;11014:73;;;11052:2;11014:73;11007:80;;;;10980:119;6339:6;11115:1;:20;11111:713;;;11422:12;;11466;:1;11472:5;11466:12;:5;:12;:::i;:::-;11449:29;-1:-1:-1;11497:11:0;11493:255;;11536:1;11529:8;;11493:255;;;11589:2;11579:6;11573:2;11564:6;:11;11563:22;;;;;;:28;11559:189;;;11619:29;11637:10;11644:2;;11637:10;:6;:10;:::i;:::-;11620:11;;;;11619:29;:17;:29;:::i;:::-;11612:36;;11559:189;;;11696:36;11729:2;11696:28;11722:1;11696:21;11729:2;11696:28;:5;11706:2;11696:13;:9;:13;:::i;:36::-;11689:43;;11559:189;11769:43;11786:25;:4;6339:6;11786:25;:8;:25;:::i;:::-;11769:12;:2;11776:4;11769:12;:6;:12;:::i;:43::-;11762:50;;;;;;11111:713;12148:13;12164:43;12194:12;:1;12200:5;12194:12;:5;:12;:::i;:::-;12164:25;12186:2;12164:17;12178:2;12164:9;:1;12186:2;12164:9;:5;:9;:::i;:43::-;12148:59;-1:-1:-1;12239:12:0;12254:30;12281:2;12254:22;6339:6;12274:1;12254:22;:19;:22;:::i;:30::-;12239:45;;12308:9;12340:5;12332:4;:13;12328:170;;-1:-1:-1;12369:12:0;;;12403:5;12328:170;;;-1:-1:-1;12448:12:0;;12482:4;12328:170;12515:25;:4;6339:6;12515:25;:8;:25;:::i;:::-;12508:32;-1:-1:-1;12580:18:0;12614:137;12653:29;12680:1;12653:22;6339:6;12673:1;12653:22;:19;:22;:::i;:29::-;12701:35;12733:2;12701:27;12722:1;12725:2;12701:20;:27::i;:35::-;12614:20;:137::i;:::-;12580:171;-1:-1:-1;12790:37:0;:30;12580:171;12790:14;12799:4;;12790:14;:8;:14;:::i;:37::-;12777:50;-1:-1:-1;12888:19:0;12910:29;12937:1;12910:22;6339:6;12930:1;12910:22;:19;:22;:::i;:29::-;12888:51;;12960:17;12992:4;12988:134;;;13025:20;:10;13040:4;13025:20;:14;:20;:::i;:::-;13013:32;;12988:134;;;13090:20;:4;13099:10;13090:20;:8;:20;:::i;:::-;13078:32;;12988:134;13134:10;13147:43;13167:9;13178:11;13147:19;:43::i;:::-;13134:56;;13210:2;13205;:7;13201:95;;;13236:1;13229:8;;;;;;;;;;;13201:95;13277:7;;;-1:-1:-1;13270:14:0;;-1:-1:-1;;;;;;13270:14:0;10676:2627;;;;;;;;:::o;7791:612::-;7951:7;7984:1;7979:2;:6;7971:33;;;;-1:-1:-1;;;7971:33:0;;;;;;;;;8015:18;8036:17;8042:10;:2;8049;8042:10;:6;:10;:::i;:::-;8036:1;;:17;:5;:17;:::i;:::-;8015:38;-1:-1:-1;8079:6:0;8075:77;;8109:31;:10;6339:6;8109:31;:14;:31;:::i;:::-;8102:38;;;;;8075:77;8162:16;8181:44;8202:18;8217:2;8202:10;8209:2;;8202:10;:6;:10;:::i;:18::-;8222:2;8181:20;:44::i;:::-;8162:63;;8236:15;8254:33;8275:1;8278:8;8254:20;:33::i;:::-;8236:51;-1:-1:-1;8322:73:0;6385:6;8322:51;8362:10;8322:35;8236:51;8322:22;6339:6;8342:1;8322:22;:19;:22;:::i;:73::-;8315:80;7791:612;-1:-1:-1;;;;;;;;;7791:612:0:o;5865:205::-;5947:1;5955;5951;5947:5;;:9;5983:80;5994:1;5990;:5;5983:80;;;6016:1;6012:5;;6050:1;6045;6041;6037;:5;;;;;;:9;6036:15;;;;;;6032:19;;5983:80;;;5865:205;;;;:::o;23596:1046::-;24256:12;24270:23;24305:5;-1:-1:-1;;;;;24297:19:0;24317:4;24297:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24255:67;;;;24341:7;24333:52;;;;-1:-1:-1;;;24333:52:0;;;;;;;;;24402:17;;:21;24398:237;;24557:10;24546:30;;;;;;;;;;;;;;24538:85;;;;-1:-1:-1;;;24538:85:0;;;;;;;;;23596:1046;;;;:::o;6810:131::-;6877:7;6904:29;6931:1;6904:18;:6;6915;6904:18;:10;:18;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;44198:54;;46615:35;;46605:2;;46664:1;;46654:12;559:336;;;673:3;666:4;658:6;654:17;650:27;640:2;;-1:-1;;681:12;640:2;-1:-1;711:20;;751:18;740:30;;737:2;;;-1:-1;;773:12;737:2;817:4;809:6;805:17;793:29;;868:3;817:4;848:17;809:6;834:32;;831:41;828:2;;;885:1;;875:12;1451:241;;1555:2;1543:9;1534:7;1530:23;1526:32;1523:2;;;-1:-1;;1561:12;1523:2;1623:53;1668:7;1644:22;1623:53;;1699:366;;;1820:2;1808:9;1799:7;1795:23;1791:32;1788:2;;;-1:-1;;1826:12;1788:2;1888:53;1933:7;1909:22;1888:53;;;1878:63;;1996:53;2041:7;1978:2;2021:9;2017:22;1996:53;;;1986:63;;1782:283;;;;;;2072:1115;;;;;;;;;2292:3;2280:9;2271:7;2267:23;2263:33;2260:2;;;-1:-1;;2299:12;2260:2;2361:53;2406:7;2382:22;2361:53;;;2351:63;;2469:53;2514:7;2451:2;2494:9;2490:22;2469:53;;;2459:63;;2577:53;2622:7;2559:2;2602:9;2598:22;2577:53;;;2567:63;;2667:2;2710:9;2706:22;970:20;2675:63;;2794:53;2839:7;2775:3;2819:9;2815:22;2794:53;;;2784:63;;2884:3;2928:9;2924:22;970:20;2893:63;;2993:3;3037:9;3033:22;970:20;3002:63;;3102:3;3143:9;3139:22;206:20;231:30;255:5;231:30;;;3111:60;;;;2254:933;;;;;;;;;;;;3194:491;;;;3332:2;3320:9;3311:7;3307:23;3303:32;3300:2;;;-1:-1;;3338:12;3300:2;85:6;72:20;97:33;124:5;97:33;;;3390:63;-1:-1;3490:2;3529:22;;72:20;97:33;72:20;97:33;;;3294:391;;3498:63;;-1:-1;;;3598:2;3637:22;;;;970:20;;3294:391;3692:991;;;;;;;;3896:3;3884:9;3875:7;3871:23;3867:33;3864:2;;;-1:-1;;3903:12;3864:2;3965:53;4010:7;3986:22;3965:53;;;3955:63;;4073:53;4118:7;4055:2;4098:9;4094:22;4073:53;;;4063:63;;4163:2;4206:9;4202:22;970:20;4171:63;;4271:2;4314:9;4310:22;970:20;4279:63;;4379:3;4421:9;4417:22;1246:20;1271:31;1296:5;1271:31;;;3858:825;;;;-1:-1;3858:825;;;;4388:61;4486:3;4526:22;;475:20;;-1:-1;4595:3;4635:22;;;475:20;;3858:825;-1:-1;;3858:825;4690:366;;;4811:2;4799:9;4790:7;4786:23;4782:32;4779:2;;;-1:-1;;4817:12;4779:2;4879:53;4924:7;4900:22;4879:53;;;4869:63;4969:2;5008:22;;;;970:20;;-1:-1;;;4773:283;5063:257;;5175:2;5163:9;5154:7;5150:23;5146:32;5143:2;;;-1:-1;;5181:12;5143:2;354:6;348:13;366:30;390:5;366:30;;5327:263;;5442:2;5430:9;5421:7;5417:23;5413:32;5410:2;;;-1:-1;;5448:12;5410:2;-1:-1;1118:13;;5404:186;-1:-1;5404:186;5597:993;;;;;;;;5805:3;5793:9;5784:7;5780:23;5776:33;5773:2;;;-1:-1;;5812:12;5773:2;983:6;970:20;5864:63;;5964:2;6007:9;6003:22;72:20;97:33;124:5;97:33;;;5972:63;-1:-1;6072:2;6111:22;;970:20;;-1:-1;6180:2;6219:22;;970:20;;-1:-1;6316:3;6301:19;;6288:33;6341:18;6330:30;;6327:2;;;-1:-1;;6363:12;6327:2;6401:64;6457:7;6448:6;6437:9;6433:22;6401:64;;;5767:823;;;;-1:-1;5767:823;;;;;;6502:3;6542:22;;;970:20;;5767:823;-1:-1;;;;5767:823;6597:741;;;;;;6771:3;6759:9;6750:7;6746:23;6742:33;6739:2;;;-1:-1;;6778:12;6739:2;983:6;970:20;6830:63;;6930:2;6973:9;6969:22;970:20;6938:63;;7056:53;7101:7;7038:2;7081:9;7077:22;7056:53;;;7046:63;;7174:2;7163:9;7159:18;7146:32;7198:18;7190:6;7187:30;7184:2;;;-1:-1;;7220:12;7184:2;7258:64;7314:7;7305:6;7294:9;7290:22;7258:64;;;6733:605;;;;-1:-1;6733:605;;-1:-1;7248:74;;;6733:605;-1:-1;;;6733:605;7345:259;;7458:2;7446:9;7437:7;7433:23;7429:32;7426:2;;;-1:-1;;7464:12;7426:2;1396:6;1390:13;1408:31;1433:5;1408:31;;8293:297;;43081:6;43076:3;43069:19;45912:6;45907:3;43118:4;43113:3;43109:14;45889:30;-1:-1;43118:4;45959:6;43113:3;45950:16;;45943:27;43118:4;46426:7;;46430:2;8576:6;46410:14;46406:28;43113:3;8545:39;;8538:46;;8393:197;;;;;;20718:271;;8758:5;42796:12;8869:52;8914:6;8909:3;8902:4;8895:5;8891:16;8869:52;;;8933:16;;;;;20852:137;-1:-1;;20852:137;20996:273;;-1:-1;9123:5;9117:12;9157:1;;9146:9;9142:17;9170:1;9165:267;;;;9443:1;9438:427;;;;9135:730;;9165:267;-1:-1;;9369:25;;9357:38;;9239:1;9224:17;;9243:4;9220:28;9409:16;;;-1:-1;9165:267;;9438:427;9507:1;9496:9;9492:17;42649:3;-1:-1;42639:14;42681:4;;-1:-1;42668:18;-1:-1;9698:130;9712:6;9709:1;9706:13;9698:130;;;9771:14;;9758:11;;;9751:35;9805:15;;;;9727:12;;9698:130;;;-1:-1;;;9842:16;;;-1:-1;9135:730;-1:-1;21254:10;;21131:138;-1:-1;;;;;21131:138;21276:597;;8758:5;42796:12;8869:52;8914:6;8909:3;8902:4;8895:5;8891:16;8869:52;;;42796:12;;;8933:16;;8869:52;42796:12;8933:16;8902:4;8891:16;;8869:52;;;42796:12;;;8933:16;;8869:52;42796:12;8933:16;8902:4;8891:16;;8869:52;;;8933:16;;;;21508:365;-1:-1;;;;;;21508:365;21880:659;-1:-1;;;13438:87;;13423:1;13544:11;;8062:37;;;;22391:12;;;8062:37;22502:12;;;22125:414;22546:222;-1:-1;;;;;44198:54;;;;7831:37;;22673:2;22658:18;;22644:124;22775:572;-1:-1;;;;;44198:54;;;7690:58;;44198:54;;;;23167:2;23152:18;;7831:37;23250:2;23235:18;;8062:37;23333:2;23318:18;;8062:37;;;;22994:3;22979:19;;22965:382;23354:676;;44209:42;;;;;43696:5;44198:54;7697:3;7690:58;8092:5;23774:2;23763:9;23759:18;8062:37;8092:5;23857:2;23846:9;23842:18;8062:37;23601:3;23894:2;23883:9;23879:18;23872:48;23934:86;23601:3;23590:9;23586:19;24006:6;23998;23934:86;;;23926:94;23572:458;-1:-1;;;;;;;23572:458;24037:788;;44209:42;;;;;43696:5;44198:54;7697:3;7690:58;8092:5;24485:2;24474:9;24470:18;8062:37;8092:5;24568:2;24557:9;24553:18;8062:37;8092:5;24651:2;24640:9;24636:18;8062:37;24312:3;24688;24677:9;24673:19;24666:49;24729:86;24312:3;24301:9;24297:19;24801:6;24793;24729:86;;;24721:94;24283:542;-1:-1;;;;;;;;24283:542;24832:796;-1:-1;;;;;44198:54;;;7831:37;;44198:54;;;25272:2;25257:18;;7831:37;25355:2;25340:18;;8062:37;;;;25438:2;25423:18;;8062:37;;;;44198:54;;25529:3;25514:19;;7690:58;44198:54;;;44209:42;25598:19;;7831:37;25107:3;25092:19;;25078:550;25635:333;-1:-1;;;;;44198:54;;;;7831:37;;25954:2;25939:18;;8062:37;25790:2;25775:18;;25761:207;25975:444;-1:-1;;;;;44198:54;;;;7831:37;;26322:2;26307:18;;8062:37;;;;26405:2;26390:18;;8062:37;26158:2;26143:18;;26129:290;26426:210;43780:13;;43773:21;7945:34;;26547:2;26532:18;;26518:118;26643:222;8062:37;;;26770:2;26755:18;;26741:124;26872:780;8062:37;;;-1:-1;;;;;44198:54;;;27304:2;27289:18;;7831:37;44198:54;;;;27387:2;27372:18;;7831:37;27470:2;27455:18;;8062:37;27553:3;27538:19;;8062:37;;;;44209:42;27622:19;;8062:37;27139:3;27124:19;;27110:542;27659:548;8062:37;;;44509:4;44498:16;;;;28027:2;28012:18;;20671:35;28110:2;28095:18;;8062:37;28193:2;28178:18;;8062:37;27866:3;27851:19;;27837:370;28742:240;28878:2;28863:18;;45341:35;10337:5;45341:35;;;10292:3;10285:59;28849:133;;;;;28989:836;10662:134;;;29561:2;29546:18;;8062:37;;;;29644:2;29629:18;;8062:37;;;;29727:2;29712:18;;8062:37;-1:-1;;;;;44198:54;29810:3;29795:19;;7831:37;29312:3;29297:19;;29283:542;29832:310;;29979:2;30000:17;29993:47;10953:5;42796:12;43081:6;29979:2;29968:9;29964:18;43069:19;11047:52;11092:6;43109:14;29968:9;43109:14;29979:2;11073:5;11069:16;11047:52;;;46426:7;46410:14;-1:-1;;46406:28;11111:39;;;;43109:14;11111:39;;29950:192;-1:-1;;29950:192;30149:416;30349:2;30363:47;;;11754:2;30334:18;;;43069:19;-1:-1;;;43109:14;;;11770:38;11827:12;;;30320:245;30572:416;30772:2;30786:47;;;12078:2;30757:18;;;43069:19;-1:-1;;;43109:14;;;12094:40;12153:12;;;30743:245;30995:416;31195:2;31209:47;;;12404:2;31180:18;;;43069:19;-1:-1;;;43109:14;;;12420:45;12484:12;;;31166:245;31418:416;31618:2;31632:47;;;12735:2;31603:18;;;43069:19;-1:-1;;;43109:14;;;12751:43;12813:12;;;31589:245;31841:416;32041:2;32055:47;;;13064:2;32026:18;;;43069:19;-1:-1;;;43109:14;;;13080:37;13136:12;;;32012:245;32264:416;32464:2;32478:47;;;13794:2;32449:18;;;43069:19;13830:32;43109:14;;;13810:53;13882:12;;;32435:245;32687:416;32887:2;32901:47;;;14133:1;32872:18;;;43069:19;-1:-1;;;43109:14;;;14148:32;14199:12;;;32858:245;33110:416;33310:2;33324:47;;;14450:2;33295:18;;;43069:19;14486:28;43109:14;;;14466:49;14534:12;;;33281:245;33533:416;33733:2;33747:47;;;33718:18;;;43069:19;14821:34;43109:14;;;14801:55;14875:12;;;33704:245;33956:416;34156:2;34170:47;;;15126:2;34141:18;;;43069:19;-1:-1;;;43109:14;;;15142:36;15197:12;;;34127:245;34379:416;34579:2;34593:47;;;15448:2;34564:18;;;43069:19;-1:-1;;;43109:14;;;15464:37;15520:12;;;34550:245;34802:416;35002:2;35016:47;;;15771:1;34987:18;;;43069:19;-1:-1;;;43109:14;;;15786:32;15837:12;;;34973:245;35225:416;35425:2;35439:47;;;16088:2;35410:18;;;43069:19;-1:-1;;;43109:14;;;16104:42;16165:12;;;35396:245;35648:416;35848:2;35862:47;;;16416:2;35833:18;;;43069:19;-1:-1;;;43109:14;;;16432:37;16488:12;;;35819:245;36071:416;36271:2;36285:47;;;16739:2;36256:18;;;43069:19;-1:-1;;;43109:14;;;16755:41;16815:12;;;36242:245;36494:416;36694:2;36708:47;;;17066:1;36679:18;;;43069:19;-1:-1;;;43109:14;;;17081:31;17131:12;;;36665:245;36917:416;37117:2;37131:47;;;17382:2;37102:18;;;43069:19;-1:-1;;;43109:14;;;17398:43;17460:12;;;37088:245;37340:416;37540:2;37554:47;;;17711:1;37525:18;;;43069:19;-1:-1;;;43109:14;;;17726:32;17777:12;;;37511:245;37763:416;37963:2;37977:47;;;18028:2;37948:18;;;43069:19;18064:34;43109:14;;;18044:55;-1:-1;;;18119:12;;;18112:34;18165:12;;;37934:245;38186:416;38386:2;38400:47;;;18416:2;38371:18;;;43069:19;-1:-1;;;43109:14;;;18432:35;18486:12;;;38357:245;38609:416;38809:2;38823:47;;;18737:1;38794:18;;;43069:19;-1:-1;;;43109:14;;;18752:32;18803:12;;;38780:245;39032:327;;39211:3;39200:9;39196:19;39188:27;;19106:16;19100:23;8069:3;8062:37;19268:4;19261:5;19257:16;19251:23;19268:4;19332:3;19328:14;8062:37;19419:4;19412:5;19408:16;19402:23;19419:4;19483:3;19479:14;8062:37;19570:4;19563:5;19559:16;19553:23;19570:4;19634:3;19630:14;8062:37;19722:4;19715:5;19711:16;19705:23;19722:4;19786:3;19782:14;8062:37;19874:4;19867:5;19863:16;19857:23;19874:4;19938:3;19934:14;8062:37;45341:35;20025:4;20018:5;20014:16;20008:23;45341:35;;;20025:4;20098:3;20094:14;10285:59;39182:177;;;;;39366:222;-1:-1;;;;;44082:42;;;;20208:37;;39493:2;39478:18;;39464:124;39824:333;8062:37;;;40143:2;40128:18;;8062:37;39979:2;39964:18;;39950:207;40164:574;8062:37;;;40549:2;40534:18;;8062:37;;;40384:3;40369:19;;45341:35;10337:5;45341:35;;;40641:2;40630:9;40626:18;10285:59;8092:5;40724:2;40713:9;40709:18;8062:37;40355:383;;;;;;;;40745:444;8062:37;;;41092:2;41077:18;;8062:37;;;;41175:2;41160:18;;8062:37;40928:2;40913:18;;40899:290;41196:892;8062:37;;;41656:2;41641:18;;8062:37;;;;41739:2;41724:18;;8062:37;;;;41822:2;41807:18;;8062:37;;;;41905:3;41890:19;;8062:37;41989:3;41974:19;;8062:37;42073:3;42058:19;;8062:37;41491:3;41476:19;;41462:626;42095:218;44415:10;44404:22;;;;20556:36;;42220:2;42205:18;;42191:122;42320:214;44509:4;44498:16;;;;20671:35;;42443:2;42428:18;;42414:120;43885:128;43947:16;46527:1;46517:12;;46507:2;;46533:9;45985:268;46050:1;46057:101;46071:6;46068:1;46065:13;46057:101;;;46138:11;;;46132:18;46119:11;;;46112:39;46093:2;46086:10;46057:101;;;46173:6;46170:1;46167:13;46164:2;;;-1:-1;;46050:1;46220:16;;46213:27;46034:219;46556:117;-1:-1;;;;;44198:54;;46615:35;;46605:2;;46664:1;;46654:12;46680:111;46761:5;43780:13;43773:21;46739:5;46736:32;46726:2;;46782:1;;46772:12;47046:113;44509:4;47129:5;44498:16;47106:5;47103:33;47093:2;;47150:1;;47140:12
Swarm Source
ipfs://7e43fe3c65a0960d957dd6869ff0e588f6bfb9fc4f4aaec6c20405c858f3167e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.