Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 11270803 | 1947 days ago | 86.22271765 ETH | ||||
| - | 11270803 | 1947 days ago | 86.22271765 ETH | ||||
| - | 11270803 | 1947 days ago | 0.00273 ETH | ||||
| - | 11270803 | 1947 days ago | 0.00273 ETH | ||||
| - | 11269536 | 1947 days ago | 0.0084 ETH | ||||
| - | 11269536 | 1947 days ago | 0.0084 ETH | ||||
| - | 11269357 | 1947 days ago | 0.00308 ETH | ||||
| - | 11269357 | 1947 days ago | 0.00308 ETH | ||||
| - | 11269113 | 1947 days ago | 0.00231 ETH | ||||
| - | 11269113 | 1947 days ago | 0.00231 ETH | ||||
| - | 11266471 | 1948 days ago | 11.41461262 ETH | ||||
| - | 11266471 | 1948 days ago | 11.41461262 ETH | ||||
| - | 11263830 | 1948 days ago | 0.00042 ETH | ||||
| - | 11263830 | 1948 days ago | 0.00042 ETH | ||||
| - | 11263830 | 1948 days ago | 0.00266 ETH | ||||
| - | 11263830 | 1948 days ago | 137.07210691 ETH | ||||
| - | 11263830 | 1948 days ago | 137.07476691 ETH | ||||
| - | 11263830 | 1948 days ago | 0.00266 ETH | ||||
| - | 11263830 | 1948 days ago | 0.00266 ETH | ||||
| - | 11262739 | 1948 days ago | 137.07021691 ETH | ||||
| - | 11262739 | 1948 days ago | 137.07021691 ETH | ||||
| - | 11262739 | 1948 days ago | 0.00189 ETH | ||||
| - | 11262739 | 1948 days ago | 0.00189 ETH | ||||
| - | 11260333 | 1949 days ago | 0.00245 ETH | ||||
| - | 11260333 | 1949 days ago | 0.00245 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LoanShifterReceiver
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-10-24
*/
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
interface ERC20 {
function totalSupply() external view returns (uint256 supply);
function balanceOf(address _owner) external view returns (uint256 balance);
function transfer(address _to, uint256 _value) external returns (bool success);
function transferFrom(address _from, address _to, uint256 _value)
external
returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
function allowance(address _owner, address _spender) external view returns (uint256 remaining);
function decimals() external view returns (uint256 digits);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
} library Address {
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
} library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
} library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(ERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*/
function safeApprove(ERC20 token, address spender, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(ERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "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");
}
}
} contract AdminAuth {
using SafeERC20 for ERC20;
address public owner;
address public admin;
modifier onlyOwner() {
require(owner == msg.sender);
_;
}
constructor() public {
owner = msg.sender;
}
/// @notice Admin is set by owner first time, after that admin is super role and has permission to change owner
/// @param _admin Address of multisig that becomes admin
function setAdminByOwner(address _admin) public {
require(msg.sender == owner);
require(admin == address(0));
admin = _admin;
}
/// @notice Admin is able to set new admin
/// @param _admin Address of multisig that becomes new admin
function setAdminByAdmin(address _admin) public {
require(msg.sender == admin);
admin = _admin;
}
/// @notice Admin is able to change owner
/// @param _owner Address of new owner
function setOwnerByAdmin(address _owner) public {
require(msg.sender == admin);
owner = _owner;
}
/// @notice Destroy the contract
function kill() public onlyOwner {
selfdestruct(payable(owner));
}
/// @notice withdraw stuck funds
function withdrawStuckFunds(address _token, uint _amount) public onlyOwner {
if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
payable(owner).transfer(_amount);
} else {
ERC20(_token).safeTransfer(owner, _amount);
}
}
} interface IFlashLoanReceiver {
function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external;
}
abstract contract ILendingPoolAddressesProvider {
function getLendingPool() public view virtual returns (address);
function setLendingPoolImpl(address _pool) public virtual;
function getLendingPoolCore() public virtual view returns (address payable);
function setLendingPoolCoreImpl(address _lendingPoolCore) public virtual;
function getLendingPoolConfigurator() public virtual view returns (address);
function setLendingPoolConfiguratorImpl(address _configurator) public virtual;
function getLendingPoolDataProvider() public virtual view returns (address);
function setLendingPoolDataProviderImpl(address _provider) public virtual;
function getLendingPoolParametersProvider() public virtual view returns (address);
function setLendingPoolParametersProviderImpl(address _parametersProvider) public virtual;
function getTokenDistributor() public virtual view returns (address);
function setTokenDistributor(address _tokenDistributor) public virtual;
function getFeeProvider() public virtual view returns (address);
function setFeeProviderImpl(address _feeProvider) public virtual;
function getLendingPoolLiquidationManager() public virtual view returns (address);
function setLendingPoolLiquidationManager(address _manager) public virtual;
function getLendingPoolManager() public virtual view returns (address);
function setLendingPoolManager(address _lendingPoolManager) public virtual;
function getPriceOracle() public virtual view returns (address);
function setPriceOracle(address _priceOracle) public virtual;
function getLendingRateOracle() public view virtual returns (address);
function setLendingRateOracle(address _lendingRateOracle) public virtual;
}
library EthAddressLib {
function ethAddress() internal pure returns(address) {
return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
}
}
abstract contract FlashLoanReceiverBase is IFlashLoanReceiver {
using SafeERC20 for ERC20;
using SafeMath for uint256;
ILendingPoolAddressesProvider public addressesProvider;
constructor(ILendingPoolAddressesProvider _provider) public {
addressesProvider = _provider;
}
receive () external virtual payable {}
function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {
address payable core = addressesProvider.getLendingPoolCore();
transferInternal(core,_reserve, _amount);
}
function transferInternal(address payable _destination, address _reserve, uint256 _amount) internal {
if(_reserve == EthAddressLib.ethAddress()) {
//solium-disable-next-line
_destination.call{value: _amount}("");
return;
}
ERC20(_reserve).safeTransfer(_destination, _amount);
}
function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
if(_reserve == EthAddressLib.ethAddress()) {
return _target.balance;
}
return ERC20(_reserve).balanceOf(_target);
}
} abstract contract DSProxyInterface {
/// Truffle wont compile if this isn't commented
// function execute(bytes memory _code, bytes memory _data)
// public virtual
// payable
// returns (address, bytes32);
function execute(address _target, bytes memory _data) public virtual payable returns (bytes32);
function setCache(address _cacheAddr) public virtual payable returns (bool);
function owner() public virtual returns (address);
} contract DSMath {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x);
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x);
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x);
}
function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x / y;
}
function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x <= y ? x : y;
}
function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x >= y ? x : y;
}
function imin(int256 x, int256 y) internal pure returns (int256 z) {
return x <= y ? x : y;
}
function imax(int256 x, int256 y) internal pure returns (int256 z) {
return x >= y ? x : y;
}
uint256 constant WAD = 10**18;
uint256 constant RAY = 10**27;
function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, RAY), y / 2) / y;
}
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
//
function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
} abstract contract TokenInterface {
function allowance(address, address) public virtual returns (uint256);
function balanceOf(address) public virtual returns (uint256);
function approve(address, uint256) public virtual;
function transfer(address, uint256) public virtual returns (bool);
function transferFrom(address, address, uint256) public virtual returns (bool);
function deposit() public virtual payable;
function withdraw(uint256) public virtual;
} interface ExchangeInterfaceV2 {
function sell(address _srcAddr, address _destAddr, uint _srcAmount) external payable returns (uint);
function buy(address _srcAddr, address _destAddr, uint _destAmount) external payable returns(uint);
function getSellRate(address _srcAddr, address _destAddr, uint _srcAmount) external view returns (uint);
function getBuyRate(address _srcAddr, address _destAddr, uint _srcAmount) external view returns (uint);
} contract ZrxAllowlist is AdminAuth {
mapping (address => bool) public zrxAllowlist;
mapping(address => bool) private nonPayableAddrs;
constructor() public {
zrxAllowlist[0x6958F5e95332D93D21af0D7B9Ca85B8212fEE0A5] = true;
zrxAllowlist[0x61935CbDd02287B511119DDb11Aeb42F1593b7Ef] = true;
zrxAllowlist[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true;
zrxAllowlist[0x080bf510FCbF18b91105470639e9561022937712] = true;
nonPayableAddrs[0x080bf510FCbF18b91105470639e9561022937712] = true;
}
function setAllowlistAddr(address _zrxAddr, bool _state) public onlyOwner {
zrxAllowlist[_zrxAddr] = _state;
}
function isZrxAddr(address _zrxAddr) public view returns (bool) {
return zrxAllowlist[_zrxAddr];
}
function addNonPayableAddr(address _nonPayableAddr) public onlyOwner {
nonPayableAddrs[_nonPayableAddr] = true;
}
function removeNonPayableAddr(address _nonPayableAddr) public onlyOwner {
nonPayableAddrs[_nonPayableAddr] = false;
}
function isNonPayableAddr(address _addr) public view returns(bool) {
return nonPayableAddrs[_addr];
}
} contract Discount {
address public owner;
mapping(address => CustomServiceFee) public serviceFees;
uint256 constant MAX_SERVICE_FEE = 400;
struct CustomServiceFee {
bool active;
uint256 amount;
}
constructor() public {
owner = msg.sender;
}
function isCustomFeeSet(address _user) public view returns (bool) {
return serviceFees[_user].active;
}
function getCustomServiceFee(address _user) public view returns (uint256) {
return serviceFees[_user].amount;
}
function setServiceFee(address _user, uint256 _fee) public {
require(msg.sender == owner, "Only owner");
require(_fee >= MAX_SERVICE_FEE || _fee == 0);
serviceFees[_user] = CustomServiceFee({active: true, amount: _fee});
}
function disableServiceFee(address _user) public {
require(msg.sender == owner, "Only owner");
serviceFees[_user] = CustomServiceFee({active: false, amount: 0});
}
} contract SaverExchangeHelper {
using SafeERC20 for ERC20;
address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address payable public constant WALLET_ID = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08;
address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F;
address public constant SAVER_EXCHANGE_REGISTRY = 0x25dd3F51e0C3c3Ff164DDC02A8E4D65Bb9cBB12D;
address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF;
address public constant ZRX_ALLOWLIST_ADDR = 0x4BA1f38427b33B8ab7Bb0490200dAE1F1C36823F;
function getDecimals(address _token) internal view returns (uint256) {
if (_token == KYBER_ETH_ADDRESS) return 18;
return ERC20(_token).decimals();
}
function getBalance(address _tokenAddr) internal view returns (uint balance) {
if (_tokenAddr == KYBER_ETH_ADDRESS) {
balance = address(this).balance;
} else {
balance = ERC20(_tokenAddr).balanceOf(address(this));
}
}
function approve0xProxy(address _tokenAddr, uint _amount) internal {
if (_tokenAddr != KYBER_ETH_ADDRESS) {
ERC20(_tokenAddr).safeApprove(address(ERC20_PROXY_0X), _amount);
}
}
function sendLeftover(address _srcAddr, address _destAddr, address payable _to) internal {
// send back any leftover ether or tokens
if (address(this).balance > 0) {
_to.transfer(address(this).balance);
}
if (getBalance(_srcAddr) > 0) {
ERC20(_srcAddr).safeTransfer(_to, getBalance(_srcAddr));
}
if (getBalance(_destAddr) > 0) {
ERC20(_destAddr).safeTransfer(_to, getBalance(_destAddr));
}
}
function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) {
require(bs.length >= start + 32, "slicing out of range");
uint256 x;
assembly {
x := mload(add(bs, add(0x20, start)))
}
return x;
}
} contract SaverExchangeRegistry is AdminAuth {
mapping(address => bool) private wrappers;
constructor() public {
wrappers[0x880A845A85F843a5c67DB2061623c6Fc3bB4c511] = true;
wrappers[0x4c9B55f2083629A1F7aDa257ae984E03096eCD25] = true;
wrappers[0x42A9237b872368E1bec4Ca8D26A928D7d39d338C] = true;
}
function addWrapper(address _wrapper) public onlyOwner {
wrappers[_wrapper] = true;
}
function removeWrapper(address _wrapper) public onlyOwner {
wrappers[_wrapper] = false;
}
function isWrapper(address _wrapper) public view returns(bool) {
return wrappers[_wrapper];
}
}
contract SaverExchangeCore is SaverExchangeHelper, DSMath {
// first is empty to keep the legacy order in place
enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX }
enum ActionType { SELL, BUY }
struct ExchangeData {
address srcAddr;
address destAddr;
uint srcAmount;
uint destAmount;
uint minPrice;
address wrapper;
address exchangeAddr;
bytes callData;
uint256 price0x;
}
/// @notice Internal method that preforms a sell on 0x/on-chain
/// @dev Usefull for other DFS contract to integrate for exchanging
/// @param exData Exchange data struct
/// @return (address, uint) Address of the wrapper used and destAmount
function _sell(ExchangeData memory exData) internal returns (address, uint) {
address wrapper;
uint swapedTokens;
bool success;
uint tokensLeft = exData.srcAmount;
// if selling eth, convert to weth
if (exData.srcAddr == KYBER_ETH_ADDRESS) {
exData.srcAddr = ethToWethAddr(exData.srcAddr);
TokenInterface(WETH_ADDRESS).deposit.value(exData.srcAmount)();
}
// Try 0x first and then fallback on specific wrapper
if (exData.price0x > 0) {
approve0xProxy(exData.srcAddr, exData.srcAmount);
uint ethAmount = getProtocolFee(exData.srcAddr, exData.srcAmount);
(success, swapedTokens, tokensLeft) = takeOrder(exData, ethAmount, ActionType.SELL);
if (success) {
wrapper = exData.exchangeAddr;
}
}
// fallback to desired wrapper if 0x failed
if (!success) {
swapedTokens = saverSwap(exData, ActionType.SELL);
wrapper = exData.wrapper;
}
require(getBalance(exData.destAddr) >= wmul(exData.minPrice, exData.srcAmount), "Final amount isn't correct");
// if anything is left in weth, pull it to user as eth
if (getBalance(WETH_ADDRESS) > 0) {
TokenInterface(WETH_ADDRESS).withdraw(
TokenInterface(WETH_ADDRESS).balanceOf(address(this))
);
}
return (wrapper, swapedTokens);
}
/// @notice Internal method that preforms a buy on 0x/on-chain
/// @dev Usefull for other DFS contract to integrate for exchanging
/// @param exData Exchange data struct
/// @return (address, uint) Address of the wrapper used and srcAmount
function _buy(ExchangeData memory exData) internal returns (address, uint) {
address wrapper;
uint swapedTokens;
bool success;
require(exData.destAmount != 0, "Dest amount must be specified");
// if selling eth, convert to weth
if (exData.srcAddr == KYBER_ETH_ADDRESS) {
exData.srcAddr = ethToWethAddr(exData.srcAddr);
TokenInterface(WETH_ADDRESS).deposit.value(exData.srcAmount)();
}
if (exData.price0x > 0) {
approve0xProxy(exData.srcAddr, exData.srcAmount);
uint ethAmount = getProtocolFee(exData.srcAddr, exData.srcAmount);
(success, swapedTokens,) = takeOrder(exData, ethAmount, ActionType.BUY);
if (success) {
wrapper = exData.exchangeAddr;
}
}
// fallback to desired wrapper if 0x failed
if (!success) {
swapedTokens = saverSwap(exData, ActionType.BUY);
wrapper = exData.wrapper;
}
require(getBalance(exData.destAddr) >= exData.destAmount, "Final amount isn't correct");
// if anything is left in weth, pull it to user as eth
if (getBalance(WETH_ADDRESS) > 0) {
TokenInterface(WETH_ADDRESS).withdraw(
TokenInterface(WETH_ADDRESS).balanceOf(address(this))
);
}
return (wrapper, getBalance(exData.destAddr));
}
/// @notice Takes order from 0x and returns bool indicating if it is successful
/// @param _exData Exchange data
/// @param _ethAmount Ether fee needed for 0x order
function takeOrder(
ExchangeData memory _exData,
uint256 _ethAmount,
ActionType _type
) private returns (bool success, uint256, uint256) {
// write in the exact amount we are selling/buing in an order
if (_type == ActionType.SELL) {
writeUint256(_exData.callData, 36, _exData.srcAmount);
} else {
writeUint256(_exData.callData, 36, _exData.destAmount);
}
if (ZrxAllowlist(ZRX_ALLOWLIST_ADDR).isNonPayableAddr(_exData.exchangeAddr)) {
_ethAmount = 0;
}
uint256 tokensBefore = getBalance(_exData.destAddr);
if (ZrxAllowlist(ZRX_ALLOWLIST_ADDR).isZrxAddr(_exData.exchangeAddr)) {
(success, ) = _exData.exchangeAddr.call{value: _ethAmount}(_exData.callData);
} else {
success = false;
}
uint256 tokensSwaped = 0;
uint256 tokensLeft = _exData.srcAmount;
if (success) {
// check to see if any _src tokens are left over after exchange
tokensLeft = getBalance(_exData.srcAddr);
// convert weth -> eth if needed
if (_exData.destAddr == KYBER_ETH_ADDRESS) {
TokenInterface(WETH_ADDRESS).withdraw(
TokenInterface(WETH_ADDRESS).balanceOf(address(this))
);
}
// get the current balance of the swaped tokens
tokensSwaped = getBalance(_exData.destAddr) - tokensBefore;
}
return (success, tokensSwaped, tokensLeft);
}
/// @notice Calls wraper contract for exchage to preform an on-chain swap
/// @param _exData Exchange data struct
/// @param _type Type of action SELL|BUY
/// @return swapedTokens For Sell that the destAmount, for Buy thats the srcAmount
function saverSwap(ExchangeData memory _exData, ActionType _type) internal returns (uint swapedTokens) {
require(SaverExchangeRegistry(SAVER_EXCHANGE_REGISTRY).isWrapper(_exData.wrapper), "Wrapper is not valid");
uint ethValue = 0;
ERC20(_exData.srcAddr).safeTransfer(_exData.wrapper, _exData.srcAmount);
if (_type == ActionType.SELL) {
swapedTokens = ExchangeInterfaceV2(_exData.wrapper).
sell{value: ethValue}(_exData.srcAddr, _exData.destAddr, _exData.srcAmount);
} else {
swapedTokens = ExchangeInterfaceV2(_exData.wrapper).
buy{value: ethValue}(_exData.srcAddr, _exData.destAddr, _exData.destAmount);
}
}
function writeUint256(bytes memory _b, uint256 _index, uint _input) internal pure {
if (_b.length < _index + 32) {
revert("Incorrent lengt while writting bytes32");
}
bytes32 input = bytes32(_input);
_index += 32;
// Read the bytes32 from array memory
assembly {
mstore(add(_b, _index), input)
}
}
/// @notice Converts Kybers Eth address -> Weth
/// @param _src Input address
function ethToWethAddr(address _src) internal pure returns (address) {
return _src == KYBER_ETH_ADDRESS ? WETH_ADDRESS : _src;
}
/// @notice Calculates protocol fee
/// @param _srcAddr selling token address (if eth should be WETH)
/// @param _srcAmount amount we are selling
function getProtocolFee(address _srcAddr, uint256 _srcAmount) internal view returns(uint256) {
// if we are not selling ETH msg value is always the protocol fee
if (_srcAddr != WETH_ADDRESS) return address(this).balance;
// if msg value is larger than srcAmount, that means that msg value is protocol fee + srcAmount, so we subsctract srcAmount from msg value
// we have an edge case here when protocol fee is higher than selling amount
if (address(this).balance > _srcAmount) return address(this).balance - _srcAmount;
// if msg value is lower than src amount, that means that srcAmount isn't included in msg value, so we return msg value
return address(this).balance;
}
function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) {
// splitting in two different bytes and encoding all because of stack too deep in decoding part
bytes memory part1 = abi.encode(
_exData.srcAddr,
_exData.destAddr,
_exData.srcAmount,
_exData.destAmount
);
bytes memory part2 = abi.encode(
_exData.minPrice,
_exData.wrapper,
_exData.exchangeAddr,
_exData.callData,
_exData.price0x
);
return abi.encode(part1, part2);
}
function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) {
(
bytes memory part1,
bytes memory part2
) = abi.decode(_data, (bytes,bytes));
(
_exData.srcAddr,
_exData.destAddr,
_exData.srcAmount,
_exData.destAmount
) = abi.decode(part1, (address,address,uint256,uint256));
(
_exData.minPrice,
_exData.wrapper,
_exData.exchangeAddr,
_exData.callData,
_exData.price0x
)
= abi.decode(part2, (uint256,address,address,bytes,uint256));
}
// solhint-disable-next-line no-empty-blocks
receive() external virtual payable {}
} contract ShifterRegistry is AdminAuth {
mapping (string => address) public contractAddresses;
bool public finalized;
function changeContractAddr(string memory _contractName, address _protoAddr) public onlyOwner {
require(!finalized);
contractAddresses[_contractName] = _protoAddr;
}
function lock() public onlyOwner {
finalized = true;
}
function getAddr(string memory _contractName) public view returns (address contractAddr) {
contractAddr = contractAddresses[_contractName];
require(contractAddr != address(0), "No contract address registred");
}
}
/// @title LoanShifterReceiver Recevies the Aave flash loan and calls actions through users DSProxy
contract LoanShifterReceiver is SaverExchangeCore, FlashLoanReceiverBase, AdminAuth {
address payable public constant WALLET_ADDR = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08;
address public constant DISCOUNT_ADDR = 0x1b14E8D511c9A4395425314f849bD737BAF8208F;
ILendingPoolAddressesProvider public LENDING_POOL_ADDRESS_PROVIDER = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
address public constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
ShifterRegistry public constant shifterRegistry = ShifterRegistry(0x597C52281b31B9d949a9D8fEbA08F7A2530a965e);
struct ParamData {
bytes proxyData1;
bytes proxyData2;
address proxy;
address debtAddr;
uint8 protocol1;
uint8 protocol2;
uint8 swapType;
}
constructor() FlashLoanReceiverBase(LENDING_POOL_ADDRESS_PROVIDER) public {}
function executeOperation(
address _reserve,
uint256 _amount,
uint256 _fee,
bytes calldata _params)
external override {
// Format the call data for DSProxy
(ParamData memory paramData, ExchangeData memory exchangeData)
= packFunctionCall(_amount, _fee, _params);
address protocolAddr1 = shifterRegistry.getAddr(getNameByProtocol(paramData.protocol1));
address protocolAddr2 = shifterRegistry.getAddr(getNameByProtocol(paramData.protocol2));
// Send Flash loan amount to DSProxy
sendToProxy(payable(paramData.proxy), _reserve, _amount);
// Execute the Close/Change debt operation
DSProxyInterface(paramData.proxy).execute(protocolAddr1, paramData.proxyData1);
if (paramData.swapType == 1) { // COLL_SWAP
exchangeData.srcAmount -= getFee(getBalance(exchangeData.srcAddr), exchangeData.srcAddr, paramData.proxy);
(, uint amount) = _sell(exchangeData);
sendToProxy(payable(paramData.proxy), exchangeData.destAddr, amount);
} else if (paramData.swapType == 2) { // DEBT_SWAP
exchangeData.srcAmount -= getFee(exchangeData.srcAmount, exchangeData.srcAddr, paramData.proxy);
exchangeData.destAmount = (_amount + _fee);
_buy(exchangeData);
// Send extra to DSProxy
sendToProxy(payable(paramData.proxy), exchangeData.srcAddr, ERC20(exchangeData.srcAddr).balanceOf(address(this)));
} else { // NO_SWAP just send tokens to proxy
sendToProxy(payable(paramData.proxy), exchangeData.srcAddr, getBalance(exchangeData.srcAddr));
}
// Execute the Open operation
DSProxyInterface(paramData.proxy).execute(protocolAddr2, paramData.proxyData2);
// Repay FL
transferFundsBackToPoolInternal(_reserve, _amount.add(_fee));
// if there is some eth left (0x fee), return it to user
if (address(this).balance > 0) {
tx.origin.transfer(address(this).balance);
}
}
function packFunctionCall(uint _amount, uint _fee, bytes memory _params)
internal pure returns (ParamData memory paramData, ExchangeData memory exchangeData) {
(
uint[8] memory numData, // collAmount, debtAmount, id1, id2, srcAmount, destAmount, minPrice, price0x
address[8] memory addrData, // addrLoan1, addrLoan2, debtAddr1, debtAddr2, srcAddr, destAddr, exchangeAddr, wrapper
uint8[3] memory enumData, // fromProtocol, toProtocol, swapType
bytes memory callData,
address proxy
)
= abi.decode(_params, (uint256[8],address[8],uint8[3],bytes,address));
bytes memory proxyData1;
bytes memory proxyData2;
uint openDebtAmount = (_amount + _fee);
if (enumData[0] == 0) { // MAKER FROM
proxyData1 = abi.encodeWithSignature("close(uint256,address,uint256,uint256)", numData[2], addrData[0], _amount, numData[0]);
} else if(enumData[0] == 1) { // COMPOUND FROM
if (enumData[2] == 2) { // DEBT_SWAP
proxyData1 = abi.encodeWithSignature("changeDebt(address,address,uint256,uint256)", addrData[2], addrData[3], _amount, numData[4]);
} else {
proxyData1 = abi.encodeWithSignature("close(address,address,uint256,uint256)", addrData[0], addrData[2], numData[0], numData[1]);
}
}
if (enumData[1] == 0) { // MAKER TO
proxyData2 = abi.encodeWithSignature("open(uint256,address,uint256)", numData[3], addrData[1], openDebtAmount);
} else if(enumData[1] == 1) { // COMPOUND TO
if (enumData[2] == 2) { // DEBT_SWAP
proxyData2 = abi.encodeWithSignature("repayAll(address)", addrData[3]);
} else {
proxyData2 = abi.encodeWithSignature("open(address,address,uint256)", addrData[1], addrData[3], openDebtAmount);
}
}
paramData = ParamData({
proxyData1: proxyData1,
proxyData2: proxyData2,
proxy: proxy,
debtAddr: addrData[2],
protocol1: enumData[0],
protocol2: enumData[1],
swapType: enumData[2]
});
exchangeData = SaverExchangeCore.ExchangeData({
srcAddr: addrData[4],
destAddr: addrData[5],
srcAmount: numData[4],
destAmount: numData[5],
minPrice: numData[6],
wrapper: addrData[7],
exchangeAddr: addrData[6],
callData: callData,
price0x: numData[7]
});
}
function sendToProxy(address payable _proxy, address _reserve, uint _amount) internal {
if (_reserve != ETH_ADDRESS) {
ERC20(_reserve).safeTransfer(_proxy, _amount);
}
_proxy.transfer(address(this).balance);
}
function getNameByProtocol(uint8 _proto) internal pure returns (string memory) {
if (_proto == 0) {
return "MCD_SHIFTER";
} else if (_proto == 1) {
return "COMP_SHIFTER";
}
}
function getFee(uint _amount, address _tokenAddr, address _proxy) internal returns (uint feeAmount) {
uint fee = 400;
DSProxyInterface proxy = DSProxyInterface(payable(_proxy));
address user = proxy.owner();
if (Discount(DISCOUNT_ADDR).isCustomFeeSet(user)) {
fee = Discount(DISCOUNT_ADDR).getCustomServiceFee(user);
}
feeAmount = (fee == 0) ? 0 : (_amount / fee);
// fee can't go over 20% of the whole amount
if (feeAmount > (_amount / 5)) {
feeAmount = _amount / 5;
}
if (_tokenAddr == ETH_ADDRESS) {
WALLET_ADDR.transfer(feeAmount);
} else {
ERC20(_tokenAddr).safeTransfer(WALLET_ADDR, feeAmount);
}
}
receive() external override(FlashLoanReceiverBase, SaverExchangeCore) payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DISCOUNT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC20_PROXY_0X","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KYBER_ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_POOL_ADDRESS_PROVIDER","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAVER_EXCHANGE_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_ADDR","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_ID","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZRX_ALLOWLIST_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressesProvider","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"bytes","name":"_params","type":"bytes"}],"name":"executeOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"price0x","type":"uint256"}],"internalType":"struct SaverExchangeCore.ExchangeData","name":"_exData","type":"tuple"}],"name":"packExchangeData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shifterRegistry","outputs":[{"internalType":"contract ShifterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"unpackExchangeData","outputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"price0x","type":"uint256"}],"internalType":"struct SaverExchangeCore.ExchangeData","name":"_exData","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c817905534801561003657600080fd5b50600354600080546001600160a01b03199081166001600160a01b039093169290921790556001805490911633179055612e46806100756000396000f3fe6080604052600436106101445760003560e01c806398ab3d49116100b6578063d0cc72891161006f578063d0cc7289146102f4578063d3661fa5146101fc578063deca5f8814610309578063e6a12ca914610329578063ee8725581461033e578063f851a4401461035e5761014b565b806398ab3d491461027d578063a3b8e5d114610292578063a46a66c91461023e578063a7304bf7146102bf578063a734f06e1461019d578063c72c4d10146102df5761014b565b806341c0e1b51161010857806341c0e1b5146101e757806344169752146101fc57806353485907146102115780637b925ab11461023e5780638c8a7958146102535780638da5cb5b146102685761014b565b8063040141e5146101505780631e48907b1461017b57806329f7fc9e1461019d578063314b6332146101b25780633a128322146101c75761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b50610165610373565b60405161017291906129c3565b60405180910390f35b34801561018757600080fd5b5061019b610196366004612540565b61038b565b005b3480156101a957600080fd5b506101656103c4565b3480156101be57600080fd5b506101656103dc565b3480156101d357600080fd5b5061019b6101e23660046125bf565b6103f4565b3480156101f357600080fd5b5061019b61048e565b34801561020857600080fd5b506101656104b3565b34801561021d57600080fd5b5061023161022c366004612813565b6104cb565b6040516101729190612a7d565b34801561024a57600080fd5b50610165610570565b34801561025f57600080fd5b50610165610588565b34801561027457600080fd5b506101656105a0565b34801561028957600080fd5b506101656105af565b34801561029e57600080fd5b506102b26102ad36600461277f565b6105be565b6040516101729190612c58565b3480156102cb57600080fd5b5061019b6102da366004612540565b610658565b3480156102eb57600080fd5b50610165610691565b34801561030057600080fd5b506101656106a0565b34801561031557600080fd5b5061019b610324366004612540565b6106b8565b34801561033557600080fd5b506101656106e5565b34801561034a57600080fd5b5061019b6103593660046125ea565b6106fd565b34801561036a57600080fd5b50610165610b4f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6002546001600160a01b031633146103a257600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b6001546001600160a01b0316331461040b57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610470576001546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561046a573d6000803e3d6000fd5b5061048a565b60015461048a906001600160a01b03848116911683610b5e565b5050565b6001546001600160a01b031633146104a557600080fd5b6001546001600160a01b0316ff5b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b60608082600001518360200151846040015185606001516040516020016104f594939291906129fb565b60408051601f1981840301815290829052608085015160a086015160c087015160e08801516101008901519496506060956105339590602001612cfa565b60405160208183030381529060405290508181604051602001610557929190612a90565b604051602081830303815290604052925050505b919050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b734ba1f38427b33b8ab7bb0490200dae1f1c36823f81565b6001546001600160a01b031681565b6003546001600160a01b031681565b6105c66122d8565b606080838060200190518101906105dd91906127b2565b91509150818060200190518101906105f59190612578565b606087015260408601526001600160a01b0390811660208087019190915291168452815161062a9190830181019083016128f5565b61010088015260e08701526001600160a01b0390811660c08701521660a08501526080840152509092915050565b6002546001600160a01b0316331461066f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b6001546001600160a01b031633146106cf57600080fd5b6002546001600160a01b03161561066f57600080fd5b73597c52281b31b9d949a9d8feba08f7a2530a965e81565b610705612348565b61070d6122d8565b61074e868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bb992505050565b91509150600073597c52281b31b9d949a9d8feba08f7a2530a965e6001600160a01b031663d502db976107848560800151610fd0565b6040518263ffffffff1660e01b81526004016107a09190612a7d565b60206040518083038186803b1580156107b857600080fd5b505afa1580156107cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f0919061255c565b9050600073597c52281b31b9d949a9d8feba08f7a2530a965e6001600160a01b031663d502db976108248660a00151610fd0565b6040518263ffffffff1660e01b81526004016108409190612a7d565b60206040518083038186803b15801561085857600080fd5b505afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610890919061255c565b90506108a184604001518a8a611037565b60408085015185519151631cff79cd60e01b81526001600160a01b0390911691631cff79cd916108d5918691600401612a24565b602060405180830381600087803b1580156108ef57600080fd5b505af1158015610903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109279190612767565b508360c0015160ff16600114156109875761095461094884600001516110aa565b8451604087015161115a565b604084018051919091039052600061096b846113bf565b9150506109818560400151856020015183611037565b50610a74565b8360c0015160ff1660021415610a5f576109ae83604001518460000151866040015161115a565b60408401805191909103905287870160608401526109cb8361163f565b5050604080850151845191516370a0823160e01b8152610a5a92906001600160a01b038216906370a0823190610a059030906004016129c3565b60206040518083038186803b158015610a1d57600080fd5b505afa158015610a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a559190612767565b611037565b610a74565b60408401518351610a749190610a55816110aa565b83604001516001600160a01b0316631cff79cd8286602001516040518363ffffffff1660e01b8152600401610aaa929190612a24565b602060405180830381600087803b158015610ac457600080fd5b505af1158015610ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afc9190612767565b50610b1089610b0b8a8a6118d0565b6118fc565b4715610b445760405132904780156108fc02916000818181858888f19350505050158015610b42573d6000803e3d6000fd5b505b505050505050505050565b6002546001600160a01b031681565b610bb48363a9059cbb60e01b8484604051602401610b7d929190612a64565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611990565b505050565b610bc1612348565b610bc96122d8565b610bd1612384565b610bd9612384565b610be16123a3565b6060600087806020019051810190610bf9919061267b565b9398509196509450925090506060808b8b01856000602002015160ff16610c7757876002602002015187600060200201518e8a60006020020151604051602401610c469493929190612d5d565b60408051601f198184030181529190526020810180516001600160e01b0316638dff4f7760e01b1790529250610d3d565b855160ff1660011415610d3d57604086015160ff1660021415610cf157866002602002015187600360200201518e8a60046020020151604051602401610cc094939291906129fb565b60408051601f198184030181529190526020810180516001600160e01b031663b7c2940360e01b1790529250610d3d565b86516040808901518a5160208c01519251610d109493906024016129fb565b60408051601f198184030181529190526020810180516001600160e01b0316630784262160e31b17905292505b602086015160ff16610d975760608801516020880151604051610d669291908490602401612d3e565b60408051601f198184030181529190526020810180516001600160e01b031663b6147ed560e01b1790529150610e47565b602086015160ff1660011415610e4757604086015160ff1660021415610dfd576060870151604051610dcc91906024016129c3565b60408051601f198184030181529190526020810180516001600160e01b0316637c27383b60e01b1790529150610e47565b60208701516060880151604051610e1a92919084906024016129d7565b60408051601f198184030181529190526020810180516001600160e01b0316637a79382160e11b17905291505b6040518060e00160405280848152602001838152602001856001600160a01b0316815260200188600260088110610e7a57fe5b60200201516001600160a01b0316815260200187600060038110610e9a57fe5b602002015160ff16815260200187600160038110610eb457fe5b602002015160ff16815260200187600260038110610ece57fe5b602002015160ff169052604080516101208101909152909a508088600460200201516001600160a01b0316815260200188600560088110610f0b57fe5b60200201516001600160a01b0316815260200189600460088110610f2b57fe5b6020020151815260200189600560088110610f4257fe5b6020020151815260200189600660088110610f5957fe5b6020020151815260200188600760088110610f7057fe5b60200201516001600160a01b0316815260200188600660088110610f9057fe5b60200201516001600160a01b0316815260200186815260200189600760088110610fb657fe5b602002015181525098505050505050505050935093915050565b606060ff8216611002575060408051808201909152600b81526a26a1a22fa9a424a32a22a960a91b602082015261056b565b8160ff166001141561056b575060408051808201909152600c81526b21a7a6a82fa9a424a32a22a960a11b602082015261056b565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461106f5761106f6001600160a01b0383168483610b5e565b6040516001600160a01b038416904780156108fc02916000818181858888f193505050501580156110a4573d6000803e3d6000fd5b50505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110d857504761056b565b6040516370a0823160e01b81526001600160a01b038316906370a08231906111049030906004016129c3565b60206040518083038186803b15801561111c57600080fd5b505afa158015611130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111549190612767565b92915050565b600080610190905060008390506000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111a457600080fd5b505af11580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc919061255c565b604051632cdc77ab60e21b8152909150731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac906112169084906004016129c3565b60206040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112669190612747565b156112f557604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb5431906112a29084906004016129c3565b60206040518083038186803b1580156112ba57600080fd5b505afa1580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f29190612767565b92505b821561130a5782878161130457fe5b0461130d565b60005b935060058704841115611321576005870493505b6001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561138d5760405173322d58b9e75a6918f7e7849aee0ff09369977e089085156108fc029086906000818181858888f19350505050158015611387573d6000803e3d6000fd5b506113b5565b6113b56001600160a01b03871673322d58b9e75a6918f7e7849aee0ff09369977e0886610b5e565b5050509392505050565b604081015181516000918291829182918291906001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561147757865161140190611a1f565b6001600160a01b031687526040808801518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b15801561145d57600080fd5b505af1158015611471573d6000803e3d6000fd5b50505050505b610100870151156114ce5761149487600001518860400151611a66565b60006114a888600001518960400151611ab2565b90506114b688826000611af9565b909550909350915082156114cc578760c0015194505b505b816114e8576114de876000611e2a565b92508660a0015193505b6114fa87608001518860400151612042565b61150788602001516110aa565b101561152e5760405162461bcd60e51b815260040161152590612b5a565b60405180910390fd5b600061154d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26110aa565b1115611633576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a08231906115929030906004016129c3565b602060405180830381600087803b1580156115ac57600080fd5b505af11580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e49190612767565b6040518263ffffffff1660e01b81526004016116009190612cf1565b600060405180830381600087803b15801561161a57600080fd5b505af115801561162e573d6000803e3d6000fd5b505050505b50919350915050915091565b600080600080600085606001516000141561166c5760405162461bcd60e51b815260040161152590612abe565b85516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561171357855161169d90611a1f565b6001600160a01b031686526040808701518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b50505050505b610100860151156117675761173086600001518760400151611a66565b600061174487600001518860400151611ab2565b905061175287826001611af9565b50935091508115611765578660c0015193505b505b8061178157611777866001611e2a565b91508560a0015192505b856060015161179387602001516110aa565b10156117b15760405162461bcd60e51b815260040161152590612b5a565b60006117d073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26110aa565b11156118b6576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a08231906118159030906004016129c3565b602060405180830381600087803b15801561182f57600080fd5b505af1158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190612767565b6040518263ffffffff1660e01b81526004016118839190612cf1565b600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b505050505b826118c487602001516110aa565b94509450505050915091565b6000828201838110156118f55760405162461bcd60e51b815260040161152590612af5565b9392505050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561194b57600080fd5b505afa15801561195f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611983919061255c565b9050610bb4818484612077565b60606119e5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661210d9092919063ffffffff16565b805190915015610bb45780806020019051810190611a039190612747565b610bb45760405162461bcd60e51b815260040161152590612c0e565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611a4b5781611154565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2919050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461048a5761048a6001600160a01b0383167395e6f48254609a6ee006f7d493c8e5fb97094cef83612124565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214611adf575047611154565b81471115611af1578147039050611154565b504792915050565b6000808080846001811115611b0a57fe5b1415611b2957611b248660e0015160248860400151612163565b611b3d565b611b3d8660e0015160248860600151612163565b60c0860151604051620c045f60e41b8152734ba1f38427b33b8ab7bb0490200dae1f1c36823f9162c045f091611b7691906004016129c3565b60206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190612747565b15611bd057600094505b6000611bdf87602001516110aa565b60c08801516040516302f5cc7960e11b8152919250734ba1f38427b33b8ab7bb0490200dae1f1c36823f916305eb98f291611c1c916004016129c3565b60206040518083038186803b158015611c3457600080fd5b505afa158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c9190612747565b15611cdf578660c001516001600160a01b0316868860e00151604051611c9291906129a4565b60006040518083038185875af1925050503d8060008114611ccf576040519150601f19603f3d011682016040523d82523d6000602084013e611cd4565b606091505b505080945050611ce4565b600093505b60408701516000908515611e1b578851611cfd906110aa565b60208a01519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e09576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190611d689030906004016129c3565b602060405180830381600087803b158015611d8257600080fd5b505af1158015611d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dba9190612767565b6040518263ffffffff1660e01b8152600401611dd69190612cf1565b600060405180830381600087803b158015611df057600080fd5b505af1158015611e04573d6000803e3d6000fd5b505050505b82611e178a602001516110aa565b0391505b90935091505093509350939050565b60a082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa279791611e67916004016129c3565b60206040518083038186803b158015611e7f57600080fd5b505afa158015611e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb79190612747565b611ed35760405162461bcd60e51b815260040161152590612b2c565b60a083015160408401518451600092611ef7926001600160a01b0390921691610b5e565b6000836001811115611f0557fe5b1415611fa5578360a001516001600160a01b031663cae270b6828660000151876020015188604001516040518563ffffffff1660e01b8152600401611f4c939291906129d7565b6020604051808303818588803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f9e9190612767565b915061203b565b8360a001516001600160a01b031663153e66e6828660000151876020015188606001516040518563ffffffff1660e01b8152600401611fe6939291906129d7565b6020604051808303818588803b158015611fff57600080fd5b505af1158015612013573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120389190612767565b91505b5092915050565b6000670de0b6b3a764000061206861205a858561218f565b6706f05b59d3b200006121b3565b8161206f57fe5b049392505050565b61207f6121c3565b6001600160a01b0316826001600160a01b031614156120f957826001600160a01b0316816040516120af906129c0565b60006040518083038185875af1925050503d80600081146120ec576040519150601f19603f3d011682016040523d82523d6000602084013e6120f1565b606091505b505050610bb4565b610bb46001600160a01b0383168483610b5e565b606061211c84846000856121db565b949350505050565b6121448363095ea7b360e01b846000604051602401610b7d929190612a48565b610bb48363095ea7b360e01b8484604051602401610b7d929190612a64565b81602001835110156121875760405162461bcd60e51b815260040161152590612b91565b910160200152565b60008115806121aa575050808202828282816121a757fe5b04145b61115457600080fd5b8082018281101561115457600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b60606121e68561229f565b6122025760405162461bcd60e51b815260040161152590612bd7565b60006060866001600160a01b0316858760405161221f91906129a4565b60006040518083038185875af1925050503d806000811461225c576040519150601f19603f3d011682016040523d82523d6000602084013e612261565b606091505b5091509150811561227557915061211c9050565b8051156122855780518082602001fd5b8360405162461bcd60e51b81526004016115259190612a7d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061211c575050151592915050565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600081525090565b6040805160e081018252606080825260208201819052600092820183905281018290526080810182905260a0810182905260c081019190915290565b6040518061010001604052806008906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b803561115481612df8565b805161115481612df8565b600082601f8301126123e7578081fd5b6101006123f381612d81565b9150818385838601111561240657600080fd5b600092505b600883101561243457805161241f81612df8565b8252600192909201916020918201910161240b565b50505092915050565b600082601f83011261244d578081fd5b6124576060612d81565b905080828460608501111561246b57600080fd5b6000805b600381101561249d57825160ff81168114612488578283fd5b8452602093840193929092019160010161246f565b5050505092915050565b600082601f8301126124b7578081fd5b81356124ca6124c582612da8565b612d81565b91508082528360208285010111156124e157600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261250a578081fd5b81516125186124c582612da8565b915080825283602082850101111561252f57600080fd5b61203b816020840160208601612dcc565b600060208284031215612551578081fd5b81356118f581612df8565b60006020828403121561256d578081fd5b81516118f581612df8565b6000806000806080858703121561258d578283fd5b845161259881612df8565b60208601519094506125a981612df8565b6040860151606090960151949790965092505050565b600080604083850312156125d1578182fd5b82356125dc81612df8565b946020939093013593505050565b600080600080600060808688031215612601578081fd5b853561260c81612df8565b94506020860135935060408601359250606086013567ffffffffffffffff80821115612636578283fd5b818801915088601f830112612649578283fd5b813581811115612657578384fd5b896020828501011115612668578384fd5b9699959850939650602001949392505050565b60008060008060006102a08688031215612693578283fd5b86601f8701126126a1578283fd5b6101006126ad81612d81565b9087019080888a8411156126bf578687fd5b865b60088110156126e05781518452602093840193909101906001016126c1565b505080975050506126f188826123d7565b94505061270287610200880161243d565b925061026086015167ffffffffffffffff81111561271e578182fd5b61272a888289016124fa565b92505061273b8761028088016123cc565b90509295509295909350565b600060208284031215612758578081fd5b815180151581146118f5578182fd5b600060208284031215612778578081fd5b5051919050565b600060208284031215612790578081fd5b813567ffffffffffffffff8111156127a6578182fd5b612038848285016124a7565b600080604083850312156127c4578182fd5b825167ffffffffffffffff808211156127db578384fd5b6127e7868387016124fa565b935060208501519150808211156127fc578283fd5b50612809858286016124fa565b9150509250929050565b600060208284031215612824578081fd5b813567ffffffffffffffff8082111561283b578283fd5b8184019150610120808387031215612851578384fd5b61285a81612d81565b905061286686846123c1565b815261287586602085016123c1565b60208201526040830135604082015260608301356060820152608083013560808201526128a58660a085016123c1565b60a08201526128b78660c085016123c1565b60c082015260e0830135828111156128cd578485fd5b6128d9878286016124a7565b60e0830152506101009283013592810192909252509392505050565b600080600080600060a0868803121561290c578283fd5b85519450602086015161291e81612df8565b604087015190945061292f81612df8565b606087015190935067ffffffffffffffff81111561294b578182fd5b612957888289016124fa565b925050608086015190509295509295909350565b6001600160a01b03169052565b60008151808452612990816020860160208601612dcc565b601f01601f19169290920160200192915050565b600082516129b6818460208701612dcc565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b038316815260406020820181905260009061211c90830184612978565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6000602082526118f56020830184612978565b600060408252612aa36040830185612978565b8281036020840152612ab58185612978565b95945050505050565b6020808252601d908201527f4465737420616d6f756e74206d75737420626520737065636966696564000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527315dc985c1c195c881a5cc81b9bdd081d985b1a5960621b604082015260600190565b6020808252601a908201527f46696e616c20616d6f756e742069736e277420636f7272656374000000000000604082015260600190565b60208082526026908201527f496e636f7272656e74206c656e6774207768696c65207772697474696e6720626040820152653cba32b9999960d11b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060208252612c6c60208301845161296b565b6020830151612c7e604084018261296b565b506040830151606083015260608301516080830152608083015160a083015260a0830151612caf60c084018261296b565b5060c0830151612cc260e084018261296b565b5060e08301516101206101008181860152612ce1610140860184612978565b9501519301929092525090919050565b90815260200190565b8581526001600160a01b0385811660208301528416604082015260a060608201819052600090612d2c90830185612978565b90508260808301529695505050505050565b9283526001600160a01b03919091166020830152604082015260600190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715612da057600080fd5b604052919050565b600067ffffffffffffffff821115612dbe578081fd5b50601f01601f191660200190565b60005b83811015612de7578181015183820152602001612dcf565b838111156110a45750506000910152565b6001600160a01b0381168114612e0d57600080fd5b5056fea26469706673582212204dfa6cf83064241904e879086b58b606c40d5cf0fc3c10563ae441edb06f11d264736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101445760003560e01c806398ab3d49116100b6578063d0cc72891161006f578063d0cc7289146102f4578063d3661fa5146101fc578063deca5f8814610309578063e6a12ca914610329578063ee8725581461033e578063f851a4401461035e5761014b565b806398ab3d491461027d578063a3b8e5d114610292578063a46a66c91461023e578063a7304bf7146102bf578063a734f06e1461019d578063c72c4d10146102df5761014b565b806341c0e1b51161010857806341c0e1b5146101e757806344169752146101fc57806353485907146102115780637b925ab11461023e5780638c8a7958146102535780638da5cb5b146102685761014b565b8063040141e5146101505780631e48907b1461017b57806329f7fc9e1461019d578063314b6332146101b25780633a128322146101c75761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b50610165610373565b60405161017291906129c3565b60405180910390f35b34801561018757600080fd5b5061019b610196366004612540565b61038b565b005b3480156101a957600080fd5b506101656103c4565b3480156101be57600080fd5b506101656103dc565b3480156101d357600080fd5b5061019b6101e23660046125bf565b6103f4565b3480156101f357600080fd5b5061019b61048e565b34801561020857600080fd5b506101656104b3565b34801561021d57600080fd5b5061023161022c366004612813565b6104cb565b6040516101729190612a7d565b34801561024a57600080fd5b50610165610570565b34801561025f57600080fd5b50610165610588565b34801561027457600080fd5b506101656105a0565b34801561028957600080fd5b506101656105af565b34801561029e57600080fd5b506102b26102ad36600461277f565b6105be565b6040516101729190612c58565b3480156102cb57600080fd5b5061019b6102da366004612540565b610658565b3480156102eb57600080fd5b50610165610691565b34801561030057600080fd5b506101656106a0565b34801561031557600080fd5b5061019b610324366004612540565b6106b8565b34801561033557600080fd5b506101656106e5565b34801561034a57600080fd5b5061019b6103593660046125ea565b6106fd565b34801561036a57600080fd5b50610165610b4f565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6002546001600160a01b031633146103a257600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b6001546001600160a01b0316331461040b57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610470576001546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561046a573d6000803e3d6000fd5b5061048a565b60015461048a906001600160a01b03848116911683610b5e565b5050565b6001546001600160a01b031633146104a557600080fd5b6001546001600160a01b0316ff5b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b60608082600001518360200151846040015185606001516040516020016104f594939291906129fb565b60408051601f1981840301815290829052608085015160a086015160c087015160e08801516101008901519496506060956105339590602001612cfa565b60405160208183030381529060405290508181604051602001610557929190612a90565b604051602081830303815290604052925050505b919050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b734ba1f38427b33b8ab7bb0490200dae1f1c36823f81565b6001546001600160a01b031681565b6003546001600160a01b031681565b6105c66122d8565b606080838060200190518101906105dd91906127b2565b91509150818060200190518101906105f59190612578565b606087015260408601526001600160a01b0390811660208087019190915291168452815161062a9190830181019083016128f5565b61010088015260e08701526001600160a01b0390811660c08701521660a08501526080840152509092915050565b6002546001600160a01b0316331461066f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b6001546001600160a01b031633146106cf57600080fd5b6002546001600160a01b03161561066f57600080fd5b73597c52281b31b9d949a9d8feba08f7a2530a965e81565b610705612348565b61070d6122d8565b61074e868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bb992505050565b91509150600073597c52281b31b9d949a9d8feba08f7a2530a965e6001600160a01b031663d502db976107848560800151610fd0565b6040518263ffffffff1660e01b81526004016107a09190612a7d565b60206040518083038186803b1580156107b857600080fd5b505afa1580156107cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f0919061255c565b9050600073597c52281b31b9d949a9d8feba08f7a2530a965e6001600160a01b031663d502db976108248660a00151610fd0565b6040518263ffffffff1660e01b81526004016108409190612a7d565b60206040518083038186803b15801561085857600080fd5b505afa15801561086c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610890919061255c565b90506108a184604001518a8a611037565b60408085015185519151631cff79cd60e01b81526001600160a01b0390911691631cff79cd916108d5918691600401612a24565b602060405180830381600087803b1580156108ef57600080fd5b505af1158015610903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109279190612767565b508360c0015160ff16600114156109875761095461094884600001516110aa565b8451604087015161115a565b604084018051919091039052600061096b846113bf565b9150506109818560400151856020015183611037565b50610a74565b8360c0015160ff1660021415610a5f576109ae83604001518460000151866040015161115a565b60408401805191909103905287870160608401526109cb8361163f565b5050604080850151845191516370a0823160e01b8152610a5a92906001600160a01b038216906370a0823190610a059030906004016129c3565b60206040518083038186803b158015610a1d57600080fd5b505afa158015610a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a559190612767565b611037565b610a74565b60408401518351610a749190610a55816110aa565b83604001516001600160a01b0316631cff79cd8286602001516040518363ffffffff1660e01b8152600401610aaa929190612a24565b602060405180830381600087803b158015610ac457600080fd5b505af1158015610ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afc9190612767565b50610b1089610b0b8a8a6118d0565b6118fc565b4715610b445760405132904780156108fc02916000818181858888f19350505050158015610b42573d6000803e3d6000fd5b505b505050505050505050565b6002546001600160a01b031681565b610bb48363a9059cbb60e01b8484604051602401610b7d929190612a64565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611990565b505050565b610bc1612348565b610bc96122d8565b610bd1612384565b610bd9612384565b610be16123a3565b6060600087806020019051810190610bf9919061267b565b9398509196509450925090506060808b8b01856000602002015160ff16610c7757876002602002015187600060200201518e8a60006020020151604051602401610c469493929190612d5d565b60408051601f198184030181529190526020810180516001600160e01b0316638dff4f7760e01b1790529250610d3d565b855160ff1660011415610d3d57604086015160ff1660021415610cf157866002602002015187600360200201518e8a60046020020151604051602401610cc094939291906129fb565b60408051601f198184030181529190526020810180516001600160e01b031663b7c2940360e01b1790529250610d3d565b86516040808901518a5160208c01519251610d109493906024016129fb565b60408051601f198184030181529190526020810180516001600160e01b0316630784262160e31b17905292505b602086015160ff16610d975760608801516020880151604051610d669291908490602401612d3e565b60408051601f198184030181529190526020810180516001600160e01b031663b6147ed560e01b1790529150610e47565b602086015160ff1660011415610e4757604086015160ff1660021415610dfd576060870151604051610dcc91906024016129c3565b60408051601f198184030181529190526020810180516001600160e01b0316637c27383b60e01b1790529150610e47565b60208701516060880151604051610e1a92919084906024016129d7565b60408051601f198184030181529190526020810180516001600160e01b0316637a79382160e11b17905291505b6040518060e00160405280848152602001838152602001856001600160a01b0316815260200188600260088110610e7a57fe5b60200201516001600160a01b0316815260200187600060038110610e9a57fe5b602002015160ff16815260200187600160038110610eb457fe5b602002015160ff16815260200187600260038110610ece57fe5b602002015160ff169052604080516101208101909152909a508088600460200201516001600160a01b0316815260200188600560088110610f0b57fe5b60200201516001600160a01b0316815260200189600460088110610f2b57fe5b6020020151815260200189600560088110610f4257fe5b6020020151815260200189600660088110610f5957fe5b6020020151815260200188600760088110610f7057fe5b60200201516001600160a01b0316815260200188600660088110610f9057fe5b60200201516001600160a01b0316815260200186815260200189600760088110610fb657fe5b602002015181525098505050505050505050935093915050565b606060ff8216611002575060408051808201909152600b81526a26a1a22fa9a424a32a22a960a91b602082015261056b565b8160ff166001141561056b575060408051808201909152600c81526b21a7a6a82fa9a424a32a22a960a11b602082015261056b565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461106f5761106f6001600160a01b0383168483610b5e565b6040516001600160a01b038416904780156108fc02916000818181858888f193505050501580156110a4573d6000803e3d6000fd5b50505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110d857504761056b565b6040516370a0823160e01b81526001600160a01b038316906370a08231906111049030906004016129c3565b60206040518083038186803b15801561111c57600080fd5b505afa158015611130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111549190612767565b92915050565b600080610190905060008390506000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111a457600080fd5b505af11580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc919061255c565b604051632cdc77ab60e21b8152909150731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac906112169084906004016129c3565b60206040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112669190612747565b156112f557604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb5431906112a29084906004016129c3565b60206040518083038186803b1580156112ba57600080fd5b505afa1580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f29190612767565b92505b821561130a5782878161130457fe5b0461130d565b60005b935060058704841115611321576005870493505b6001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561138d5760405173322d58b9e75a6918f7e7849aee0ff09369977e089085156108fc029086906000818181858888f19350505050158015611387573d6000803e3d6000fd5b506113b5565b6113b56001600160a01b03871673322d58b9e75a6918f7e7849aee0ff09369977e0886610b5e565b5050509392505050565b604081015181516000918291829182918291906001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561147757865161140190611a1f565b6001600160a01b031687526040808801518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b15801561145d57600080fd5b505af1158015611471573d6000803e3d6000fd5b50505050505b610100870151156114ce5761149487600001518860400151611a66565b60006114a888600001518960400151611ab2565b90506114b688826000611af9565b909550909350915082156114cc578760c0015194505b505b816114e8576114de876000611e2a565b92508660a0015193505b6114fa87608001518860400151612042565b61150788602001516110aa565b101561152e5760405162461bcd60e51b815260040161152590612b5a565b60405180910390fd5b600061154d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26110aa565b1115611633576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a08231906115929030906004016129c3565b602060405180830381600087803b1580156115ac57600080fd5b505af11580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e49190612767565b6040518263ffffffff1660e01b81526004016116009190612cf1565b600060405180830381600087803b15801561161a57600080fd5b505af115801561162e573d6000803e3d6000fd5b505050505b50919350915050915091565b600080600080600085606001516000141561166c5760405162461bcd60e51b815260040161152590612abe565b85516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561171357855161169d90611a1f565b6001600160a01b031686526040808701518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b50505050505b610100860151156117675761173086600001518760400151611a66565b600061174487600001518860400151611ab2565b905061175287826001611af9565b50935091508115611765578660c0015193505b505b8061178157611777866001611e2a565b91508560a0015192505b856060015161179387602001516110aa565b10156117b15760405162461bcd60e51b815260040161152590612b5a565b60006117d073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26110aa565b11156118b6576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a08231906118159030906004016129c3565b602060405180830381600087803b15801561182f57600080fd5b505af1158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190612767565b6040518263ffffffff1660e01b81526004016118839190612cf1565b600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b505050505b826118c487602001516110aa565b94509450505050915091565b6000828201838110156118f55760405162461bcd60e51b815260040161152590612af5565b9392505050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b15801561194b57600080fd5b505afa15801561195f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611983919061255c565b9050610bb4818484612077565b60606119e5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661210d9092919063ffffffff16565b805190915015610bb45780806020019051810190611a039190612747565b610bb45760405162461bcd60e51b815260040161152590612c0e565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611a4b5781611154565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2919050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461048a5761048a6001600160a01b0383167395e6f48254609a6ee006f7d493c8e5fb97094cef83612124565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214611adf575047611154565b81471115611af1578147039050611154565b504792915050565b6000808080846001811115611b0a57fe5b1415611b2957611b248660e0015160248860400151612163565b611b3d565b611b3d8660e0015160248860600151612163565b60c0860151604051620c045f60e41b8152734ba1f38427b33b8ab7bb0490200dae1f1c36823f9162c045f091611b7691906004016129c3565b60206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190612747565b15611bd057600094505b6000611bdf87602001516110aa565b60c08801516040516302f5cc7960e11b8152919250734ba1f38427b33b8ab7bb0490200dae1f1c36823f916305eb98f291611c1c916004016129c3565b60206040518083038186803b158015611c3457600080fd5b505afa158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c9190612747565b15611cdf578660c001516001600160a01b0316868860e00151604051611c9291906129a4565b60006040518083038185875af1925050503d8060008114611ccf576040519150601f19603f3d011682016040523d82523d6000602084013e611cd4565b606091505b505080945050611ce4565b600093505b60408701516000908515611e1b578851611cfd906110aa565b60208a01519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e09576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190611d689030906004016129c3565b602060405180830381600087803b158015611d8257600080fd5b505af1158015611d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dba9190612767565b6040518263ffffffff1660e01b8152600401611dd69190612cf1565b600060405180830381600087803b158015611df057600080fd5b505af1158015611e04573d6000803e3d6000fd5b505050505b82611e178a602001516110aa565b0391505b90935091505093509350939050565b60a082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa279791611e67916004016129c3565b60206040518083038186803b158015611e7f57600080fd5b505afa158015611e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb79190612747565b611ed35760405162461bcd60e51b815260040161152590612b2c565b60a083015160408401518451600092611ef7926001600160a01b0390921691610b5e565b6000836001811115611f0557fe5b1415611fa5578360a001516001600160a01b031663cae270b6828660000151876020015188604001516040518563ffffffff1660e01b8152600401611f4c939291906129d7565b6020604051808303818588803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f9e9190612767565b915061203b565b8360a001516001600160a01b031663153e66e6828660000151876020015188606001516040518563ffffffff1660e01b8152600401611fe6939291906129d7565b6020604051808303818588803b158015611fff57600080fd5b505af1158015612013573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120389190612767565b91505b5092915050565b6000670de0b6b3a764000061206861205a858561218f565b6706f05b59d3b200006121b3565b8161206f57fe5b049392505050565b61207f6121c3565b6001600160a01b0316826001600160a01b031614156120f957826001600160a01b0316816040516120af906129c0565b60006040518083038185875af1925050503d80600081146120ec576040519150601f19603f3d011682016040523d82523d6000602084013e6120f1565b606091505b505050610bb4565b610bb46001600160a01b0383168483610b5e565b606061211c84846000856121db565b949350505050565b6121448363095ea7b360e01b846000604051602401610b7d929190612a48565b610bb48363095ea7b360e01b8484604051602401610b7d929190612a64565b81602001835110156121875760405162461bcd60e51b815260040161152590612b91565b910160200152565b60008115806121aa575050808202828282816121a757fe5b04145b61115457600080fd5b8082018281101561115457600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b60606121e68561229f565b6122025760405162461bcd60e51b815260040161152590612bd7565b60006060866001600160a01b0316858760405161221f91906129a4565b60006040518083038185875af1925050503d806000811461225c576040519150601f19603f3d011682016040523d82523d6000602084013e612261565b606091505b5091509150811561227557915061211c9050565b8051156122855780518082602001fd5b8360405162461bcd60e51b81526004016115259190612a7d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061211c575050151592915050565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600081525090565b6040805160e081018252606080825260208201819052600092820183905281018290526080810182905260a0810182905260c081019190915290565b6040518061010001604052806008906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b803561115481612df8565b805161115481612df8565b600082601f8301126123e7578081fd5b6101006123f381612d81565b9150818385838601111561240657600080fd5b600092505b600883101561243457805161241f81612df8565b8252600192909201916020918201910161240b565b50505092915050565b600082601f83011261244d578081fd5b6124576060612d81565b905080828460608501111561246b57600080fd5b6000805b600381101561249d57825160ff81168114612488578283fd5b8452602093840193929092019160010161246f565b5050505092915050565b600082601f8301126124b7578081fd5b81356124ca6124c582612da8565b612d81565b91508082528360208285010111156124e157600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261250a578081fd5b81516125186124c582612da8565b915080825283602082850101111561252f57600080fd5b61203b816020840160208601612dcc565b600060208284031215612551578081fd5b81356118f581612df8565b60006020828403121561256d578081fd5b81516118f581612df8565b6000806000806080858703121561258d578283fd5b845161259881612df8565b60208601519094506125a981612df8565b6040860151606090960151949790965092505050565b600080604083850312156125d1578182fd5b82356125dc81612df8565b946020939093013593505050565b600080600080600060808688031215612601578081fd5b853561260c81612df8565b94506020860135935060408601359250606086013567ffffffffffffffff80821115612636578283fd5b818801915088601f830112612649578283fd5b813581811115612657578384fd5b896020828501011115612668578384fd5b9699959850939650602001949392505050565b60008060008060006102a08688031215612693578283fd5b86601f8701126126a1578283fd5b6101006126ad81612d81565b9087019080888a8411156126bf578687fd5b865b60088110156126e05781518452602093840193909101906001016126c1565b505080975050506126f188826123d7565b94505061270287610200880161243d565b925061026086015167ffffffffffffffff81111561271e578182fd5b61272a888289016124fa565b92505061273b8761028088016123cc565b90509295509295909350565b600060208284031215612758578081fd5b815180151581146118f5578182fd5b600060208284031215612778578081fd5b5051919050565b600060208284031215612790578081fd5b813567ffffffffffffffff8111156127a6578182fd5b612038848285016124a7565b600080604083850312156127c4578182fd5b825167ffffffffffffffff808211156127db578384fd5b6127e7868387016124fa565b935060208501519150808211156127fc578283fd5b50612809858286016124fa565b9150509250929050565b600060208284031215612824578081fd5b813567ffffffffffffffff8082111561283b578283fd5b8184019150610120808387031215612851578384fd5b61285a81612d81565b905061286686846123c1565b815261287586602085016123c1565b60208201526040830135604082015260608301356060820152608083013560808201526128a58660a085016123c1565b60a08201526128b78660c085016123c1565b60c082015260e0830135828111156128cd578485fd5b6128d9878286016124a7565b60e0830152506101009283013592810192909252509392505050565b600080600080600060a0868803121561290c578283fd5b85519450602086015161291e81612df8565b604087015190945061292f81612df8565b606087015190935067ffffffffffffffff81111561294b578182fd5b612957888289016124fa565b925050608086015190509295509295909350565b6001600160a01b03169052565b60008151808452612990816020860160208601612dcc565b601f01601f19169290920160200192915050565b600082516129b6818460208701612dcc565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b038316815260406020820181905260009061211c90830184612978565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6000602082526118f56020830184612978565b600060408252612aa36040830185612978565b8281036020840152612ab58185612978565b95945050505050565b6020808252601d908201527f4465737420616d6f756e74206d75737420626520737065636966696564000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527315dc985c1c195c881a5cc81b9bdd081d985b1a5960621b604082015260600190565b6020808252601a908201527f46696e616c20616d6f756e742069736e277420636f7272656374000000000000604082015260600190565b60208082526026908201527f496e636f7272656e74206c656e6774207768696c65207772697474696e6720626040820152653cba32b9999960d11b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060208252612c6c60208301845161296b565b6020830151612c7e604084018261296b565b506040830151606083015260608301516080830152608083015160a083015260a0830151612caf60c084018261296b565b5060c0830151612cc260e084018261296b565b5060e08301516101206101008181860152612ce1610140860184612978565b9501519301929092525090919050565b90815260200190565b8581526001600160a01b0385811660208301528416604082015260a060608201819052600090612d2c90830185612978565b90508260808301529695505050505050565b9283526001600160a01b03919091166020830152604082015260600190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715612da057600080fd5b604052919050565b600067ffffffffffffffff821115612dbe578081fd5b50601f01601f191660200190565b60005b83811015612de7578181015183820152602001612dcf565b838111156110a45750506000910152565b6001600160a01b0381168114612e0d57600080fd5b5056fea26469706673582212204dfa6cf83064241904e879086b58b606c40d5cf0fc3c10563ae441edb06f11d264736f6c634300060c0033
Deployed Bytecode Sourcemap
31933:7116:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18677:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8496:122;;;;;;;;;;-1:-1:-1;8496:122:0;;;;;:::i;:::-;;:::i;:::-;;18584:86;;;;;;;;;;;;;:::i;18952:92::-;;;;;;;;;;;;;:::i;8791:285::-;;;;;;;;;;-1:-1:-1;8791:285:0;;;;;:::i;:::-;;:::i;8664:80::-;;;;;;;;;;;;;:::i;32026:88::-;;;;;;;;;;;;;:::i;29735:641::-;;;;;;;;;;-1:-1:-1;29735:641:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32121:82::-;;;;;;;;;;;;;:::i;19143:87::-;;;;;;;;;;;;;:::i;7603:20::-;;;;;;;;;;;;;:::i;32212:142::-;;;;;;;;;;;;;:::i;30384:684::-;;;;;;;;;;-1:-1:-1;30384:684:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8275:122::-;;;;;;;;;;-1:-1:-1;8275:122:0;;;;;:::i;:::-;;:::i;11329:54::-;;;;;;;;;;;;;:::i;19053:83::-;;;;;;;;;;;;;:::i;7992:161::-;;;;;;;;;;-1:-1:-1;7992:161:0;;;;;:::i;:::-;;:::i;32450:109::-;;;;;;;;;;;;;:::i;32867:2137::-;;;;;;;;;;-1:-1:-1;32867:2137:0;;;;;:::i;:::-;;:::i;7630:20::-;;;;;;;;;;;;;:::i;18677:81::-;18716:42;18677:81;:::o;8496:122::-;8577:5;;-1:-1:-1;;;;;8577:5:0;8563:10;:19;8555:28;;;;;;8596:5;:14;;-1:-1:-1;;;;;;8596:14:0;-1:-1:-1;;;;;8596:14:0;;;;;;;;;;8496:122::o;18584:86::-;18628:42;18584:86;:::o;18952:92::-;19002:42;18952:92;:::o;8791:285::-;7699:5;;-1:-1:-1;;;;;7699:5:0;7708:10;7699:19;7691:28;;;;;;8891:42:::1;-1:-1:-1::0;;;;;8881:52:0;::::1;;8877:192;;;8958:5;::::0;8950:32:::1;::::0;-1:-1:-1;;;;;8958:5:0;;::::1;::::0;8950:32;::::1;;;::::0;8974:7;;8958:5:::1;8950:32:::0;8958:5;8950:32;8974:7;8958:5;8950:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8877:192;;;9042:5;::::0;9015:42:::1;::::0;-1:-1:-1;;;;;9015:26:0;;::::1;::::0;9042:5:::1;9049:7:::0;9015:26:::1;:42::i;:::-;8791:285:::0;;:::o;8664:80::-;7699:5;;-1:-1:-1;;;;;7699:5:0;7708:10;7699:19;7691:28;;;;;;8729:5:::1;::::0;-1:-1:-1;;;;;8729:5:0::1;8708:28;32026:88:::0;32072:42;32026:88;:::o;29735:641::-;29810:12;29942:18;29988:7;:15;;;30018:7;:16;;;30049:7;:17;;;30081:7;:18;;;29963:147;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29963:147:0;;;;;;;;;;30169:16;;;;30200:15;;;;30230:20;;;;30265:16;;;;30296:15;;;;29963:147;;-1:-1:-1;30123:18:0;;30144:178;;30296:15;29963:147;30144:178;;:::i;:::-;;;;;;;;;;;;;30123:199;;30355:5;30362;30344:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30337:31;;;;29735:641;;;;:::o;32121:82::-;32161:42;32121:82;:::o;19143:87::-;19188:42;19143:87;:::o;7603:20::-;;;-1:-1:-1;;;;;7603:20:0;;:::o;32212:142::-;;;-1:-1:-1;;;;;32212:142:0;;:::o;30384:684::-;30452:27;;:::i;:::-;30507:18;30540;30583:5;30572:32;;;;;;;;;;;;:::i;:::-;30492:112;;;;30768:5;30757:52;;;;;;;;;;;;:::i;:::-;30725:18;;;30617:192;30693:17;;;30617:192;-1:-1:-1;;;;;30617:192:0;;;30662:16;;;;30617:192;;;;;;;;31002:58;;;;;;;;;;;;;:::i;:::-;30964:15;;;30822:238;30933:16;;;30822:238;-1:-1:-1;;;;;30822:238:0;;;30898:20;;;30822:238;;30868:15;;;30822:238;30837:16;;;30822:238;-1:-1:-1;30837:7:0;;30384:684;-1:-1:-1;;30384:684:0:o;8275:122::-;8356:5;;-1:-1:-1;;;;;8356:5:0;8342:10;:19;8334:28;;;;;;8375:5;:14;;-1:-1:-1;;;;;;8375:14:0;-1:-1:-1;;;;;8375:14:0;;;;;;;;;;8275:122::o;11329:54::-;;;-1:-1:-1;;;;;11329:54:0;;:::o;19053:83::-;19094:42;19053:83;:::o;7992:161::-;8073:5;;-1:-1:-1;;;;;8073:5:0;8059:10;:19;8051:28;;;;;;8098:5;;-1:-1:-1;;;;;8098:5:0;:19;8090:28;;;;;32450:109;32516:42;32450:109;:::o;32867:2137::-;33083:26;;:::i;:::-;33111:32;;:::i;:::-;33181:40;33198:7;33207:4;33213:7;;33181:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33181:16:0;;-1:-1:-1;;;33181:40:0:i;:::-;33082:139;;;;33234:21;32516:42;-1:-1:-1;;;;;33258:23:0;;33282:38;33300:9;:19;;;33282:17;:38::i;:::-;33258:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33234:87;;33332:21;32516:42;-1:-1:-1;;;;;33356:23:0;;33380:38;33398:9;:19;;;33380:17;:38::i;:::-;33356:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33332:87;;33478:56;33498:9;:15;;;33516:8;33526:7;33478:11;:56::i;:::-;33616:15;;;;;33656:20;;33599:78;;-1:-1:-1;;;33599:78:0;;-1:-1:-1;;;;;33599:41:0;;;;;;:78;;33641:13;;33599:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33694:9;:18;;;:23;;33716:1;33694:23;33690:906;;;33773:79;33780:32;33791:12;:20;;;33780:10;:32::i;:::-;33814:20;;33836:15;;;;33773:6;:79::i;:::-;33747:22;;;:105;;;;;;;;-1:-1:-1;33885:19:0;33747:12;33885:5;:19::i;:::-;33867:37;;;33921:68;33941:9;:15;;;33959:12;:21;;;33982:6;33921:11;:68::i;:::-;33690:906;;;;34011:9;:18;;;:23;;34033:1;34011:23;34007:589;;;34090:69;34097:12;:22;;;34121:12;:20;;;34143:9;:15;;;34090:6;:69::i;:::-;34064:22;;;:95;;;;;;;;34203:14;;;34176:23;;;:42;34233:18;34064:12;34233:4;:18::i;:::-;-1:-1:-1;;34326:15:0;;;;;34344:20;;34366:52;;-1:-1:-1;;;34366:52:0;;34306:113;;34344:20;-1:-1:-1;;;;;34366:37:0;;;;;:52;;34412:4;;34366:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34306:11;:113::i;:::-;34007:589;;;34511:15;;;;34529:20;;34491:93;;34511:15;34551:32;34529:20;34551:10;:32::i;34491:93::-;34664:9;:15;;;-1:-1:-1;;;;;34647:41:0;;34689:13;34704:9;:20;;;34647:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34759:60:0;34791:8;34801:17;:7;34813:4;34801:11;:17::i;:::-;34759:31;:60::i;:::-;34902:21;:25;34898:99;;34944:41;;:9;;34963:21;34944:41;;;;;;;;;34963:21;34944:9;:41;;;;;;;;;;;;;;;;;;;;;34898:99;32867:2137;;;;;;;;;:::o;7630:20::-;;;-1:-1:-1;;;;;7630:20:0;;:::o;5647:176::-;5729:86;5749:5;5779:23;;;5804:2;5808:5;5756:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5756:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;5756:58:0;-1:-1:-1;;;;;;5756:58:0;;;;;;;;;;5729:19;:86::i;:::-;5647:176;;;:::o;35012:2655::-;35117:26;;:::i;:::-;35145:32;;:::i;:::-;35207:22;;:::i;:::-;35322:26;;:::i;:::-;35451:24;;:::i;:::-;35528:21;35564:13;35611:7;35600:67;;;;;;;;;;;;:::i;:::-;35192:475;;-1:-1:-1;35192:475:0;;-1:-1:-1;35192:475:0;-1:-1:-1;35192:475:0;-1:-1:-1;35192:475:0;-1:-1:-1;35680:23:0;;35771:14;;;35192:475;35748:19;35803:11;;;;:16;;35799:628;;35929:7;35937:1;35929:10;;;;35941:8;35950:1;35941:11;;;;35954:7;35963;35971:1;35963:10;;;;35863:111;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;35863:111:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35863:111:0;-1:-1:-1;;;35863:111:0;;;;-1:-1:-1;35799:628:0;;;35997:11;;:16;;36012:1;35997:16;35994:433;;;36051:11;;;;:16;;36060:1;36051:16;36047:369;;;36185:8;36194:1;36185:11;;;;36198:8;36207:1;36198:11;;;;36211:7;36220;36228:1;36220:10;;;;36114:117;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;36114:117:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36114:117:0;-1:-1:-1;;;36114:117:0;;;;-1:-1:-1;36047:369:0;;;36351:11;;36364;;;;;36377:10;;36351:11;36389:10;;;36285:115;;;;36351:11;36389:10;36285:115;;;:::i;:::-;;;;-1:-1:-1;;36285:115:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36285:115:0;-1:-1:-1;;;36285:115:0;;;;-1:-1:-1;36047:369:0;36443:11;;;;:16;;36439:531;;36558:10;;;;;36570:11;;;36501:97;;;;36558:10;36570:11;36583:14;;36501:97;;;:::i;:::-;;;;-1:-1:-1;;36501:97:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36501:97:0;-1:-1:-1;;;36501:97:0;;;;-1:-1:-1;36439:531:0;;;36619:11;;;;:16;;36628:1;36619:16;36616:354;;;36671:11;;;;:16;;36680:1;36671:16;36667:292;;;36779:11;;;;36734:57;;;;36779:11;36734:57;;;:::i;:::-;;;;-1:-1:-1;;36734:57:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36734:57:0;-1:-1:-1;;;36734:57:0;;;;-1:-1:-1;36667:292:0;;;36902:11;;;;36915;;;;36845:98;;;;36902:11;36915;36928:14;;36845:98;;;:::i;:::-;;;;-1:-1:-1;;36845:98:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36845:98:0;-1:-1:-1;;;36845:98:0;;;;-1:-1:-1;36667:292:0;36996:269;;;;;;;;37033:10;36996:269;;;;37070:10;36996:269;;;;37102:5;-1:-1:-1;;;;;36996:269:0;;;;;37132:8;37141:1;37132:11;;;;;;;;;;;-1:-1:-1;;;;;36996:269:0;;;;;37169:8;37178:1;37169:11;;;;;;;;;;;36996:269;;;;;;37206:8;37215:1;37206:11;;;;;;;;;;;36996:269;;;;;;37242:8;37251:1;37242:11;;;;;;;;;;;36996:269;;;;37293:364;;;;;;;;;36984:281;;-1:-1:-1;37293:364:0;37348:8;37357:1;37348:11;;;;-1:-1:-1;;;;;37293:364:0;;;;;37384:8;37393:1;37384:11;;;;;;;;;;;-1:-1:-1;;;;;37293:364:0;;;;;37421:7;37429:1;37421:10;;;;;;;;;;;37293:364;;;;37458:7;37466:1;37458:10;;;;;;;;;;;37293:364;;;;37493:7;37501:1;37493:10;;;;;;;;;;;37293:364;;;;37527:8;37536:1;37527:11;;;;;;;;;;;-1:-1:-1;;;;;37293:364:0;;;;;37567:8;37576:1;37567:11;;;;;;;;;;;-1:-1:-1;;;;;37293:364:0;;;;;37603:8;37293:364;;;;37635:7;37643:1;37635:10;;;;;;;;;;;37293:364;;;37278:379;;35012:2655;;;;;;;;;;;;;;:::o;37939:232::-;38003:13;38033:11;;;38029:135;;-1:-1:-1;38061:20:0;;;;;;;;;;;;-1:-1:-1;;;38061:20:0;;;;;;38029:135;38103:6;:11;;38113:1;38103:11;38099:65;;;-1:-1:-1;38131:21:0;;;;;;;;;;;;-1:-1:-1;;;38131:21:0;;;;;;37675:256;-1:-1:-1;;;;;37776:23:0;;32399:42;37776:23;37772:101;;37816:45;-1:-1:-1;;;;;37816:28:0;;37845:6;37853:7;37816:28;:45::i;:::-;37885:38;;-1:-1:-1;;;;;37885:15:0;;;37901:21;37885:38;;;;;;;;;37901:21;37885:15;:38;;;;;;;;;;;;;;;;;;;;;37675:256;;;:::o;19423:275::-;19486:12;-1:-1:-1;;;;;19515:31:0;;18628:42;19515:31;19511:180;;;-1:-1:-1;19573:21:0;19511:180;;;19637:42;;-1:-1:-1;;;19637:42:0;;-1:-1:-1;;;;;19637:27:0;;;;;:42;;19673:4;;19637:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19627:52;19423:275;-1:-1:-1;;19423:275:0:o;38179:779::-;38263:14;38290:8;38301:3;38290:14;;38317:22;38367:6;38317:58;;38386:12;38401:5;-1:-1:-1;;;;;38401:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38431:44;;-1:-1:-1;;;38431:44:0;;38386:28;;-1:-1:-1;32161:42:0;;38431:38;;:44;;38386:28;;38431:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38427:132;;;38498:49;;-1:-1:-1;;;38498:49:0;;32161:42;;38498:43;;:49;;38542:4;;38498:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38492:55;;38427:132;38584:8;;38583:32;;38611:3;38601:7;:13;;;;;;38583:32;;;38596:1;38583:32;38571:44;-1:-1:-1;38709:1:0;38699:7;:11;38686:9;:25;38682:81;;;38750:1;38740:7;:11;38728:23;;38682:81;-1:-1:-1;;;;;38779:25:0;;32399:42;38779:25;38775:176;;;38821:31;;32072:42;;38821:31;;;;;38842:9;;38821:31;;;;38842:9;32072:42;38821:31;;;;;;;;;;;;;;;;;;;;;38775:176;;;38885:54;-1:-1:-1;;;;;38885:30:0;;32072:42;38929:9;38885:30;:54::i;:::-;38179:779;;;;;;;;:::o;22114:1522::-;22298:16;;;;22375:14;;22175:7;;;;;;;;;;22298:16;-1:-1:-1;;;;;22375:35:0;18628:42;22375:35;22371:191;;;22458:14;;22444:29;;:13;:29::i;:::-;-1:-1:-1;;;;;22427:46:0;;;22531:16;;;;;22488:62;;-1:-1:-1;;;22488:62:0;;;;18716:42;;22488:36;;22531:16;22488:62;;;;;22427:14;;22488:62;;;;;;;22531:16;18716:42;22488:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22371:191;22641:14;;;;:18;22637:372;;22676:48;22691:6;:14;;;22707:6;:16;;;22676:14;:48::i;:::-;22741:14;22758:48;22773:6;:14;;;22789:6;:16;;;22758:14;:48::i;:::-;22741:65;;22859:45;22869:6;22877:9;22888:15;22859:9;:45::i;:::-;22821:83;;-1:-1:-1;22821:83:0;;-1:-1:-1;22821:83:0;-1:-1:-1;22921:77:0;;;;22963:6;:19;;;22953:29;;22921:77;22637:372;;23079:7;23074:129;;23118:34;23128:6;23136:15;23118:9;:34::i;:::-;23103:49;;23177:6;:14;;;23167:24;;23074:129;23254:39;23259:6;:15;;;23276:6;:16;;;23254:4;:39::i;:::-;23223:27;23234:6;:15;;;23223:10;:27::i;:::-;:70;;23215:109;;;;-1:-1:-1;;;23215:109:0;;;;;;;:::i;:::-;;;;;;;;;23432:1;23405:24;18716:42;23405:10;:24::i;:::-;:28;23401:185;;;23506:53;;-1:-1:-1;;;23506:53:0;;18716:42;;23450:37;;18716:42;;23506:38;;:53;;23553:4;;23506:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23450:124;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23401:185;-1:-1:-1;23606:7:0;;-1:-1:-1;23615:12:0;-1:-1:-1;;22114:1522:0;;;:::o;23904:1470::-;23964:7;23973:4;23992:15;24018:17;24046:12;24079:6;:17;;;24100:1;24079:22;;24071:64;;;;-1:-1:-1;;;24071:64:0;;;;;;;:::i;:::-;24196:14;;-1:-1:-1;;;;;24196:35:0;18628:42;24196:35;24192:191;;;24279:14;;24265:29;;:13;:29::i;:::-;-1:-1:-1;;;;;24248:46:0;;;24352:16;;;;;24309:62;;-1:-1:-1;;;24309:62:0;;;;18716:42;;24309:36;;24352:16;24309:62;;;;;24248:14;;24309:62;;;;;;;24352:16;18716:42;24309:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24192:191;24399:14;;;;:18;24395:360;;24434:48;24449:6;:14;;;24465:6;:16;;;24434:14;:48::i;:::-;24499:14;24516:48;24531:6;:14;;;24547:6;:16;;;24516:14;:48::i;:::-;24499:65;;24606:44;24616:6;24624:9;24635:14;24606:9;:44::i;:::-;-1:-1:-1;24579:71:0;-1:-1:-1;24579:71:0;-1:-1:-1;24667:77:0;;;;24709:6;:19;;;24699:29;;24667:77;24395:360;;24825:7;24820:128;;24864:33;24874:6;24882:14;24864:9;:33::i;:::-;24849:48;;24922:6;:14;;;24912:24;;24820:128;24999:6;:17;;;24968:27;24979:6;:15;;;24968:10;:27::i;:::-;:48;;24960:87;;;;-1:-1:-1;;;24960:87:0;;;;;;;:::i;:::-;25155:1;25128:24;18716:42;25128:10;:24::i;:::-;:28;25124:185;;;25229:53;;-1:-1:-1;;;25229:53:0;;18716:42;;25173:37;;18716:42;;25229:38;;:53;;25276:4;;25229:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25173:124;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25124:185;25329:7;25338:27;25349:6;:15;;;25338:10;:27::i;:::-;25321:45;;;;;;;23904:1470;;;:::o;3807:181::-;3865:7;3897:5;;;3921:6;;;;3913:46;;;;-1:-1:-1;;;3913:46:0;;;;;;;:::i;:::-;3979:1;3807:181;-1:-1:-1;;;3807:181:0:o;11554:220::-;11652:20;11675:17;;;;;;;;;-1:-1:-1;;;;;11675:17:0;-1:-1:-1;;;;;11675:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11652:61;;11726:40;11743:4;11748:8;11758:7;11726:16;:40::i;7116:419::-;7198:23;7224:69;7252:4;7224:69;;;;;;;;;;;;;;;;;7232:5;-1:-1:-1;;;;;7224:27:0;;;:69;;;;;:::i;:::-;7308:17;;7198:95;;-1:-1:-1;7308:21:0;7304:224;;7450:10;7439:30;;;;;;;;;;;;:::i;:::-;7431:85;;;;-1:-1:-1;;;7431:85:0;;;;;;;:::i;28673:142::-;28733:7;-1:-1:-1;;;;;28760:25:0;;18628:42;28760:25;:47;;28803:4;28760:47;;;-1:-1:-1;18716:42:0;;28673:142;-1:-1:-1;28673:142:0:o;19706:212::-;-1:-1:-1;;;;;19788:31:0;;18628:42;19788:31;19784:127;;19836:63;-1:-1:-1;;;;;19836:29:0;;19094:42;19891:7;19836:29;:63::i;28984:743::-;29068:7;-1:-1:-1;;;;;29167:24:0;;18716:42;29167:24;29163:58;;-1:-1:-1;29200:21:0;29193:28;;29163:58;29496:10;29472:21;:34;29468:81;;;29539:10;29515:21;:34;29508:41;;;;29468:81;-1:-1:-1;29698:21:0;28984:743;;;;:::o;25562:1602::-;25699:12;;;;25819:5;:24;;;;;;;;;25815:197;;;25860:53;25873:7;:16;;;25891:2;25895:7;:17;;;25860:12;:53::i;:::-;25815:197;;;25946:54;25959:7;:16;;;25977:2;25981:7;:18;;;25946:12;:54::i;:::-;26078:20;;;;26028:71;;-1:-1:-1;;;26028:71:0;;19188:42;;26028:49;;:71;;26078:20;26028:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26024:118;;;26129:1;26116:14;;26024:118;26154:20;26177:28;26188:7;:16;;;26177:10;:28::i;:::-;26265:20;;;;26222:64;;-1:-1:-1;;;26222:64:0;;26154:51;;-1:-1:-1;19188:42:0;;26222;;:64;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26218:221;;;26317:7;:20;;;-1:-1:-1;;;;;26317:25:0;26350:10;26362:7;:16;;;26317:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:76;;;;;26218:221;;;26422:5;26412:15;;26218:221;26507:17;;;;26451:20;;26537:565;;;;26666:15;;26655:27;;:10;:27::i;:::-;26749:16;;;;26642:40;;-1:-1:-1;;;;;;26749:37:0;18628:42;26749:37;26745:210;;;26867:53;;-1:-1:-1;;;26867:53:0;;18716:42;;26807:37;;18716:42;;26867:38;;:53;;26914:4;;26867:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26807:132;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26745:210;27078:12;27047:28;27058:7;:16;;;27047:10;:28::i;:::-;:43;27032:58;;26537:565;27131:12;;-1:-1:-1;27145:10:0;-1:-1:-1;;25562:1602:0;;;;;;;:::o;27430:742::-;27609:15;;;;27552:73;;-1:-1:-1;;;27552:73:0;;27514:17;;19002:42;;27552:56;;:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27544:106;;;;-1:-1:-1;;;27544:106:0;;;;;;;:::i;:::-;27729:15;;;;27746:17;;;;27699:15;;27663:13;;27693:71;;-1:-1:-1;;;;;27693:35:0;;;;;:71::i;:::-;27790:15;27781:5;:24;;;;;;;;;27777:388;;;27857:7;:15;;;-1:-1:-1;;;;;27837:63:0;;27908:8;27918:7;:15;;;27935:7;:16;;;27953:7;:17;;;27837:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27822:149;;27777:388;;;28039:7;:15;;;-1:-1:-1;;;;;28019:62:0;;28089:8;28099:7;:15;;;28116:7;:16;;;28134:7;:18;;;28019:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28004:149;;27777:388;27430:742;;;;;:::o;13954:122::-;14013:9;13903:6;14039:23;14043:9;14047:1;14050;14043:3;:9::i;:::-;14054:7;14039:3;:23::i;:::-;:29;;;;;;;13954:122;-1:-1:-1;;;13954:122:0:o;11782:355::-;11909:26;:24;:26::i;:::-;-1:-1:-1;;;;;11897:38:0;:8;-1:-1:-1;;;;;11897:38:0;;11894:168;;;11992:12;-1:-1:-1;;;;;11992:17:0;12017:7;11992:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12044:7;;11894:168;12074:51;-1:-1:-1;;;;;12074:28:0;;12103:12;12117:7;12074:28;:51::i;2036:196::-;2139:12;2171:53;2194:6;2202:4;2208:1;2211:12;2171:22;:53::i;:::-;2164:60;2036:196;-1:-1:-1;;;;2036:196:0:o;6196:281::-;6282:86;6302:5;6332:22;;;6356:7;6365:1;6309:58;;;;;;;;;:::i;6282:86::-;6379:90;6399:5;6429:22;;;6453:7;6462:5;6406:62;;;;;;;;;:::i;28180:397::-;28289:6;28298:2;28289:11;28277:2;:9;:23;28273:104;;;28317:48;;-1:-1:-1;;;28317:48:0;;;;;;;:::i;28273:104::-;28536:15;;28443:2;28536:15;28529:30;28514:56::o;13173:127::-;13231:9;13261:6;;;:30;;-1:-1:-1;;13276:5:0;;;13290:1;13285;13276:5;13285:1;13271:15;;;;;:20;13261:30;13253:39;;;;;12931:113;13024:5;;;13019:16;;;;13011:25;;;;;11063:121;11134:42;11063:121;:::o;2798:979::-;2928:12;2961:18;2972:6;2961:10;:18::i;:::-;2953:60;;;;-1:-1:-1;;;2953:60:0;;;;;;;:::i;:::-;3087:12;3101:23;3128:6;-1:-1:-1;;;;;3128:11:0;3148:8;3159:4;3128:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3086:78;;;;3179:7;3175:595;;;3210:10;-1:-1:-1;3203:17:0;;-1:-1:-1;3203:17:0;3175:595;3324:17;;:21;3320:439;;3587:10;3581:17;3648:15;3635:10;3631:2;3627:19;3620:44;3535:148;3730:12;3723:20;;-1:-1:-1;;;3723:20:0;;;;;;;;:::i;823:619::-;883:4;1351:20;;1194:66;1391:23;;;;;;:42;;-1:-1:-1;;1418:15:0;;;1383:51;-1:-1:-1;;823:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;283:150::-;369:13;;387:41;369:13;387:41;:::i;459:638::-;;585:3;578:4;570:6;566:17;562:27;552:2;;-1:-1;;593:12;552:2;31163:17;646:78;31163:17;646:78;:::i;:::-;637:87;;730:16;789:17;847:3;31163:17;822:3;818:27;815:36;812:2;;;864:1;;854:12;812:2;889:1;880:10;;874:217;627:4;896:1;893:13;874:217;;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;967:61;;921:1;914:9;;;;;31175:4;1042:14;;;;1070;874:217;;;878:14;;;545:552;;;;:::o;1787:632::-;;1911:3;1904:4;1896:6;1892:17;1888:27;1878:2;;-1:-1;;1919:12;1878:2;1972:76;31163:17;1972:76;:::i;:::-;1963:85;;2054:16;2113:17;2171:3;31163:17;2146:3;2142:27;2139:36;2136:2;;;2188:1;;2178:12;2136:2;2213:1;;2198:215;1953:4;2220:1;2217:13;2198:215;;;5998:6;5992:13;33597:4;36030:5;33586:16;36007:5;36004:33;35994:2;;2213:1;;36041:12;35994:2;2291:59;;31175:4;2364:14;;;;2392;;;;;2245:1;2238:9;2198:215;;;2202:14;;;;1871:548;;;;:::o;3062:440::-;;3163:3;3156:4;3148:6;3144:17;3140:27;3130:2;;-1:-1;;3171:12;3130:2;3218:6;3205:20;3240:64;3255:48;3296:6;3255:48;:::i;:::-;3240:64;:::i;:::-;3231:73;;3324:6;3317:5;3310:21;3428:3;3360:4;3419:6;3352;3410:16;;3407:25;3404:2;;;3445:1;;3435:12;3404:2;34863:6;3360:4;3352:6;3348:17;3360:4;3386:5;3382:16;34840:30;34919:1;34901:16;;;3360:4;34901:16;34894:27;3386:5;3123:379;-1:-1;;3123:379::o;3511:442::-;;3623:3;3616:4;3608:6;3604:17;3600:27;3590:2;;-1:-1;;3631:12;3590:2;3671:6;3665:13;3693:64;3708:48;3749:6;3708:48;:::i;3693:64::-;3684:73;;3777:6;3770:5;3763:21;3881:3;3813:4;3872:6;3805;3863:16;;3860:25;3857:2;;;3898:1;;3888:12;3857:2;3908:39;3940:6;3813:4;3839:5;3835:16;3813:4;3805:6;3801:17;3908:39;:::i;6053:241::-;;6157:2;6145:9;6136:7;6132:23;6128:32;6125:2;;;-1:-1;;6163:12;6125:2;85:6;72:20;97:33;124:5;97:33;:::i;6301:263::-;;6416:2;6404:9;6395:7;6391:23;6387:32;6384:2;;;-1:-1;;6422:12;6384:2;226:6;220:13;238:33;265:5;238:33;:::i;6857:704::-;;;;;7039:3;7027:9;7018:7;7014:23;7010:33;7007:2;;;-1:-1;;7046:12;7007:2;375:6;369:13;387:41;422:5;387:41;:::i;:::-;7217:2;7275:22;;369:13;7098:82;;-1:-1;387:41;369:13;387:41;:::i;:::-;7344:2;7394:22;;5853:13;7463:2;7513:22;;;5853:13;7001:560;;7225:82;;-1:-1;7001:560;-1:-1;;;7001:560::o;7568:366::-;;;7689:2;7677:9;7668:7;7664:23;7660:32;7657:2;;;-1:-1;;7695:12;7657:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7747:63;7847:2;7886:22;;;;5705:20;;-1:-1;;;7651:283::o;7941:741::-;;;;;;8115:3;8103:9;8094:7;8090:23;8086:33;8083:2;;;-1:-1;;8122:12;8083:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8174:63;-1:-1;8274:2;8313:22;;5705:20;;-1:-1;8382:2;8421:22;;5705:20;;-1:-1;8518:2;8503:18;;8490:32;8542:18;8531:30;;;8528:2;;;-1:-1;;8564:12;8528:2;8649:6;8638:9;8634:22;;;2831:3;2824:4;2816:6;2812:17;2808:27;2798:2;;-1:-1;;2839:12;2798:2;2882:6;2869:20;8542:18;2901:6;2898:30;2895:2;;;-1:-1;;2931:12;2895:2;3026:3;8274:2;3006:17;2967:6;2992:32;;2989:41;2986:2;;;-1:-1;;3033:12;2986:2;8077:605;;;;-1:-1;8077:605;;-1:-1;8274:2;2963:17;;8584:82;8077:605;-1:-1;;;8077:605::o;8689:1059::-;;;;;;8956:3;8944:9;8935:7;8931:23;8927:33;8924:2;;;-1:-1;;8963:12;8924:2;1250:3;1243:4;1235:6;1231:17;1227:27;1217:2;;-1:-1;;1258:12;1217:2;31163:17;1311:78;31163:17;1311:78;:::i;:::-;1483:27;;;;1395:16;1454:17;1480:36;;;1477:2;;;-1:-1;;1519:12;1477:2;-1:-1;1539:217;1292:4;1561:1;1558:13;1539:217;;;5853:13;;1632:61;;31175:4;1707:14;;;;1735;;;;1586:1;1579:9;1539:217;;;1543:14;;9015:97;;;;;9168:87;9247:7;9223:22;9168:87;:::i;:::-;9158:97;;;9311:85;9388:7;9292:3;9368:9;9364:22;9311:85;:::i;:::-;9301:95;;9454:3;9443:9;9439:19;9433:26;31108:18;9471:6;9468:30;9465:2;;;-1:-1;;9501:12;9465:2;9531:73;9596:7;9587:6;9576:9;9572:22;9531:73;:::i;:::-;9521:83;;;9660:72;9724:7;9641:3;9704:9;9700:22;9660:72;:::i;:::-;9650:82;;8918:830;;;;;;;;:::o;9755:257::-;;9867:2;9855:9;9846:7;9842:23;9838:32;9835:2;;;-1:-1;;9873:12;9835:2;2508:6;2502:13;35662:5;33214:13;33207:21;35640:5;35637:32;35627:2;;-1:-1;;35673:12;10019:263;;10134:2;10122:9;10113:7;10109:23;10105:32;10102:2;;;-1:-1;;10140:12;10102:2;-1:-1;2640:13;;10096:186;-1:-1;10096:186::o;10289:345::-;;10402:2;10390:9;10381:7;10377:23;10373:32;10370:2;;;-1:-1;;10408:12;10370:2;10466:17;10453:31;10504:18;10496:6;10493:30;10490:2;;;-1:-1;;10526:12;10490:2;10556:62;10610:7;10601:6;10590:9;10586:22;10556:62;:::i;10641:593::-;;;10791:2;10779:9;10770:7;10766:23;10762:32;10759:2;;;-1:-1;;10797:12;10759:2;10848:17;10842:24;10886:18;;10878:6;10875:30;10872:2;;;-1:-1;;10908:12;10872:2;10938:73;11003:7;10994:6;10983:9;10979:22;10938:73;:::i;:::-;10928:83;;11069:2;11058:9;11054:18;11048:25;11034:39;;10886:18;11085:6;11082:30;11079:2;;;-1:-1;;11115:12;11079:2;;11145:73;11210:7;11201:6;11190:9;11186:22;11145:73;:::i;:::-;11135:83;;;10753:481;;;;;:::o;11241:387::-;;11375:2;11363:9;11354:7;11350:23;11346:32;11343:2;;;-1:-1;;11381:12;11343:2;11439:17;11426:31;11477:18;;11469:6;11466:30;11463:2;;;-1:-1;;11499:12;11463:2;11595:6;11584:9;11580:22;;;4124:6;;4112:9;4107:3;4103:19;4099:32;4096:2;;;-1:-1;;4134:12;4096:2;4162:22;4124:6;4162:22;:::i;:::-;4153:31;;4269:49;4314:3;4290:22;4269:49;:::i;:::-;4251:16;4244:75;4417:49;4462:3;11375:2;4442:9;4438:22;4417:49;:::i;:::-;11375:2;4403:5;4399:16;4392:75;4533:2;4591:9;4587:22;5705:20;4533:2;4552:5;4548:16;4541:75;4683:2;4741:9;4737:22;5705:20;4683:2;4702:5;4698:16;4691:75;4831:3;4890:9;4886:22;5705:20;4831:3;4851:5;4847:16;4840:75;5013:49;5058:3;4979;5038:9;5034:22;5013:49;:::i;:::-;4979:3;4999:5;4995:16;4988:75;5166:49;5211:3;5132;5191:9;5187:22;5166:49;:::i;:::-;5132:3;5152:5;5148:16;5141:75;5309:3;5298:9;5294:19;5281:33;11477:18;5326:6;5323:30;5320:2;;;-1:-1;;5356:12;5320:2;5401:58;5455:3;5446:6;5435:9;5431:22;5401:58;:::i;:::-;5309:3;5383:16;;5376:84;-1:-1;5524:3;5581:22;;;5705:20;5540:18;;;5533:77;;;;-1:-1;5387:5;11337:291;-1:-1;;;11337:291::o;11905:938::-;;;;;;12113:3;12101:9;12092:7;12088:23;12084:33;12081:2;;;-1:-1;;12120:12;12081:2;5859:6;5853:13;12172:74;;12283:2;12345:9;12341:22;369:13;387:41;422:5;387:41;:::i;:::-;12410:2;12468:22;;369:13;12291:82;;-1:-1;387:41;369:13;387:41;:::i;:::-;12558:2;12543:18;;12537:25;12418:82;;-1:-1;12582:18;12571:30;;12568:2;;;-1:-1;;12604:12;12568:2;12634:73;12699:7;12690:6;12679:9;12675:22;12634:73;:::i;:::-;12624:83;;;12744:3;12799:9;12795:22;5853:13;12753:74;;12075:768;;;;;;;;:::o;12999:137::-;-1:-1;;;;;33381:54;13086:45;;13080:56::o;13373:323::-;;13505:5;32117:12;32392:6;32387:3;32380:19;13588:52;13633:6;32429:4;32424:3;32420:14;32429:4;13614:5;13610:16;13588:52;:::i;:::-;35296:7;35280:14;-1:-1;;35276:28;13652:39;;;;32429:4;13652:39;;13453:243;-1:-1;;13453:243::o;20081:271::-;;14213:5;32117:12;14324:52;14369:6;14364:3;14357:4;14350:5;14346:16;14324:52;:::i;:::-;14388:16;;;;;20215:137;-1:-1;;20215:137::o;20359:379::-;20723:10;20547:191::o;20745:222::-;-1:-1;;;;;33381:54;;;;13086:45;;20872:2;20857:18;;20843:124::o;21480:444::-;-1:-1;;;;;33381:54;;;13086:45;;33381:54;;;;21827:2;21812:18;;13086:45;21910:2;21895:18;;19912:37;;;;21663:2;21648:18;;21634:290::o;21931:556::-;-1:-1;;;;;33381:54;;;13086:45;;33381:54;;;;22307:2;22292:18;;13086:45;22390:2;22375:18;;19912:37;22473:2;22458:18;;19912:37;;;;22142:3;22127:19;;22113:374::o;22494:417::-;-1:-1;;;;;33381:54;;13086:45;;22667:2;22785;22770:18;;22763:48;;;22494:417;;22825:76;;22652:18;;22887:6;22825:76;:::i;22918:345::-;-1:-1;;;;;33381:54;;;;13086:45;;33597:4;33586:16;23249:2;23234:18;;14881:56;23079:2;23064:18;;23050:213::o;23270:333::-;-1:-1;;;;;33381:54;;;;13086:45;;23589:2;23574:18;;19912:37;23425:2;23410:18;;23396:207::o;23610:306::-;;23755:2;23776:17;23769:47;23830:76;23755:2;23744:9;23740:18;23892:6;23830:76;:::i;23923:501::-;;24114:2;24135:17;24128:47;24189:76;24114:2;24103:9;24099:18;24251:6;24189:76;:::i;:::-;24313:9;24307:4;24303:20;24298:2;24287:9;24283:18;24276:48;24338:76;24409:4;24400:6;24338:76;:::i;:::-;24330:84;24085:339;-1:-1;;;;;24085:339::o;25328:416::-;25528:2;25542:47;;;15528:2;25513:18;;;32380:19;15564:31;32420:14;;;15544:52;15615:12;;;25499:245::o;25751:416::-;25951:2;25965:47;;;15866:2;25936:18;;;32380:19;15902:29;32420:14;;;15882:50;15951:12;;;25922:245::o;26174:416::-;26374:2;26388:47;;;16202:2;26359:18;;;32380:19;-1:-1;;;32420:14;;;16218:43;16280:12;;;26345:245::o;26597:416::-;26797:2;26811:47;;;16531:2;26782:18;;;32380:19;16567:28;32420:14;;;16547:49;16615:12;;;26768:245::o;27020:416::-;27220:2;27234:47;;;16866:2;27205:18;;;32380:19;16902:34;32420:14;;;16882:55;-1:-1;;;16957:12;;;16950:30;16999:12;;;27191:245::o;27443:416::-;27643:2;27657:47;;;17555:2;27628:18;;;32380:19;17591:31;32420:14;;;17571:52;17642:12;;;27614:245::o;27866:416::-;28066:2;28080:47;;;17893:2;28051:18;;;32380:19;17929:34;32420:14;;;17909:55;-1:-1;;;17984:12;;;17977:34;18030:12;;;28037:245::o;28289:390::-;;28476:2;28497:17;28490:47;18402:63;28476:2;28465:9;28461:18;18379:16;18373:23;18402:63;:::i;:::-;28476:2;18541:5;18537:16;18531:23;18560:63;18608:14;28465:9;18608:14;18594:12;18560:63;:::i;:::-;;18608:14;18700:5;18696:16;18690:23;18767:14;28465:9;18767:14;19912:37;18767:14;18860:5;18856:16;18850:23;18927:14;28465:9;18927:14;19912:37;18927:14;19018:5;19014:16;19008:23;19085:14;28465:9;19085:14;19912:37;19085:14;19175:5;19171:16;19165:23;19194:63;19242:14;28465:9;19242:14;19228:12;19194:63;:::i;:::-;;19242:14;19337:5;19333:16;19327:23;19356:63;19404:14;28465:9;19404:14;19390:12;19356:63;:::i;:::-;;19404:14;19495:5;19491:16;19485:23;18302:6;19528:14;18302:6;19528:14;28465:9;19528:14;19521:38;19574:71;18293:16;28465:9;18293:16;19626:12;19574:71;:::i;:::-;19722:18;;19716:25;19795:16;;19912:37;;;;-1:-1;19566:79;;28447:232;-1:-1;28447:232::o;28686:222::-;19912:37;;;28813:2;28798:18;;28784:124::o;28915:752::-;19912:37;;;-1:-1;;;;;33381:54;;;29337:2;29322:18;;13086:45;33381:54;;29420:2;29405:18;;13086:45;33392:42;29457:2;29442:18;;29435:48;;;28915:752;;29497:76;;29157:19;;29559:6;29497:76;:::i;:::-;29489:84;;19942:5;29652:3;29641:9;29637:19;19912:37;29143:524;;;;;;;;:::o;29674:444::-;19912:37;;;-1:-1;;;;;33381:54;;;;30021:2;30006:18;;13086:45;30104:2;30089:18;;19912:37;29857:2;29842:18;;29828:290::o;30125:556::-;19912:37;;;-1:-1;;;;;33381:54;;;;30501:2;30486:18;;13086:45;30584:2;30569:18;;19912:37;30667:2;30652:18;;19912:37;30336:3;30321:19;;30307:374::o;30688:256::-;30750:2;30744:9;30776:17;;;30851:18;30836:34;;30872:22;;;30833:62;30830:2;;;30908:1;;30898:12;30830:2;30750;30917:22;30728:216;;-1:-1;30728:216::o;31702:321::-;;31845:18;31837:6;31834:30;31831:2;;;-1:-1;;31867:12;31831:2;-1:-1;35296:7;31921:17;-1:-1;;31917:33;32008:4;31998:15;;31768:255::o;34936:268::-;35001:1;35008:101;35022:6;35019:1;35016:13;35008:101;;;35089:11;;;35083:18;35070:11;;;35063:39;35044:2;35037:10;35008:101;;;35124:6;35121:1;35118:13;35115:2;;;-1:-1;;35001:1;35171:16;;35164:27;34985:219::o;35317:117::-;-1:-1;;;;;33381:54;;35376:35;;35366:2;;35425:1;;35415:12;35366:2;35360:74;:::o
Swarm Source
ipfs://4dfa6cf83064241904e879086b58b606c40d5cf0fc3c10563ae441edb06f11d2
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.