Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OneSplit
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-01-11
*/
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol
pragma solidity ^0.5.0;
/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol, uint8 decimals) public {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
}
// File: contracts/interface/IUniswapExchange.sol
pragma solidity ^0.5.0;
interface IUniswapExchange {
function getEthToTokenInputPrice(uint256 ethSold)
external view returns(uint256 tokensBought);
function getTokenToEthInputPrice(uint256 tokensSold)
external view returns (uint256 ethBought);
function ethToTokenSwapInput(uint256 minTokens, uint256 deadline)
external payable returns (uint256 tokensBought);
function tokenToEthSwapInput(uint256 tokensSold, uint256 minEth, uint256 deadline)
external returns (uint256 ethBought);
function tokenToTokenSwapInput(uint256 tokensSold, uint256 minTokensBought, uint256 minEthBought, uint256 deadline, address tokenAddr)
external returns (uint256 tokensBought);
}
// File: contracts/interface/IUniswapFactory.sol
pragma solidity ^0.5.0;
interface IUniswapFactory {
function getExchange(IERC20 token)
external view returns(IUniswapExchange exchange);
}
// File: contracts/interface/IKyberNetworkContract.sol
pragma solidity ^0.5.0;
interface IKyberNetworkContract {
function searchBestRate(
IERC20 src,
IERC20 dest,
uint256 srcAmount,
bool usePermissionless
) external view returns(address reserve, uint256 rate);
}
// File: contracts/interface/IKyberNetworkProxy.sol
pragma solidity ^0.5.0;
interface IKyberNetworkProxy {
function getExpectedRate(
IERC20 src,
IERC20 dest,
uint256 srcQty
) external view returns(uint256 expectedRate, uint256 slippageRate);
function tradeWithHint(
IERC20 src,
uint256 srcAmount,
IERC20 dest,
address destAddress,
uint256 maxDestAmount,
uint256 minConversionRate,
address walletId,
bytes calldata hint
) external payable returns(uint256);
function kyberNetworkContract() external view returns (IKyberNetworkContract);
// TODO: Limit usage by tx.gasPrice
// function maxGasPrice() external view returns (uint256);
// TODO: Limit usage by user cap
// function getUserCapInWei(address user) external view returns (uint256);
// function getUserCapInTokenWei(address user, IERC20 token) external view returns (uint256);
}
// File: contracts/interface/IKyberUniswapReserve.sol
pragma solidity ^0.5.0;
interface IKyberUniswapReserve {
function uniswapFactory() external view returns(address);
}
// File: contracts/interface/IKyberOasisReserve.sol
pragma solidity ^0.5.0;
interface IKyberOasisReserve {
function otc() external view returns(address);
}
// File: contracts/interface/IKyberBancorReserve.sol
pragma solidity ^0.5.0;
contract IKyberBancorReserve {
function bancorEth() public view returns(address);
}
// File: contracts/interface/IBancorNetwork.sol
pragma solidity ^0.5.0;
interface IBancorNetwork {
function getReturnByPath(
address[] calldata path,
uint256 amount
) external view returns(
uint256 returnAmount,
uint256 conversionFee
);
function claimAndConvert(
address[] calldata path,
uint256 amount,
uint256 minReturn
) external returns(uint256);
function convert(
address[] calldata path,
uint256 amount,
uint256 minReturn
) external payable returns(uint256);
}
// File: contracts/interface/IBancorContractRegistry.sol
pragma solidity ^0.5.0;
contract IBancorContractRegistry {
function addressOf(bytes32 contractName)
external view returns (address);
}
// File: contracts/interface/IBancorNetworkPathFinder.sol
pragma solidity ^0.5.0;
interface IBancorNetworkPathFinder {
function generatePath(IERC20 sourceToken, IERC20 targetToken)
external view returns(address[] memory);
}
// File: contracts/interface/IBancorEtherToken.sol
pragma solidity ^0.5.0;
contract IBancorEtherToken is IERC20 {
function deposit()
external payable;
function withdraw(uint256 amount)
external;
}
// File: contracts/interface/IOasisExchange.sol
pragma solidity ^0.5.0;
interface IOasisExchange {
function getBuyAmount(IERC20 buyGem, IERC20 payGem, uint256 payAmt)
external view returns(uint256 fillAmt);
function sellAllAmount(IERC20 payGem, uint payAmt, IERC20 buyGem, uint256 minFillAmount)
external returns(uint256 fillAmt);
}
// File: contracts/interface/ICompound.sol
pragma solidity ^0.5.0;
contract ICompound {
function markets(address cToken)
external
view
returns(bool isListed, uint256 collateralFactorMantissa);
}
contract ICompoundToken is IERC20 {
function underlying() external view returns(address);
function exchangeRateStored() external view returns(uint256);
function mint(uint256 mintAmount) external returns(uint256);
function redeem(uint256 redeemTokens) external returns(uint256);
}
contract ICompoundEther is IERC20 {
function mint() external payable;
function redeem(uint256 redeemTokens) external returns(uint256);
}
// File: contracts/interface/IFulcrum.sol
pragma solidity ^0.5.0;
contract IFulcrumToken is IERC20 {
function tokenPrice() external view returns(uint256);
function loanTokenAddress() external view returns(address);
function mintWithEther(address receiver)
external payable returns (uint256 mintAmount);
function mint(address receiver, uint256 depositAmount)
external returns (uint256 mintAmount);
function burnToEther(address receiver, uint256 burnAmount)
external returns (uint256 loanAmountPaid);
function burn(address receiver, uint256 burnAmount)
external returns (uint256 loanAmountPaid);
}
// File: contracts/interface/IWETH.sol
pragma solidity ^0.5.0;
contract IWETH is IERC20 {
function deposit()
external payable;
function withdraw(uint256 amount)
external;
}
// File: contracts/interface/IChai.sol
pragma solidity ^0.5.0;
interface IPot {
function dsr() external view returns (uint256);
function chi() external view returns (uint256);
function rho() external view returns (uint256);
function drip() external returns (uint256);
function join(uint256) external;
function exit(uint256) external;
}
contract IChai is IERC20 {
function POT() public view returns(IPot);
function join(address dst, uint wad) external;
function exit(address src, uint wad) external;
}
library ChaiHelper {
IPot private constant POT = IPot(0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7);
uint256 private constant RAY = 10 ** 27;
function _mul(uint x, uint y) private pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x);
}
function _rmul(uint x, uint y) private pure returns (uint z) {
// always rounds down
z = _mul(x, y) / RAY;
}
function _rdiv(uint x, uint y) private pure returns (uint z) {
// always rounds down
z = _mul(x, RAY) / y;
}
function rpow(uint x, uint n, uint base) private pure returns (uint z) {
// solium-disable-next-line security/no-inline-assembly
assembly {
switch x case 0 {switch n case 0 {z := base} default {z := 0}}
default {
switch mod(n, 2) case 0 { z := base } default { z := x }
let half := div(base, 2) // for rounding.
for { n := div(n, 2) } n { n := div(n,2) } {
let xx := mul(x, x)
if iszero(eq(div(xx, x), x)) { revert(0,0) }
let xxRound := add(xx, half)
if lt(xxRound, xx) { revert(0,0) }
x := div(xxRound, base)
if mod(n,2) {
let zx := mul(z, x)
if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) }
let zxRound := add(zx, half)
if lt(zxRound, zx) { revert(0,0) }
z := div(zxRound, base)
}
}
}
}
}
function potDrip() private view returns(uint256) {
return _rmul(rpow(POT.dsr(), now - POT.rho(), RAY), POT.chi());
}
function daiToChai(IChai /*chai*/, uint256 amount) internal view returns(uint256) {
uint chi = (now > POT.rho()) ? potDrip() : POT.chi();
return _rdiv(amount, chi);
}
function chaiToDai(IChai /*chai*/, uint256 amount) internal view returns(uint256) {
uint chi = (now > POT.rho()) ? potDrip() : POT.chi();
return _rmul(chi, amount);
}
}
// File: contracts/interface/IAaveToken.sol
pragma solidity ^0.5.0;
interface IAaveToken {
function underlyingAssetAddress() external view returns(IERC20);
function redeem(uint256 amount) external;
}
interface IAaveLendingPool {
function underlyingAssetAddress() external view returns(IERC20);
function deposit(IERC20 token, uint256 amount, uint16 refCode) external payable;
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.5.5;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* This test is non-exhaustive, and there may be false-negatives: during the
* execution of a contract's constructor, its address will be reported as
* not containing a contract.
*
* IMPORTANT: It is unsafe to assume that an address for which this
* function returns false is an externally-owned account (EOA) and not a
* contract.
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
// 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 != 0x0 && codehash != accountHash);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.5.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 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(IERC20 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));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/UniversalERC20.sol
pragma solidity ^0.5.0;
library UniversalERC20 {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000);
IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
function universalTransfer(IERC20 token, address to, uint256 amount) internal returns(bool) {
if (amount == 0) {
return true;
}
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
address(uint160(to)).transfer(amount);
} else {
token.safeTransfer(to, amount);
return true;
}
}
function universalTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
if (amount == 0) {
return;
}
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
require(from == msg.sender && msg.value >= amount, "msg.value is zero");
if (to != address(this)) {
address(uint160(to)).transfer(amount);
}
if (msg.value > amount) {
msg.sender.transfer(msg.value.sub(amount));
}
} else {
token.safeTransferFrom(from, to, amount);
}
}
function universalApprove(IERC20 token, address to, uint256 amount) internal {
if (token != ZERO_ADDRESS && token != ETH_ADDRESS) {
token.safeApprove(to, amount);
}
}
function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) {
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
return who.balance;
} else {
return token.balanceOf(who);
}
}
function universalDecimals(IERC20 token) internal view returns (uint256) {
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
return 18;
}
(bool success, bytes memory data) = address(token).staticcall.gas(5000)(
abi.encodeWithSignature("decimals()")
);
if (!success) {
(success, data) = address(token).staticcall.gas(5000)(
abi.encodeWithSignature("DECIMALS()")
);
}
return success ? abi.decode(data, (uint256)) : 18;
}
function isETH(IERC20 token) internal pure returns(bool) {
return (address(token) == address(ZERO_ADDRESS) || address(token) == address(ETH_ADDRESS));
}
}
// File: contracts/OneSplit.sol
pragma solidity ^0.5.0;
library DisableFlags {
function enabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) {
return (disableFlags & flag) == 0;
}
function disabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) {
return (disableFlags & flag) != 0;
}
}
contract OneSplit {
using SafeMath for uint256;
using DisableFlags for uint256;
using ChaiHelper for IChai;
using UniversalERC20 for IERC20;
using UniversalERC20 for IWETH;
using UniversalERC20 for IBancorEtherToken;
//
// disableFlags = FLAG_UNISWAP + FLAG_KYBER + ...
//
uint256 constant public FLAG_UNISWAP = 0x01;
uint256 constant public FLAG_KYBER = 0x02;
uint256 constant public FLAG_BANCOR = 0x04;
uint256 constant public FLAG_OASIS = 0x08;
uint256 constant public FLAG_COMPOUND = 0x10;
uint256 constant public FLAG_FULCRUM = 0x20;
uint256 constant public FLAG_CHAI = 0x40;
uint256 constant public FLAG_AAVE = 0x80;
IERC20 constant public ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
IWETH wethToken = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
IBancorEtherToken bancorEtherToken = IBancorEtherToken(0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315);
ICompound public compound = ICompound(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B);
ICompoundEther public cETH = ICompoundEther(0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5);
IERC20 public dai = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F);
IChai public chai = IChai(0x06AF07097C9Eeb7fD685c692751D5C66dB49c215);
IAaveLendingPool public aave = IAaveLendingPool(0x398eC7346DcD622eDc5ae82352F02bE94C62d119);
IKyberNetworkProxy public kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755);
IUniswapFactory public uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95);
IBancorContractRegistry public bancorContractRegistry = IBancorContractRegistry(0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4);
IBancorNetworkPathFinder bancorNetworkPathFinder = IBancorNetworkPathFinder(0x6F0cD8C4f6F06eAB664C7E3031909452b4B72861);
IOasisExchange public oasisExchange = IOasisExchange(0x39755357759cE0d7f32dC8dC45414CCa409AE24e);
function() external payable {
// solium-disable-next-line security/no-tx-origin
require(msg.sender != tx.origin);
}
function log(uint256) external view {
}
function getAllRatesForDEX(
IERC20 fromToken,
IERC20 toToken,
uint256 amount,
uint256 parts,
uint256 disableFlags
) public view returns(uint256[] memory results) {
results = new uint256[](parts);
for (uint i = 0; i < parts; i++) {
(results[i],) = getExpectedReturn(
fromToken,
toToken,
amount.mul(i + 1).div(parts),
1,
disableFlags
);
}
}
function getExpectedReturn(
IERC20 fromToken,
IERC20 toToken,
uint256 amount,
uint256 parts,
uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum
)
public
view
returns(
uint256 returnAmount,
uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis]
)
{
distribution = new uint256[](4);
if (fromToken == toToken) {
returnAmount = amount;
return (returnAmount, distribution);
}
if (disableFlags.enabled(FLAG_COMPOUND)) {
if (_isCompoundToken(fromToken)) {
IERC20 underlying = _compoundUnderlyingAsset(fromToken);
if (underlying != IERC20(-1)) {
uint256 compoundRate = ICompoundToken(address(fromToken)).exchangeRateStored();
return getExpectedReturn(
underlying,
toToken,
amount.mul(compoundRate).div(1e18),
parts,
disableFlags
);
}
}
if (_isCompoundToken(toToken)) {
IERC20 underlying = _compoundUnderlyingAsset(toToken);
if (underlying != IERC20(-1)) {
uint256 compoundRate = ICompoundToken(address(toToken)).exchangeRateStored();
(returnAmount, distribution) = getExpectedReturn(
fromToken,
underlying,
amount,
parts,
disableFlags
);
returnAmount = returnAmount.mul(1e18).div(compoundRate);
return (returnAmount, distribution);
}
}
}
if (disableFlags.enabled(FLAG_FULCRUM)) {
IERC20 underlying = _isFulcrumToken(fromToken);
if (underlying != IERC20(-1)) {
uint256 fulcrumRate = IFulcrumToken(address(fromToken)).tokenPrice();
return getExpectedReturn(
underlying,
toToken,
amount.mul(fulcrumRate).div(1e18),
parts,
disableFlags
);
}
underlying = _isFulcrumToken(toToken);
if (underlying != IERC20(-1)) {
uint256 fulcrumRate = IFulcrumToken(address(toToken)).tokenPrice();
(returnAmount, distribution) = getExpectedReturn(
fromToken,
underlying,
amount,
parts,
disableFlags
);
returnAmount = returnAmount.mul(1e18).div(fulcrumRate);
return (returnAmount, distribution);
}
}
if (disableFlags.enabled(FLAG_CHAI)) {
if (fromToken == IERC20(chai)) {
return getExpectedReturn(
dai,
toToken,
chai.chaiToDai(amount),
parts,
disableFlags
);
}
if (toToken == IERC20(chai)) {
(returnAmount, distribution) = getExpectedReturn(
fromToken,
dai,
amount,
parts,
disableFlags
);
return (chai.daiToChai(returnAmount), distribution);
}
}
if (disableFlags.enabled(FLAG_AAVE)) {
IERC20 underlying = _isAaveToken(fromToken);
if (underlying != IERC20(-1)) {
return getExpectedReturn(
underlying,
toToken,
amount,
parts,
disableFlags
);
}
underlying = _isAaveToken(toToken);
if (underlying != IERC20(-1)) {
return getExpectedReturn(
fromToken,
underlying,
amount,
parts,
disableFlags
);
}
}
function(IERC20,IERC20,uint256) view returns(uint256)[4] memory reserves = [
disableFlags.disabled(FLAG_UNISWAP) ? _calculateNoReturn : calculateUniswapReturn,
disableFlags.disabled(FLAG_KYBER) ? _calculateNoReturn : calculateKyberReturn,
disableFlags.disabled(FLAG_BANCOR) ? _calculateNoReturn : calculateBancorReturn,
disableFlags.disabled(FLAG_OASIS) ? _calculateNoReturn : calculateOasisReturn
];
uint256[4] memory rates;
uint256[4] memory fullRates;
for (uint i = 0; i < rates.length; i++) {
rates[i] = reserves[i](fromToken, toToken, amount.div(parts));
this.log(rates[i]);
fullRates[i] = rates[i];
}
for (uint j = 0; j < parts; j++) {
// Find best part
uint256 bestIndex = 0;
for (uint i = 1; i < rates.length; i++) {
if (rates[i] > rates[bestIndex]) {
bestIndex = i;
}
}
// Add best part
returnAmount = returnAmount.add(rates[bestIndex]);
distribution[bestIndex]++;
// Avoid CompilerError: Stack too deep
uint256 srcAmount = amount;
// Recalc part if needed
if (j + 1 < parts) {
uint256 newRate = reserves[bestIndex](
fromToken,
toToken,
srcAmount.mul(distribution[bestIndex] + 1).div(parts)
);
rates[bestIndex] = newRate.sub(fullRates[bestIndex]);
this.log(rates[bestIndex]);
fullRates[bestIndex] = newRate;
}
}
}
function swap(
IERC20 fromToken,
IERC20 toToken,
uint256 amount,
uint256 minReturn,
uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis]
uint256 disableFlags // 16 - Compound, 32 - Fulcrum
) public payable {
fromToken.universalTransferFrom(msg.sender, address(this), amount);
_swap(fromToken, toToken, amount, distribution, disableFlags);
uint256 returnAmount = toToken.universalBalanceOf(address(this));
require(returnAmount >= minReturn, "OneSplit: actual return amount is less than minReturn");
toToken.universalTransfer(msg.sender, returnAmount);
fromToken.universalTransfer(msg.sender, fromToken.universalBalanceOf(address(this)));
}
function _swap(
IERC20 fromToken,
IERC20 toToken,
uint256 amount,
uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis]
uint256 disableFlags // 16 - Compound
) internal {
if (fromToken == toToken) {
return;
}
if (disableFlags.enabled(FLAG_COMPOUND)) {
if (_isCompoundToken(fromToken)) {
IERC20 underlying = _compoundUnderlyingAsset(fromToken);
ICompoundToken(address(fromToken)).redeem(amount);
uint256 underlyingAmount = underlying.universalBalanceOf(address(this));
return _swap(
underlying,
toToken,
underlyingAmount,
distribution,
disableFlags
);
}
if (_isCompoundToken(toToken)) {
IERC20 underlying = _compoundUnderlyingAsset(toToken);
_swap(
fromToken,
underlying,
amount,
distribution,
disableFlags
);
uint256 underlyingAmount = underlying.universalBalanceOf(address(this));
if (underlying.isETH()) {
cETH.mint.value(underlyingAmount)();
} else {
_infiniteApproveIfNeeded(underlying, address(toToken));
ICompoundToken(address(toToken)).mint(underlyingAmount);
}
return;
}
}
if (disableFlags.enabled(FLAG_FULCRUM)) {
IERC20 underlying = _isFulcrumToken(fromToken);
if (underlying != IERC20(-1)) {
if (underlying.isETH()) {
IFulcrumToken(address(fromToken)).burnToEther(address(this), amount);
} else {
IFulcrumToken(address(fromToken)).burn(address(this), amount);
}
uint256 underlyingAmount = underlying.universalBalanceOf(address(this));
return _swap(
underlying,
toToken,
underlyingAmount,
distribution,
disableFlags
);
}
underlying = _isFulcrumToken(toToken);
if (underlying != IERC20(-1)) {
_swap(
fromToken,
underlying,
amount,
distribution,
disableFlags
);
uint256 underlyingAmount = underlying.universalBalanceOf(address(this));
if (underlying.isETH()) {
IFulcrumToken(address(toToken)).mintWithEther.value(underlyingAmount)(address(this));
} else {
_infiniteApproveIfNeeded(underlying, address(toToken));
IFulcrumToken(address(toToken)).mint(address(this), underlyingAmount);
}
return;
}
}
if (disableFlags.enabled(FLAG_CHAI)) {
if (fromToken == IERC20(chai)) {
chai.exit(address(this), amount);
return _swap(
dai,
toToken,
dai.balanceOf(address(this)),
distribution,
disableFlags
);
}
if (toToken == IERC20(chai)) {
_swap(
fromToken,
dai,
amount,
distribution,
disableFlags
);
_infiniteApproveIfNeeded(dai, address(chai));
chai.join(address(this), dai.balanceOf(address(this)));
return;
}
}
if (disableFlags.enabled(FLAG_AAVE)) {
IERC20 underlying = _isAaveToken(fromToken);
if (underlying != IERC20(-1)) {
IAaveToken(address(fromToken)).redeem(amount);
return _swap(
underlying,
toToken,
amount,
distribution,
disableFlags
);
}
underlying = _isAaveToken(toToken);
if (underlying != IERC20(-1)) {
_swap(
fromToken,
underlying,
amount,
distribution,
disableFlags
);
uint256 underlyingAmount = underlying.universalBalanceOf(address(this));
_infiniteApproveIfNeeded(underlying, address(aave));
aave.deposit.value(underlying.isETH() ? underlyingAmount : 0)(
underlying.isETH() ? ETH_ADDRESS : underlying,
underlyingAmount,
1101
);
return;
}
}
function(IERC20,IERC20,uint256) returns(uint256)[4] memory reserves = [
_swapOnUniswap,
_swapOnKyber,
_swapOnBancor,
_swapOnOasis
];
uint256 parts = 0;
uint256 lastNonZeroIndex = 0;
for (uint i = 0; i < reserves.length; i++) {
if (distribution[i] > 0) {
parts = parts.add(distribution[i]);
lastNonZeroIndex = i;
}
}
require(parts > 0, "OneSplit: distribution should contain non-zeros");
uint256 remainingAmount = amount;
for (uint i = 0; i < reserves.length; i++) {
if (distribution[i] == 0) {
continue;
}
uint256 swapAmount = amount.mul(distribution[i]).div(parts);
if (i == lastNonZeroIndex) {
swapAmount = remainingAmount;
}
remainingAmount -= swapAmount;
reserves[i](fromToken, toToken, swapAmount);
}
}
function goodSwap(
IERC20 fromToken,
IERC20 toToken,
uint256 amount,
uint256 minReturn,
uint256 parts,
uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum
) public payable {
(, uint256[] memory distribution) = getExpectedReturn(fromToken, toToken, amount, parts, disableFlags);
swap(
fromToken,
toToken,
amount,
minReturn,
distribution,
disableFlags
);
}
// View Helpers
function calculateUniswapReturn(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) public view returns(uint256) {
uint256 returnAmount = amount;
if (!fromToken.isETH()) {
IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken);
if (fromExchange != IUniswapExchange(0)) {
(bool success, bytes memory data) = address(fromExchange).staticcall.gas(200000)(
abi.encodeWithSelector(
fromExchange.getTokenToEthInputPrice.selector,
returnAmount
)
);
if (success) {
returnAmount = abi.decode(data, (uint256));
} else {
returnAmount = 0;
}
}
}
if (!toToken.isETH()) {
IUniswapExchange toExchange = uniswapFactory.getExchange(toToken);
if (toExchange != IUniswapExchange(0)) {
(bool success, bytes memory data) = address(toExchange).staticcall.gas(200000)(
abi.encodeWithSelector(
toExchange.getEthToTokenInputPrice.selector,
returnAmount
)
);
if (success) {
returnAmount = abi.decode(data, (uint256));
} else {
returnAmount = 0;
}
}
}
return returnAmount;
}
function calculateKyberReturn(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) public view returns(uint256) {
(bool success, bytes memory data) = address(kyberNetworkProxy).staticcall.gas(2300)(abi.encodeWithSelector(
kyberNetworkProxy.kyberNetworkContract.selector
));
if (!success) {
return 0;
}
IKyberNetworkContract kyberNetworkContract = IKyberNetworkContract(abi.decode(data, (address)));
if (fromToken.isETH() || toToken.isETH()) {
return _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, toToken, amount);
}
uint256 value = _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, ETH_ADDRESS, amount);
if (value == 0) {
return 0;
}
return _calculateKyberReturnWithEth(kyberNetworkContract, ETH_ADDRESS, toToken, value);
}
function _calculateKyberReturnWithEth(
IKyberNetworkContract kyberNetworkContract,
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) public view returns(uint256) {
(bool success, bytes memory data) = address(kyberNetworkContract).staticcall.gas(200000)(abi.encodeWithSelector(
kyberNetworkContract.searchBestRate.selector,
fromToken.isETH() ? ETH_ADDRESS : fromToken,
toToken.isETH() ? ETH_ADDRESS : toToken,
amount,
true
));
if (!success) {
return 0;
}
(address reserve, uint256 rate) = abi.decode(data, (address,uint256));
if (reserve == 0x54A4a1167B004b004520c605E3f01906f683413d || // Uniswap
reserve == 0xCf1394C5e2e879969fdB1f464cE1487147863dCb || // Oasis
reserve == 0x053AA84FCC676113a57e0EbB0bD1913839874bE4) // Bancor
{
return 0;
}
// Check for Uniswap reserve
(success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector(
IKyberUniswapReserve(reserve).uniswapFactory.selector
));
if (success) {
return 0;
}
// Check for Oasis reserve
(success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector(
IKyberOasisReserve(reserve).otc.selector
));
if (success) {
return 0;
}
// Check for Bancor reserve
(success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector(
IKyberBancorReserve(reserve).bancorEth.selector
));
if (success) {
return 0;
}
return rate.mul(amount)
.mul(10 ** IERC20(toToken).universalDecimals())
.div(10 ** IERC20(fromToken).universalDecimals())
.div(1e18);
}
function calculateBancorReturn(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) public view returns(uint256) {
IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork"));
address[] memory path = bancorNetworkPathFinder.generatePath(
fromToken.isETH() ? bancorEtherToken : fromToken,
toToken.isETH() ? bancorEtherToken : toToken
);
(bool success, bytes memory data) = address(bancorNetwork).staticcall.gas(200000)(
abi.encodeWithSelector(
bancorNetwork.getReturnByPath.selector,
path,
amount
)
);
if (!success) {
return 0;
}
(uint256 returnAmount,) = abi.decode(data, (uint256,uint256));
return returnAmount;
}
function calculateOasisReturn(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) public view returns(uint256) {
(bool success, bytes memory data) = address(oasisExchange).staticcall.gas(500000)(
abi.encodeWithSelector(
oasisExchange.getBuyAmount.selector,
toToken.isETH() ? wethToken : toToken,
fromToken.isETH() ? wethToken : fromToken,
amount
)
);
if (!success) {
return 0;
}
return abi.decode(data, (uint256));
}
function _calculateNoReturn(
IERC20 /*fromToken*/,
IERC20 /*toToken*/,
uint256 /*amount*/
) internal view returns(uint256) {
this;
}
// Swap Helpers
function _swapOnUniswap(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) internal returns(uint256) {
uint256 returnAmount = amount;
if (!fromToken.isETH()) {
IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken);
if (fromExchange != IUniswapExchange(0)) {
_infiniteApproveIfNeeded(fromToken, address(fromExchange));
returnAmount = fromExchange.tokenToEthSwapInput(returnAmount, 1, now);
}
}
if (!toToken.isETH()) {
IUniswapExchange toExchange = uniswapFactory.getExchange(toToken);
if (toExchange != IUniswapExchange(0)) {
returnAmount = toExchange.ethToTokenSwapInput.value(returnAmount)(1, now);
}
}
return returnAmount;
}
function _swapOnKyber(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) internal returns(uint256) {
_infiniteApproveIfNeeded(fromToken, address(kyberNetworkProxy));
return kyberNetworkProxy.tradeWithHint.value(fromToken.isETH() ? amount : 0)(
fromToken.isETH() ? ETH_ADDRESS : fromToken,
amount,
toToken.isETH() ? ETH_ADDRESS : toToken,
address(this),
1 << 255,
0,
0x4D37f28D2db99e8d35A6C725a5f1749A085850a3,
""
);
}
function _swapOnBancor(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) internal returns(uint256) {
if (fromToken.isETH()) {
bancorEtherToken.deposit.value(amount)();
}
IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork"));
address[] memory path = bancorNetworkPathFinder.generatePath(
fromToken.isETH() ? bancorEtherToken : fromToken,
toToken.isETH() ? bancorEtherToken : toToken
);
_infiniteApproveIfNeeded(fromToken.isETH() ? bancorEtherToken : fromToken, address(bancorNetwork));
uint256 returnAmount = bancorNetwork.claimAndConvert(path, amount, 1);
if (toToken.isETH()) {
bancorEtherToken.withdraw(bancorEtherToken.balanceOf(address(this)));
}
return returnAmount;
}
function _swapOnOasis(
IERC20 fromToken,
IERC20 toToken,
uint256 amount
) internal returns(uint256) {
if (fromToken.isETH()) {
wethToken.deposit.value(amount)();
}
_infiniteApproveIfNeeded(fromToken.isETH() ? wethToken : fromToken, address(oasisExchange));
uint256 returnAmount = oasisExchange.sellAllAmount(
fromToken.isETH() ? wethToken : fromToken,
amount,
toToken.isETH() ? wethToken : toToken,
1
);
if (toToken.isETH()) {
wethToken.withdraw(wethToken.balanceOf(address(this)));
}
return returnAmount;
}
// Helpers
function _infiniteApproveIfNeeded(IERC20 token, address to) internal {
if (!token.isETH()) {
if ((token.allowance(address(this), to) >> 255) == 0) {
token.universalApprove(to, uint256(- 1));
}
}
}
function _isCompoundToken(IERC20 token) internal view returns(bool) {
if (token == cETH) {
return true;
}
(bool success, bytes memory data) = address(compound).staticcall.gas(5000)(abi.encodeWithSelector(
compound.markets.selector,
token
));
if (!success) {
return false;
}
(bool isListed,) = abi.decode(data, (bool,uint256));
return isListed;
}
function _compoundUnderlyingAsset(IERC20 asset) internal view returns(IERC20) {
if (asset == cETH) {
return IERC20(address(0));
}
(bool success, bytes memory data) = address(asset).staticcall.gas(5000)(abi.encodeWithSelector(
ICompoundToken(address(asset)).underlying.selector
));
if (!success) {
return IERC20(-1);
}
return abi.decode(data, (IERC20));
}
function _isFulcrumToken(IERC20 token) public view returns(IERC20) {
if (token.isETH()) {
return IERC20(-1);
}
(bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector(
ERC20Detailed(address(token)).name.selector
));
if (!success) {
return IERC20(-1);
}
bool foundBZX = false;
for (uint i = 0; i < data.length - 7; i++) {
if (data[i + 0] == "F" &&
data[i + 1] == "u" &&
data[i + 2] == "l" &&
data[i + 3] == "c" &&
data[i + 4] == "r" &&
data[i + 5] == "u" &&
data[i + 6] == "m")
{
foundBZX = true;
break;
}
}
if (!foundBZX) {
return IERC20(-1);
}
(success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector(
IFulcrumToken(address(token)).loanTokenAddress.selector
));
if (!success) {
return IERC20(-1);
}
return abi.decode(data, (IERC20));
}
function _isAaveToken(IERC20 token) public view returns(IERC20) {
if (token.isETH()) {
return IERC20(-1);
}
(bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector(
ERC20Detailed(address(token)).name.selector
));
if (!success) {
return IERC20(-1);
}
bool foundAave = false;
for (uint i = 0; i < data.length - 4; i++) {
if (data[i + 0] == "A" &&
data[i + 1] == "a" &&
data[i + 2] == "v" &&
data[i + 3] == "e")
{
foundAave = true;
break;
}
}
if (!foundAave) {
return IERC20(-1);
}
(success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector(
IAaveToken(address(token)).underlyingAssetAddress.selector
));
if (!success) {
return IERC20(-1);
}
return abi.decode(data, (IERC20));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_AAVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_BANCOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_CHAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_COMPOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_FULCRUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_OASIS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_UNISWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IKyberNetworkContract","name":"kyberNetworkContract","type":"address"},{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"_calculateKyberReturnWithEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isAaveToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isFulcrumToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"contract IAaveLendingPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorContractRegistry","outputs":[{"internalType":"contract IBancorContractRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cETH","outputs":[{"internalType":"contract ICompoundEther","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateBancorReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateKyberReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateOasisReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateUniswapReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"chai","outputs":[{"internalType":"contract IChai","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"contract ICompound","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getAllRatesForDEX","outputs":[{"internalType":"uint256[]","name":"results","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"goodSwap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkProxy","outputs":[{"internalType":"contract IKyberNetworkProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"log","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oasisExchange","outputs":[{"internalType":"contract IOasisExchange","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"swap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560018054821673c0829421c1d260bd3cb3e0f06cfe2d52db2ce315179055600280548216733d9819210a31b4961b30ef54be2aed79b9c9cd3b179055600380548216734ddc2d193948926d02f9b1fe9e1daa0718270ed5179055600480548216736b175474e89094c44da98b954eedeac495271d0f1790556005805482167306af07097c9eeb7fd685c692751d5c66db49c21517905560068054821673398ec7346dcd622edc5ae82352f02be94c62d11917905560078054821673818e6fecd516ecc3849daf6845e3ec868087b75517905560088054821673c0a47dfe034b400b47bdad5fecda2621de6c4d951790556009805482167352ae12abe5d8bd778bd5397f99ca900624cfadd4179055600a80548216736f0cd8c4f6f06eab664c7e3031909452b4b72861179055600b80549091167339755357759ce0d7f32dc8dc45414cca409ae24e17905534801561018457600080fd5b50615059806101946000396000f3fe6080604052600436106101cd5760003560e01c80638bdb2afa116100f7578063d77366a411610095578063f4b9fa7511610064578063f4b9fa751461075b578063f64a9a4914610770578063f69e204614610785578063f82c50f11461079a576101cd565b8063d77366a4146105c8578063e2a7515e146105dd578063eb16df2a146106a7578063f484966b146106bc576101cd565b8063a1b4d011116100d1578063a1b4d01114610574578063a734f06e14610589578063b69d04561461059e578063ceb54115146105b3576101cd565b80638bdb2afa146105015780638c6c11f214610516578063955039451461052b576101cd565b80635cfcee281161016f57806372b6f1bf1161013e57806372b6f1bf14610461578063819faf7b1461049457806383366577146104a95780638a273858146104be576101cd565b80635cfcee281461037e57806364456efa146103935780636b9589aa146103d65780636f3a10531461041e576101cd565b80633c1a62dc116101ab5780633c1a62dc146102cc5780634037f967146102f35780634c914a4e146103265780635372d5481461033b576101cd565b8063085e2c5b146101dc57806312dea160146102865780631388b420146102b7575b333214156101da57600080fd5b005b3480156101e857600080fd5b5061022b600480360360a08110156101ff57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356107c4565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610271578181015183820152602001610259565b50505050905001935050505060405180910390f35b34801561029257600080fd5b5061029b610f1d565b604080516001600160a01b039092168252519081900360200190f35b3480156102c357600080fd5b5061029b610f2c565b3480156102d857600080fd5b506102e1610f3b565b60408051918252519081900360200190f35b3480156102ff57600080fd5b5061029b6004803603602081101561031657600080fd5b50356001600160a01b0316610f40565b34801561033257600080fd5b506102e16112b8565b34801561034757600080fd5b506102e16004803603606081101561035e57600080fd5b506001600160a01b038135811691602081013590911690604001356112bd565b34801561038a57600080fd5b506102e161145e565b34801561039f57600080fd5b506102e1600480360360608110156103b657600080fd5b506001600160a01b03813581169160208101359091169060400135611463565b6101da600480360360c08110156103ec57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a001356117de565b34801561042a57600080fd5b506102e16004803603606081101561044157600080fd5b506001600160a01b03813581169160208101359091169060400135611807565b34801561046d57600080fd5b5061029b6004803603602081101561048457600080fd5b50356001600160a01b0316611ba5565b3480156104a057600080fd5b5061029b611df5565b3480156104b557600080fd5b506102e1611e04565b3480156104ca57600080fd5b506102e1600480360360608110156104e157600080fd5b506001600160a01b03813581169160208101359091169060400135611e09565b34801561050d57600080fd5b5061029b611f9a565b34801561052257600080fd5b506102e1611fa9565b34801561053757600080fd5b506102e16004803603608081101561054e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611fae565b34801561058057600080fd5b5061029b6124d6565b34801561059557600080fd5b5061029b6124e5565b3480156105aa57600080fd5b5061029b6124f7565b3480156105bf57600080fd5b506102e1612506565b3480156105d457600080fd5b5061029b61250b565b6101da600480360360c08110156105f357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561063357600080fd5b82018360208201111561064557600080fd5b8035906020019184602083028401116401000000008311171561066757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061251a915050565b3480156106b357600080fd5b506102e16125f7565b3480156106c857600080fd5b5061070b600480360360a08110156106df57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356125fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074757818101518382015260200161072f565b505050509050019250505060405180910390f35b34801561076757600080fd5b5061029b612684565b34801561077c57600080fd5b506102e1612693565b34801561079157600080fd5b5061029b612698565b3480156107a657600080fd5b506101da600480360360208110156107bd57600080fd5b50356126a7565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b0316141561080d57849150610f13565b61081e83601063ffffffff6126aa16565b156109c65761082c876126b5565b156108f857600061083c886127e8565b90506001600160a01b03808216146108f6576000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b505afa15801561089d573d6000803e3d6000fd5b505050506040513d60208110156108b357600080fd5b505190506108eb82896108e4670de0b6b3a76400006108d88c8763ffffffff61290f16565b9063ffffffff61296816565b89896107c4565b935093505050610f13565b505b610901866126b5565b156109c6576000610911876127e8565b90506001600160a01b03808216146109c4576000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505afa158015610972573d6000803e3d6000fd5b505050506040513d602081101561098857600080fd5b5051905061099989838989896107c4565b90945092506109ba816108d886670de0b6b3a764000063ffffffff61290f16565b9350610f13915050565b505b6109d783602063ffffffff6126aa16565b15610a8c5760006109e788610f40565b90506001600160a01b0380821614610a34576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b610a3d87610f40565b90506001600160a01b0380821614610a8a576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505b610a9d83604063ffffffff6126aa16565b15610b49576005546001600160a01b0388811691161415610af157600454600554610ae8916001600160a01b03908116918991610ae191168963ffffffff6129aa16565b87876107c4565b91509150610f13565b6005546001600160a01b0387811691161415610b4957600454610b219088906001600160a01b03168787876107c4565b6005549193509150610b42906001600160a01b03168363ffffffff612abe16565b9150610f13565b610b5a83608063ffffffff6126aa16565b15610bbd576000610b6a88611ba5565b90506001600160a01b0380821614610b9357610b8981888888886107c4565b9250925050610f13565b610b9c87611ba5565b90506001600160a01b0380821614610bbb57610b8988828888886107c4565b505b610bc5614ed7565b604080516080810190915280610be286600163ffffffff612bd216565b610bee57611463610bf2565b612bd85b67ffffffffffffffff168152602001610c1286600263ffffffff612bd216565b610c1e576112bd610c22565b612bd85b67ffffffffffffffff168152602001610c4286600463ffffffff612bd216565b610c4e57611807610c52565b612bd85b67ffffffffffffffff168152602001610c7286600863ffffffff612bd216565b610c7e57611e09610c82565b612bd85b67ffffffffffffffff1690529050610c98614eff565b610ca0614eff565b60005b6004811015610d7857610cda8b8b610cc18c8c63ffffffff61296816565b878560048110610ccd57fe5b602002015163ffffffff16565b838260048110610ce657fe5b60200201523063f82c50f1848360048110610cfd57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b50505050828160048110610d5a57fe5b6020020151828260048110610d6b57fe5b6020020152600101610ca3565b5060005b87811015610f0e57600060015b6004811015610dc657848260048110610d9e57fe5b6020020151858260048110610daf57fe5b60200201511115610dbe578091505b600101610d89565b50610de8848260048110610dd657fe5b6020020151889063ffffffff612be116565b9650858181518110610df657fe5b6020026020010180518091906001018152505060008a905089836001011015610f04576000610e598e8e610e4d8e6108d88d8981518110610e3357fe5b60200260200101516001018861290f90919063ffffffff16565b8a8760048110610ccd57fe5b9050610e7c858460048110610e6a57fe5b6020020151829063ffffffff612c3b16565b868460048110610e8857fe5b60200201523063f82c50f1878560048110610e9f57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b5050505080858460048110610efd57fe5b6020020152505b5050600101610d7c565b505050505b9550959350505050565b6009546001600160a01b031681565b600b546001600160a01b031681565b602081565b6000610f54826001600160a01b0316612c7d565b15610f6257506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610fcd5780518252601f199092019160209182019101610fae565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461102e576040519150601f19603f3d011682016040523d82523d6000602084013e611033565b606091505b50915091508161104957600019925050506112b3565b6000805b60078351038110156111a25782816000018151811061106857fe5b6020910101516001600160f81b031916602360f91b1480156110ab575082816001018151811061109457fe5b6020910101516001600160f81b031916607560f81b145b80156110d857508281600201815181106110c157fe5b6020910101516001600160f81b031916601b60fa1b145b801561110557508281600301815181106110ee57fe5b6020910101516001600160f81b031916606360f81b145b8015611132575082816004018151811061111b57fe5b6020910101516001600160f81b031916603960f91b145b801561115f575082816005018151811061114857fe5b6020910101516001600160f81b031916607560f81b145b801561118c575082816006018151811061117557fe5b6020910101516001600160f81b031916606d60f81b145b1561119a57600191506111a2565b60010161104d565b50806111b55760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b602083106112185780518252601f1990920191602091820191016111f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611279576040519150601f19603f3d011682016040523d82523d6000602084013e61127e565b606091505b509093509150826112965760001993505050506112b3565b8180602001905160208110156112ab57600080fd5b505193505050505b919050565b604081565b60075460408051600481526024810182526020810180516001600160e01b0316634f61ff8b60e01b1781529151815160009485946060946001600160a01b03909216936108fc93909182918083835b6020831061132b5780518252601f19909201916020918201910161130c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461138c576040519150601f19603f3d011682016040523d82523d6000602084013e611391565b606091505b5091509150816113a657600092505050611457565b60008180602001905160208110156113bd57600080fd5b505190506113d36001600160a01b038816612c7d565b806113eb57506113eb866001600160a01b0316612c7d565b15611406576113fc81888888611fae565b9350505050611457565b60006114228289600080516020614fa583398151915289611fae565b905080611436576000945050505050611457565b61145082600080516020614fa58339815191528984611fae565b9450505050505b9392505050565b601081565b6000816114786001600160a01b038616612c7d565b61161e57600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d60208110156114f757600080fd5b505190506001600160a01b0381161561161c5760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106115855780518252601f199092019160209182019101611566565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146115e6576040519150601f19603f3d011682016040523d82523d6000602084013e6115eb565b606091505b509150915081156116145780806020019051602081101561160b57600080fd5b50519350611619565b600093505b50505b505b611630846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561168557600080fd5b505afa158015611699573d6000803e3d6000fd5b505050506040513d60208110156116af57600080fd5b505190506001600160a01b038116156117d45760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b6020831061173d5780518252601f19909201916020918201910161171e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461179e576040519150601f19603f3d011682016040523d82523d6000602084013e6117a3565b606091505b509150915081156117cc578080602001905160208110156117c357600080fd5b505193506117d1565b600093505b50505b505b949350505050565b60606117ed87878786866107c4565b9150506117fe87878787858761251a565b50505050505050565b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561186757600080fd5b505afa15801561187b573d6000803e3d6000fd5b505050506040513d602081101561189157600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc82906118b9908916612c7d565b6118c357876118d0565b6001546001600160a01b03165b6118e2886001600160a01b0316612c7d565b6118ec57876118f9565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561195857600080fd5b505afa15801561196c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561199557600080fd5b81019080805160405193929190846401000000008211156119b557600080fd5b9083019060208201858111156119ca57600080fd5b82518660208202830111640100000000821117156119e757600080fd5b82525081516020918201928201910280838360005b83811015611a145781810151838201526020016119fc565b50505050905001604052505050905060006060836001600160a01b031662030d40856001600160a01b0316630c8496cc905060e01b85896040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015611a94578181015183820152602001611a7c565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b60208310611b025780518252601f199092019160209182019101611ae3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611b63576040519150601f19603f3d011682016040523d82523d6000602084013e611b68565b606091505b509150915081611b7f576000945050505050611457565b6000818060200190516040811015611b9657600080fd5b50519998505050505050505050565b6000611bb9826001600160a01b0316612c7d565b15611bc757506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310611c325780518252601f199092019160209182019101611c13565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611c93576040519150601f19603f3d011682016040523d82523d6000602084013e611c98565b606091505b509150915081611cae57600019925050506112b3565b6000805b6004835103811015611d8057828160000181518110611ccd57fe5b6020910101516001600160f81b031916604160f81b148015611d105750828160010181518110611cf957fe5b6020910101516001600160f81b031916606160f81b145b8015611d3d5750828160020181518110611d2657fe5b6020910101516001600160f81b031916603b60f91b145b8015611d6a5750828160030181518110611d5357fe5b6020910101516001600160f81b031916606560f81b145b15611d785760019150611d80565b600101611cb2565b5080611d935760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b03891693611388939291829190808383602083106112185780518252601f1990920191602091820191016111f9565b6006546001600160a01b031681565b608081565b600b5460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90611e39908916612c7d565b611e435787611e50565b6000546001600160a01b03165b611e628a6001600160a01b0316612c7d565b611e6c5789611e79565b6000546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018a905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611efe5780518252601f199092019160209182019101611edf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611f5f576040519150601f19603f3d011682016040523d82523d6000602084013e611f64565b606091505b509150915081611f7957600092505050611457565b808060200190516020811015611f8e57600080fd5b50519695505050505050565b6008546001600160a01b031681565b600881565b60008060606001600160a01b038088169062030d4090630611aecb60e11b90611fd8908a16612c7d565b611fe25788611ff2565b600080516020614fa58339815191525b612004896001600160a01b0316612c7d565b61200e578861201e565b600080516020614fa58339815191525b604080516001600160a01b0393841660248201529190921660448201526064810189905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106120ad5780518252601f19909201916020918201910161208e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461210e576040519150601f19603f3d011682016040523d82523d6000602084013e612113565b606091505b509150915081612128576000925050506117d6565b60008082806020019051604081101561214057600080fd5b50805160209091015190925090507354a4a1167b004b004520c605e3f01906f683413d6001600160a01b0383161480612195575073cf1394c5e2e879969fdb1f464ce1487147863dcb6001600160a01b038316145b806121bc575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316145b156121ce5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b602083106122315780518252601f199092019160209182019101612212565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612292576040519150601f19603f3d011682016040523d82523d6000602084013e612297565b606091505b509094505083156122af5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123125780518252601f1990920191602091820191016122f3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612373576040519150601f19603f3d011682016040523d82523d6000602084013e612378565b606091505b509094505083156123905760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123f35780518252601f1990920191602091820191016123d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612454576040519150601f19603f3d011682016040523d82523d6000602084013e612459565b606091505b509094505083156124715760009450505050506117d6565b6124c9670de0b6b3a76400006108d86124928b6001600160a01b0316612cb0565b600a0a6108d86124aa8c6001600160a01b0316612cb0565b600a0a6124bd878d63ffffffff61290f16565b9063ffffffff61290f16565b9998505050505050505050565b6003546001600160a01b031681565b600080516020614fa583398151915281565b6005546001600160a01b031681565b600281565b6007546001600160a01b031681565b6125356001600160a01b03871633308763ffffffff612ea516565b6125428686868585612ff1565b600061255d6001600160a01b0387163063ffffffff613a2816565b90508381101561259e5760405162461bcd60e51b8152600401808060200182810382526035815260200180614f206035913960400191505060405180910390fd5b6125b86001600160a01b038716338363ffffffff613af516565b506125ed336125d66001600160a01b038a163063ffffffff613a2816565b6001600160a01b038a16919063ffffffff613af516565b5050505050505050565b600181565b606082604051908082528060200260200182016040528015612628578160200160208202803883390190505b50905060005b8381101561267a5761265a8787612652876108d88a6001880163ffffffff61290f16565b6001876107c4565b5082828151811061266757fe5b602090810291909101015260010161262e565b5095945050505050565b6004546001600160a01b031681565b600481565b6002546001600160a01b031681565b50565b818116155b92915050565b6003546000906001600160a01b03838116911614156126d6575060016112b3565b600254604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b602083106127565780518252601f199092019160209182019101612737565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146127b7576040519150601f19603f3d011682016040523d82523d6000602084013e6127bc565b606091505b5091509150816127d1576000925050506112b3565b60008180602001905160408110156112ab57600080fd5b6003546000906001600160a01b0383811691161415612809575060006112b3565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b602083106128745780518252601f199092019160209182019101612855565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146128d5576040519150601f19603f3d011682016040523d82523d6000602084013e6128da565b606091505b5091509150816128f057600019925050506112b3565b80806020019051602081101561290557600080fd5b5051949350505050565b60008261291e575060006126af565b8282028284828161292b57fe5b04146114575760405162461bcd60e51b8152600401808060200182810382526021815260200180614f846021913960400191505060405180910390fd5b600061145783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b93565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129fa57600080fd5b505afa158015612a0e573d6000803e3d6000fd5b505050506040513d6020811015612a2457600080fd5b50514211612aaa5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612a7957600080fd5b505afa158015612a8d573d6000803e3d6000fd5b505050506040513d6020811015612aa357600080fd5b5051612ab2565b612ab2613c35565b90506117d68184613dc4565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0e57600080fd5b505afa158015612b22573d6000803e3d6000fd5b505050506040513d6020811015612b3857600080fd5b50514211612bbe5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8d57600080fd5b505afa158015612ba1573d6000803e3d6000fd5b505050506040513d6020811015612bb757600080fd5b5051612bc6565b612bc6613c35565b90506117d68382613dec565b16151590565b60009392505050565b600082820183811015611457576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061145783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e05565b60006001600160a01b03821615806126af57506001600160a01b038216600080516020614fa58339815191521492915050565b60006001600160a01b0382161580612cde57506001600160a01b038216600080516020614fa5833981519152145b15612ceb575060126112b3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310612d565780518252601f199092019160209182019101612d37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612db7576040519150601f19603f3d011682016040523d82523d6000602084013e612dbc565b606091505b509150915081612e965760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b60208310612e295780518252601f199092019160209182019101612e0a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612e8a576040519150601f19603f3d011682016040523d82523d6000602084013e612e8f565b606091505b5090925090505b816128f0576012949350505050565b80612eaf57612feb565b6001600160a01b0384161580612edb57506001600160a01b038416600080516020614fa5833981519152145b15612fd0576001600160a01b03831633148015612ef85750803410155b612f3d576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612f85576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612f83573d6000803e3d6000fd5b505b80341115612fcb57336108fc612fa1348463ffffffff612c3b16565b6040518115909202916000818181858888f19350505050158015612fc9573d6000803e3d6000fd5b505b612feb565b612feb6001600160a01b03851684848463ffffffff613e5f16565b50505050565b836001600160a01b0316856001600160a01b0316141561301057613a21565b61302181601063ffffffff6126aa16565b156132325761302f856126b5565b156130e557600061303f866127e8565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561308757600080fd5b505af115801561309b573d6000803e3d6000fd5b505050506040513d60208110156130b157600080fd5b50600090506130cf6001600160a01b0383163063ffffffff613a2816565b90506130de8287838787612ff1565b5050613a21565b6130ee846126b5565b156132325760006130fe856127e8565b905061310d8682868686612ff1565b60006131286001600160a01b0383163063ffffffff613a2816565b905061313c826001600160a01b0316612c7d565b156131af57600360009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319157600080fd5b505af11580156131a5573d6000803e3d6000fd5b50505050506130de565b6131b98287613eb9565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156131ff57600080fd5b505af1158015613213573d6000803e3d6000fd5b505050506040513d602081101561322957600080fd5b50505050613a21565b61324381602063ffffffff6126aa16565b1561349b57600061325386610f40565b90506001600160a01b038082161461336757613277816001600160a01b0316612c7d565b156132fd576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b1580156132cb57600080fd5b505af11580156132df573d6000803e3d6000fd5b505050506040513d60208110156132f557600080fd5b5061334c9050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b15801561308757600080fd5b60006130cf6001600160a01b0383163063ffffffff613a2816565b61337085610f40565b90506001600160a01b03808216146134995761338f8682868686612ff1565b60006133aa6001600160a01b0383163063ffffffff613a2816565b90506133be826001600160a01b0316612c7d565b156134405760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050506040513d602081101561343857600080fd5b506130de9050565b61344a8287613eb9565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b1580156131ff57600080fd5b505b6134ac81604063ffffffff6126aa16565b156136f1576005546001600160a01b03868116911614156135bf576005546040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b15801561351a57600080fd5b505af115801561352e573d6000803e3d6000fd5b505060048054604080516370a0823160e01b81523093810193909352516135ba94506001600160a01b039091169250879183916370a0823191602480820192602092909190829003018186803b15801561358757600080fd5b505afa15801561359b573d6000803e3d6000fd5b505050506040513d60208110156135b157600080fd5b50518585612ff1565b613a21565b6005546001600160a01b03858116911614156136f1576004546135ef9086906001600160a01b0316858585612ff1565b60045460055461360b916001600160a01b039081169116613eb9565b60055460048054604080516370a0823160e01b81523093810184905290516001600160a01b0394851694633b4da69f949316916370a08231916024808301926020929190829003018186803b15801561366357600080fd5b505afa158015613677573d6000803e3d6000fd5b505050506040513d602081101561368d57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b1580156136dd57600080fd5b505af1158015613229573d6000803e3d6000fd5b61370281608063ffffffff6126aa16565b156138c257600061371286611ba5565b90506001600160a01b038082161461379557856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561376a57600080fd5b505af115801561377e573d6000803e3d6000fd5b5050505061378f8186868686612ff1565b50613a21565b61379e85611ba5565b90506001600160a01b03808216146138c0576137bd8682868686612ff1565b60006137d86001600160a01b0383163063ffffffff613a2816565b6006549091506137f29083906001600160a01b0316613eb9565b6006546001600160a01b039081169063d2d0e06690613812908516612c7d565b61381d57600061381f565b825b613831856001600160a01b0316612c7d565b61383b578461384b565b600080516020614fa58339815191525b604080516001600160e01b031960e086901b1681526001600160a01b0390921660048301526024820186905261044d604483015251606480830192600092919082900301818588803b1580156138a057600080fd5b505af11580156138b4573d6000803e3d6000fd5b50505050505050613a21565b505b6138ca614ed7565b5060408051608081018252613f7281526141c8602082015261432b918101919091526147b36060820152600080805b600481101561395257600086828151811061391057fe5b6020026020010151111561394a5761394486828151811061392d57fe5b602002602001015184612be190919063ffffffff16565b92508091505b6001016138f9565b50600082116139925760405162461bcd60e51b815260040180806020018281038252602f815260200180614f55602f913960400191505060405180910390fd5b8560005b6004811015613a1b578681815181106139ab57fe5b6020026020010151600014156139c057613a13565b60006139ec856108d88a85815181106139d557fe5b60200260200101518c61290f90919063ffffffff16565b9050838214156139f95750815b8083039250613a108b8b83898660048110610ccd57fe5b50505b600101613996565b50505050505b5050505050565b60006001600160a01b0383161580613a5657506001600160a01b038316600080516020614fa5833981519152145b15613a6c57506001600160a01b038116316126af565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613ac257600080fd5b505afa158015613ad6573d6000803e3d6000fd5b505050506040513d6020811015613aec57600080fd5b505190506126af565b600081613b0457506001611457565b6001600160a01b0384161580613b3057506001600160a01b038416600080516020614fa5833981519152145b15613b71576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015613b6b573d6000803e3d6000fd5b50611457565b613b8b6001600160a01b038516848463ffffffff614a4d16565b506001611457565b60008183613c1f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be4578181015183820152602001613bcc565b50505050905090810190601f168015613c115780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c2b57fe5b0495945050505050565b6000613dbf613d4173197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b815260040160206040518083038186803b158015613c8a57600080fd5b505afa158015613c9e573d6000803e3d6000fd5b505050506040513d6020811015613cb457600080fd5b5051604080516320aba08b60e01b8152905173197e90f9fad81970ba7976f33cbd77088e5d7cf7916320aba08b916004808301926020929190829003018186803b158015613d0157600080fd5b505afa158015613d15573d6000803e3d6000fd5b505050506040513d6020811015613d2b57600080fd5b505142036b033b2e3c9fd0803ce8000000614aa4565b73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015613d8e57600080fd5b505afa158015613da2573d6000803e3d6000fd5b505050506040513d6020811015613db857600080fd5b5051613dc4565b905090565b60006b033b2e3c9fd0803ce8000000613ddd8484614b63565b81613de457fe5b049392505050565b600081613ddd846b033b2e3c9fd0803ce8000000614b63565b60008184841115613e575760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be4578181015183820152602001613bcc565b505050900390565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612feb908590614b87565b613ecb826001600160a01b0316612c7d565b613f6e5760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b158015613f2057600080fd5b505afa158015613f34573d6000803e3d6000fd5b505050506040513d6020811015613f4a57600080fd5b5051901c613f6e57613f6e6001600160a01b0383168260001963ffffffff614d3f16565b5050565b600081613f876001600160a01b038616612c7d565b6140aa57600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b158015613fdc57600080fd5b505afa158015613ff0573d6000803e3d6000fd5b505050506040513d602081101561400657600080fd5b505190506001600160a01b038116156140a8576140238682613eb9565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b15801561407957600080fd5b505af115801561408d573d6000803e3d6000fd5b505050506040513d60208110156140a357600080fd5b505191505b505b6140bc846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561411157600080fd5b505afa158015614125573d6000803e3d6000fd5b505050506040513d602081101561413b57600080fd5b505190506001600160a01b038116156117d457806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b15801561419d57600080fd5b505af11580156141b1573d6000803e3d6000fd5b50505050506040513d6020811015611f8e57600080fd5b6007546000906141e29085906001600160a01b0316613eb9565b6007546001600160a01b03908116906329589f6190614202908716612c7d565b61420d57600061420f565b835b614221876001600160a01b0316612c7d565b61422b578661423b565b600080516020614fa58339815191525b8561424e886001600160a01b0316612c7d565b6142585787614268565b600080516020614fa58339815191525b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a48201819052734d37f28d2db99e8d35a6c725a5f1749a085850a360c483015261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561430057600080fd5b505af1158015614314573d6000803e3d6000fd5b50505050506040513d602081101561290557600080fd5b600061433f846001600160a01b0316612c7d565b156143ae57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561439457600080fd5b505af11580156143a8573d6000803e3d6000fd5b50505050505b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561440957600080fd5b505afa15801561441d573d6000803e3d6000fd5b505050506040513d602081101561443357600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc829061445b908916612c7d565b6144655787614472565b6001546001600160a01b03165b614484886001600160a01b0316612c7d565b61448e578761449b565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b1580156144fa57600080fd5b505afa15801561450e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561453757600080fd5b810190808051604051939291908464010000000082111561455757600080fd5b90830190602082018581111561456c57600080fd5b825186602082028301116401000000008211171561458957600080fd5b82525081516020918201928201910280838360005b838110156145b657818101518382015260200161459e565b5050505090500160405250505090506145f76145da876001600160a01b0316612c7d565b6145e457866145f1565b6001546001600160a01b03165b83613eb9565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561466757818101518382015260200161464f565b50505050905001945050505050602060405180830381600087803b15801561468e57600080fd5b505af11580156146a2573d6000803e3d6000fd5b505050506040513d60208110156146b857600080fd5b505190506146ce6001600160a01b038716612c7d565b156147a957600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561472657600080fd5b505afa15801561473a573d6000803e3d6000fd5b505050506040513d602081101561475057600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b15801561479057600080fd5b505af11580156147a4573d6000803e3d6000fd5b505050505b9695505050505050565b60006147c7846001600160a01b0316612c7d565b1561482b576000805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692600480820193929182900301818588803b15801561481157600080fd5b505af1158015614825573d6000803e3d6000fd5b50505050505b614868614840856001600160a01b0316612c7d565b61484a5784614857565b6000546001600160a01b03165b600b546001600160a01b0316613eb9565b600b546000906001600160a01b0390811690630621b4f69061488b908816612c7d565b61489557866148a2565b6000546001600160a01b03165b856148b5886001600160a01b0316612c7d565b6148bf57876148cc565b6000546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b15801561492a57600080fd5b505af115801561493e573d6000803e3d6000fd5b505050506040513d602081101561495457600080fd5b5051905061496a6001600160a01b038516612c7d565b156117d657600054604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b1580156149c257600080fd5b505afa1580156149d6573d6000803e3d6000fd5b505050506040513d60208110156149ec57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015614a2c57600080fd5b505af1158015614a40573d6000803e3d6000fd5b5050505090509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052614a9f908490614b87565b505050565b6000838015614b4557600184168015614abf57859250614ac3565b8392505b50600283046002850494505b8415614b3f578586028687820414614ae657600080fd5b81810181811015614af657600080fd5b85810497506002870615614b32578785028589820414158915151615614b1b57600080fd5b83810181811015614b2b57600080fd5b8790049550505b5050600285049450614acf565b50614b5b565b838015614b555760009250614b59565b8392505b505b509392505050565b6000811580614b7e57505080820282828281614b7b57fe5b04145b6126af57600080fd5b614b99826001600160a01b0316614d8d565b614bea576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310614c285780518252601f199092019160209182019101614c09565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614c8a576040519150601f19603f3d011682016040523d82523d6000602084013e614c8f565b606091505b509150915081614ce6576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612feb57808060200190516020811015614d0257600080fd5b5051612feb5760405162461bcd60e51b815260040180806020018281038252602a815260200180614fc5602a913960400191505060405180910390fd5b6001600160a01b03831615801590614d6e57506001600160a01b038316600080516020614fa583398151915214155b15614a9f57614a9f6001600160a01b038416838363ffffffff614dc416565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906117d65750141592915050565b801580614e4a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614e1c57600080fd5b505afa158015614e30573d6000803e3d6000fd5b505050506040513d6020811015614e4657600080fd5b5051155b614e855760405162461bcd60e51b8152600401808060200182810382526036815260200180614fef6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052614a9f908490614b87565b60405180608001604052806004905b614f1d815260200190600190039081614ee65790505090565b60405180608001604052806004906020820280388339509192915050565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582014963a139889871cc6595a913217f0c92949011a394507b6ebd6b9cbb1bc998d64736f6c63430005100032
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80638bdb2afa116100f7578063d77366a411610095578063f4b9fa7511610064578063f4b9fa751461075b578063f64a9a4914610770578063f69e204614610785578063f82c50f11461079a576101cd565b8063d77366a4146105c8578063e2a7515e146105dd578063eb16df2a146106a7578063f484966b146106bc576101cd565b8063a1b4d011116100d1578063a1b4d01114610574578063a734f06e14610589578063b69d04561461059e578063ceb54115146105b3576101cd565b80638bdb2afa146105015780638c6c11f214610516578063955039451461052b576101cd565b80635cfcee281161016f57806372b6f1bf1161013e57806372b6f1bf14610461578063819faf7b1461049457806383366577146104a95780638a273858146104be576101cd565b80635cfcee281461037e57806364456efa146103935780636b9589aa146103d65780636f3a10531461041e576101cd565b80633c1a62dc116101ab5780633c1a62dc146102cc5780634037f967146102f35780634c914a4e146103265780635372d5481461033b576101cd565b8063085e2c5b146101dc57806312dea160146102865780631388b420146102b7575b333214156101da57600080fd5b005b3480156101e857600080fd5b5061022b600480360360a08110156101ff57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356107c4565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610271578181015183820152602001610259565b50505050905001935050505060405180910390f35b34801561029257600080fd5b5061029b610f1d565b604080516001600160a01b039092168252519081900360200190f35b3480156102c357600080fd5b5061029b610f2c565b3480156102d857600080fd5b506102e1610f3b565b60408051918252519081900360200190f35b3480156102ff57600080fd5b5061029b6004803603602081101561031657600080fd5b50356001600160a01b0316610f40565b34801561033257600080fd5b506102e16112b8565b34801561034757600080fd5b506102e16004803603606081101561035e57600080fd5b506001600160a01b038135811691602081013590911690604001356112bd565b34801561038a57600080fd5b506102e161145e565b34801561039f57600080fd5b506102e1600480360360608110156103b657600080fd5b506001600160a01b03813581169160208101359091169060400135611463565b6101da600480360360c08110156103ec57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a001356117de565b34801561042a57600080fd5b506102e16004803603606081101561044157600080fd5b506001600160a01b03813581169160208101359091169060400135611807565b34801561046d57600080fd5b5061029b6004803603602081101561048457600080fd5b50356001600160a01b0316611ba5565b3480156104a057600080fd5b5061029b611df5565b3480156104b557600080fd5b506102e1611e04565b3480156104ca57600080fd5b506102e1600480360360608110156104e157600080fd5b506001600160a01b03813581169160208101359091169060400135611e09565b34801561050d57600080fd5b5061029b611f9a565b34801561052257600080fd5b506102e1611fa9565b34801561053757600080fd5b506102e16004803603608081101561054e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611fae565b34801561058057600080fd5b5061029b6124d6565b34801561059557600080fd5b5061029b6124e5565b3480156105aa57600080fd5b5061029b6124f7565b3480156105bf57600080fd5b506102e1612506565b3480156105d457600080fd5b5061029b61250b565b6101da600480360360c08110156105f357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561063357600080fd5b82018360208201111561064557600080fd5b8035906020019184602083028401116401000000008311171561066757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061251a915050565b3480156106b357600080fd5b506102e16125f7565b3480156106c857600080fd5b5061070b600480360360a08110156106df57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356125fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074757818101518382015260200161072f565b505050509050019250505060405180910390f35b34801561076757600080fd5b5061029b612684565b34801561077c57600080fd5b506102e1612693565b34801561079157600080fd5b5061029b612698565b3480156107a657600080fd5b506101da600480360360208110156107bd57600080fd5b50356126a7565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b0316141561080d57849150610f13565b61081e83601063ffffffff6126aa16565b156109c65761082c876126b5565b156108f857600061083c886127e8565b90506001600160a01b03808216146108f6576000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b505afa15801561089d573d6000803e3d6000fd5b505050506040513d60208110156108b357600080fd5b505190506108eb82896108e4670de0b6b3a76400006108d88c8763ffffffff61290f16565b9063ffffffff61296816565b89896107c4565b935093505050610f13565b505b610901866126b5565b156109c6576000610911876127e8565b90506001600160a01b03808216146109c4576000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505afa158015610972573d6000803e3d6000fd5b505050506040513d602081101561098857600080fd5b5051905061099989838989896107c4565b90945092506109ba816108d886670de0b6b3a764000063ffffffff61290f16565b9350610f13915050565b505b6109d783602063ffffffff6126aa16565b15610a8c5760006109e788610f40565b90506001600160a01b0380821614610a34576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b610a3d87610f40565b90506001600160a01b0380821614610a8a576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505b610a9d83604063ffffffff6126aa16565b15610b49576005546001600160a01b0388811691161415610af157600454600554610ae8916001600160a01b03908116918991610ae191168963ffffffff6129aa16565b87876107c4565b91509150610f13565b6005546001600160a01b0387811691161415610b4957600454610b219088906001600160a01b03168787876107c4565b6005549193509150610b42906001600160a01b03168363ffffffff612abe16565b9150610f13565b610b5a83608063ffffffff6126aa16565b15610bbd576000610b6a88611ba5565b90506001600160a01b0380821614610b9357610b8981888888886107c4565b9250925050610f13565b610b9c87611ba5565b90506001600160a01b0380821614610bbb57610b8988828888886107c4565b505b610bc5614ed7565b604080516080810190915280610be286600163ffffffff612bd216565b610bee57611463610bf2565b612bd85b67ffffffffffffffff168152602001610c1286600263ffffffff612bd216565b610c1e576112bd610c22565b612bd85b67ffffffffffffffff168152602001610c4286600463ffffffff612bd216565b610c4e57611807610c52565b612bd85b67ffffffffffffffff168152602001610c7286600863ffffffff612bd216565b610c7e57611e09610c82565b612bd85b67ffffffffffffffff1690529050610c98614eff565b610ca0614eff565b60005b6004811015610d7857610cda8b8b610cc18c8c63ffffffff61296816565b878560048110610ccd57fe5b602002015163ffffffff16565b838260048110610ce657fe5b60200201523063f82c50f1848360048110610cfd57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b50505050828160048110610d5a57fe5b6020020151828260048110610d6b57fe5b6020020152600101610ca3565b5060005b87811015610f0e57600060015b6004811015610dc657848260048110610d9e57fe5b6020020151858260048110610daf57fe5b60200201511115610dbe578091505b600101610d89565b50610de8848260048110610dd657fe5b6020020151889063ffffffff612be116565b9650858181518110610df657fe5b6020026020010180518091906001018152505060008a905089836001011015610f04576000610e598e8e610e4d8e6108d88d8981518110610e3357fe5b60200260200101516001018861290f90919063ffffffff16565b8a8760048110610ccd57fe5b9050610e7c858460048110610e6a57fe5b6020020151829063ffffffff612c3b16565b868460048110610e8857fe5b60200201523063f82c50f1878560048110610e9f57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b5050505080858460048110610efd57fe5b6020020152505b5050600101610d7c565b505050505b9550959350505050565b6009546001600160a01b031681565b600b546001600160a01b031681565b602081565b6000610f54826001600160a01b0316612c7d565b15610f6257506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610fcd5780518252601f199092019160209182019101610fae565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461102e576040519150601f19603f3d011682016040523d82523d6000602084013e611033565b606091505b50915091508161104957600019925050506112b3565b6000805b60078351038110156111a25782816000018151811061106857fe5b6020910101516001600160f81b031916602360f91b1480156110ab575082816001018151811061109457fe5b6020910101516001600160f81b031916607560f81b145b80156110d857508281600201815181106110c157fe5b6020910101516001600160f81b031916601b60fa1b145b801561110557508281600301815181106110ee57fe5b6020910101516001600160f81b031916606360f81b145b8015611132575082816004018151811061111b57fe5b6020910101516001600160f81b031916603960f91b145b801561115f575082816005018151811061114857fe5b6020910101516001600160f81b031916607560f81b145b801561118c575082816006018151811061117557fe5b6020910101516001600160f81b031916606d60f81b145b1561119a57600191506111a2565b60010161104d565b50806111b55760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b602083106112185780518252601f1990920191602091820191016111f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611279576040519150601f19603f3d011682016040523d82523d6000602084013e61127e565b606091505b509093509150826112965760001993505050506112b3565b8180602001905160208110156112ab57600080fd5b505193505050505b919050565b604081565b60075460408051600481526024810182526020810180516001600160e01b0316634f61ff8b60e01b1781529151815160009485946060946001600160a01b03909216936108fc93909182918083835b6020831061132b5780518252601f19909201916020918201910161130c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461138c576040519150601f19603f3d011682016040523d82523d6000602084013e611391565b606091505b5091509150816113a657600092505050611457565b60008180602001905160208110156113bd57600080fd5b505190506113d36001600160a01b038816612c7d565b806113eb57506113eb866001600160a01b0316612c7d565b15611406576113fc81888888611fae565b9350505050611457565b60006114228289600080516020614fa583398151915289611fae565b905080611436576000945050505050611457565b61145082600080516020614fa58339815191528984611fae565b9450505050505b9392505050565b601081565b6000816114786001600160a01b038616612c7d565b61161e57600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d60208110156114f757600080fd5b505190506001600160a01b0381161561161c5760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106115855780518252601f199092019160209182019101611566565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146115e6576040519150601f19603f3d011682016040523d82523d6000602084013e6115eb565b606091505b509150915081156116145780806020019051602081101561160b57600080fd5b50519350611619565b600093505b50505b505b611630846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561168557600080fd5b505afa158015611699573d6000803e3d6000fd5b505050506040513d60208110156116af57600080fd5b505190506001600160a01b038116156117d45760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b6020831061173d5780518252601f19909201916020918201910161171e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461179e576040519150601f19603f3d011682016040523d82523d6000602084013e6117a3565b606091505b509150915081156117cc578080602001905160208110156117c357600080fd5b505193506117d1565b600093505b50505b505b949350505050565b60606117ed87878786866107c4565b9150506117fe87878787858761251a565b50505050505050565b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561186757600080fd5b505afa15801561187b573d6000803e3d6000fd5b505050506040513d602081101561189157600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc82906118b9908916612c7d565b6118c357876118d0565b6001546001600160a01b03165b6118e2886001600160a01b0316612c7d565b6118ec57876118f9565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561195857600080fd5b505afa15801561196c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561199557600080fd5b81019080805160405193929190846401000000008211156119b557600080fd5b9083019060208201858111156119ca57600080fd5b82518660208202830111640100000000821117156119e757600080fd5b82525081516020918201928201910280838360005b83811015611a145781810151838201526020016119fc565b50505050905001604052505050905060006060836001600160a01b031662030d40856001600160a01b0316630c8496cc905060e01b85896040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015611a94578181015183820152602001611a7c565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b60208310611b025780518252601f199092019160209182019101611ae3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611b63576040519150601f19603f3d011682016040523d82523d6000602084013e611b68565b606091505b509150915081611b7f576000945050505050611457565b6000818060200190516040811015611b9657600080fd5b50519998505050505050505050565b6000611bb9826001600160a01b0316612c7d565b15611bc757506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310611c325780518252601f199092019160209182019101611c13565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611c93576040519150601f19603f3d011682016040523d82523d6000602084013e611c98565b606091505b509150915081611cae57600019925050506112b3565b6000805b6004835103811015611d8057828160000181518110611ccd57fe5b6020910101516001600160f81b031916604160f81b148015611d105750828160010181518110611cf957fe5b6020910101516001600160f81b031916606160f81b145b8015611d3d5750828160020181518110611d2657fe5b6020910101516001600160f81b031916603b60f91b145b8015611d6a5750828160030181518110611d5357fe5b6020910101516001600160f81b031916606560f81b145b15611d785760019150611d80565b600101611cb2565b5080611d935760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b03891693611388939291829190808383602083106112185780518252601f1990920191602091820191016111f9565b6006546001600160a01b031681565b608081565b600b5460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90611e39908916612c7d565b611e435787611e50565b6000546001600160a01b03165b611e628a6001600160a01b0316612c7d565b611e6c5789611e79565b6000546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018a905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611efe5780518252601f199092019160209182019101611edf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611f5f576040519150601f19603f3d011682016040523d82523d6000602084013e611f64565b606091505b509150915081611f7957600092505050611457565b808060200190516020811015611f8e57600080fd5b50519695505050505050565b6008546001600160a01b031681565b600881565b60008060606001600160a01b038088169062030d4090630611aecb60e11b90611fd8908a16612c7d565b611fe25788611ff2565b600080516020614fa58339815191525b612004896001600160a01b0316612c7d565b61200e578861201e565b600080516020614fa58339815191525b604080516001600160a01b0393841660248201529190921660448201526064810189905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106120ad5780518252601f19909201916020918201910161208e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461210e576040519150601f19603f3d011682016040523d82523d6000602084013e612113565b606091505b509150915081612128576000925050506117d6565b60008082806020019051604081101561214057600080fd5b50805160209091015190925090507354a4a1167b004b004520c605e3f01906f683413d6001600160a01b0383161480612195575073cf1394c5e2e879969fdb1f464ce1487147863dcb6001600160a01b038316145b806121bc575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316145b156121ce5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b602083106122315780518252601f199092019160209182019101612212565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612292576040519150601f19603f3d011682016040523d82523d6000602084013e612297565b606091505b509094505083156122af5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123125780518252601f1990920191602091820191016122f3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612373576040519150601f19603f3d011682016040523d82523d6000602084013e612378565b606091505b509094505083156123905760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123f35780518252601f1990920191602091820191016123d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612454576040519150601f19603f3d011682016040523d82523d6000602084013e612459565b606091505b509094505083156124715760009450505050506117d6565b6124c9670de0b6b3a76400006108d86124928b6001600160a01b0316612cb0565b600a0a6108d86124aa8c6001600160a01b0316612cb0565b600a0a6124bd878d63ffffffff61290f16565b9063ffffffff61290f16565b9998505050505050505050565b6003546001600160a01b031681565b600080516020614fa583398151915281565b6005546001600160a01b031681565b600281565b6007546001600160a01b031681565b6125356001600160a01b03871633308763ffffffff612ea516565b6125428686868585612ff1565b600061255d6001600160a01b0387163063ffffffff613a2816565b90508381101561259e5760405162461bcd60e51b8152600401808060200182810382526035815260200180614f206035913960400191505060405180910390fd5b6125b86001600160a01b038716338363ffffffff613af516565b506125ed336125d66001600160a01b038a163063ffffffff613a2816565b6001600160a01b038a16919063ffffffff613af516565b5050505050505050565b600181565b606082604051908082528060200260200182016040528015612628578160200160208202803883390190505b50905060005b8381101561267a5761265a8787612652876108d88a6001880163ffffffff61290f16565b6001876107c4565b5082828151811061266757fe5b602090810291909101015260010161262e565b5095945050505050565b6004546001600160a01b031681565b600481565b6002546001600160a01b031681565b50565b818116155b92915050565b6003546000906001600160a01b03838116911614156126d6575060016112b3565b600254604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b602083106127565780518252601f199092019160209182019101612737565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146127b7576040519150601f19603f3d011682016040523d82523d6000602084013e6127bc565b606091505b5091509150816127d1576000925050506112b3565b60008180602001905160408110156112ab57600080fd5b6003546000906001600160a01b0383811691161415612809575060006112b3565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b602083106128745780518252601f199092019160209182019101612855565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146128d5576040519150601f19603f3d011682016040523d82523d6000602084013e6128da565b606091505b5091509150816128f057600019925050506112b3565b80806020019051602081101561290557600080fd5b5051949350505050565b60008261291e575060006126af565b8282028284828161292b57fe5b04146114575760405162461bcd60e51b8152600401808060200182810382526021815260200180614f846021913960400191505060405180910390fd5b600061145783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b93565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129fa57600080fd5b505afa158015612a0e573d6000803e3d6000fd5b505050506040513d6020811015612a2457600080fd5b50514211612aaa5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612a7957600080fd5b505afa158015612a8d573d6000803e3d6000fd5b505050506040513d6020811015612aa357600080fd5b5051612ab2565b612ab2613c35565b90506117d68184613dc4565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0e57600080fd5b505afa158015612b22573d6000803e3d6000fd5b505050506040513d6020811015612b3857600080fd5b50514211612bbe5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8d57600080fd5b505afa158015612ba1573d6000803e3d6000fd5b505050506040513d6020811015612bb757600080fd5b5051612bc6565b612bc6613c35565b90506117d68382613dec565b16151590565b60009392505050565b600082820183811015611457576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061145783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e05565b60006001600160a01b03821615806126af57506001600160a01b038216600080516020614fa58339815191521492915050565b60006001600160a01b0382161580612cde57506001600160a01b038216600080516020614fa5833981519152145b15612ceb575060126112b3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310612d565780518252601f199092019160209182019101612d37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612db7576040519150601f19603f3d011682016040523d82523d6000602084013e612dbc565b606091505b509150915081612e965760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b60208310612e295780518252601f199092019160209182019101612e0a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612e8a576040519150601f19603f3d011682016040523d82523d6000602084013e612e8f565b606091505b5090925090505b816128f0576012949350505050565b80612eaf57612feb565b6001600160a01b0384161580612edb57506001600160a01b038416600080516020614fa5833981519152145b15612fd0576001600160a01b03831633148015612ef85750803410155b612f3d576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612f85576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612f83573d6000803e3d6000fd5b505b80341115612fcb57336108fc612fa1348463ffffffff612c3b16565b6040518115909202916000818181858888f19350505050158015612fc9573d6000803e3d6000fd5b505b612feb565b612feb6001600160a01b03851684848463ffffffff613e5f16565b50505050565b836001600160a01b0316856001600160a01b0316141561301057613a21565b61302181601063ffffffff6126aa16565b156132325761302f856126b5565b156130e557600061303f866127e8565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561308757600080fd5b505af115801561309b573d6000803e3d6000fd5b505050506040513d60208110156130b157600080fd5b50600090506130cf6001600160a01b0383163063ffffffff613a2816565b90506130de8287838787612ff1565b5050613a21565b6130ee846126b5565b156132325760006130fe856127e8565b905061310d8682868686612ff1565b60006131286001600160a01b0383163063ffffffff613a2816565b905061313c826001600160a01b0316612c7d565b156131af57600360009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319157600080fd5b505af11580156131a5573d6000803e3d6000fd5b50505050506130de565b6131b98287613eb9565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156131ff57600080fd5b505af1158015613213573d6000803e3d6000fd5b505050506040513d602081101561322957600080fd5b50505050613a21565b61324381602063ffffffff6126aa16565b1561349b57600061325386610f40565b90506001600160a01b038082161461336757613277816001600160a01b0316612c7d565b156132fd576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b1580156132cb57600080fd5b505af11580156132df573d6000803e3d6000fd5b505050506040513d60208110156132f557600080fd5b5061334c9050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b15801561308757600080fd5b60006130cf6001600160a01b0383163063ffffffff613a2816565b61337085610f40565b90506001600160a01b03808216146134995761338f8682868686612ff1565b60006133aa6001600160a01b0383163063ffffffff613a2816565b90506133be826001600160a01b0316612c7d565b156134405760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050506040513d602081101561343857600080fd5b506130de9050565b61344a8287613eb9565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b1580156131ff57600080fd5b505b6134ac81604063ffffffff6126aa16565b156136f1576005546001600160a01b03868116911614156135bf576005546040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b15801561351a57600080fd5b505af115801561352e573d6000803e3d6000fd5b505060048054604080516370a0823160e01b81523093810193909352516135ba94506001600160a01b039091169250879183916370a0823191602480820192602092909190829003018186803b15801561358757600080fd5b505afa15801561359b573d6000803e3d6000fd5b505050506040513d60208110156135b157600080fd5b50518585612ff1565b613a21565b6005546001600160a01b03858116911614156136f1576004546135ef9086906001600160a01b0316858585612ff1565b60045460055461360b916001600160a01b039081169116613eb9565b60055460048054604080516370a0823160e01b81523093810184905290516001600160a01b0394851694633b4da69f949316916370a08231916024808301926020929190829003018186803b15801561366357600080fd5b505afa158015613677573d6000803e3d6000fd5b505050506040513d602081101561368d57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b1580156136dd57600080fd5b505af1158015613229573d6000803e3d6000fd5b61370281608063ffffffff6126aa16565b156138c257600061371286611ba5565b90506001600160a01b038082161461379557856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561376a57600080fd5b505af115801561377e573d6000803e3d6000fd5b5050505061378f8186868686612ff1565b50613a21565b61379e85611ba5565b90506001600160a01b03808216146138c0576137bd8682868686612ff1565b60006137d86001600160a01b0383163063ffffffff613a2816565b6006549091506137f29083906001600160a01b0316613eb9565b6006546001600160a01b039081169063d2d0e06690613812908516612c7d565b61381d57600061381f565b825b613831856001600160a01b0316612c7d565b61383b578461384b565b600080516020614fa58339815191525b604080516001600160e01b031960e086901b1681526001600160a01b0390921660048301526024820186905261044d604483015251606480830192600092919082900301818588803b1580156138a057600080fd5b505af11580156138b4573d6000803e3d6000fd5b50505050505050613a21565b505b6138ca614ed7565b5060408051608081018252613f7281526141c8602082015261432b918101919091526147b36060820152600080805b600481101561395257600086828151811061391057fe5b6020026020010151111561394a5761394486828151811061392d57fe5b602002602001015184612be190919063ffffffff16565b92508091505b6001016138f9565b50600082116139925760405162461bcd60e51b815260040180806020018281038252602f815260200180614f55602f913960400191505060405180910390fd5b8560005b6004811015613a1b578681815181106139ab57fe5b6020026020010151600014156139c057613a13565b60006139ec856108d88a85815181106139d557fe5b60200260200101518c61290f90919063ffffffff16565b9050838214156139f95750815b8083039250613a108b8b83898660048110610ccd57fe5b50505b600101613996565b50505050505b5050505050565b60006001600160a01b0383161580613a5657506001600160a01b038316600080516020614fa5833981519152145b15613a6c57506001600160a01b038116316126af565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613ac257600080fd5b505afa158015613ad6573d6000803e3d6000fd5b505050506040513d6020811015613aec57600080fd5b505190506126af565b600081613b0457506001611457565b6001600160a01b0384161580613b3057506001600160a01b038416600080516020614fa5833981519152145b15613b71576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015613b6b573d6000803e3d6000fd5b50611457565b613b8b6001600160a01b038516848463ffffffff614a4d16565b506001611457565b60008183613c1f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613be4578181015183820152602001613bcc565b50505050905090810190601f168015613c115780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c2b57fe5b0495945050505050565b6000613dbf613d4173197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b815260040160206040518083038186803b158015613c8a57600080fd5b505afa158015613c9e573d6000803e3d6000fd5b505050506040513d6020811015613cb457600080fd5b5051604080516320aba08b60e01b8152905173197e90f9fad81970ba7976f33cbd77088e5d7cf7916320aba08b916004808301926020929190829003018186803b158015613d0157600080fd5b505afa158015613d15573d6000803e3d6000fd5b505050506040513d6020811015613d2b57600080fd5b505142036b033b2e3c9fd0803ce8000000614aa4565b73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015613d8e57600080fd5b505afa158015613da2573d6000803e3d6000fd5b505050506040513d6020811015613db857600080fd5b5051613dc4565b905090565b60006b033b2e3c9fd0803ce8000000613ddd8484614b63565b81613de457fe5b049392505050565b600081613ddd846b033b2e3c9fd0803ce8000000614b63565b60008184841115613e575760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613be4578181015183820152602001613bcc565b505050900390565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612feb908590614b87565b613ecb826001600160a01b0316612c7d565b613f6e5760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b158015613f2057600080fd5b505afa158015613f34573d6000803e3d6000fd5b505050506040513d6020811015613f4a57600080fd5b5051901c613f6e57613f6e6001600160a01b0383168260001963ffffffff614d3f16565b5050565b600081613f876001600160a01b038616612c7d565b6140aa57600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b158015613fdc57600080fd5b505afa158015613ff0573d6000803e3d6000fd5b505050506040513d602081101561400657600080fd5b505190506001600160a01b038116156140a8576140238682613eb9565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b15801561407957600080fd5b505af115801561408d573d6000803e3d6000fd5b505050506040513d60208110156140a357600080fd5b505191505b505b6140bc846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561411157600080fd5b505afa158015614125573d6000803e3d6000fd5b505050506040513d602081101561413b57600080fd5b505190506001600160a01b038116156117d457806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b15801561419d57600080fd5b505af11580156141b1573d6000803e3d6000fd5b50505050506040513d6020811015611f8e57600080fd5b6007546000906141e29085906001600160a01b0316613eb9565b6007546001600160a01b03908116906329589f6190614202908716612c7d565b61420d57600061420f565b835b614221876001600160a01b0316612c7d565b61422b578661423b565b600080516020614fa58339815191525b8561424e886001600160a01b0316612c7d565b6142585787614268565b600080516020614fa58339815191525b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a48201819052734d37f28d2db99e8d35a6c725a5f1749a085850a360c483015261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561430057600080fd5b505af1158015614314573d6000803e3d6000fd5b50505050506040513d602081101561290557600080fd5b600061433f846001600160a01b0316612c7d565b156143ae57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561439457600080fd5b505af11580156143a8573d6000803e3d6000fd5b50505050505b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561440957600080fd5b505afa15801561441d573d6000803e3d6000fd5b505050506040513d602081101561443357600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc829061445b908916612c7d565b6144655787614472565b6001546001600160a01b03165b614484886001600160a01b0316612c7d565b61448e578761449b565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b1580156144fa57600080fd5b505afa15801561450e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561453757600080fd5b810190808051604051939291908464010000000082111561455757600080fd5b90830190602082018581111561456c57600080fd5b825186602082028301116401000000008211171561458957600080fd5b82525081516020918201928201910280838360005b838110156145b657818101518382015260200161459e565b5050505090500160405250505090506145f76145da876001600160a01b0316612c7d565b6145e457866145f1565b6001546001600160a01b03165b83613eb9565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561466757818101518382015260200161464f565b50505050905001945050505050602060405180830381600087803b15801561468e57600080fd5b505af11580156146a2573d6000803e3d6000fd5b505050506040513d60208110156146b857600080fd5b505190506146ce6001600160a01b038716612c7d565b156147a957600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561472657600080fd5b505afa15801561473a573d6000803e3d6000fd5b505050506040513d602081101561475057600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b15801561479057600080fd5b505af11580156147a4573d6000803e3d6000fd5b505050505b9695505050505050565b60006147c7846001600160a01b0316612c7d565b1561482b576000805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692600480820193929182900301818588803b15801561481157600080fd5b505af1158015614825573d6000803e3d6000fd5b50505050505b614868614840856001600160a01b0316612c7d565b61484a5784614857565b6000546001600160a01b03165b600b546001600160a01b0316613eb9565b600b546000906001600160a01b0390811690630621b4f69061488b908816612c7d565b61489557866148a2565b6000546001600160a01b03165b856148b5886001600160a01b0316612c7d565b6148bf57876148cc565b6000546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b15801561492a57600080fd5b505af115801561493e573d6000803e3d6000fd5b505050506040513d602081101561495457600080fd5b5051905061496a6001600160a01b038516612c7d565b156117d657600054604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b1580156149c257600080fd5b505afa1580156149d6573d6000803e3d6000fd5b505050506040513d60208110156149ec57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015614a2c57600080fd5b505af1158015614a40573d6000803e3d6000fd5b5050505090509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052614a9f908490614b87565b505050565b6000838015614b4557600184168015614abf57859250614ac3565b8392505b50600283046002850494505b8415614b3f578586028687820414614ae657600080fd5b81810181811015614af657600080fd5b85810497506002870615614b32578785028589820414158915151615614b1b57600080fd5b83810181811015614b2b57600080fd5b8790049550505b5050600285049450614acf565b50614b5b565b838015614b555760009250614b59565b8392505b505b509392505050565b6000811580614b7e57505080820282828281614b7b57fe5b04145b6126af57600080fd5b614b99826001600160a01b0316614d8d565b614bea576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310614c285780518252601f199092019160209182019101614c09565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614c8a576040519150601f19603f3d011682016040523d82523d6000602084013e614c8f565b606091505b509150915081614ce6576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612feb57808060200190516020811015614d0257600080fd5b5051612feb5760405162461bcd60e51b815260040180806020018281038252602a815260200180614fc5602a913960400191505060405180910390fd5b6001600160a01b03831615801590614d6e57506001600160a01b038316600080516020614fa583398151915214155b15614a9f57614a9f6001600160a01b038416838363ffffffff614dc416565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906117d65750141592915050565b801580614e4a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614e1c57600080fd5b505afa158015614e30573d6000803e3d6000fd5b505050506040513d6020811015614e4657600080fd5b5051155b614e855760405162461bcd60e51b8152600401808060200182810382526036815260200180614fef6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052614a9f908490614b87565b60405180608001604052806004905b614f1d815260200190600190039081614ee65790505090565b60405180608001604052806004906020820280388339509192915050565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582014963a139889871cc6595a913217f0c92949011a394507b6ebd6b9cbb1bc998d64736f6c63430005100032
Deployed Bytecode Sourcemap
29447:29519:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31568:10;31582:9;31568:23;;31560:32;;;;;;29447:29519;32199:6258;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32199:6258:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32199:6258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32199:6258:0;;;;;;;;;;;;;;;;;;31101:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31101:123:0;;;:::i;:::-;;;;-1:-1:-1;;;;;31101:123:0;;;;;;;;;;;;;;31357:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31357:96:0;;;:::i;30020:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30020:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;56659:1205;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56659:1205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56659:1205:0;-1:-1:-1;;;;;56659:1205:0;;:::i;30070:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30070:40:0;;;:::i;47730:946::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47730:946:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;47730:946:0;;;;;;;;;;;;;;;;;:::i;29969:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29969:44:0;;;:::i;46147:1575::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46147:1575:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46147:1575:0;;;;;;;;;;;;;;;;;:::i;45546:570::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;45546:570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50598:888::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50598:888:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;50598:888:0;;;;;;;;;;;;;;;;;:::i;57872:1091::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57872:1091:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57872:1091:0;-1:-1:-1;;;;;57872:1091:0;;:::i;30780:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30780:91:0;;;:::i;30117:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30117:40:0;;;:::i;51494:607::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51494:607:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51494:607:0;;;;;;;;;;;;;;;;;:::i;30995:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30995:99:0;;;:::i;29921:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29921:41:0;;;:::i;48684:1906::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48684:1906:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;48684:1906:0;;;;;;;;;;;;;;;;;;;;;;:::i;30531:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30531:87:0;;;:::i;30166:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30166:87:0;;;:::i;30704:69::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30704:69:0;;;:::i;29824:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29824:41:0;;;:::i;30880:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30880:108:0;;;:::i;38465:773::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38465:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38465:773:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38465:773:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38465:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38465:773:0;;-1:-1:-1;;38465:773:0;;;-1:-1:-1;38465:773:0;;-1:-1:-1;;38465:773:0:i;29774:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29774:43:0;;;:::i;31660:531::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31660:531:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;31660:531:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31660:531:0;;;;;;;;;;;;;;;;;30627:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30627:70:0;;;:::i;29872:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29872:42:0;;;:::i;30443:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30443:81:0;;;:::i;31608:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31608:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31608:44:0;;:::i;32199:6258::-;32646:16;;;32660:1;32646:16;;;;;;;;;32504:20;;32539:29;;32646:16;;;;17:15:-1;;105:10;32646:16:0;88:34:-1;136:17;;-1:-1;32646:16:0;32631:31;;32692:7;-1:-1:-1;;;;;32679:20:0;:9;-1:-1:-1;;;;;32679:20:0;;32675:124;;;32731:6;;-1:-1:-1;32752:35:0;;32675:124;32815:35;:12;30009:4;32815:35;:20;:35;:::i;:::-;32811:1347;;;32871:27;32888:9;32871:16;:27::i;:::-;32867:567;;;32919:17;32939:35;32964:9;32939:24;:35::i;:::-;32919:55;-1:-1:-1;;;;;;32997:24:0;;;;32993:426;;33046:20;33092:9;-1:-1:-1;;;;;33069:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33069:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33069:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33069:55:0;;-1:-1:-1;33156:243:0;33200:10;33237:7;33271:34;33300:4;33271:24;:6;33069:55;33271:24;:10;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;33332:5;33364:12;33156:17;:243::i;:::-;33149:250;;;;;;;;32993:426;32867:567;;33454:25;33471:7;33454:16;:25::i;:::-;33450:697;;;33500:17;33520:33;33545:7;33520:24;:33::i;:::-;33500:53;-1:-1:-1;;;;;;33576:24:0;;;;33572:560;;33625:20;33671:7;-1:-1:-1;;;;;33648:51:0;;:53;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33648:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33648:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33648:53:0;;-1:-1:-1;33757:217:0;33801:9;33837:10;33874:6;33907:5;33939:12;33757:17;:217::i;:::-;33726:248;;-1:-1:-1;33726:248:0;-1:-1:-1;34014:40:0;34041:12;34014:22;33726:248;34031:4;34014:22;:16;:22;:::i;:40::-;33999:55;-1:-1:-1;34077:35:0;;-1:-1:-1;;34077:35:0;33572:560;33450:697;;34174:34;:12;30059:4;34174:34;:20;:34;:::i;:::-;34170:1079;;;34225:17;34245:26;34261:9;34245:15;:26::i;:::-;34225:46;-1:-1:-1;;;;;;34290:24:0;;;;34286:379;;34335:19;34379:9;-1:-1:-1;;;;;34357:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;34286:379:0;34694:24;34710:7;34694:15;:24::i;:::-;34681:37;-1:-1:-1;;;;;;34737:24:0;;;;34733:505;;34782:19;34826:7;-1:-1:-1;;;;;34804:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;34733:505:0;34170:1079;;35265:31;:12;30106:4;35265:31;:20;:31;:::i;:::-;35261:703;;;35337:4;;-1:-1:-1;;;;;35317:25:0;;;35337:4;;35317:25;35313:273;;;35410:3;;35466:4;;35370:200;;-1:-1:-1;;;;;35410:3:0;;;;35436:7;;35466:22;;:4;35481:6;35466:22;:14;:22;:::i;:::-;35511:5;35539:12;35370:17;:200::i;:::-;35363:207;;;;;;35313:273;35624:4;;-1:-1:-1;;;;;35606:23:0;;;35624:4;;35606:23;35602:351;;;35753:3;;35681:186;;35721:9;;-1:-1:-1;;;;;35753:3:0;35779:6;35808:5;35836:12;35681:17;:186::i;:::-;35894:4;;35650:217;;-1:-1:-1;35650:217:0;-1:-1:-1;35894:28:0;;-1:-1:-1;;;;;35894:4:0;35650:217;35894:28;:14;:28;:::i;:::-;35886:51;-1:-1:-1;35886:51:0;;35602:351;35980:31;:12;30153:4;35980:31;:20;:31;:::i;:::-;35976:714;;;36028:17;36048:23;36061:9;36048:12;:23::i;:::-;36028:43;-1:-1:-1;;;;;;36090:24:0;;;;36086:263;;36142:191;36182:10;36215:7;36245:6;36274:5;36302:12;36142:17;:191::i;:::-;36135:198;;;;;;;36086:263;36378:21;36391:7;36378:12;:21::i;:::-;36365:34;-1:-1:-1;;;;;;36418:24:0;;;;36414:265;;36470:193;36510:9;36542:10;36575:6;36604:5;36632:12;36470:17;:193::i;36414:265::-;35976:714;;36702:72;;:::i;:::-;:465;;;;;;;;;;36792:35;:12;29813:4;36792:35;:21;:35;:::i;:::-;:81;;36851:22;36792:81;;;36830:18;36792:81;36702:465;;;;;;36888:33;:12;29861:4;36888:33;:21;:33;:::i;:::-;:79;;36947:20;36888:79;;;36926:18;36888:79;36702:465;;;;;;36982:34;:12;29910:4;36982:34;:21;:34;:::i;:::-;:80;;37041:21;36982:80;;;37020:18;36982:80;36702:465;;;;;;37077:33;:12;29958:4;37077:33;:21;:33;:::i;:::-;:79;;37136:20;37077:79;;;37115:18;37077:79;36702:465;;;;;-1:-1:-1;37180:23:0;;:::i;:::-;37214:27;;:::i;:::-;37257:6;37252:199;37273:12;37269:1;:16;37252:199;;;37318:50;37330:9;37341:7;37350:17;:6;37361:5;37350:17;:10;:17;:::i;:::-;37318:8;37327:1;37318:11;;;;;;;;;;;:50;;:::i;:::-;37307:5;37313:1;37307:8;;;;;;;;;;:61;37383:4;:8;37392:5;37398:1;37392:8;;;;;;;;;;;37383:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37383:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37383:18:0;;;;37431:5;37437:1;37431:8;;;;;;;;;;;37416:9;37426:1;37416:12;;;;;;;;;;:23;37287:3;;37252:199;;;-1:-1:-1;37468:6:0;37463:987;37484:5;37480:1;:9;37463:987;;;37542:17;37592:1;37578:163;37599:12;37595:1;:16;37578:163;;;37652:5;37658:9;37652:16;;;;;;;;;;;37641:5;37647:1;37641:8;;;;;;;;;;;:27;37637:89;;;37705:1;37693:13;;37637:89;37613:3;;37578:163;;;;37802:34;37819:5;37825:9;37819:16;;;;;;;;;;;37802:12;;:34;:16;:34;:::i;:::-;37787:49;;37851:12;37864:9;37851:23;;;;;;;;;;;;;:25;;;;;;;;;;;37945:17;37965:6;37945:26;;38038:5;38030:1;38034;38030:5;:13;38026:413;;;38064:15;38082:176;38124:9;38156:7;38186:53;38233:5;38186:42;38200:12;38213:9;38200:23;;;;;;;;;;;;;;38226:1;38200:27;38186:9;:13;;:42;;;;:::i;:53::-;38082:8;38091:9;38082:19;;;;;;:176;38064:194;;38296:33;38308:9;38318;38308:20;;;;;;;;;;;38296:7;;:33;:11;:33;:::i;:::-;38277:5;38283:9;38277:16;;;;;;;;;;:52;38348:4;:8;38357:5;38363:9;38357:16;;;;;;;;;;;38348:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38348:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38348:26:0;;;;38416:7;38393:9;38403;38393:20;;;;;;;;;;:30;-1:-1:-1;38026:413:0;-1:-1:-1;;37491:3:0;;37463:987;;;;32199:6258;;;;;;;;;;;;:::o;31101:123::-;;;-1:-1:-1;;;;;31101:123:0;;:::o;31357:96::-;;;-1:-1:-1;;;;;31357:96:0;;:::o;30020:43::-;30059:4;30020:43;:::o;56659:1205::-;56718:6;56741:13;:5;-1:-1:-1;;;;;56741:11:0;;:13::i;:::-;56737:63;;;-1:-1:-1;;;56771:17:0;;56737:63;56884:91;;;22:32:-1;6:49;;56884:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;56848:128:0;;;;56813:12;;56827:17;;-1:-1:-1;;;;;56848:25:0;;;56878:4;;56884:91;;56848:128;;;;25:18:-1;56848:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;56848:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;56812:164:0;;;;56992:7;56987:58;;-1:-1:-1;;57016:17:0;;;;;;56987:58;57057:13;;57089:414;57124:1;57110:4;:11;:15;57106:1;:19;57089:414;;;57151:4;57156:1;57160;57156:5;57151:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57151:11:0;-1:-1:-1;;;57151:18:0;:57;;;;;57190:4;57195:1;57199;57195:5;57190:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57190:11:0;-1:-1:-1;;;57190:18:0;57151:57;:96;;;;;57229:4;57234:1;57238;57234:5;57229:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57229:11:0;-1:-1:-1;;;57229:18:0;57151:96;:135;;;;;57268:4;57273:1;57277;57273:5;57268:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57268:11:0;-1:-1:-1;;;57268:18:0;57151:135;:174;;;;;57307:4;57312:1;57316;57312:5;57307:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57307:11:0;-1:-1:-1;;;57307:18:0;57151:174;:213;;;;;57346:4;57351:1;57355;57351:5;57346:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57346:11:0;-1:-1:-1;;;57346:18:0;57151:213;:252;;;;;57385:4;57390:1;57394;57390:5;57385:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57385:11:0;-1:-1:-1;;;57385:18:0;57151:252;57147:345;;;57448:4;57437:15;;57471:5;;57147:345;57127:3;;57089:414;;;;57518:8;57513:59;;-1:-1:-1;;57543:17:0;;;;;;;57513:59;57638:103;;;22:32:-1;6:49;;57638:103:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;57602:140:0;;;;-1:-1:-1;;;;;57602:25:0;;;57632:4;;57638:103;57602:140;;;25:18:-1;57602:140:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;57602:140:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;57584:158:0;;-1:-1:-1;57584:158:0;-1:-1:-1;57584:158:0;57753:58;;-1:-1:-1;;57782:17:0;;;;;;;57753:58;57841:4;57830:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57830:26:0;;-1:-1:-1;;;;56659:1205:0;;;;:::o;30070:40::-;30106:4;30070:40;:::o;47730:946::-;47928:17;;47968:95;;;22:32:-1;6:49;;47968:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;47920:144:0;;;;47864:7;;;;47899:17;;-1:-1:-1;;;;;47928:17:0;;;;47962:4;;47920:144;;;;;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47920:144:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;47884:180:0;;;;48080:7;48075:49;;48111:1;48104:8;;;;;;48075:49;48136:42;48214:4;48203:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48203:27:0;;-1:-1:-1;48248:17:0;-1:-1:-1;;;;;48248:15:0;;;:17::i;:::-;:36;;;;48269:15;:7;-1:-1:-1;;;;;48269:13:0;;:15::i;:::-;48244:154;;;48308:78;48337:20;48359:9;48370:7;48379:6;48308:28;:78::i;:::-;48301:85;;;;;;;48244:154;48410:13;48426:82;48455:20;48477:9;-1:-1:-1;;;;;;;;;;;48501:6:0;48426:28;:82::i;:::-;48410:98;-1:-1:-1;48523:10:0;48519:51;;48557:1;48550:8;;;;;;;;48519:51;48589:79;48618:20;-1:-1:-1;;;;;;;;;;;48653:7:0;48662:5;48589:28;:79::i;:::-;48582:86;;;;;;47730:946;;;;;;:::o;29969:44::-;30009:4;29969:44;:::o;46147:1575::-;46283:7;46326:6;46350:17;-1:-1:-1;;;;;46350:15:0;;;:17::i;:::-;46345:669;;46416:14;;:37;;;-1:-1:-1;;;46416:37:0;;-1:-1:-1;;;;;46416:37:0;;;;;;;;;46384:29;;46416:14;;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;46416:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46416:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46416:37:0;;-1:-1:-1;;;;;;46472:35:0;;;46468:535;;46631:156;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46631:156:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;46564:242:0;;;;46529:12;;46543:17;;-1:-1:-1;;;;;46564:32:0;;;46601:6;;46631:156;;46564:242;;;;25:18:-1;46564:242:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;46564:242:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;46528:278:0;;;;46829:7;46825:163;;;46887:4;46876:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46876:27:0;;-1:-1:-1;46825:163:0;;;46967:1;46952:16;;46825:163;46468:535;;;46345:669;;47031:15;:7;-1:-1:-1;;;;;47031:13:0;;:15::i;:::-;47026:657;;47093:14;;:35;;;-1:-1:-1;;;47093:35:0;;-1:-1:-1;;;;;47093:35:0;;;;;;;;;47063:27;;47093:14;;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;47093:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47093:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47093:35:0;;-1:-1:-1;;;;;;47147:33:0;;;47143:529;;47302:154;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47302:154:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;47237:238:0;;;;47202:12;;47216:17;;-1:-1:-1;;;;;47237:30:0;;;47272:6;;47302:154;;47237:238;;;;25:18:-1;47237:238:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47237:238:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;47201:274:0;;;;47498:7;47494:163;;;47556:4;47545:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47545:27:0;;-1:-1:-1;47494:163:0;;;47636:1;47621:16;;47494:163;47143:529;;;47026:657;;47702:12;46147:1575;-1:-1:-1;;;;46147:1575:0:o;45546:570::-;45838:29;45871:66;45889:9;45900:7;45909:6;45917:5;45924:12;45871:17;:66::i;:::-;45835:102;;;45948:160;45967:9;45991:7;46013:6;46034:9;46058:12;46085;45948:4;:160::i;:::-;45546:570;;;;;;;:::o;50598:888::-;50799:22;;:49;;;-1:-1:-1;;;50799:49:0;;-1:-1:-1;;;50799:49:0;;;;;;50733:7;;;;-1:-1:-1;;;;;50799:22:0;;;;:32;;:49;;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;50799:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50799:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50799:49:0;50884:23;;50799:49;;-1:-1:-1;50860:21:0;;-1:-1:-1;;;;;50884:23:0;;;;:36;;50935:17;;:15;;;:17::i;:::-;:48;;50974:9;50935:48;;;50955:16;;-1:-1:-1;;;;;50955:16:0;50935:48;50998:15;:7;-1:-1:-1;;;;;50998:13:0;;:15::i;:::-;:44;;51035:7;50998:44;;;51016:16;;-1:-1:-1;;;;;51016:16:0;50998:44;50884:169;;;;;;;;;;;;;-1:-1:-1;;;;;50884:169:0;-1:-1:-1;;;;;50884:169:0;;;;;;-1:-1:-1;;;;;50884:169:0;-1:-1:-1;;;;;50884:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50884:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50884:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;50884:169:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;50884:169:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;50884:169:0;;421:4:-1;412:14;;;;50884:169:0;;;;;412:14:-1;50884:169:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;50884:169:0;;;;;;;;;;;50860:193;;51067:12;51081:17;51110:13;-1:-1:-1;;;;;51102:33:0;51140:6;51203:13;-1:-1:-1;;;;;51203:29:0;;:38;;;;51260:4;51283:6;51162:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51162:142:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;51162:142:0;;;;-1:-1:-1;;;;;51162:142:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;51162:142:0;51102:213;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;51102:213:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51066:249:0;;;;51331:7;51326:49;;51362:1;51355:8;;;;;;;;51326:49;51388:20;51424:4;51413:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51413:35:0;;50598:888;-1:-1:-1;;;;;;;;;50598:888:0:o;57872:1091::-;57928:6;57951:13;:5;-1:-1:-1;;;;;57951:11:0;;:13::i;:::-;57947:63;;;-1:-1:-1;;;57981:17:0;;57947:63;58094:91;;;22:32:-1;6:49;;58094:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;58058:128:0;;;;58023:12;;58037:17;;-1:-1:-1;;;;;58058:25:0;;;58088:4;;58094:91;;58058:128;;;;25:18:-1;58058:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;58058:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;58022:164:0;;;;58202:7;58197:58;;-1:-1:-1;;58226:17:0;;;;;;58197:58;58267:14;;58300:298;58335:1;58321:4;:11;:15;58317:1;:19;58300:298;;;58362:4;58367:1;58371;58367:5;58362:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58362:11:0;-1:-1:-1;;;58362:18:0;:57;;;;;58401:4;58406:1;58410;58406:5;58401:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58401:11:0;-1:-1:-1;;;58401:18:0;58362:57;:96;;;;;58440:4;58445:1;58449;58445:5;58440:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58440:11:0;-1:-1:-1;;;58440:18:0;58362:96;:135;;;;;58479:4;58484:1;58488;58484:5;58479:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58479:11:0;-1:-1:-1;;;58479:18:0;58362:135;58358:229;;;58543:4;58531:16;;58566:5;;58358:229;58338:3;;58300:298;;;;58613:9;58608:60;;-1:-1:-1;;58639:17:0;;;;;;;58608:60;58734:106;;;22:32:-1;6:49;;58734:106:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;58698:143:0;;;;-1:-1:-1;;;;;58698:25:0;;;58728:4;;58734:106;58698:143;;;25:18:-1;58698:143:0;;25:18:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;30780:91:0;;;-1:-1:-1;;;;;30780:91:0;;:::o;30117:40::-;30153:4;30117:40;:::o;51494:607::-;51692:13;;51628:7;;;;51663:17;;-1:-1:-1;;;;;51692:13:0;;;;51722:6;;-1:-1:-1;;;51785:35:0;51839:15;;:13;;;:15::i;:::-;:37;;51869:7;51839:37;;;51857:9;;-1:-1:-1;;;;;51857:9:0;51839:37;51895:17;:9;-1:-1:-1;;;;;51895:15:0;;:17::i;:::-;:41;;51927:9;51895:41;;;51915:9;;-1:-1:-1;;;;;51915:9:0;51895:41;51744:232;;;-1:-1:-1;;;;;51744:232:0;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;51744:232:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51744:232:0;;;179:29:-1;;;;160:49;;51684:303:0;;;;51744:232;;51684:303;;;;25:18:-1;51684:303:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;51684:303:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51648:339:0;;;;52003:7;51998:49;;52034:1;52027:8;;;;;;51998:49;52077:4;52066:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52066:27:0;;51494:607;-1:-1:-1;;;;;;51494:607:0:o;30995:99::-;;;-1:-1:-1;;;;;30995:99:0;;:::o;29921:41::-;29958:4;29921:41;:::o;48684:1906::-;48879:7;;48914:17;-1:-1:-1;;;;;48935:40:0;;;;48980:6;;-1:-1:-1;;;49025:44:0;49084:17;;:15;;;:17::i;:::-;:43;;49118:9;49084:43;;;-1:-1:-1;;;;;;;;;;;49084:43:0;49142:15;:7;-1:-1:-1;;;;;49142:13:0;;:15::i;:::-;:39;;49174:7;49142:39;;;-1:-1:-1;;;;;;;;;;;49142:39:0;48988:244;;;-1:-1:-1;;;;;48988:244:0;;;;;;;;;;;;;;;;;;;;;49217:4;48988:244;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;48988:244:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;48988:244:0;;;179:29:-1;;;;160:49;;48935:298:0;;;;48988:244;;48935:298;;;;25:18:-1;48935:298:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;48935:298:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;48899:334:0;;;;49249:7;49244:49;;49280:1;49273:8;;;;;;49244:49;49306:15;49323:12;49350:4;49339:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49339:35:0;;;;;;;;;-1:-1:-1;49339:35:0;-1:-1:-1;49402:42:0;-1:-1:-1;;;;;49391:53:0;;;;:134;;-1:-1:-1;49483:42:0;-1:-1:-1;;;;;49472:53:0;;;49391:134;:213;;;-1:-1:-1;49562:42:0;-1:-1:-1;;;;;49551:53:0;;;49391:213;49387:275;;;49649:1;49642:8;;;;;;;;49387:275;49754:101;;;22:32:-1;6:49;;49754:101:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;49725:131:0;;;;-1:-1:-1;;;;;49725:18:0;;;49748:4;;49754:101;49725:131;;;25:18:-1;49725:131:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;49725:131:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;49712:144:0;;-1:-1:-1;;49867:48:0;;;;49902:1;49895:8;;;;;;;;49867:48;50005:88;;;22:32:-1;6:49;;50005:88:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;49976:118:0;;;;-1:-1:-1;;;;;49976:18:0;;;49999:4;;50005:88;49976:118;;;25:18:-1;49976:118:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;49976:118:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;49963:131:0;;-1:-1:-1;;50105:48:0;;;;50140:1;50133:8;;;;;;;;50105:48;50244:95;;;22:32:-1;6:49;;50244:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;50215:125:0;;;;-1:-1:-1;;;;;50215:18:0;;;50238:4;;50244:95;50215:125;;;25:18:-1;50215:125:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;50215:125:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;50202:138:0;;-1:-1:-1;;50351:48:0;;;;50386:1;50379:8;;;;;;;;50351:48;50418:164;50577:4;50418:140;50520:37;50527:9;-1:-1:-1;;;;;50520:35:0;;:37::i;:::-;50514:2;:43;50418:77;50459:35;50466:7;-1:-1:-1;;;;;50459:33:0;;:35::i;:::-;50453:2;:41;50418:16;:4;50427:6;50418:16;:8;:16;:::i;:::-;:34;:77;:34;:77;:::i;:164::-;50411:171;48684:1906;-1:-1:-1;;;;;;;;;48684:1906:0:o;30531:87::-;;;-1:-1:-1;;;;;30531:87:0;;:::o;30166:::-;-1:-1:-1;;;;;;;;;;;30166:87:0;:::o;30704:69::-;;;-1:-1:-1;;;;;30704:69:0;;:::o;29824:41::-;29861:4;29824:41;:::o;30880:108::-;;;-1:-1:-1;;;;;30880:108:0;;:::o;38465:773::-;38754:66;-1:-1:-1;;;;;38754:31:0;;38786:10;38806:4;38813:6;38754:66;:31;:66;:::i;:::-;38833:61;38839:9;38850:7;38859:6;38867:12;38881;38833:5;:61::i;:::-;38907:20;38930:41;-1:-1:-1;;;;;38930:26:0;;38965:4;38930:41;:26;:41;:::i;:::-;38907:64;;39006:9;38990:12;:25;;38982:91;;;;-1:-1:-1;;;38982:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39084:51;-1:-1:-1;;;;;39084:25:0;;39110:10;39122:12;39084:51;:25;:51;:::i;:::-;-1:-1:-1;39146:84:0;39174:10;39186:43;-1:-1:-1;;;;;39186:28:0;;39223:4;39186:43;:28;:43;:::i;:::-;-1:-1:-1;;;;;39146:27:0;;;:84;;:27;:84;:::i;:::-;;38465:773;;;;;;;:::o;29774:43::-;29813:4;29774:43;:::o;31660:531::-;31846:24;31907:5;31893:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;31893:20:0;-1:-1:-1;31883:30:0;-1:-1:-1;31929:6:0;31924:260;31945:5;31941:1;:9;31924:260;;;31988:184;32024:9;32052:7;32078:28;32100:5;32078:17;:6;32093:1;32089:5;;32078:17;:10;:17;:::i;:28::-;32125:1;32145:12;31988:17;:184::i;:::-;31972:200;31973:7;31981:1;31973:10;;;;;;;;;;;;;;;;;31972:200;31952:3;;31924:260;;;;31660:531;;;;;;;:::o;30627:70::-;;;-1:-1:-1;;;;;30627:70:0;;:::o;29872:42::-;29910:4;29872:42;:::o;30443:81::-;;;-1:-1:-1;;;;;30443:81:0;;:::o;31608:44::-;;:::o;29163:133::-;29263:19;;;29262:26;29163:133;;;;;:::o;55700:478::-;55792:4;;55762;;-1:-1:-1;;;;;55783:13:0;;;55792:4;;55783:13;55779:57;;;-1:-1:-1;55820:4:0;55813:11;;55779:57;55892:8;;55923:93;;;-1:-1:-1;;;;;55923:93:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;55923:93:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;55884:133:0;;;;55849:12;;55863:17;;55892:8;;;55917:4;;55923:93;;55884:133;;;25:18:-1;55884:133:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;55884:133:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;55848:169:0;;;;56033:7;56028:53;;56064:5;56057:12;;;;;;56028:53;56094:13;56123:4;56112:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;56186:465:0;56288:4;;56256:6;;-1:-1:-1;;;;;56279:13:0;;;56288:4;;56279:13;56275:71;;;-1:-1:-1;56331:1:0;56309:25;;56275:71;56430:98;;;22:32:-1;6:49;;56430:98:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;56394:135:0;;;;56359:12;;56373:17;;-1:-1:-1;;;;;56394:25:0;;;56424:4;;56430:98;;56394:135;;;;25:18:-1;56394:135:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;56394:135:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;56358:171:0;;;;56545:7;56540:58;;-1:-1:-1;;56569:17:0;;;;;;56540:58;56628:4;56617:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56617:26:0;;56186:465;-1:-1:-1;;;;56186:465:0:o;2285:471::-;2343:7;2588:6;2584:47;;-1:-1:-1;2618:1:0;2611:8;;2584:47;2655:5;;;2659:1;2655;:5;:1;2679:5;;;;;:10;2671:56;;;;-1:-1:-1;;;2671:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3224:132;3282:7;3309:39;3313:1;3316;3309:39;;;;;;;;;;;;;;;;;:3;:39::i;18852:189::-;18925:7;18945:8;16885:42;-1:-1:-1;;;;;18963:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18963:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18963:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18963:9:0;18957:3;:15;18956:41;;16885:42;-1:-1:-1;;;;;18988:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18988:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18988:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18988:9:0;18956:41;;;18976:9;:7;:9::i;:::-;18945:52;;19015:18;19021:3;19026:6;19015:5;:18::i;18655:189::-;18728:7;18748:8;16885:42;-1:-1:-1;;;;;18766:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18766:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18766:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18766:9:0;18760:3;:15;18759:41;;16885:42;-1:-1:-1;;;;;18791:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18791:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18791:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18791:9:0;18759:41;;;18779:9;:7;:9::i;:::-;18748:52;;18818:18;18824:6;18832:3;18818:5;:18::i;29304:134::-;29405:19;29404:26;;;29304:134::o;52109:178::-;52255:7;52109:178;;;;;:::o;913:181::-;971:7;1003:5;;;1027:6;;;;1019:46;;;;;-1:-1:-1;;;1019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:136;1427:7;1454:43;1458:1;1461;1454:43;;;;;;;;;;;;;;;;;:3;:43::i;28862:166::-;28913:4;-1:-1:-1;;;;;28938:39:0;;;;:81;;-1:-1:-1;;;;;;28981:38:0;;-1:-1:-1;;;;;;;;;;;28981:38:0;28930:90;28862:166;-1:-1:-1;;28862:166:0:o;28290:564::-;28354:7;-1:-1:-1;;;;;28380:21:0;;;;:45;;-1:-1:-1;;;;;;28405:20:0;;-1:-1:-1;;;;;;;;;;;28405:20:0;28380:45;28376:87;;;-1:-1:-1;28449:2:0;28442:9;;28376:87;28561:37;;;22:32:-1;6:49;;28561:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28511:98:0;;;;28476:12;;28490:17;;-1:-1:-1;;;;;28511:25:0;;;28541:4;;28561:37;;28511:98;;;;25:18:-1;28511:98:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;28511:98:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;28475:134:0;;;;28625:7;28620:165;;28721:37;;;22:32:-1;6:49;;28721:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28667:106:0;;;;-1:-1:-1;;;;;28667:25:0;;;28697:4;;28721:37;28667:106;;;25:18:-1;28667:106:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;28667:106:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;28649:124:0;;-1:-1:-1;28649:124:0;-1:-1:-1;28620:165:0;28804:7;:42;;28844:2;28797:49;28290:564;-1:-1:-1;;;;28290:564:0:o;27179:624::-;27290:11;27286:50;;27318:7;;27286:50;-1:-1:-1;;;;;27352:21:0;;;;:45;;-1:-1:-1;;;;;;27377:20:0;;-1:-1:-1;;;;;;;;;;;27377:20:0;27352:45;27348:448;;;-1:-1:-1;;;;;27422:18:0;;27430:10;27422:18;:41;;;;;27457:6;27444:9;:19;;27422:41;27414:71;;;;;-1:-1:-1;;;27414:71:0;;;;;;;;;;;;-1:-1:-1;;;27414:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27504:19:0;;27518:4;27504:19;27500:97;;27544:37;;-1:-1:-1;;;;;27544:29:0;;;:37;;;;;27574:6;;27544:37;;;;27574:6;27544:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27544:37:0;27500:97;27627:6;27615:9;:18;27611:101;;;27654:10;:42;27674:21;:9;27688:6;27674:21;:13;:21;:::i;:::-;27654:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27654:42:0;27611:101;27348:448;;;27744:40;-1:-1:-1;;;;;27744:22:0;;27767:4;27773:2;27777:6;27744:40;:22;:40;:::i;:::-;27179:624;;;;:::o;39246:6292::-;39505:7;-1:-1:-1;;;;;39492:20:0;:9;-1:-1:-1;;;;;39492:20:0;;39488:59;;;39529:7;;39488:59;39563:35;:12;30009:4;39563:35;:20;:35;:::i;:::-;39559:1338;;;39619:27;39636:9;39619:16;:27::i;:::-;39615:507;;;39667:17;39687:35;39712:9;39687:24;:35::i;:::-;39667:55;;39766:9;-1:-1:-1;;;;;39743:41:0;;39785:6;39743:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39743:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39743:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39811:24:0;;-1:-1:-1;39838:44:0;-1:-1:-1;;;;;39838:29:0;;39876:4;39838:44;:29;:44;:::i;:::-;39811:71;;39910:196;39938:10;39971:7;40001:16;40040:12;40075;39910:5;:196::i;:::-;39903:203;;;;39615:507;40142:25;40159:7;40142:16;:25::i;:::-;40138:748;;;40188:17;40208:33;40233:7;40208:24;:33::i;:::-;40188:53;;40262:188;40290:9;40322:10;40355:6;40384:12;40419;40262:5;:188::i;:::-;40471:24;40498:44;-1:-1:-1;;;;;40498:29:0;;40536:4;40498:44;:29;:44;:::i;:::-;40471:71;;40567:18;:10;-1:-1:-1;;;;;40567:16:0;;:18::i;:::-;40563:283;;;40610:4;;;;;;;;;-1:-1:-1;;;;;40610:4:0;-1:-1:-1;;;;;40610:9:0;;40626:16;40610:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40610:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40610:35:0;;;;;40563:283;;;40694:54;40719:10;40739:7;40694:24;:54::i;:::-;40794:7;-1:-1:-1;;;;;40771:37:0;;40809:16;40771:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40771:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40771:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;40864:7:0;;;;40138:748;40913:34;:12;30059:4;40913:34;:20;:34;:::i;:::-;40909:1556;;;40964:17;40984:26;41000:9;40984:15;:26::i;:::-;40964:46;-1:-1:-1;;;;;;41029:24:0;;;;41025:625;;41078:18;:10;-1:-1:-1;;;;;41078:16:0;;:18::i;:::-;41074:245;;;41121:68;;;-1:-1:-1;;;41121:68:0;;41175:4;41121:68;;;;;;;;;;;;-1:-1:-1;;;;;41121:45:0;;;;;:68;;;;;;;;;;;;;;-1:-1:-1;41121:45:0;:68;;;5:2:-1;;;;30:1;27;20:12;5:2;41121:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41121:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41074:245:0;;-1:-1:-1;41074:245:0;;41238:61;;;-1:-1:-1;;;41238:61:0;;41285:4;41238:61;;;;;;;;;;;;-1:-1:-1;;;;;41238:38:0;;;;;:61;;;;;;;;;;;;;;-1:-1:-1;41238:38:0;:61;;;5:2:-1;;;;30:1;27;20:12;41074:245:0;41339:24;41366:44;-1:-1:-1;;;;;41366:29:0;;41404:4;41366:44;:29;:44;:::i;41025:625::-;41679:24;41695:7;41679:15;:24::i;:::-;41666:37;-1:-1:-1;;;;;;41722:24:0;;;;41718:736;;41767:188;41795:9;41827:10;41860:6;41889:12;41924;41767:5;:188::i;:::-;41976:24;42003:44;-1:-1:-1;;;;;42003:29:0;;42041:4;42003:44;:29;:44;:::i;:::-;41976:71;;42072:18;:10;-1:-1:-1;;;;;42072:16:0;;:18::i;:::-;42068:346;;;42115:84;;;-1:-1:-1;;;42115:84:0;;42193:4;42115:84;;;;;;-1:-1:-1;;;;;42115:45:0;;;;;42167:16;;42115:84;;;;;;;;;;;;;;;42167:16;42115:45;:84;;;5:2:-1;;;;30:1;27;20:12;5:2;42115:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42115:84:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42068:346:0;;-1:-1:-1;42068:346:0;;42248:54;42273:10;42293:7;42248:24;:54::i;:::-;42325:69;;;-1:-1:-1;;;42325:69:0;;42370:4;42325:69;;;;;;;;;;;;-1:-1:-1;;;;;42325:36:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;42325:36:0;:69;;;5:2:-1;;;;30:1;27;20:12;41718:736:0;40909:1556;;42481:31;:12;30106:4;42481:31;:20;:31;:::i;:::-;42477:814;;;42553:4;;-1:-1:-1;;;;;42533:25:0;;;42553:4;;42533:25;42529:327;;;42579:4;;:32;;;-1:-1:-1;;;42579:32:0;;42597:4;42579:32;;;;;;;;;;;;-1:-1:-1;;;;;42579:4:0;;;;:9;;:32;;;;;:4;;:32;;;;;;;;:4;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;42579:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42667:3:0;;;42723:28;;;-1:-1:-1;;;42723:28:0;;42745:4;42723:28;;;;;;;;42639:201;;-1:-1:-1;;;;;;42667:3:0;;;;-1:-1:-1;42693:7:0;;42667:3;;42723:13;;:28;;;;;;;;;;;;;;;42667:3;42723:28;;;5:2:-1;;;;30:1;27;20:12;5:2;42723:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42723:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42723:28:0;42774:12;42809;42639:5;:201::i;:::-;42632:208;;42529:327;42894:4;;-1:-1:-1;;;;;42876:23:0;;;42894:4;;42876:23;42872:408;;;42980:3;;42920:181;;42948:9;;-1:-1:-1;;;;;42980:3:0;43006:6;43035:12;43070;42920:5;:181::i;:::-;43147:3;;43160:4;;43122:44;;-1:-1:-1;;;;;43147:3:0;;;;43160:4;43122:24;:44::i;:::-;43185:4;;43210:3;;;:28;;;-1:-1:-1;;;43210:28:0;;43203:4;43210:28;;;;;;;;-1:-1:-1;;;;;43185:4:0;;;;:9;;43203:4;43210:3;;:13;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;43210:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43210:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43210:28:0;43185:54;;;-1:-1:-1;;;;;;43185:54:0;;;;;;;-1:-1:-1;;;;;43185:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43185:54:0;;;;;;;-1:-1:-1;43185:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;43185:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;42872:408:0;43307:31;:12;30153:4;43307:31;:20;:31;:::i;:::-;43303:1185;;;43355:17;43375:23;43388:9;43375:12;:23::i;:::-;43355:43;-1:-1:-1;;;;;;43417:24:0;;;;43413:324;;43481:9;-1:-1:-1;;;;;43462:37:0;;43500:6;43462:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43462:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43462:45:0;;;;43535:186;43563:10;43596:7;43626:6;43655:12;43690;43535:5;:186::i;:::-;43528:193;;;43413:324;43766:21;43779:7;43766:12;:21::i;:::-;43753:34;-1:-1:-1;;;;;;43806:24:0;;;;43802:675;;43851:188;43879:9;43911:10;43944:6;43973:12;44008;43851:5;:188::i;:::-;44060:24;44087:44;-1:-1:-1;;;;;44087:29:0;;44125:4;44087:44;:29;:44;:::i;:::-;44197:4;;44060:71;;-1:-1:-1;44152:51:0;;44177:10;;-1:-1:-1;;;;;44197:4:0;44152:24;:51::i;:::-;44222:4;;-1:-1:-1;;;;;44222:4:0;;;;:12;;44241:18;;:16;;;:18::i;:::-;:41;;44281:1;44241:41;;;44262:16;44241:41;44306:18;:10;-1:-1:-1;;;;;44306:16:0;;:18::i;:::-;:45;;44341:10;44306:45;;;-1:-1:-1;;;;;;;;;;;44306:45:0;44222:214;;;-1:-1:-1;;;;;;44222:214:0;;;;;;;-1:-1:-1;;;;;44222:214:0;;;;;;;;;;;;;44413:4;44222:214;;;;;;;;;;-1:-1:-1;;44222:214:0;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;44222:214:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44222:214:0;;;;;44455:7;;;;43802:675;43303:1185;;44500:67;;:::i;:::-;-1:-1:-1;44500:192:0;;;;;;;;44585:14;44500:192;;44614:12;44500:192;;;;44641:13;44500:192;;;;;;;44669:12;44500:192;;;;-1:-1:-1;;;44772:202:0;44793:15;44789:1;:19;44772:202;;;44852:1;44834:12;44847:1;44834:15;;;;;;;;;;;;;;:19;44830:133;;;44882:26;44892:12;44905:1;44892:15;;;;;;;;;;;;;;44882:5;:9;;:26;;;;:::i;:::-;44874:34;;44946:1;44927:20;;44830:133;44810:3;;44772:202;;;;45002:1;44994:5;:9;44986:69;;;;-1:-1:-1;;;44986:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45094:6;45068:23;45111:420;45132:15;45128:1;:19;45111:420;;;45173:12;45186:1;45173:15;;;;;;;;;;;;;;45192:1;45173:20;45169:69;;;45214:8;;45169:69;45254:18;45275:38;45307:5;45275:27;45286:12;45299:1;45286:15;;;;;;;;;;;;;;45275:6;:10;;:27;;;;:::i;:38::-;45254:59;;45337:16;45332:1;:21;45328:90;;;-1:-1:-1;45387:15:0;45328:90;45451:10;45432:29;;;;45476:43;45488:9;45499:7;45508:10;45476:8;45485:1;45476:11;;;;;;:43;;45111:420;;45149:3;;45111:420;;;;39246:6292;;;;;;;;;;:::o;28021:261::-;28099:7;-1:-1:-1;;;;;28123:21:0;;;;:45;;-1:-1:-1;;;;;;28148:20:0;;-1:-1:-1;;;;;;;;;;;28148:20:0;28123:45;28119:156;;;-1:-1:-1;;;;;;28192:11:0;;;28185:18;;28119:156;28243:5;-1:-1:-1;;;;;28243:15:0;;28259:3;28243:20;;;;;;;;;;;;;-1:-1:-1;;;;;28243:20:0;-1:-1:-1;;;;;28243:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28243:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28243:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28243:20:0;;-1:-1:-1;28236:27:0;;26790:381;26876:4;26897:11;26893:55;;-1:-1:-1;26932:4:0;26925:11;;26893:55;-1:-1:-1;;;;;26964:21:0;;;;:45;;-1:-1:-1;;;;;;26989:20:0;;-1:-1:-1;;;;;;;;;;;26989:20:0;26964:45;26960:204;;;27026:37;;-1:-1:-1;;;;;27026:29:0;;;:37;;;;;27056:6;;27026:37;;;;27056:6;27026:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27026:37:0;26960:204;;;27096:30;-1:-1:-1;;;;;27096:18:0;;27115:2;27119:6;27096:30;:18;:30;:::i;:::-;-1:-1:-1;27148:4:0;27141:11;;3886:345;3972:7;4074:12;4067:5;4059:28;;;;-1:-1:-1;;;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4098:9;4114:1;4110;:5;;;;;;;3886:345;-1:-1:-1;;;;;3886:345:0:o;18517:130::-;18557:7;18584:55;18590:37;16885:42;-1:-1:-1;;;;;18595:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18595:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18595:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18595:9:0;18612;;;-1:-1:-1;;;18612:9:0;;;;16885:42;;18612:7;;:9;;;;;18595;;18612;;;;;;;16885:42;18612:9;;;5:2:-1;;;;30:1;27;20:12;5:2;18612:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18612:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18612:9:0;18606:3;:15;16966:8;18590:4;:37::i;:::-;16885:42;-1:-1:-1;;;;;18629:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18629:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18629:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18629:9:0;18584:5;:55::i;:::-;18577:62;;18517:130;:::o;17109:131::-;17162:6;16966:8;17216:10;17221:1;17224;17216:4;:10::i;:::-;:16;;;;;;;17109:131;-1:-1:-1;;;17109:131:0:o;17248:::-;17301:6;17370:1;17355:12;17360:1;16966:8;17355:4;:12::i;1842:192::-;1928:7;1964:12;1956:6;;;;1948:29;;;;-1:-1:-1;;;1948:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1948:29:0;-1:-1:-1;;;2000:5:0;;;1842:192::o;23445:204::-;23572:68;;;-1:-1:-1;;;;;23572:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23572:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23546:95:0;;23565:5;;23546:18;:95::i;55430:262::-;55515:13;:5;-1:-1:-1;;;;;55515:11:0;;:13::i;:::-;55510:175;;55550:34;;;-1:-1:-1;;;55550:34:0;;55574:4;55550:34;;;;-1:-1:-1;;;;;55550:34:0;;;;;;;;;55588:3;;55550:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;55550:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55550:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55550:34:0;:41;;55545:129;;55618:40;-1:-1:-1;;;;;55618:22:0;;55641:2;-1:-1:-1;;55618:40:0;:22;:40;:::i;:::-;55430:262;;:::o;52318:871::-;52443:7;52488:6;52512:17;-1:-1:-1;;;;;52512:15:0;;;:17::i;:::-;52507:356;;52578:14;;:37;;;-1:-1:-1;;;52578:37:0;;-1:-1:-1;;;;;52578:37:0;;;;;;;;;52546:29;;52578:14;;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;52578:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52578:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52578:37:0;;-1:-1:-1;;;;;;52634:35:0;;;52630:222;;52690:58;52715:9;52734:12;52690:24;:58::i;:::-;52782:54;;;-1:-1:-1;;;52782:54:0;;;;;;;;52829:1;52782:54;;;;52832:3;52782:54;;;;;;-1:-1:-1;;;;;52782:32:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;52782:32:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;52782:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52782:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52782:54:0;;-1:-1:-1;52630:222:0;52507:356;;52880:15;:7;-1:-1:-1;;;;;52880:13:0;;:15::i;:::-;52875:275;;52942:14;;:35;;;-1:-1:-1;;;52942:35:0;;-1:-1:-1;;;;;52942:35:0;;;;;;;;;52912:27;;52942:14;;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;52942:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52942:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52942:35:0;;-1:-1:-1;;;;;;52996:33:0;;;52992:147;;53065:10;-1:-1:-1;;;;;53065:30:0;;53102:12;53116:1;53119:3;53065:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53065:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53065:58:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;53197:586:0;53384:17;;53320:7;;53340:63;;53365:9;;-1:-1:-1;;;;;53384:17:0;53340:24;:63::i;:::-;53421:17;;-1:-1:-1;;;;;53421:17:0;;;;:31;;53459:17;;:15;;;:17::i;:::-;:30;;53488:1;53459:30;;;53479:6;53459:30;53505:17;:9;-1:-1:-1;;;;;53505:15:0;;:17::i;:::-;:43;;53539:9;53505:43;;;-1:-1:-1;;;;;;;;;;;53505:43:0;53563:6;53584:15;:7;-1:-1:-1;;;;;53584:13:0;;:15::i;:::-;:39;;53616:7;53584:39;;;-1:-1:-1;;;;;;;;;;;53584:39:0;53421:354;;;-1:-1:-1;;;;;;53421:354:0;;;;;;;-1:-1:-1;;;;;53421:354:0;;;;;;;;;;;;;;;;;;;;53646:4;53421:354;;;;-1:-1:-1;;;53421:354:0;;;;53689:1;53421:354;;;;;;53705:42;53421:354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;53421:354:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53421:354:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;53791:905:0;53915:7;53939:17;:9;-1:-1:-1;;;;;53939:15:0;;:17::i;:::-;53935:90;;;53973:16;;;;;;;;;-1:-1:-1;;;;;53973:16:0;-1:-1:-1;;;;;53973:24:0;;54004:6;53973:40;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53973:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53973:40:0;;;;;53935:90;54083:22;;:49;;;-1:-1:-1;;;54083:49:0;;-1:-1:-1;;;54083:49:0;;;;;;54037:28;;-1:-1:-1;;;;;54083:22:0;;:32;;:49;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;54083:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54083:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54083:49:0;54168:23;;54083:49;;-1:-1:-1;54144:21:0;;-1:-1:-1;;;;;54168:23:0;;;;:36;;54219:17;;:15;;;:17::i;:::-;:48;;54258:9;54219:48;;;54239:16;;-1:-1:-1;;;;;54239:16:0;54219:48;54282:15;:7;-1:-1:-1;;;;;54282:13:0;;:15::i;:::-;:44;;54319:7;54282:44;;;54300:16;;-1:-1:-1;;;;;54300:16:0;54282:44;54168:169;;;;;;;;;;;;;-1:-1:-1;;;;;54168:169:0;-1:-1:-1;;;;;54168:169:0;;;;;;-1:-1:-1;;;;;54168:169:0;-1:-1:-1;;;;;54168:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54168:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54168:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;54168:169:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;54168:169:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;54168:169:0;;421:4:-1;412:14;;;;54168:169:0;;;;;412:14:-1;54168:169:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54168:169:0;;;;;;;;;;;54144:193;;54350:98;54375:17;:9;-1:-1:-1;;;;;54375:15:0;;:17::i;:::-;:48;;54414:9;54375:48;;;54395:16;;-1:-1:-1;;;;;54395:16:0;54375:48;54433:13;54350:24;:98::i;:::-;54459:20;54482:13;-1:-1:-1;;;;;54482:29:0;;54512:4;54518:6;54526:1;54482:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54482:46:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54482:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54482:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54482:46:0;;-1:-1:-1;54545:15:0;-1:-1:-1;;;;;54545:13:0;;;:15::i;:::-;54541:116;;;54577:16;;54603:41;;;-1:-1:-1;;;54603:41:0;;54638:4;54603:41;;;;;;-1:-1:-1;;;;;54577:16:0;;;;:25;;:16;;54603:26;;:41;;;;;;;;;;;;;;;54577:16;54603:41;;;5:2:-1;;;;30:1;27;20:12;5:2;54603:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54603:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54603:41:0;54577:68;;;-1:-1:-1;;;;;;54577:68:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54577:68:0;;;;;;;-1:-1:-1;54577:68:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;54577:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54577:68:0;;;;54541:116;54676:12;53791:905;-1:-1:-1;;;;;;53791:905:0:o;54704:700::-;54827:7;54851:17;:9;-1:-1:-1;;;;;54851:15:0;;:17::i;:::-;54847:83;;;54885:9;;;:33;;;-1:-1:-1;;;54885:33:0;;;;-1:-1:-1;;;;;54885:9:0;;;;:17;;54909:6;;54885:33;;;;;:9;:33;;;;;;54909:6;54885:9;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;54885:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54885:33:0;;;;;54847:83;54942:91;54967:17;:9;-1:-1:-1;;;;;54967:15:0;;:17::i;:::-;:41;;54999:9;54967:41;;;54987:9;;-1:-1:-1;;;;;54987:9:0;54967:41;55018:13;;-1:-1:-1;;;;;55018:13:0;54942:24;:91::i;:::-;55067:13;;55044:20;;-1:-1:-1;;;;;55067:13:0;;;;:27;;55109:17;;:15;;;:17::i;:::-;:41;;55141:9;55109:41;;;55129:9;;-1:-1:-1;;;;;55129:9:0;55109:41;55165:6;55186:15;:7;-1:-1:-1;;;;;55186:13:0;;:15::i;:::-;:37;;55216:7;55186:37;;;55204:9;;-1:-1:-1;;;;;55204:9:0;55186:37;55067:183;;;-1:-1:-1;;;;;;55067:183:0;;;;;;;-1:-1:-1;;;;;55067:183:0;;;;;;;;;;;;;;;;;;;;55238:1;55067:183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55067:183:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;55067:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55067:183:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55067:183:0;;-1:-1:-1;55267:15:0;-1:-1:-1;;;;;55267:13:0;;;:15::i;:::-;55263:102;;;55299:9;;55318:34;;;-1:-1:-1;;;55318:34:0;;55346:4;55318:34;;;;;;-1:-1:-1;;;;;55299:9:0;;;;:18;;:9;;55318:19;;:34;;;;;;;;;;;;;;;55299:9;55318:34;;;5:2:-1;;;;30:1;27;20:12;5:2;55318:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55318:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55318:34:0;55299:54;;;-1:-1:-1;;;;;;55299:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55299:54:0;;;;;;;-1:-1:-1;55299:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;55299:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55299:54:0;;;;55384:12;-1:-1:-1;54704:700:0;;;;;:::o;23261:176::-;23370:58;;;-1:-1:-1;;;;;23370:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23370:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23344:85:0;;23363:5;;23344:18;:85::i;:::-;23261:176;;;:::o;17387:1122::-;17450:6;17565:1;17567:53;;;;17668:9;;;17678:20;;;;17714:1;17709:6;;17661:56;;17678:20;17692:4;17687:9;;17661:56;;17757:1;17751:4;17747:12;17813:1;17810;17806:9;17801:14;;17795:681;17818:1;17795:681;;;17878:1;17875;17871:9;17927:1;17923;17919:2;17915:10;17912:17;17902:2;;17942:1;17940;17933:11;17902:2;17991:4;17987:2;17983:13;18033:2;18024:7;18021:15;18018:2;;;18048:1;18046;18039:11;18018:2;18092:4;18083:7;18079:18;18074:23;;18128:1;18126;18122:8;18119:2;;;18175:1;18172;18168:9;18251:1;18247;18243:2;18239:10;18236:17;18229:25;18224:1;18217:9;18210:17;18206:49;18203:2;;;18267:1;18265;18258:11;18203:2;18320:4;18316:2;18312:13;18366:2;18357:7;18354:15;18351:2;;;18381:1;18379;18372:11;18351:2;18416:18;;;;-1:-1:-1;;18119:2:0;17838:638;;17833:1;17831;17827:8;17822:13;;17795:681;;;17642:849;17558:933;;17567:53;17582:1;17584:18;;;;17617:1;17612:6;;17575:44;;17584:18;17597:4;17592:9;;17575:44;;17558:933;;17543:959;;;;;:::o;16983:118::-;17035:6;17062;;;:30;;-1:-1:-1;;17077:5:0;;;17091:1;17086;17077:5;17086:1;17072:15;;;;;:20;17062:30;17054:39;;;;;25300:1114;25904:27;25912:5;-1:-1:-1;;;;;25904:25:0;;:27::i;:::-;25896:71;;;;;-1:-1:-1;;;25896:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26041:12;26055:23;26090:5;-1:-1:-1;;;;;26082:19:0;26102:4;26082:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;26082:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;26040:67:0;;;;26126:7;26118:52;;;;;-1:-1:-1;;;26118:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26187:17;;:21;26183:224;;26329:10;26318:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26318:30:0;26310:85;;;;-1:-1:-1;;;26310:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27811:202;-1:-1:-1;;;;;27903:21:0;;;;;;:45;;-1:-1:-1;;;;;;27928:20:0;;-1:-1:-1;;;;;;;;;;;27928:20:0;;27903:45;27899:107;;;27965:29;-1:-1:-1;;;;;27965:17:0;;27983:2;27987:6;27965:29;:17;:29;:::i;20099:810::-;20159:4;20818:20;;20661:66;20858:15;;;;;:42;;-1:-1:-1;20877:23:0;;;20099:810;-1:-1:-1;;20099:810:0:o;23657:621::-;24027:10;;;24026:62;;-1:-1:-1;24043:39:0;;;-1:-1:-1;;;24043:39:0;;24067:4;24043:39;;;;-1:-1:-1;;;;;24043:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;24043:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24043:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24043:39:0;:44;24026:62;24018:152;;;;-1:-1:-1;;;24018:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24207:62;;;-1:-1:-1;;;;;24207:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;24207:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;24181:89:0;;24200:5;;24181:18;:89::i;29447:29519::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;29447:29519:0;;;-1:-1:-1;;29447:29519:0:o;:::-;
Swarm Source
bzzr://14963a139889871cc6595a913217f0c92949011a394507b6ebd6b9cbb1bc998d
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.