Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 70804222 | 995 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
StrategySushiWethUsdt
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2023-03-13
*/
// Sources flattened with hardhat v2.10.1-gzeon-c8fe47dd4 https://hardhat.org
// File contracts/lib/safe-math.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File contracts/lib/context.sol
pragma solidity 0.8.4;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File contracts/lib/erc20.sol
// File: contracts/GSN/Context.sol
pragma solidity 0.8.4;
// File: contracts/token/ERC20/IERC20.sol
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @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: contracts/utils/Address.sol
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is 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.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @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].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/token/ERC20/ERC20.sol
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @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. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* 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;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
/**
* @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 IERC20;` 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));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
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. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/interfaces/uniswapv2.sol
pragma solidity 0.8.4;
interface UniswapRouterV2 {
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint256[] memory amounts);
}
interface IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(address to)
external
returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
}
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
// File contracts/interfaces/staking-rewards.sol
pragma solidity 0.8.4;
interface IStakingRewards {
function balanceOf(address account) external view returns (uint256);
function balances(address account) external view returns (uint256);
function earned(address account) external view returns (uint256);
function exit() external;
function getReward() external;
function getRewardForDuration() external view returns (uint256);
function lastTimeRewardApplicable() external view returns (uint256);
function lastUpdateTime() external view returns (uint256);
function notifyRewardAmount(uint256 reward) external;
function periodFinish() external view returns (uint256);
function rewardPerToken() external view returns (uint256);
function rewardPerTokenStored() external view returns (uint256);
function rewardRate() external view returns (uint256);
function rewards(address) external view returns (uint256);
function rewardsDistribution() external view returns (address);
function rewardsDuration() external view returns (uint256);
function rewardsToken() external view returns (address);
function stake(uint256 amount) external;
function deposit(uint256 amount) external;
function stakeWithPermit(
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function stakingToken() external view returns (address);
function totalSupply() external view returns (uint256);
function userRewardPerTokenPaid(address) external view returns (uint256);
function withdraw(uint256 amount) external;
}
interface IStakingRewardsFactory {
function deploy(address stakingToken, uint256 rewardAmount) external;
function isOwner() external view returns (bool);
function notifyRewardAmount(address stakingToken) external;
function notifyRewardAmounts() external;
function owner() external view returns (address);
function renounceOwnership() external;
function rewardsToken() external view returns (address);
function stakingRewardsGenesis() external view returns (uint256);
function stakingRewardsInfoByStakingToken(address)
external
view
returns (address stakingRewards, uint256 rewardAmount);
function stakingTokens(uint256) external view returns (address);
function transferOwnership(address newOwner) external;
}
// File contracts/interfaces/vault.sol
pragma solidity 0.8.4;
interface IVault is IERC20 {
function token() external view returns (address);
function reward() external view returns (address);
function claimInsurance() external; // NOTE: Only yDelegatedVault implements this
function getRatio() external view returns (uint256);
function depositAll() external;
function balance() external view returns (uint256);
function deposit(uint256) external;
function withdrawAll() external;
function withdraw(uint256) external;
function earn() external;
function decimals() external view returns (uint8);
}
// File contracts/interfaces/controller.sol
pragma solidity 0.8.4;
interface IController {
function vaults(address) external view returns (address);
function rewards() external view returns (address);
function devfund() external view returns (address);
function treasury() external view returns (address);
function balanceOf(address) external view returns (uint256);
function withdraw(address, uint256) external;
function earn(address, uint256) external;
// For Big Green Button:
function setVault(address _token, address _vault) external;
function approveStrategy(address _token, address _strategy) external;
function revokeStrategy(address _token, address _strategy) external;
function setStrategy(address _token, address _strategy) external;
function setStrategist(address _strategist) external;
function setGovernance(address _governance) external;
function setTimelock(address _timelock) external;
}
// File contracts/strategies/strategy-base.sol
pragma solidity 0.8.4;
/**
* The is the Strategy Base that most LPs will inherit
*/
abstract contract StrategyBase {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
// Tokens
address public want;
address public constant weth = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
address public constant uni = 0xd4d42F0b6DEF4CE0383636770eF773390d85c61A;
// Dex
address public univ2Router2 = 0xE54Ca86531e17Ef3616d22Ca28b0D458b6C89106;
address public feeDistributor = 0xAd86ef5fD2eBc25bb9Db41A1FE8d0f2a322c7839;
// Perfomance fees - start with 10%
uint256 public performanceTreasuryFee = 1000;
uint256 public constant performanceTreasuryMax = 10000;
uint256 public performanceDevFee = 0;
uint256 public constant performanceDevMax = 10000;
// Withdrawal fee 0%
// - 0% to treasury
// - 0% to dev fund
uint256 public withdrawalTreasuryFee = 0;
uint256 public constant withdrawalTreasuryMax = 100000;
uint256 public withdrawalDevFundFee = 0;
uint256 public constant withdrawalDevFundMax = 100000;
// User accounts
address public governance;
address public controller;
address public strategist;
address public timelock;
// Dex
address public sushiRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
mapping(address => bool) public harvesters;
constructor(
address _want,
address _governance,
address _strategist,
address _controller,
address _timelock
) {
require(_want != address(0));
require(_governance != address(0));
require(_strategist != address(0));
require(_controller != address(0));
require(_timelock != address(0));
want = _want;
governance = _governance;
strategist = _strategist;
controller = _controller;
timelock = _timelock;
}
// **** Modifiers **** //
modifier onlyBenevolent {
require(
harvesters[msg.sender] ||
msg.sender == governance ||
msg.sender == strategist
);
_;
}
// **** Views **** //
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
function balanceOfPool() public virtual view returns (uint256);
function balanceOf() public view returns (uint256) {
return balanceOfWant().add(balanceOfPool());
}
function getName() external virtual pure returns (string memory);
// **** Setters **** //
function whitelistHarvester(address _harvester) external {
require(msg.sender == governance ||
msg.sender == strategist || harvesters[msg.sender], "not authorized");
harvesters[_harvester] = true;
}
function revokeHarvester(address _harvester) external {
require(msg.sender == governance ||
msg.sender == strategist, "not authorized");
harvesters[_harvester] = false;
}
function setFeeDistributor(address _feeDistributor) external {
require(msg.sender == governance, "not authorized");
feeDistributor = _feeDistributor;
}
function setWithdrawalDevFundFee(uint256 _withdrawalDevFundFee) external {
require(msg.sender == timelock, "!timelock");
withdrawalDevFundFee = _withdrawalDevFundFee;
}
function setWithdrawalTreasuryFee(uint256 _withdrawalTreasuryFee) external {
require(msg.sender == timelock, "!timelock");
withdrawalTreasuryFee = _withdrawalTreasuryFee;
}
function setPerformanceDevFee(uint256 _performanceDevFee) external {
require(msg.sender == timelock, "!timelock");
performanceDevFee = _performanceDevFee;
}
function setPerformanceTreasuryFee(uint256 _performanceTreasuryFee)
external
{
require(msg.sender == timelock, "!timelock");
performanceTreasuryFee = _performanceTreasuryFee;
}
function setStrategist(address _strategist) external {
require(msg.sender == governance, "!governance");
strategist = _strategist;
}
function setGovernance(address _governance) external {
require(msg.sender == governance, "!governance");
governance = _governance;
}
function setTimelock(address _timelock) external {
require(msg.sender == timelock, "!timelock");
timelock = _timelock;
}
function setController(address _controller) external {
require(msg.sender == timelock, "!timelock");
controller = _controller;
}
// **** State mutations **** //
function deposit() public virtual;
// Controller only function for creating additional rewards from dust
function withdraw(IERC20 _asset) external returns (uint256 balance) {
require(msg.sender == controller, "!controller");
require(want != address(_asset), "want");
balance = _asset.balanceOf(address(this));
_asset.safeTransfer(controller, balance);
}
// Withdraw partial funds, normally used with a vault withdrawal
function withdraw(uint256 _amount) external {
require(msg.sender == controller, "!controller");
uint256 _balance = IERC20(want).balanceOf(address(this));
if (_balance < _amount) {
_amount = _withdrawSome(_amount.sub(_balance));
_amount = _amount.add(_balance);
}
uint256 _feeDev = _amount.mul(withdrawalDevFundFee).div(
withdrawalDevFundMax
);
IERC20(want).safeTransfer(IController(controller).devfund(), _feeDev);
uint256 _feeTreasury = _amount.mul(withdrawalTreasuryFee).div(
withdrawalTreasuryMax
);
IERC20(want).safeTransfer(
IController(controller).treasury(),
_feeTreasury
);
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds
IERC20(want).safeTransfer(_vault, _amount.sub(_feeDev).sub(_feeTreasury));
}
// Withdraw funds, used to swap between strategies
function withdrawForSwap(uint256 _amount)
external
returns (uint256 balance)
{
require(msg.sender == controller, "!controller");
_withdrawSome(_amount);
balance = IERC20(want).balanceOf(address(this));
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault");
IERC20(want).safeTransfer(_vault, balance);
}
// Withdraw all funds, normally used when migrating strategies
function withdrawAll() external returns (uint256 balance) {
require(msg.sender == controller, "!controller");
_withdrawAll();
balance = IERC20(want).balanceOf(address(this));
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds
IERC20(want).safeTransfer(_vault, balance);
}
function _withdrawAll() internal {
_withdrawSome(balanceOfPool());
}
function _withdrawSome(uint256 _amount) internal virtual returns (uint256);
function harvest() public virtual;
// **** Emergency functions ****
function execute(address _target, bytes memory _data)
public
payable
returns (bytes memory response)
{
require(msg.sender == timelock, "!timelock");
require(_target != address(0), "!target");
// call contract in current context
assembly {
let succeeded := delegatecall(
sub(gas(), 5000),
_target,
add(_data, 0x20),
mload(_data),
0,
0
)
let size := returndatasize()
response := mload(0x40)
mstore(
0x40,
add(response, and(add(add(size, 0x20), 0x1f), not(0x1f)))
)
mstore(response, size)
returndatacopy(add(response, 0x20), 0, size)
switch iszero(succeeded)
case 1 {
// throw if delegatecall failed
revert(add(response, 0x20), size)
}
}
}
// **** Internal functions ****
function _swapSushiswap(
address _from,
address _to,
uint256 _amount
) internal {
require(_to != address(0));
address[] memory path;
if (_from == weth || _to == weth) {
path = new address[](2);
path[0] = _from;
path[1] = _to;
} else {
path = new address[](3);
path[0] = _from;
path[1] = weth;
path[2] = _to;
}
IERC20(_from).safeApprove(sushiRouter, 0);
IERC20(_from).safeApprove(sushiRouter, _amount);
UniswapRouterV2(sushiRouter).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
block.timestamp.add(60)
);
}
function _swapSushiswapWithPath(
address[] memory path,
uint256 _amount
) internal {
require(path[1] != address(0));
IERC20(path[0]).safeApprove(sushiRouter, 0);
IERC20(path[0]).safeApprove(sushiRouter, _amount);
UniswapRouterV2(sushiRouter).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
block.timestamp.add(60)
);
}
function _distributePerformanceFeesAndDeposit() internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
// Treasury fees
IERC20(want).safeTransfer(
IController(controller).treasury(),
_want.mul(performanceTreasuryFee).div(performanceTreasuryMax)
);
// Performance fee
IERC20(want).safeTransfer(
IController(controller).devfund(),
_want.mul(performanceDevFee).div(performanceDevMax)
);
deposit();
}
}
function _distributePerformanceFeesBasedAmountAndDeposit(uint256 _amount) internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_amount > _want) {
_amount = _want;
}
if (_amount > 0) {
// Treasury fees
IERC20(want).safeTransfer(
IController(controller).treasury(),
_amount.mul(performanceTreasuryFee).div(performanceTreasuryMax)
);
// Performance fee
IERC20(want).safeTransfer(
IController(controller).devfund(),
_amount.mul(performanceDevFee).div(performanceDevMax)
);
deposit();
}
}
}
// File contracts/lib/BoringERC20.sol
pragma solidity 0.8.4;
library BoringERC20 {
function safeSymbol(IERC20 token) internal view returns(string memory) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
return success && data.length > 0 ? abi.decode(data, (string)) : "???";
}
function safeName(IERC20 token) internal view returns(string memory) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
return success && data.length > 0 ? abi.decode(data, (string)) : "???";
}
function safeDecimals(IERC20 token) internal view returns (uint8) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
}
function safeTransfer(IERC20 token, address to, uint256 amount) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
}
}
// File contracts/interfaces/IRewarder.sol
pragma solidity 0.8.4;
interface IRewarder {
function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;
function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory);
}
// File contracts/interfaces/minichefv2.sol
pragma solidity 0.8.4;
pragma experimental ABIEncoderV2;
interface IMiniChefV2{
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
struct PoolInfo {
uint128 accSushiPerShare;
uint64 lastRewardTime;
uint64 allocPoint;
}
function rewarder(uint256 _pid) external view returns (IRewarder);
function poolLength() external view returns (uint256);
function updatePool(uint256 pid) external returns (IMiniChefV2.PoolInfo memory);
function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256);
function deposit(uint256 pid, uint256 amount, address to) external;
function withdraw(uint256 pid, uint256 amount, address to) external;
function harvest(uint256 pid, address to) external;
function withdrawAndHarvest(uint256 pid, uint256 amount, address to) external;
function emergencyWithdraw(uint256 pid, address to) external;
function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending);
}
// File contracts/strategies/sushi-farm-bases/strategy-sushi-farm-base.sol
pragma solidity 0.8.4;
abstract contract StrategySushiFarmBase is StrategyBase {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
// Token addresses
address public constant sushi = 0xd4d42F0b6DEF4CE0383636770eF773390d85c61A;
address public constant miniChef = 0xF4d73326C13a4Fc5FD7A064217e12780e9Bd62c3;
// WETH/<token1> pair
address public token0;
address public token1;
address rewardToken;
// How much tokens to keep?
uint256 public keep = 1000;
uint256 public keepReward = 1000;
uint256 public constant keepMax = 10000;
uint256 public poolId;
constructor(
address _token0,
address _token1,
uint256 _poolId,
address _lp,
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyBase(_lp, _governance, _strategist, _controller, _timelock)
{
poolId = _poolId;
token0 = _token0;
token1 = _token1;
}
function balanceOfPool() public view override returns (uint256) {
(uint256 amount, ) = IMiniChefV2(miniChef).userInfo(
poolId,
address(this)
);
return amount;
}
function getHarvestable() external view returns (uint256) {
uint256 _pendingSushi = IMiniChefV2(miniChef).pendingSushi(
poolId,
address(this)
);
return (_pendingSushi);
}
// **** Setters ****
function deposit() public override {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
IERC20(want).safeApprove(miniChef, 0);
IERC20(want).safeApprove(miniChef, _want);
IMiniChefV2(miniChef).deposit(poolId, _want, address(this));
}
}
function _withdrawSome(uint256 _amount)
internal
override
returns (uint256)
{
IMiniChefV2(miniChef).withdraw(poolId, _amount, address(this));
return _amount;
}
// **** Setters ****
function setKeep(uint256 _keep) external {
require(msg.sender == timelock, "!timelock");
keep = _keep;
}
function setKeepReward(uint256 _keepReward) external {
require(msg.sender == timelock, "!timelock");
keepReward = _keepReward;
}
function setRewardToken(address _rewardToken) external {
require(
msg.sender == timelock || msg.sender == strategist,
"!timelock"
);
rewardToken = _rewardToken;
}
// **** State Mutations ****
// Declare a Harvest Event
event Harvest(uint _timestamp, uint _value);
function harvest() public override onlyBenevolent {
// Collects SUSHI tokens
IMiniChefV2(miniChef).harvest(poolId, address(this));
uint256 _sushi = IERC20(sushi).balanceOf(address(this));
if (_sushi > 0) {
// 10% is locked up for future gov
uint256 _keepSUSHI = _sushi.mul(keep).div(keepMax);
IERC20(sushi).safeTransfer(
IController(controller).treasury(),
_keepSUSHI
);
_sushi = IERC20(sushi).balanceOf(address(this));
_swapSushiswap(sushi, weth, _sushi);
}
// Collect reward tokens
if (rewardToken != address(0)) {
uint256 _reward = IERC20(rewardToken).balanceOf(address(this));
if (_reward > 0) {
uint256 _keepReward = _reward.mul(keepReward).div(keepMax);
IERC20(rewardToken).safeTransfer(
IController(controller).treasury(),
_keepReward
);
_reward = IERC20(rewardToken).balanceOf(address(this));
_swapSushiswap(rewardToken, weth, _reward);
}
}
// Swap half WETH for token0
uint256 _weth = IERC20(weth).balanceOf(address(this));
if (_weth > 0 && token0 != weth) {
_swapSushiswap(weth, token0, _weth.div(2));
}
// Swap half WETH for token1
if (_weth > 0 && token1 != weth) {
_swapSushiswap(weth, token1, _weth.div(2));
}
// Adds in liquidity for token0/token1
uint256 _token0 = IERC20(token0).balanceOf(address(this));
uint256 _token1 = IERC20(token1).balanceOf(address(this));
if (_token0 > 0 && _token1 > 0) {
IERC20(token0).safeApprove(sushiRouter, 0);
IERC20(token0).safeApprove(sushiRouter, _token0);
IERC20(token1).safeApprove(sushiRouter, 0);
IERC20(token1).safeApprove(sushiRouter, _token1);
UniswapRouterV2(sushiRouter).addLiquidity(
token0,
token1,
_token0,
_token1,
0,
0,
address(this),
block.timestamp.add(60)
);
// Donates DUST
IERC20(token0).transfer(
IController(controller).treasury(),
IERC20(token0).balanceOf(address(this))
);
IERC20(token1).safeTransfer(
IController(controller).treasury(),
IERC20(token1).balanceOf(address(this))
);
}
uint256 _want = IERC20(want).balanceOf(address(this));
emit Harvest(block.timestamp, _want);
// We want to get back SUSHI LP tokens
_distributePerformanceFeesAndDeposit();
}
}
// File contracts/strategies/sushi/strategy-sushi-weth-usdt.sol
pragma solidity 0.8.4;
contract StrategySushiWethUsdt is StrategySushiFarmBase {
uint256 public sushi_weth_usdt_poolId = 4;
// Token addresses
address public sushi_weth_usdt_lp = 0xCB0E5bFa72bBb4d16AB5aA0c60601c438F04b4ad;
address public usdt = 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9;
constructor(
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategySushiFarmBase(
weth,
usdt,
sushi_weth_usdt_poolId,
sushi_weth_usdt_lp,
_governance,
_strategist,
_controller,
_timelock
)
{}
// **** Views ****
function getName() external override pure returns (string memory) {
return "StrategySushiWethUsdt";
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Harvest","type":"event"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHarvestable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"harvesters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miniChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceDevMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"revokeHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDistributor","type":"address"}],"name":"setFeeDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keep","type":"uint256"}],"name":"setKeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepReward","type":"uint256"}],"name":"setKeepReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceDevFee","type":"uint256"}],"name":"setPerformanceDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceTreasuryFee","type":"uint256"}],"name":"setPerformanceTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalDevFundFee","type":"uint256"}],"name":"setWithdrawalDevFundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalTreasuryFee","type":"uint256"}],"name":"setWithdrawalTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushi_weth_usdt_lp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushi_weth_usdt_poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uni","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"univ2Router2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"whitelistHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawForSwap","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalDevFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalDevFundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600180546001600160a01b031990811673e54ca86531e17ef3616d22ca28b0d458b6c891061790915560028054821673ad86ef5fd2ebc25bb9db41a1fe8d0f2a322c78391790556103e86003819055600060048181556005829055600691909155600b80548416731b02da8cb0d097eb8d57a175b88c7d8b47997506179055601082905560119190915560135560148054821673cb0e5bfa72bbb4d16ab5aa0c60601c438f04b4ad1790556015805490911673fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9179055348015620000db57600080fd5b506040516200361e3803806200361e833981016040819052620000fe9162000241565b6015546013546014547382af49447d8a07e3bd95bd0d56f35241523fbab1926001600160a01b03908116929116878787878484848484846200013f57600080fd5b6001600160a01b0384166200015357600080fd5b6001600160a01b0383166200016757600080fd5b6001600160a01b0382166200017b57600080fd5b6001600160a01b0381166200018f57600080fd5b600080546001600160a01b03199081166001600160a01b03978816179091556007805482169587169590951790945560098054851693861693909317909255600880548416918516919091179055600a80548316918416919091179055601297909755600d80548816998216999099179098555050600e80549094169490951693909317909155506200029d95505050505050565b80516001600160a01b03811681146200023c57600080fd5b919050565b6000806000806080858703121562000257578384fd5b620002628562000224565b9350620002726020860162000224565b9250620002826040860162000224565b9150620002926060860162000224565b905092959194509250565b61337180620002ad6000396000f3fe60806040526004361061036b5760003560e01c8063722713f7116101c6578063bf14f35b116100f7578063d0e30db011610095578063e4d06d821161006f578063e4d06d8214610989578063edc9af95146103ae578063f77c47911461099f578063fe1f8f7a146105da57600080fd5b8063d0e30db014610934578063d21220a714610949578063d33219b41461096957600080fd5b8063c6223e26116100d1578063c6223e26146108b4578063c65e3242146108d4578063c7b9d530146108f4578063ccfc2e8d1461091457600080fd5b8063bf14f35b14610873578063c1a3d44c14610889578063c39d43341461089e57600080fd5b806392eefe9b11610164578063ab73e4331161013e578063ab73e433146107f3578063b9e3748914610813578063ba40273d14610833578063bdacb3031461085357600080fd5b806392eefe9b14610793578063a4909e84146107b3578063ab033ea9146107d357600080fd5b806387976583116101a0578063879765831461070757806388993f22146107475780638aee81271461075d5780638ccdbb701461077d57600080fd5b8063722713f7146106bd57806382378594146106d2578063853828b6146106f257600080fd5b80632f48ab7d116102a05780634fe809cc1161023e57806354df7b631161021857806354df7b631461064757806359739ec4146106675780635aa6e6751461067d5780636d13582c1461069d57600080fd5b80634fe809cc1461039857806351cff8d91461061157806351f3d0b81461063157600080fd5b80634005760a1161027a5780634005760a1461059d5780634641257d146105c5578063479119be146105da5780634c2798ad146105f157600080fd5b80632f48ab7d1461053f5780633e0dc34e1461055f5780633fc8cef31461057557600080fd5b806318eb0e0b1161030d5780631fe4a686116102e75780631fe4a686146104df578063249fb9b4146104ff57806326e886c6146103985780632e1a7d4d1461051f57600080fd5b806318eb0e0b1461048a5780631cff79cd146104ac5780631f1fcd51146104bf57600080fd5b80630d43e8ad116103495780630d43e8ad146103ee5780630dfe16811461040e578063115880861461042e57806317d7de7c1461044357600080fd5b80630547104d146103705780630975d8d8146103985780630a087903146103ae575b600080fd5b34801561037c57600080fd5b506103856109bf565b6040519081526020015b60405180910390f35b3480156103a457600080fd5b5061038561271081565b3480156103ba57600080fd5b506103d673d4d42f0b6def4ce0383636770ef773390d85c61a81565b6040516001600160a01b03909116815260200161038f565b3480156103fa57600080fd5b506002546103d6906001600160a01b031681565b34801561041a57600080fd5b50600d546103d6906001600160a01b031681565b34801561043a57600080fd5b50610385610a57565b34801561044f57600080fd5b5060408051808201909152601581527414dd1c985d1959de54dd5cda1a55d95d1a155cd91d605a1b60208201525b60405161038f9190613118565b34801561049657600080fd5b506104aa6104a5366004612eae565b610aef565b005b61047d6104ba366004612ee6565b610b58565b3480156104cb57600080fd5b506000546103d6906001600160a01b031681565b3480156104eb57600080fd5b506009546103d6906001600160a01b031681565b34801561050b57600080fd5b506104aa61051a366004613050565b610c15565b34801561052b57600080fd5b506104aa61053a366004613050565b610c44565b34801561054b57600080fd5b506015546103d6906001600160a01b031681565b34801561056b57600080fd5b5061038560125481565b34801561058157600080fd5b506103d67382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156105a957600080fd5b506103d673f4d73326c13a4fc5fd7a064217e12780e9bd62c381565b3480156105d157600080fd5b506104aa610f23565b3480156105e657600080fd5b50610385620186a081565b3480156105fd57600080fd5b506104aa61060c366004613050565b611af1565b34801561061d57600080fd5b5061038561062c366004612eae565b611b20565b34801561063d57600080fd5b5061038560065481565b34801561065357600080fd5b506104aa610662366004612eae565b611c2d565b34801561067357600080fd5b5061038560035481565b34801561068957600080fd5b506007546103d6906001600160a01b031681565b3480156106a957600080fd5b50600b546103d6906001600160a01b031681565b3480156106c957600080fd5b50610385611caa565b3480156106de57600080fd5b506104aa6106ed366004613050565b611cca565b3480156106fe57600080fd5b50610385611cf9565b34801561071357600080fd5b50610737610722366004612eae565b600c6020526000908152604090205460ff1681565b604051901515815260200161038f565b34801561075357600080fd5b5061038560045481565b34801561076957600080fd5b506104aa610778366004612eae565b611e71565b34801561078957600080fd5b5061038560055481565b34801561079f57600080fd5b506104aa6107ae366004612eae565b611ed2565b3480156107bf57600080fd5b506014546103d6906001600160a01b031681565b3480156107df57600080fd5b506104aa6107ee366004612eae565b611f1e565b3480156107ff57600080fd5b506104aa61080e366004613050565b611f88565b34801561081f57600080fd5b506001546103d6906001600160a01b031681565b34801561083f57600080fd5b506104aa61084e366004613050565b611fb7565b34801561085f57600080fd5b506104aa61086e366004612eae565b611fe6565b34801561087f57600080fd5b5061038560135481565b34801561089557600080fd5b50610385612032565b3480156108aa57600080fd5b5061038560115481565b3480156108c057600080fd5b506103856108cf366004613050565b6120ae565b3480156108e057600080fd5b506104aa6108ef366004613050565b61222a565b34801561090057600080fd5b506104aa61090f366004612eae565b612259565b34801561092057600080fd5b506104aa61092f366004612eae565b6122c3565b34801561094057600080fd5b506104aa61230f565b34801561095557600080fd5b50600e546103d6906001600160a01b031681565b34801561097557600080fd5b50600a546103d6906001600160a01b031681565b34801561099557600080fd5b5061038560105481565b3480156109ab57600080fd5b506008546103d6906001600160a01b031681565b60125460405163065509bb60e21b81526004810191909152306024820152600090819073f4d73326c13a4fc5fd7a064217e12780e9bd62c39063195426ec9060440160206040518083038186803b158015610a1957600080fd5b505afa158015610a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a519190613068565b92915050565b6012546040516393f1a40b60e01b81526004810191909152306024820152600090819073f4d73326c13a4fc5fd7a064217e12780e9bd62c3906393f1a40b90604401604080518083038186803b158015610ab057600080fd5b505afa158015610ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae89190613080565b5092915050565b6007546001600160a01b0316331480610b1257506009546001600160a01b031633145b610b375760405162461bcd60e51b8152600401610b2e90613150565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600a546060906001600160a01b03163314610b855760405162461bcd60e51b8152600401610b2e90613198565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610b2e565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610c0557610c0c565b8160208501fd5b50505092915050565b600a546001600160a01b03163314610c3f5760405162461bcd60e51b8152600401610b2e90613198565b600355565b6008546001600160a01b03163314610c6e5760405162461bcd60e51b8152600401610b2e9061312b565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610cb257600080fd5b505afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190613068565b905081811015610d1557610d06610d018383612462565b6124ab565b9150610d12828261252a565b91505b6000610d39620186a0610d336006548661258990919063ffffffff16565b90612608565b9050610dd7600860009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8c57600080fd5b505afa158015610da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc49190612eca565b6000546001600160a01b0316908361264a565b6000610df5620186a0610d336005548761258990919063ffffffff16565b9050610e48600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8c57600080fd5b60085460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190612eca565b90506001600160a01b038116610ef15760405162461bcd60e51b8152600401610b2e90613178565b610f1c81610f0984610f038988612462565b90612462565b6000546001600160a01b0316919061264a565b5050505050565b336000908152600c602052604090205460ff1680610f4b57506007546001600160a01b031633145b80610f6057506009546001600160a01b031633145b610f6957600080fd5b601254604051630c7e663b60e11b8152600481019190915230602482015273f4d73326c13a4fc5fd7a064217e12780e9bd62c3906318fccc7690604401600060405180830381600087803b158015610fc057600080fd5b505af1158015610fd4573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526000925073d4d42f0b6def4ce0383636770ef773390d85c61a91506370a082319060240160206040518083038186803b15801561102557600080fd5b505afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190613068565b905080156111e2576000611082612710610d336010548561258990919063ffffffff16565b9050611129600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190612eca565b73d4d42f0b6def4ce0383636770ef773390d85c61a908361264a565b6040516370a0823160e01b815230600482015273d4d42f0b6def4ce0383636770ef773390d85c61a906370a082319060240160206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190613068565b91506111e073d4d42f0b6def4ce0383636770ef773390d85c61a7382af49447d8a07e3bd95bd0d56f35241523fbab1846126b2565b505b600f546001600160a01b0316156113df57600f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f9190613068565b905080156113dd576000611294612710610d336011548561258990919063ffffffff16565b9050611332600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f9190612eca565b600f546001600160a01b0316908361264a565b600f546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad9190613068565b600f549092506113db906001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab1846126b2565b505b505b6040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190613068565b90506000811180156114955750600d546001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab114155b156114d057600d546114d0907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b03166114cb846002612608565b6126b2565b6000811180156114ff5750600e546001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab114155b1561153557600e54611535907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b03166114cb846002612608565b600d546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561157957600080fd5b505afa15801561158d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b19190613068565b600e546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156115fa57600080fd5b505afa15801561160e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116329190613068565b90506000821180156116445750600081115b15611a3157600b54600d54611667916001600160a01b0391821691166000612984565b600b54600d54611684916001600160a01b03918216911684612984565b600b54600e546116a2916001600160a01b0391821691166000612984565b600b54600e546116bf916001600160a01b03918216911683612984565b600b54600d54600e546001600160a01b039283169263e8e3370092811691168585600080306116ef42603c61252a565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b15801561176657600080fd5b505af115801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e91906130a3565b5050600d54600854604080516361d027b360e01b815290516001600160a01b03938416945063a9059cbb93909216916361d027b391600480820192602092909190829003018186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190612eca565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561186e57600080fd5b505afa158015611882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a69190613068565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119249190613030565b50600854604080516361d027b360e01b81529051611a31926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a39190612eca565b600e546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1e9190613068565b600e546001600160a01b0316919061264a565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a7557600080fd5b505afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad9190613068565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a1610f1c612aa8565b600a546001600160a01b03163314611b1b5760405162461bcd60e51b8152600401610b2e90613198565b601155565b6008546000906001600160a01b03163314611b4d5760405162461bcd60e51b8152600401610b2e9061312b565b6000546001600160a01b0383811691161415611b945760405162461bcd60e51b8152600401610b2e906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015611bd357600080fd5b505afa158015611be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0b9190613068565b600854909150611c28906001600160a01b0384811691168361264a565b919050565b6007546001600160a01b0316331480611c5057506009546001600160a01b031633145b80611c6a5750336000908152600c602052604090205460ff165b611c865760405162461bcd60e51b8152600401610b2e90613150565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000611cc5611cb7610a57565b611cbf612032565b9061252a565b905090565b600a546001600160a01b03163314611cf45760405162461bcd60e51b8152600401610b2e90613198565b600555565b6008546000906001600160a01b03163314611d265760405162461bcd60e51b8152600401610b2e9061312b565b611d2e612c66565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da99190613068565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190612eca565b90506001600160a01b038116611e565760405162461bcd60e51b8152600401610b2e90613178565b600054611e6d906001600160a01b0316828461264a565b5090565b600a546001600160a01b0316331480611e9457506009546001600160a01b031633145b611eb05760405162461bcd60e51b8152600401610b2e90613198565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611efc5760405162461bcd60e51b8152600401610b2e90613198565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611f665760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b2e565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611fb25760405162461bcd60e51b8152600401610b2e90613198565b600655565b600a546001600160a01b03163314611fe15760405162461bcd60e51b8152600401610b2e90613198565b601055565b600a546001600160a01b031633146120105760405162461bcd60e51b8152600401610b2e90613198565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561207657600080fd5b505afa15801561208a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190613068565b6008546000906001600160a01b031633146120db5760405162461bcd60e51b8152600401610b2e9061312b565b6120e4826124ab565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561212857600080fd5b505afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613068565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b1580156121ad57600080fd5b505afa1580156121c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e59190612eca565b90506001600160a01b03811661220d5760405162461bcd60e51b8152600401610b2e90613178565b600054612224906001600160a01b0316828461264a565b50919050565b600a546001600160a01b031633146122545760405162461bcd60e51b8152600401610b2e90613198565b600455565b6007546001600160a01b031633146122a15760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b2e565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146122ed5760405162461bcd60e51b8152600401610b2e90613150565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190613068565b9050801561245f57600080546123c2916001600160a01b039091169073f4d73326c13a4fc5fd7a064217e12780e9bd62c390612984565b6000546123ed906001600160a01b031673f4d73326c13a4fc5fd7a064217e12780e9bd62c383612984565b601254604051638dbdbe6d60e01b815260048101919091526024810182905230604482015273f4d73326c13a4fc5fd7a064217e12780e9bd62c390638dbdbe6d90606401600060405180830381600087803b15801561244b57600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50565b60006124a483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c71565b9392505050565b601254604051630ad58d2f60e01b815260048101919091526024810182905230604482015260009073f4d73326c13a4fc5fd7a064217e12780e9bd62c390630ad58d2f90606401600060405180830381600087803b15801561250c57600080fd5b505af1158015612520573d6000803e3d6000fd5b5093949350505050565b600080612537838561325c565b9050838110156124a45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b2e565b60008261259857506000610a51565b60006125a48385613294565b9050826125b18583613274565b146124a45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b2e565b60006124a483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cab565b6040516001600160a01b0383166024820152604481018290526126ad90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612cd9565b505050565b6001600160a01b0382166126c557600080fd5b60606001600160a01b0384167382af49447d8a07e3bd95bd0d56f35241523fbab1148061270e57506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1145b156127bc576040805160028082526060820183529091602083019080368337019050509050838160008151811061275557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061279757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506128b8565b60408051600380825260808201909252906020820160608036833701905050905083816000815181106127ff57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061285557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061289757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b546128d3906001600160a01b0386811691166000612984565b600b546128ed906001600160a01b03868116911684612984565b600b546001600160a01b03166338ed1739836000843061290e42603c61252a565b6040518663ffffffff1660e01b815260040161292e9594939291906131bb565b600060405180830381600087803b15801561294857600080fd5b505af115801561295c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f1c9190810190612f88565b801580612a0d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156129d357600080fd5b505afa1580156129e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0b9190613068565b155b612a785760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b2e565b6040516001600160a01b0383166024820152604481018290526126ad90849063095ea7b360e01b90606401612676565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015612aec57600080fd5b505afa158015612b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b249190613068565b9050801561245f57600854604080516361d027b360e01b81529051612bc5926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015612b7257600080fd5b505afa158015612b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612baa9190612eca565b610f09612710610d336003548661258990919063ffffffff16565b60085460408051638d8f1e6760e01b81529051612c5e926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b158015612c0b57600080fd5b505afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190612eca565b610f09612710610d336004548661258990919063ffffffff16565b61245f61230f565b61245f610d01610a57565b60008184841115612c955760405162461bcd60e51b8152600401610b2e9190613118565b506000612ca284866132b3565b95945050505050565b60008183612ccc5760405162461bcd60e51b8152600401610b2e9190613118565b506000612ca28486613274565b6000612d2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612dab9092919063ffffffff16565b8051909150156126ad5780806020019051810190612d4c9190613030565b6126ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b2e565b6060612dba8484600085612dc2565b949350505050565b6060843b612e125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b2e565b600080866001600160a01b03168587604051612e2e91906130fc565b60006040518083038185875af1925050503d8060008114612e6b576040519150601f19603f3d011682016040523d82523d6000602084013e612e70565b606091505b50915091508115612e84579150612dba9050565b805115612e945780518082602001fd5b8360405162461bcd60e51b8152600401610b2e9190613118565b600060208284031215612ebf578081fd5b81356124a481613326565b600060208284031215612edb578081fd5b81516124a481613326565b60008060408385031215612ef8578081fd5b8235612f0381613326565b915060208381013567ffffffffffffffff80821115612f20578384fd5b818601915086601f830112612f33578384fd5b813581811115612f4557612f45613310565b612f57601f8201601f1916850161322b565b91508082528784828501011115612f6c578485fd5b8084840185840137810190920192909252919491935090915050565b60006020808385031215612f9a578182fd5b825167ffffffffffffffff80821115612fb1578384fd5b818501915085601f830112612fc4578384fd5b815181811115612fd657612fd6613310565b8060051b9150612fe784830161322b565b8181528481019084860184860187018a1015613001578788fd5b8795505b83861015613023578051835260019590950194918601918601613005565b5098975050505050505050565b600060208284031215613041578081fd5b815180151581146124a4578182fd5b600060208284031215613061578081fd5b5035919050565b600060208284031215613079578081fd5b5051919050565b60008060408385031215613092578182fd5b505080516020909101519092909150565b6000806000606084860312156130b7578081fd5b8351925060208401519150604084015190509250925092565b600081518084526130e88160208601602086016132ca565b601f01601f19169290920160200192915050565b6000825161310e8184602087016132ca565b9190910192915050565b6020815260006124a460208301846130d0565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561320a5784516001600160a01b0316835293830193918301916001016131e5565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561325457613254613310565b604052919050565b6000821982111561326f5761326f6132fa565b500190565b60008261328f57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156132ae576132ae6132fa565b500290565b6000828210156132c5576132c56132fa565b500390565b60005b838110156132e55781810151838201526020016132cd565b838111156132f4576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461245f57600080fdfea2646970667358221220d26dfb6ef1996a0cb13090aa538d762a0281e1e6e738dd3fe4de612ddb400c0864736f6c63430008040033000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc80000000000000000000000001c233a46eae1f928c0467a3c75228e26ea9888d4000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode
0x60806040526004361061036b5760003560e01c8063722713f7116101c6578063bf14f35b116100f7578063d0e30db011610095578063e4d06d821161006f578063e4d06d8214610989578063edc9af95146103ae578063f77c47911461099f578063fe1f8f7a146105da57600080fd5b8063d0e30db014610934578063d21220a714610949578063d33219b41461096957600080fd5b8063c6223e26116100d1578063c6223e26146108b4578063c65e3242146108d4578063c7b9d530146108f4578063ccfc2e8d1461091457600080fd5b8063bf14f35b14610873578063c1a3d44c14610889578063c39d43341461089e57600080fd5b806392eefe9b11610164578063ab73e4331161013e578063ab73e433146107f3578063b9e3748914610813578063ba40273d14610833578063bdacb3031461085357600080fd5b806392eefe9b14610793578063a4909e84146107b3578063ab033ea9146107d357600080fd5b806387976583116101a0578063879765831461070757806388993f22146107475780638aee81271461075d5780638ccdbb701461077d57600080fd5b8063722713f7146106bd57806382378594146106d2578063853828b6146106f257600080fd5b80632f48ab7d116102a05780634fe809cc1161023e57806354df7b631161021857806354df7b631461064757806359739ec4146106675780635aa6e6751461067d5780636d13582c1461069d57600080fd5b80634fe809cc1461039857806351cff8d91461061157806351f3d0b81461063157600080fd5b80634005760a1161027a5780634005760a1461059d5780634641257d146105c5578063479119be146105da5780634c2798ad146105f157600080fd5b80632f48ab7d1461053f5780633e0dc34e1461055f5780633fc8cef31461057557600080fd5b806318eb0e0b1161030d5780631fe4a686116102e75780631fe4a686146104df578063249fb9b4146104ff57806326e886c6146103985780632e1a7d4d1461051f57600080fd5b806318eb0e0b1461048a5780631cff79cd146104ac5780631f1fcd51146104bf57600080fd5b80630d43e8ad116103495780630d43e8ad146103ee5780630dfe16811461040e578063115880861461042e57806317d7de7c1461044357600080fd5b80630547104d146103705780630975d8d8146103985780630a087903146103ae575b600080fd5b34801561037c57600080fd5b506103856109bf565b6040519081526020015b60405180910390f35b3480156103a457600080fd5b5061038561271081565b3480156103ba57600080fd5b506103d673d4d42f0b6def4ce0383636770ef773390d85c61a81565b6040516001600160a01b03909116815260200161038f565b3480156103fa57600080fd5b506002546103d6906001600160a01b031681565b34801561041a57600080fd5b50600d546103d6906001600160a01b031681565b34801561043a57600080fd5b50610385610a57565b34801561044f57600080fd5b5060408051808201909152601581527414dd1c985d1959de54dd5cda1a55d95d1a155cd91d605a1b60208201525b60405161038f9190613118565b34801561049657600080fd5b506104aa6104a5366004612eae565b610aef565b005b61047d6104ba366004612ee6565b610b58565b3480156104cb57600080fd5b506000546103d6906001600160a01b031681565b3480156104eb57600080fd5b506009546103d6906001600160a01b031681565b34801561050b57600080fd5b506104aa61051a366004613050565b610c15565b34801561052b57600080fd5b506104aa61053a366004613050565b610c44565b34801561054b57600080fd5b506015546103d6906001600160a01b031681565b34801561056b57600080fd5b5061038560125481565b34801561058157600080fd5b506103d67382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156105a957600080fd5b506103d673f4d73326c13a4fc5fd7a064217e12780e9bd62c381565b3480156105d157600080fd5b506104aa610f23565b3480156105e657600080fd5b50610385620186a081565b3480156105fd57600080fd5b506104aa61060c366004613050565b611af1565b34801561061d57600080fd5b5061038561062c366004612eae565b611b20565b34801561063d57600080fd5b5061038560065481565b34801561065357600080fd5b506104aa610662366004612eae565b611c2d565b34801561067357600080fd5b5061038560035481565b34801561068957600080fd5b506007546103d6906001600160a01b031681565b3480156106a957600080fd5b50600b546103d6906001600160a01b031681565b3480156106c957600080fd5b50610385611caa565b3480156106de57600080fd5b506104aa6106ed366004613050565b611cca565b3480156106fe57600080fd5b50610385611cf9565b34801561071357600080fd5b50610737610722366004612eae565b600c6020526000908152604090205460ff1681565b604051901515815260200161038f565b34801561075357600080fd5b5061038560045481565b34801561076957600080fd5b506104aa610778366004612eae565b611e71565b34801561078957600080fd5b5061038560055481565b34801561079f57600080fd5b506104aa6107ae366004612eae565b611ed2565b3480156107bf57600080fd5b506014546103d6906001600160a01b031681565b3480156107df57600080fd5b506104aa6107ee366004612eae565b611f1e565b3480156107ff57600080fd5b506104aa61080e366004613050565b611f88565b34801561081f57600080fd5b506001546103d6906001600160a01b031681565b34801561083f57600080fd5b506104aa61084e366004613050565b611fb7565b34801561085f57600080fd5b506104aa61086e366004612eae565b611fe6565b34801561087f57600080fd5b5061038560135481565b34801561089557600080fd5b50610385612032565b3480156108aa57600080fd5b5061038560115481565b3480156108c057600080fd5b506103856108cf366004613050565b6120ae565b3480156108e057600080fd5b506104aa6108ef366004613050565b61222a565b34801561090057600080fd5b506104aa61090f366004612eae565b612259565b34801561092057600080fd5b506104aa61092f366004612eae565b6122c3565b34801561094057600080fd5b506104aa61230f565b34801561095557600080fd5b50600e546103d6906001600160a01b031681565b34801561097557600080fd5b50600a546103d6906001600160a01b031681565b34801561099557600080fd5b5061038560105481565b3480156109ab57600080fd5b506008546103d6906001600160a01b031681565b60125460405163065509bb60e21b81526004810191909152306024820152600090819073f4d73326c13a4fc5fd7a064217e12780e9bd62c39063195426ec9060440160206040518083038186803b158015610a1957600080fd5b505afa158015610a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a519190613068565b92915050565b6012546040516393f1a40b60e01b81526004810191909152306024820152600090819073f4d73326c13a4fc5fd7a064217e12780e9bd62c3906393f1a40b90604401604080518083038186803b158015610ab057600080fd5b505afa158015610ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae89190613080565b5092915050565b6007546001600160a01b0316331480610b1257506009546001600160a01b031633145b610b375760405162461bcd60e51b8152600401610b2e90613150565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600a546060906001600160a01b03163314610b855760405162461bcd60e51b8152600401610b2e90613198565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610b2e565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610c0557610c0c565b8160208501fd5b50505092915050565b600a546001600160a01b03163314610c3f5760405162461bcd60e51b8152600401610b2e90613198565b600355565b6008546001600160a01b03163314610c6e5760405162461bcd60e51b8152600401610b2e9061312b565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610cb257600080fd5b505afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190613068565b905081811015610d1557610d06610d018383612462565b6124ab565b9150610d12828261252a565b91505b6000610d39620186a0610d336006548661258990919063ffffffff16565b90612608565b9050610dd7600860009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8c57600080fd5b505afa158015610da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc49190612eca565b6000546001600160a01b0316908361264a565b6000610df5620186a0610d336005548761258990919063ffffffff16565b9050610e48600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8c57600080fd5b60085460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190612eca565b90506001600160a01b038116610ef15760405162461bcd60e51b8152600401610b2e90613178565b610f1c81610f0984610f038988612462565b90612462565b6000546001600160a01b0316919061264a565b5050505050565b336000908152600c602052604090205460ff1680610f4b57506007546001600160a01b031633145b80610f6057506009546001600160a01b031633145b610f6957600080fd5b601254604051630c7e663b60e11b8152600481019190915230602482015273f4d73326c13a4fc5fd7a064217e12780e9bd62c3906318fccc7690604401600060405180830381600087803b158015610fc057600080fd5b505af1158015610fd4573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526000925073d4d42f0b6def4ce0383636770ef773390d85c61a91506370a082319060240160206040518083038186803b15801561102557600080fd5b505afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190613068565b905080156111e2576000611082612710610d336010548561258990919063ffffffff16565b9050611129600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190612eca565b73d4d42f0b6def4ce0383636770ef773390d85c61a908361264a565b6040516370a0823160e01b815230600482015273d4d42f0b6def4ce0383636770ef773390d85c61a906370a082319060240160206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190613068565b91506111e073d4d42f0b6def4ce0383636770ef773390d85c61a7382af49447d8a07e3bd95bd0d56f35241523fbab1846126b2565b505b600f546001600160a01b0316156113df57600f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f9190613068565b905080156113dd576000611294612710610d336011548561258990919063ffffffff16565b9050611332600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f9190612eca565b600f546001600160a01b0316908361264a565b600f546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad9190613068565b600f549092506113db906001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab1846126b2565b505b505b6040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190613068565b90506000811180156114955750600d546001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab114155b156114d057600d546114d0907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b03166114cb846002612608565b6126b2565b6000811180156114ff5750600e546001600160a01b03167382af49447d8a07e3bd95bd0d56f35241523fbab114155b1561153557600e54611535907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b03166114cb846002612608565b600d546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561157957600080fd5b505afa15801561158d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b19190613068565b600e546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156115fa57600080fd5b505afa15801561160e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116329190613068565b90506000821180156116445750600081115b15611a3157600b54600d54611667916001600160a01b0391821691166000612984565b600b54600d54611684916001600160a01b03918216911684612984565b600b54600e546116a2916001600160a01b0391821691166000612984565b600b54600e546116bf916001600160a01b03918216911683612984565b600b54600d54600e546001600160a01b039283169263e8e3370092811691168585600080306116ef42603c61252a565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b15801561176657600080fd5b505af115801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e91906130a3565b5050600d54600854604080516361d027b360e01b815290516001600160a01b03938416945063a9059cbb93909216916361d027b391600480820192602092909190829003018186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190612eca565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561186e57600080fd5b505afa158015611882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a69190613068565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119249190613030565b50600854604080516361d027b360e01b81529051611a31926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a39190612eca565b600e546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1e9190613068565b600e546001600160a01b0316919061264a565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a7557600080fd5b505afa158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad9190613068565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a1610f1c612aa8565b600a546001600160a01b03163314611b1b5760405162461bcd60e51b8152600401610b2e90613198565b601155565b6008546000906001600160a01b03163314611b4d5760405162461bcd60e51b8152600401610b2e9061312b565b6000546001600160a01b0383811691161415611b945760405162461bcd60e51b8152600401610b2e906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015611bd357600080fd5b505afa158015611be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0b9190613068565b600854909150611c28906001600160a01b0384811691168361264a565b919050565b6007546001600160a01b0316331480611c5057506009546001600160a01b031633145b80611c6a5750336000908152600c602052604090205460ff165b611c865760405162461bcd60e51b8152600401610b2e90613150565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000611cc5611cb7610a57565b611cbf612032565b9061252a565b905090565b600a546001600160a01b03163314611cf45760405162461bcd60e51b8152600401610b2e90613198565b600555565b6008546000906001600160a01b03163314611d265760405162461bcd60e51b8152600401610b2e9061312b565b611d2e612c66565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da99190613068565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190612eca565b90506001600160a01b038116611e565760405162461bcd60e51b8152600401610b2e90613178565b600054611e6d906001600160a01b0316828461264a565b5090565b600a546001600160a01b0316331480611e9457506009546001600160a01b031633145b611eb05760405162461bcd60e51b8152600401610b2e90613198565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611efc5760405162461bcd60e51b8152600401610b2e90613198565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611f665760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b2e565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611fb25760405162461bcd60e51b8152600401610b2e90613198565b600655565b600a546001600160a01b03163314611fe15760405162461bcd60e51b8152600401610b2e90613198565b601055565b600a546001600160a01b031633146120105760405162461bcd60e51b8152600401610b2e90613198565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561207657600080fd5b505afa15801561208a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190613068565b6008546000906001600160a01b031633146120db5760405162461bcd60e51b8152600401610b2e9061312b565b6120e4826124ab565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561212857600080fd5b505afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613068565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b1580156121ad57600080fd5b505afa1580156121c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e59190612eca565b90506001600160a01b03811661220d5760405162461bcd60e51b8152600401610b2e90613178565b600054612224906001600160a01b0316828461264a565b50919050565b600a546001600160a01b031633146122545760405162461bcd60e51b8152600401610b2e90613198565b600455565b6007546001600160a01b031633146122a15760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610b2e565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146122ed5760405162461bcd60e51b8152600401610b2e90613150565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190613068565b9050801561245f57600080546123c2916001600160a01b039091169073f4d73326c13a4fc5fd7a064217e12780e9bd62c390612984565b6000546123ed906001600160a01b031673f4d73326c13a4fc5fd7a064217e12780e9bd62c383612984565b601254604051638dbdbe6d60e01b815260048101919091526024810182905230604482015273f4d73326c13a4fc5fd7a064217e12780e9bd62c390638dbdbe6d90606401600060405180830381600087803b15801561244b57600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50565b60006124a483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c71565b9392505050565b601254604051630ad58d2f60e01b815260048101919091526024810182905230604482015260009073f4d73326c13a4fc5fd7a064217e12780e9bd62c390630ad58d2f90606401600060405180830381600087803b15801561250c57600080fd5b505af1158015612520573d6000803e3d6000fd5b5093949350505050565b600080612537838561325c565b9050838110156124a45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b2e565b60008261259857506000610a51565b60006125a48385613294565b9050826125b18583613274565b146124a45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b2e565b60006124a483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cab565b6040516001600160a01b0383166024820152604481018290526126ad90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612cd9565b505050565b6001600160a01b0382166126c557600080fd5b60606001600160a01b0384167382af49447d8a07e3bd95bd0d56f35241523fbab1148061270e57506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1145b156127bc576040805160028082526060820183529091602083019080368337019050509050838160008151811061275557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061279757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506128b8565b60408051600380825260808201909252906020820160608036833701905050905083816000815181106127ff57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061285557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061289757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b546128d3906001600160a01b0386811691166000612984565b600b546128ed906001600160a01b03868116911684612984565b600b546001600160a01b03166338ed1739836000843061290e42603c61252a565b6040518663ffffffff1660e01b815260040161292e9594939291906131bb565b600060405180830381600087803b15801561294857600080fd5b505af115801561295c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f1c9190810190612f88565b801580612a0d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156129d357600080fd5b505afa1580156129e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0b9190613068565b155b612a785760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b2e565b6040516001600160a01b0383166024820152604481018290526126ad90849063095ea7b360e01b90606401612676565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015612aec57600080fd5b505afa158015612b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b249190613068565b9050801561245f57600854604080516361d027b360e01b81529051612bc5926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015612b7257600080fd5b505afa158015612b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612baa9190612eca565b610f09612710610d336003548661258990919063ffffffff16565b60085460408051638d8f1e6760e01b81529051612c5e926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b158015612c0b57600080fd5b505afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190612eca565b610f09612710610d336004548661258990919063ffffffff16565b61245f61230f565b61245f610d01610a57565b60008184841115612c955760405162461bcd60e51b8152600401610b2e9190613118565b506000612ca284866132b3565b95945050505050565b60008183612ccc5760405162461bcd60e51b8152600401610b2e9190613118565b506000612ca28486613274565b6000612d2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612dab9092919063ffffffff16565b8051909150156126ad5780806020019051810190612d4c9190613030565b6126ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b2e565b6060612dba8484600085612dc2565b949350505050565b6060843b612e125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b2e565b600080866001600160a01b03168587604051612e2e91906130fc565b60006040518083038185875af1925050503d8060008114612e6b576040519150601f19603f3d011682016040523d82523d6000602084013e612e70565b606091505b50915091508115612e84579150612dba9050565b805115612e945780518082602001fd5b8360405162461bcd60e51b8152600401610b2e9190613118565b600060208284031215612ebf578081fd5b81356124a481613326565b600060208284031215612edb578081fd5b81516124a481613326565b60008060408385031215612ef8578081fd5b8235612f0381613326565b915060208381013567ffffffffffffffff80821115612f20578384fd5b818601915086601f830112612f33578384fd5b813581811115612f4557612f45613310565b612f57601f8201601f1916850161322b565b91508082528784828501011115612f6c578485fd5b8084840185840137810190920192909252919491935090915050565b60006020808385031215612f9a578182fd5b825167ffffffffffffffff80821115612fb1578384fd5b818501915085601f830112612fc4578384fd5b815181811115612fd657612fd6613310565b8060051b9150612fe784830161322b565b8181528481019084860184860187018a1015613001578788fd5b8795505b83861015613023578051835260019590950194918601918601613005565b5098975050505050505050565b600060208284031215613041578081fd5b815180151581146124a4578182fd5b600060208284031215613061578081fd5b5035919050565b600060208284031215613079578081fd5b5051919050565b60008060408385031215613092578182fd5b505080516020909101519092909150565b6000806000606084860312156130b7578081fd5b8351925060208401519150604084015190509250925092565b600081518084526130e88160208601602086016132ca565b601f01601f19169290920160200192915050565b6000825161310e8184602087016132ca565b9190910192915050565b6020815260006124a460208301846130d0565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561320a5784516001600160a01b0316835293830193918301916001016131e5565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561325457613254613310565b604052919050565b6000821982111561326f5761326f6132fa565b500190565b60008261328f57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156132ae576132ae6132fa565b500290565b6000828210156132c5576132c56132fa565b500390565b60005b838110156132e55781810151838201526020016132cd565b838111156132f4576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461245f57600080fdfea2646970667358221220d26dfb6ef1996a0cb13090aa538d762a0281e1e6e738dd3fe4de612ddb400c0864736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc80000000000000000000000001c233a46eae1f928c0467a3c75228e26ea9888d4000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
-----Decoded View---------------
Arg [0] : _governance (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [1] : _strategist (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [2] : _controller (address): 0x1C233a46eAE1F928c0467a3C75228E26Ea9888d4
Arg [3] : _timelock (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [1] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [2] : 0000000000000000000000001c233a46eae1f928c0467a3c75228e26ea9888d4
Arg [3] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode Sourcemap
60757:841:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56240:228;;;;;;;;;;;;;:::i;:::-;;;11237:25:1;;;11225:2;11210:18;56240:228:0;;;;;;;;55520:39;;;;;;;;;;;;55554:5;55520:39;;55137:74;;;;;;;;;;;;55169:42;55137:74;;;;;-1:-1:-1;;;;;4745:32:1;;;4727:51;;4715:2;4700:18;55137:74:0;4682:102:1;40934:74:0;;;;;;;;;;-1:-1:-1;40934:74:0;;;;-1:-1:-1;;;;;40934:74:0;;;55331:21;;;;;;;;;;-1:-1:-1;55331:21:0;;;;-1:-1:-1;;;;;55331:21:0;;;56014:218;;;;;;;;;;;;;:::i;61480:115::-;;;;;;;;;;-1:-1:-1;61557:30:0;;;;;;;;;;;;-1:-1:-1;;;61557:30:0;;;;61480:115;;;;;;;:::i;43351:207::-;;;;;;;;;;-1:-1:-1;43351:207:0;;;;;:::i;:::-;;:::i;:::-;;48028:1053;;;;;;:::i;:::-;;:::i;40656:19::-;;;;;;;;;;-1:-1:-1;40656:19:0;;;;-1:-1:-1;;;;;40656:19:0;;;41653:25;;;;;;;;;;-1:-1:-1;41653:25:0;;;;-1:-1:-1;;;;;41653:25:0;;;44337:213;;;;;;;;;;-1:-1:-1;44337:213:0;;;;;:::i;:::-;;:::i;45715:1032::-;;;;;;;;;;-1:-1:-1;45715:1032:0;;;;;:::i;:::-;;:::i;60977:64::-;;;;;;;;;;-1:-1:-1;60977:64:0;;;;-1:-1:-1;;;;;60977:64:0;;;55568:21;;;;;;;;;;;;;;;;40682:73;;;;;;;;;;;;40713:42;40682:73;;55218:77;;;;;;;;;;;;55253:42;55218:77;;57729:2924;;;;;;;;;;;;;:::i;41505:53::-;;;;;;;;;;;;41552:6;41505:53;;57221:151;;;;;;;;;;-1:-1:-1;57221:151:0;;;;;:::i;:::-;;:::i;45348:289::-;;;;;;;;;;-1:-1:-1;45348:289:0;;;;;:::i;:::-;;:::i;41459:39::-;;;;;;;;;;;;;;;;43108:235;;;;;;;;;;-1:-1:-1;43108:235:0;;;;;:::i;:::-;;:::i;41058:44::-;;;;;;;;;;;;;;;;41589:25;;;;;;;;;;-1:-1:-1;41589:25:0;;;;-1:-1:-1;;;;;41589:25:0;;;41730:71;;;;;;;;;;-1:-1:-1;41730:71:0;;;;-1:-1:-1;;;;;41730:71:0;;;42883:113;;;;;;;;;;;;;:::i;43947:195::-;;;;;;;;;;-1:-1:-1;43947:195:0;;;;;:::i;:::-;;:::i;47325:440::-;;;;;;;;;;;;;:::i;41810:42::-;;;;;;;;;;-1:-1:-1;41810:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6307:14:1;;6300:22;6282:41;;6270:2;6255:18;41810:42:0;6237:92:1;41172:36:0;;;;;;;;;;;;;;;;57380:220;;;;;;;;;;-1:-1:-1;57380:220:0;;;;;:::i;:::-;;:::i;41349:40::-;;;;;;;;;;;;;;;;45035:151;;;;;;;;;;-1:-1:-1;45035:151:0;;;;;:::i;:::-;;:::i;60892:78::-;;;;;;;;;;-1:-1:-1;60892:78:0;;;;-1:-1:-1;;;;;60892:78:0;;;44721:155;;;;;;;;;;-1:-1:-1;44721:155:0;;;;;:::i;:::-;;:::i;43748:191::-;;;;;;;;;;-1:-1:-1;43748:191:0;;;;;:::i;:::-;;:::i;40855:72::-;;;;;;;;;;-1:-1:-1;40855:72:0;;;;-1:-1:-1;;;;;40855:72:0;;;57086:127;;;;;;;;;;-1:-1:-1;57086:127:0;;;;;:::i;:::-;;:::i;44884:143::-;;;;;;;;;;-1:-1:-1;44884:143:0;;;;;:::i;:::-;;:::i;60820:41::-;;;;;;;;;;;;;;;;42686:118;;;;;;;;;;;;;:::i;55481:32::-;;;;;;;;;;;;;;;;46811:438;;;;;;;;;;-1:-1:-1;46811:438:0;;;;;:::i;:::-;;:::i;44150:179::-;;;;;;;;;;-1:-1:-1;44150:179:0;;;;;:::i;:::-;;:::i;44558:155::-;;;;;;;;;;-1:-1:-1;44558:155:0;;;;;:::i;:::-;;:::i;43566:174::-;;;;;;;;;;-1:-1:-1;43566:174:0;;;;;:::i;:::-;;:::i;56502:326::-;;;;;;;;;;;;;:::i;55359:21::-;;;;;;;;;;-1:-1:-1;55359:21:0;;;;-1:-1:-1;;;;;55359:21:0;;;41685:23;;;;;;;;;;-1:-1:-1;41685:23:0;;;;-1:-1:-1;;;;;41685:23:0;;;55448:26;;;;;;;;;;;;;;;;41621:25;;;;;;;;;;-1:-1:-1;41621:25:0;;;;-1:-1:-1;;;;;41621:25:0;;;56240:228;56382:6;;56333:94;;-1:-1:-1;;;56333:94:0;;;;;11447:25:1;;;;56411:4:0;11488:18:1;;;11481:60;56289:7:0;;;;55253:42;;56333:34;;11420:18:1;;56333:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56309:118;56240:228;-1:-1:-1;;56240:228:0:o;56014:218::-;56155:6;;56110:90;;-1:-1:-1;;;56110:90:0;;;;;11447:25:1;;;;56184:4:0;11488:18:1;;;11481:60;56069:7:0;;;;55253:42;;56110:30;;11420:18:1;;56110:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56089:111:0;56014:218;-1:-1:-1;;56014:218:0:o;43351:207::-;43438:10;;-1:-1:-1;;;;;43438:10:0;43424;:24;;:66;;-1:-1:-1;43480:10:0;;-1:-1:-1;;;;;43480:10:0;43466;:24;43424:66;43416:93;;;;-1:-1:-1;;;43416:93:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;43520:22:0;43545:5;43520:22;;;:10;:22;;;;;:30;;-1:-1:-1;;43520:30:0;;;43351:207::o;48028:1053::-;48194:8;;48133:21;;-1:-1:-1;;;;;48194:8:0;48180:10;:22;48172:44;;;;-1:-1:-1;;;48172:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48235:21:0;;48227:41;;;;-1:-1:-1;;;48227:41:0;;7322:2:1;48227:41:0;;;7304:21:1;7361:1;7341:18;;;7334:29;-1:-1:-1;;;7379:18:1;;;7372:37;7426:18;;48227:41:0;7294:156:1;48227:41:0;48545:1;48525;48500:5;48494:12;48470:4;48463:5;48459:16;48433:7;48409:4;48402:5;48398:16;48367:194;48587:16;48637:4;48631:11;48619:23;;48754:4;48750:9;48743:4;48736;48730;48726:15;48722:26;48718:42;48708:8;48704:57;48681:4;48656:120;48807:4;48797:8;48790:22;48865:4;48862:1;48855:4;48845:8;48841:19;48826:44;48900:9;48893:17;48933:1;48928:135;;;;48886:177;;48928:135;49039:4;49032;49022:8;49018:19;49011:33;48886:177;;;;48335:739;;;;:::o;44337:213::-;44461:8;;-1:-1:-1;;;;;44461:8:0;44447:10;:22;44439:44;;;;-1:-1:-1;;;44439:44:0;;;;;;;:::i;:::-;44494:22;:48;44337:213::o;45715:1032::-;45792:10;;-1:-1:-1;;;;;45792:10:0;45778;:24;45770:48;;;;-1:-1:-1;;;45770:48:0;;;;;;;:::i;:::-;45829:16;45855:4;;45848:37;;-1:-1:-1;;;45848:37:0;;45879:4;45848:37;;;4727:51:1;-1:-1:-1;;;;;45855:4:0;;;;45848:22;;4700:18:1;;45848:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45829:56;;45911:7;45900:8;:18;45896:143;;;45945:36;45959:21;:7;45971:8;45959:11;:21::i;:::-;45945:13;:36::i;:::-;45935:46;-1:-1:-1;46006:21:0;45935:46;46018:8;46006:11;:21::i;:::-;45996:31;;45896:143;46051:15;46069:83;41552:6;46069:33;46081:20;;46069:7;:11;;:33;;;;:::i;:::-;:37;;:83::i;:::-;46051:101;;46163:69;46201:10;;;;;;;;;-1:-1:-1;;;;;46201:10:0;-1:-1:-1;;;;;46189:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46170:4;;-1:-1:-1;;;;;46170:4:0;;46224:7;46163:25;:69::i;:::-;46245:20;46268:85;41444:6;46268:34;46280:21;;46268:7;:11;;:34;;;;:::i;:85::-;46245:108;;46364:112;46416:10;;;;;;;;;-1:-1:-1;;;;;46416:10:0;-1:-1:-1;;;;;46404:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46364:112;46518:10;;46489:14;46545:4;;46506:45;;-1:-1:-1;;;46506:45:0;;-1:-1:-1;;;;;46545:4:0;;;46506:45;;;4727:51:1;46489:14:0;;46518:10;;46506:30;;4700:18:1;;46506:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46489:62;-1:-1:-1;;;;;;46570:20:0;;46562:39;;;;-1:-1:-1;;;46562:39:0;;;;;;;:::i;:::-;46666:73;46692:6;46700:38;46725:12;46700:20;:7;46712;46700:11;:20::i;:::-;:24;;:38::i;:::-;46673:4;;-1:-1:-1;;;;;46673:4:0;;46666:73;:25;:73::i;:::-;45715:1032;;;;;:::o;57729:2924::-;42517:10;42506:22;;;;:10;:22;;;;;;;;;:67;;-1:-1:-1;42563:10:0;;-1:-1:-1;;;;;42563:10:0;42549;:24;42506:67;:112;;;-1:-1:-1;42608:10:0;;-1:-1:-1;;;;;42608:10:0;42594;:24;42506:112;42484:145;;;;;;57854:6:::1;::::0;57824:52:::1;::::0;-1:-1:-1;;;57824:52:0;;::::1;::::0;::::1;11447:25:1::0;;;;57870:4:0::1;11488:18:1::0;;;11481:60;55253:42:0::1;::::0;57824:29:::1;::::0;11420:18:1;;57824:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;57904:38:0::1;::::0;-1:-1:-1;;;57904:38:0;;57936:4:::1;57904:38;::::0;::::1;4727:51:1::0;57887:14:0::1;::::0;-1:-1:-1;55169:42:0::1;::::0;-1:-1:-1;57904:23:0::1;::::0;4700:18:1;;57904:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57887:55:::0;-1:-1:-1;57957:10:0;;57953:393:::1;;58032:18;58053:29;55554:5;58053:16;58064:4;;58053:6;:10;;:16;;;;:::i;:29::-;58032:50;;58097:123;58154:10;;;;;;;;;-1:-1:-1::0;;;;;58154:10:0::1;-1:-1:-1::0;;;;;58142:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55169:42;::::0;58195:10;58097:26:::1;:123::i;:::-;58246:38;::::0;-1:-1:-1;;;58246:38:0;;58278:4:::1;58246:38;::::0;::::1;4727:51:1::0;55169:42:0::1;::::0;58246:23:::1;::::0;4700:18:1;;58246:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58237:47;;58299:35;55169:42;40713;58327:6;58299:14;:35::i;:::-;57953:393;;58396:11;::::0;-1:-1:-1;;;;;58396:11:0::1;:25:::0;58392:542:::1;;58463:11;::::0;58456:44:::1;::::0;-1:-1:-1;;;58456:44:0;;58494:4:::1;58456:44;::::0;::::1;4727:51:1::0;58438:15:0::1;::::0;-1:-1:-1;;;;;58463:11:0::1;::::0;58456:29:::1;::::0;4700:18:1;;58456:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58438:62:::0;-1:-1:-1;58519:11:0;;58515:408:::1;;58551:19;58573:36;55554:5;58573:23;58585:10;;58573:7;:11;;:23;;;;:::i;:36::-;58551:58;;58628:142;58695:10;;;;;;;;;-1:-1:-1::0;;;;;58695:10:0::1;-1:-1:-1::0;;;;;58683:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58635:11;::::0;-1:-1:-1;;;;;58635:11:0::1;::::0;58740;58628:32:::1;:142::i;:::-;58809:11;::::0;58802:44:::1;::::0;-1:-1:-1;;;58802:44:0;;58840:4:::1;58802:44;::::0;::::1;4727:51:1::0;-1:-1:-1;;;;;58809:11:0;;::::1;::::0;58802:29:::1;::::0;4700:18:1;;58802:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58880:11;::::0;58792:54;;-1:-1:-1;58865:42:0::1;::::0;-1:-1:-1;;;;;58880:11:0::1;40713:42;58792:54:::0;58865:14:::1;:42::i;:::-;58515:408;;58392:542;;59000:37;::::0;-1:-1:-1;;;59000:37:0;;59031:4:::1;59000:37;::::0;::::1;4727:51:1::0;58984:13:0::1;::::0;40713:42:::1;::::0;59000:22:::1;::::0;4700:18:1;;59000:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58984:53;;59060:1;59052:5;:9;:27;;;;-1:-1:-1::0;59065:6:0::1;::::0;-1:-1:-1;;;;;59065:6:0::1;40713:42;59065:14;;59052:27;59048:102;;;59117:6;::::0;59096:42:::1;::::0;40713::::1;::::0;-1:-1:-1;;;;;59117:6:0::1;59125:12;:5:::0;59135:1:::1;59125:9;:12::i;:::-;59096:14;:42::i;:::-;59212:1;59204:5;:9;:27;;;;-1:-1:-1::0;59217:6:0::1;::::0;-1:-1:-1;;;;;59217:6:0::1;40713:42;59217:14;;59204:27;59200:102;;;59269:6;::::0;59248:42:::1;::::0;40713::::1;::::0;-1:-1:-1;;;;;59269:6:0::1;59277:12;:5:::0;59287:1:::1;59277:9;:12::i;59248:42::-;59387:6;::::0;59380:39:::1;::::0;-1:-1:-1;;;59380:39:0;;59413:4:::1;59380:39;::::0;::::1;4727:51:1::0;59362:15:0::1;::::0;-1:-1:-1;;;;;59387:6:0::1;::::0;59380:24:::1;::::0;4700:18:1;;59380:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59455:6;::::0;59448:39:::1;::::0;-1:-1:-1;;;59448:39:0;;59481:4:::1;59448:39;::::0;::::1;4727:51:1::0;59362:57:0;;-1:-1:-1;59430:15:0::1;::::0;-1:-1:-1;;;;;59455:6:0;;::::1;::::0;59448:24:::1;::::0;4700:18:1;;59448:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59430:57;;59512:1;59502:7;:11;:26;;;;;59527:1;59517:7;:11;59502:26;59498:936;;;59572:11;::::0;59552:6:::1;::::0;59545:42:::1;::::0;-1:-1:-1;;;;;59552:6:0;;::::1;::::0;59572:11:::1;;59545:26;:42::i;:::-;59629:11;::::0;59609:6:::1;::::0;59602:48:::1;::::0;-1:-1:-1;;;;;59609:6:0;;::::1;::::0;59629:11:::1;59642:7:::0;59602:26:::1;:48::i;:::-;59692:11;::::0;59672:6:::1;::::0;59665:42:::1;::::0;-1:-1:-1;;;;;59672:6:0;;::::1;::::0;59692:11:::1;;59665:26;:42::i;:::-;59749:11;::::0;59729:6:::1;::::0;59722:48:::1;::::0;-1:-1:-1;;;;;59729:6:0;;::::1;::::0;59749:11:::1;59762:7:::0;59722:26:::1;:48::i;:::-;59803:11;::::0;59847:6:::1;::::0;59872::::1;::::0;-1:-1:-1;;;;;59803:11:0;;::::1;::::0;59787:41:::1;::::0;59847:6;::::1;::::0;59872::::1;59897:7:::0;59923;59803:11:::1;::::0;59997:4:::1;60021:23;:15;60041:2;60021:19;:23::i;:::-;59787:272;::::0;::::1;::::0;;;-1:-1:-1;;;;;;59787:272:0;;;-1:-1:-1;;;;;5513:15:1;;;59787:272:0::1;::::0;::::1;5495:34:1::0;5565:15;;;5545:18;;;5538:43;5597:18;;;5590:34;;;;5640:18;;;5633:34;;;;5683:19;;;5676:35;;;;5727:19;;;5720:35;5792:15;;;5771:19;;;5764:44;5824:19;;;5817:35;;;;5429:19;;59787:272:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;60112:6:0::1;::::0;60159:10:::1;::::0;60147:34:::1;::::0;;-1:-1:-1;;;60147:34:0;;;;-1:-1:-1;;;;;60112:6:0;;::::1;::::0;-1:-1:-1;60105:23:0::1;::::0;60159:10;;::::1;::::0;60147:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;60159:10;60147:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60207:6;::::0;60200:39:::1;::::0;-1:-1:-1;;;60200:39:0;;60233:4:::1;60200:39;::::0;::::1;4727:51:1::0;-1:-1:-1;;;;;60207:6:0;;::::1;::::0;60200:24:::1;::::0;4700:18:1;;60200:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60105:149;::::0;-1:-1:-1;;;;;;60105:149:0::1;::::0;;;;;;-1:-1:-1;;;;;6055:32:1;;;60105:149:0::1;::::0;::::1;6037:51:1::0;6104:18;;;6097:34;6010:18;;60105:149:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60327:10:0::1;::::0;60315:34:::1;::::0;;-1:-1:-1;;;60315:34:0;;;;60269:153:::1;::::0;-1:-1:-1;;;;;60327:10:0::1;::::0;60315:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;60327:10;60315:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60375:6;::::0;60368:39:::1;::::0;-1:-1:-1;;;60368:39:0;;60401:4:::1;60368:39;::::0;::::1;4727:51:1::0;-1:-1:-1;;;;;60375:6:0;;::::1;::::0;60368:24:::1;::::0;4700:18:1;;60368:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60276:6;::::0;-1:-1:-1;;;;;60276:6:0::1;::::0;60269:153;:27:::1;:153::i;:::-;60446:13;60469:4:::0;;60462:37:::1;::::0;-1:-1:-1;;;60462:37:0;;60493:4:::1;60462:37;::::0;::::1;4727:51:1::0;-1:-1:-1;;;;;60469:4:0;;::::1;::::0;60462:22:::1;::::0;4700:18:1;;60462:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60515:31;::::0;;60523:15:::1;12714:25:1::0;;12770:2;12755:18;;12748:34;;;60446:53:0;;-1:-1:-1;60515:31:0::1;::::0;12687:18:1;60515:31:0::1;;;;;;;60607:38;:36;:38::i;57221:151::-:0;57307:8;;-1:-1:-1;;;;;57307:8:0;57293:10;:22;57285:44;;;;-1:-1:-1;;;57285:44:0;;;;;;;:::i;:::-;57340:10;:24;57221:151::o;45348:289::-;45449:10;;45399:15;;-1:-1:-1;;;;;45449:10:0;45435;:24;45427:48;;;;-1:-1:-1;;;45427:48:0;;;;;;;:::i;:::-;45494:4;;-1:-1:-1;;;;;45494:23:0;;;:4;;:23;;45486:40;;;;-1:-1:-1;;;45486:40:0;;;;;;8353:2:1;8335:21;;;8392:1;8372:18;;;8365:29;-1:-1:-1;;;8425:2:1;8410:18;;8403:34;8469:2;8454:18;;8325:153;45486:40:0;45547:31;;-1:-1:-1;;;45547:31:0;;45572:4;45547:31;;;4727:51:1;-1:-1:-1;;;;;45547:16:0;;;;;4700:18:1;;45547:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45609:10;;45537:41;;-1:-1:-1;45589:40:0;;-1:-1:-1;;;;;45589:19:0;;;;45609:10;45537:41;45589:19;:40::i;:::-;45348:289;;;:::o;43108:235::-;43198:10;;-1:-1:-1;;;;;43198:10:0;43184;:24;;:66;;-1:-1:-1;43240:10:0;;-1:-1:-1;;;;;43240:10:0;43226;:24;43184:66;:92;;;-1:-1:-1;43265:10:0;43254:22;;;;:10;:22;;;;;;;;43184:92;43176:119;;;;-1:-1:-1;;;43176:119:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43306:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;43306:29:0;43331:4;43306:29;;;43108:235::o;42883:113::-;42925:7;42952:36;42972:15;:13;:15::i;:::-;42952;:13;:15::i;:::-;:19;;:36::i;:::-;42945:43;;42883:113;:::o;43947:195::-;44055:8;;-1:-1:-1;;;;;44055:8:0;44041:10;:22;44033:44;;;;-1:-1:-1;;;44033:44:0;;;;;;;:::i;:::-;44088:21;:46;43947:195::o;47325:440::-;47416:10;;47366:15;;-1:-1:-1;;;;;47416:10:0;47402;:24;47394:48;;;;-1:-1:-1;;;47394:48:0;;;;;;;:::i;:::-;47453:14;:12;:14::i;:::-;47497:4;;47490:37;;-1:-1:-1;;;47490:37:0;;47521:4;47490:37;;;4727:51:1;-1:-1:-1;;;;;47497:4:0;;;;47490:22;;4700:18:1;;47490:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47569:10;;47540:14;47596:4;;47557:45;;-1:-1:-1;;;47557:45:0;;-1:-1:-1;;;;;47596:4:0;;;47557:45;;;4727:51:1;47480:47:0;;-1:-1:-1;47540:14:0;;47569:10;;;47557:30;;4700:18:1;;47557:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47540:62;-1:-1:-1;;;;;;47621:20:0;;47613:39;;;;-1:-1:-1;;;47613:39:0;;;;;;;:::i;:::-;47722:4;;47715:42;;-1:-1:-1;;;;;47722:4:0;47741:6;47749:7;47715:25;:42::i;:::-;47325:440;;:::o;57380:220::-;57482:8;;-1:-1:-1;;;;;57482:8:0;57468:10;:22;;:50;;-1:-1:-1;57508:10:0;;-1:-1:-1;;;;;57508:10:0;57494;:24;57468:50;57446:109;;;;-1:-1:-1;;;57446:109:0;;;;;;;:::i;:::-;57566:11;:26;;-1:-1:-1;;;;;;57566:26:0;-1:-1:-1;;;;;57566:26:0;;;;;;;;;;57380:220::o;45035:151::-;45121:8;;-1:-1:-1;;;;;45121:8:0;45107:10;:22;45099:44;;;;-1:-1:-1;;;45099:44:0;;;;;;;:::i;:::-;45154:10;:24;;-1:-1:-1;;;;;;45154:24:0;-1:-1:-1;;;;;45154:24:0;;;;;;;;;;45035:151::o;44721:155::-;44807:10;;-1:-1:-1;;;;;44807:10:0;44793;:24;44785:48;;;;-1:-1:-1;;;44785:48:0;;6982:2:1;44785:48:0;;;6964:21:1;7021:2;7001:18;;;6994:30;-1:-1:-1;;;7040:18:1;;;7033:41;7091:18;;44785:48:0;6954:161:1;44785:48:0;44844:10;:24;;-1:-1:-1;;;;;;44844:24:0;-1:-1:-1;;;;;44844:24:0;;;;;;;;;;44721:155::o;43748:191::-;43854:8;;-1:-1:-1;;;;;43854:8:0;43840:10;:22;43832:44;;;;-1:-1:-1;;;43832:44:0;;;;;;;:::i;:::-;43887:20;:44;43748:191::o;57086:127::-;57160:8;;-1:-1:-1;;;;;57160:8:0;57146:10;:22;57138:44;;;;-1:-1:-1;;;57138:44:0;;;;;;;:::i;:::-;57193:4;:12;57086:127::o;44884:143::-;44966:8;;-1:-1:-1;;;;;44966:8:0;44952:10;:22;44944:44;;;;-1:-1:-1;;;44944:44:0;;;;;;;:::i;:::-;44999:8;:20;;-1:-1:-1;;;;;;44999:20:0;-1:-1:-1;;;;;44999:20:0;;;;;;;;;;44884:143::o;42686:118::-;42732:7;42766:4;;42759:37;;-1:-1:-1;;;42759:37:0;;42790:4;42759:37;;;4727:51:1;-1:-1:-1;;;;;42766:4:0;;;;42759:22;;4700:18:1;;42759:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46811:438::-;46944:10;;46889:15;;-1:-1:-1;;;;;46944:10:0;46930;:24;46922:48;;;;-1:-1:-1;;;46922:48:0;;;;;;;:::i;:::-;46981:22;46995:7;46981:13;:22::i;:::-;-1:-1:-1;47033:4:0;;47026:37;;-1:-1:-1;;;47026:37:0;;47057:4;47026:37;;;4727:51:1;-1:-1:-1;;;;;47033:4:0;;;;47026:22;;4700:18:1;;47026:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47105:10;;47076:14;47132:4;;47093:45;;-1:-1:-1;;;47093:45:0;;-1:-1:-1;;;;;47132:4:0;;;47093:45;;;4727:51:1;47016:47:0;;-1:-1:-1;47076:14:0;;47105:10;;;47093:30;;4700:18:1;;47093:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47076:62;-1:-1:-1;;;;;;47157:20:0;;47149:39;;;;-1:-1:-1;;;47149:39:0;;;;;;;:::i;:::-;47206:4;;47199:42;;-1:-1:-1;;;;;47206:4:0;47225:6;47233:7;47199:25;:42::i;:::-;46811:438;;;;:::o;44150:179::-;44250:8;;-1:-1:-1;;;;;44250:8:0;44236:10;:22;44228:44;;;;-1:-1:-1;;;44228:44:0;;;;;;;:::i;:::-;44283:17;:38;44150:179::o;44558:155::-;44644:10;;-1:-1:-1;;;;;44644:10:0;44630;:24;44622:48;;;;-1:-1:-1;;;44622:48:0;;6982:2:1;44622:48:0;;;6964:21:1;7021:2;7001:18;;;6994:30;-1:-1:-1;;;7040:18:1;;;7033:41;7091:18;;44622:48:0;6954:161:1;44622:48:0;44681:10;:24;;-1:-1:-1;;;;;;44681:24:0;-1:-1:-1;;;;;44681:24:0;;;;;;;;;;44558:155::o;43566:174::-;43660:10;;-1:-1:-1;;;;;43660:10:0;43646;:24;43638:51;;;;-1:-1:-1;;;43638:51:0;;;;;;;:::i;:::-;43700:14;:32;;-1:-1:-1;;;;;;43700:32:0;-1:-1:-1;;;;;43700:32:0;;;;;;;;;;43566:174::o;56502:326::-;56548:13;56571:4;;56564:37;;-1:-1:-1;;;56564:37:0;;56595:4;56564:37;;;4727:51:1;-1:-1:-1;;;;;56571:4:0;;;;56564:22;;4700:18:1;;56564:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56548:53;-1:-1:-1;56616:9:0;;56612:209;;56677:1;56649:4;;56642:37;;-1:-1:-1;;;;;56649:4:0;;;;55253:42;;56642:24;:37::i;:::-;56701:4;;56694:41;;-1:-1:-1;;;;;56701:4:0;55253:42;56729:5;56694:24;:41::i;:::-;56780:6;;56750:59;;-1:-1:-1;;;56750:59:0;;;;;12995:25:1;;;;13036:18;;;13029:34;;;56803:4:0;13079:18:1;;;13072:60;55253:42:0;;56750:29;;12968:18:1;;56750:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56612:209;56502:326;:::o;1485:136::-;1543:7;1570:43;1574:1;1577;1570:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1563:50;1485:136;-1:-1:-1;;;1485:136:0:o;56836:214::-;56986:6;;56955:62;;-1:-1:-1;;;56955:62:0;;;;;12995:25:1;;;;13036:18;;;13029:34;;;57011:4:0;13079:18:1;;;13072:60;56930:7:0;;55253:42;;56955:30;;12968:18:1;;56955:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57035:7:0;;56836:214;-1:-1:-1;;;;56836:214:0:o;1021:181::-;1079:7;;1111:5;1115:1;1111;:5;:::i;:::-;1099:17;;1140:1;1135;:6;;1127:46;;;;-1:-1:-1;;;1127:46:0;;7997:2:1;1127:46:0;;;7979:21:1;8036:2;8016:18;;;8009:30;8075:29;8055:18;;;8048:57;8122:18;;1127:46:0;7969:177:1;2375:471:0;2433:7;2678:6;2674:47;;-1:-1:-1;2708:1:0;2701:8;;2674:47;2733:9;2745:5;2749:1;2745;:5;:::i;:::-;2733:17;-1:-1:-1;2778:1:0;2769:5;2773:1;2733:17;2769:5;:::i;:::-;:10;2761:56;;;;-1:-1:-1;;;2761:56:0;;9028:2:1;2761:56:0;;;9010:21:1;9067:2;9047:18;;;9040:30;9106:34;9086:18;;;9079:62;-1:-1:-1;;;9157:18:1;;;9150:31;9198:19;;2761:56:0;9000:223:1;3322:132:0;3380:7;3407:39;3411:1;3414;3407:39;;;;;;;;;;;;;;;;;:3;:39::i;26835:177::-;26945:58;;-1:-1:-1;;;;;6055:32:1;;26945:58:0;;;6037:51:1;6104:18;;;6097:34;;;26918:86:0;;26938:5;;-1:-1:-1;;;26968:23:0;6010:18:1;;26945:58:0;;;;-1:-1:-1;;26945:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26945:58:0;-1:-1:-1;;;;;;26945:58:0;;;;;;;;;;26918:19;:86::i;:::-;26835:177;;;:::o;49126:806::-;-1:-1:-1;;;;;49257:17:0;;49249:26;;;;;;49288:21;-1:-1:-1;;;;;49326:13:0;;40713:42;49326:13;;:28;;-1:-1:-1;;;;;;49343:11:0;;40713:42;49343:11;49326:28;49322:285;;;49378:16;;;49392:1;49378:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49378:16:0;49371:23;;49419:5;49409:4;49414:1;49409:7;;;;;;-1:-1:-1;;;49409:7:0;;;;;;;;;;;;;;:15;-1:-1:-1;;;;;49409:15:0;;;-1:-1:-1;;;;;49409:15:0;;;;;49449:3;49439:4;49444:1;49439:7;;;;;;-1:-1:-1;;;49439:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;49439:13:0;;;-1:-1:-1;;;;;49439:13:0;;;;;49322:285;;;49492:16;;;49506:1;49492:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49492:16:0;49485:23;;49533:5;49523:4;49528:1;49523:7;;;;;;-1:-1:-1;;;49523:7:0;;;;;;;;;;;;;;:15;-1:-1:-1;;;;;49523:15:0;;;-1:-1:-1;;;;;49523:15:0;;;;;40713:42;49553:4;49558:1;49553:7;;;;;;-1:-1:-1;;;49553:7:0;;;;;;;;;;;;;;:14;-1:-1:-1;;;;;49553:14:0;;;-1:-1:-1;;;;;49553:14:0;;;;;49592:3;49582:4;49587:1;49582:7;;;;;;-1:-1:-1;;;49582:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;49582:13:0;;;-1:-1:-1;;;;;49582:13:0;;;;;49322:285;49653:11;;49627:41;;-1:-1:-1;;;;;49627:25:0;;;;49653:11;;49627:25;:41::i;:::-;49705:11;;49679:47;;-1:-1:-1;;;;;49679:25:0;;;;49705:11;49718:7;49679:25;:47::i;:::-;49753:11;;-1:-1:-1;;;;;49753:11:0;49737:53;49805:7;49753:11;49843:4;49870;49890:23;:15;49910:2;49890:19;:23::i;:::-;49737:187;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49737:187:0;;;;;;;;;;;;:::i;27494:622::-;27864:10;;;27863:62;;-1:-1:-1;27880:39:0;;-1:-1:-1;;;27880:39:0;;27904:4;27880:39;;;5001:34:1;-1:-1:-1;;;;;5071:15:1;;;5051:18;;;5044:43;27880:15:0;;;;;4936:18:1;;27880:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27863:62;27855:152;;;;-1:-1:-1;;;27855:152:0;;10870:2:1;27855:152:0;;;10852:21:1;10909:2;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;-1:-1:-1;;;10999:18:1;;;10992:52;11061:19;;27855:152:0;10842:244:1;27855:152:0;28045:62;;-1:-1:-1;;;;;6055:32:1;;28045:62:0;;;6037:51:1;6104:18;;;6097:34;;;28018:90:0;;28038:5;;-1:-1:-1;;;28068:22:0;6010:18:1;;28045:62:0;5992:145:1;50417:623:0;50485:13;50508:4;;50501:37;;-1:-1:-1;;;50501:37:0;;50532:4;50501:37;;;4727:51:1;-1:-1:-1;;;;;50508:4:0;;;;50501:22;;4700:18:1;;50501:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50485:53;-1:-1:-1;50555:9:0;;50551:482;;50667:10;;50655:34;;;-1:-1:-1;;;50655:34:0;;;;50611:173;;-1:-1:-1;;;;;50667:10:0;;50655:32;;:34;;;;;;;;;;;;;;50667:10;50655:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50708:61;41158:5;50708:33;50718:22;;50708:5;:9;;:33;;;;:::i;50611:173::-;50889:10;;50877:33;;;-1:-1:-1;;;50877:33:0;;;;50833:162;;-1:-1:-1;;;;;50889:10:0;;50877:31;;:33;;;;;;;;;;;;;;50889:10;50877:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50929:51;41259:5;50929:28;50939:17;;50929:5;:9;;:28;;;;:::i;50833:162::-;51012:9;:7;:9::i;47773:82::-;47817:30;47831:15;:13;:15::i;1924:192::-;2010:7;2046:12;2038:6;;;;2030:29;;;;-1:-1:-1;;;2030:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2070:9:0;2082:5;2086:1;2082;:5;:::i;:::-;2070:17;1924:192;-1:-1:-1;;;;;1924:192:0:o;3950:278::-;4036:7;4071:12;4064:5;4056:28;;;;-1:-1:-1;;;4056:28:0;;;;;;;;:::i;:::-;-1:-1:-1;4095:9:0;4107:5;4111:1;4107;:5;:::i;29140:761::-;29564:23;29590:69;29618:4;29590:69;;;;;;;;;;;;;;;;;29598:5;-1:-1:-1;;;;;29590:27:0;;;:69;;;;;:::i;:::-;29674:17;;29564:95;;-1:-1:-1;29674:21:0;29670:224;;29816:10;29805:30;;;;;;;;;;;;:::i;:::-;29797:85;;;;-1:-1:-1;;;29797:85:0;;10122:2:1;29797:85:0;;;10104:21:1;10161:2;10141:18;;;10134:30;10200:34;10180:18;;;10173:62;-1:-1:-1;;;10251:18:1;;;10244:40;10301:19;;29797:85:0;10094:232:1;12964:196:0;13067:12;13099:53;13122:6;13130:4;13136:1;13139:12;13099:22;:53::i;:::-;13092:60;12964:196;-1:-1:-1;;;;12964:196:0:o;14341:979::-;14471:12;10413:20;;14496:60;;;;-1:-1:-1;;;14496:60:0;;9764:2:1;14496:60:0;;;9746:21:1;9803:2;9783:18;;;9776:30;9842:31;9822:18;;;9815:59;9891:18;;14496:60:0;9736:179:1;14496:60:0;14630:12;14644:23;14671:6;-1:-1:-1;;;;;14671:11:0;14691:8;14702:4;14671:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14629:78;;;;14722:7;14718:595;;;14753:10;-1:-1:-1;14746:17:0;;-1:-1:-1;14746:17:0;14718:595;14867:17;;:21;14863:439;;15130:10;15124:17;15191:15;15178:10;15174:2;15170:19;15163:44;15078:148;15273:12;15266:20;;-1:-1:-1;;;15266:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:943::-;619:6;627;680:2;668:9;659:7;655:23;651:32;648:2;;;701:6;693;686:22;648:2;745:9;732:23;764:31;789:5;764:31;:::i;:::-;814:5;-1:-1:-1;838:2:1;876:18;;;863:32;914:18;944:14;;;941:2;;;976:6;968;961:22;941:2;1019:6;1008:9;1004:22;994:32;;1064:7;1057:4;1053:2;1049:13;1045:27;1035:2;;1091:6;1083;1076:22;1035:2;1132;1119:16;1154:2;1150;1147:10;1144:2;;;1160:18;;:::i;:::-;1202:53;1245:2;1226:13;;-1:-1:-1;;1222:27:1;1218:36;;1202:53;:::i;:::-;1189:66;;1278:2;1271:5;1264:17;1318:7;1313:2;1308;1304;1300:11;1296:20;1293:33;1290:2;;;1344:6;1336;1329:22;1290:2;1404;1399;1395;1391:11;1386:2;1379:5;1375:14;1362:45;1427:14;;1423:23;;;1416:39;;;;638:847;;1431:5;;-1:-1:-1;638:847:1;;-1:-1:-1;;638:847:1:o;1490:992::-;1585:6;1616:2;1659;1647:9;1638:7;1634:23;1630:32;1627:2;;;1680:6;1672;1665:22;1627:2;1718:9;1712:16;1747:18;1788:2;1780:6;1777:14;1774:2;;;1809:6;1801;1794:22;1774:2;1852:6;1841:9;1837:22;1827:32;;1897:7;1890:4;1886:2;1882:13;1878:27;1868:2;;1924:6;1916;1909:22;1868:2;1958;1952:9;1980:2;1976;1973:10;1970:2;;;1986:18;;:::i;:::-;2032:2;2029:1;2025:10;2015:20;;2055:28;2079:2;2075;2071:11;2055:28;:::i;:::-;2117:15;;;2148:12;;;;2180:11;;;2210;;;2206:20;;2203:33;-1:-1:-1;2200:2:1;;;2254:6;2246;2239:22;2200:2;2281:6;2272:15;;2296:156;2310:2;2307:1;2304:9;2296:156;;;2367:10;;2355:23;;2328:1;2321:9;;;;;2398:12;;;;2430;;2296:156;;;-1:-1:-1;2471:5:1;1596:886;-1:-1:-1;;;;;;;;1596:886:1:o;2487:297::-;2554:6;2607:2;2595:9;2586:7;2582:23;2578:32;2575:2;;;2628:6;2620;2613:22;2575:2;2665:9;2659:16;2718:5;2711:13;2704:21;2697:5;2694:32;2684:2;;2745:6;2737;2730:22;3065:190;3124:6;3177:2;3165:9;3156:7;3152:23;3148:32;3145:2;;;3198:6;3190;3183:22;3145:2;-1:-1:-1;3226:23:1;;3135:120;-1:-1:-1;3135:120:1:o;3260:194::-;3330:6;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;3404:6;3396;3389:22;3351:2;-1:-1:-1;3432:16:1;;3341:113;-1:-1:-1;3341:113:1:o;3459:255::-;3538:6;3546;3599:2;3587:9;3578:7;3574:23;3570:32;3567:2;;;3620:6;3612;3605:22;3567:2;-1:-1:-1;;3648:16:1;;3704:2;3689:18;;;3683:25;3648:16;;3683:25;;-1:-1:-1;3557:157:1:o;3719:316::-;3807:6;3815;3823;3876:2;3864:9;3855:7;3851:23;3847:32;3844:2;;;3897:6;3889;3882:22;3844:2;3931:9;3925:16;3915:26;;3981:2;3970:9;3966:18;3960:25;3950:35;;4025:2;4014:9;4010:18;4004:25;3994:35;;3834:201;;;;;:::o;4040:257::-;4081:3;4119:5;4113:12;4146:6;4141:3;4134:19;4162:63;4218:6;4211:4;4206:3;4202:14;4195:4;4188:5;4184:16;4162:63;:::i;:::-;4279:2;4258:15;-1:-1:-1;;4254:29:1;4245:39;;;;4286:4;4241:50;;4089:208;-1:-1:-1;;4089:208:1:o;4302:274::-;4431:3;4469:6;4463:13;4485:53;4531:6;4526:3;4519:4;4511:6;4507:17;4485:53;:::i;:::-;4554:16;;;;;4439:137;-1:-1:-1;;4439:137:1:o;6334:217::-;6481:2;6470:9;6463:21;6444:4;6501:44;6541:2;6530:9;6526:18;6518:6;6501:44;:::i;7455:335::-;7657:2;7639:21;;;7696:2;7676:18;;;7669:30;-1:-1:-1;;;7730:2:1;7715:18;;7708:41;7781:2;7766:18;;7629:161::o;8483:338::-;8685:2;8667:21;;;8724:2;8704:18;;;8697:30;-1:-1:-1;;;8758:2:1;8743:18;;8736:44;8812:2;8797:18;;8657:164::o;9228:329::-;9430:2;9412:21;;;9469:1;9449:18;;;9442:29;-1:-1:-1;;;9502:2:1;9487:18;;9480:36;9548:2;9533:18;;9402:155::o;10331:332::-;10533:2;10515:21;;;10572:1;10552:18;;;10545:29;-1:-1:-1;;;10605:2:1;10590:18;;10583:39;10654:2;10639:18;;10505:158::o;11552:983::-;11814:4;11862:3;11851:9;11847:19;11893:6;11882:9;11875:25;11919:2;11957:6;11952:2;11941:9;11937:18;11930:34;12000:3;11995:2;11984:9;11980:18;11973:31;12024:6;12059;12053:13;12090:6;12082;12075:22;12128:3;12117:9;12113:19;12106:26;;12167:2;12159:6;12155:15;12141:29;;12188:4;12201:195;12215:6;12212:1;12209:13;12201:195;;;12280:13;;-1:-1:-1;;;;;12276:39:1;12264:52;;12371:15;;;;12336:12;;;;12312:1;12230:9;12201:195;;;-1:-1:-1;;;;;;;12452:32:1;;;;12447:2;12432:18;;12425:60;-1:-1:-1;;;12516:3:1;12501:19;12494:35;12413:3;11823:712;-1:-1:-1;;;11823:712:1:o;13143:275::-;13214:2;13208:9;13279:2;13260:13;;-1:-1:-1;;13256:27:1;13244:40;;13314:18;13299:34;;13335:22;;;13296:62;13293:2;;;13361:18;;:::i;:::-;13397:2;13390:22;13188:230;;-1:-1:-1;13188:230:1:o;13423:128::-;13463:3;13494:1;13490:6;13487:1;13484:13;13481:2;;;13500:18;;:::i;:::-;-1:-1:-1;13536:9:1;;13471:80::o;13556:217::-;13596:1;13622;13612:2;;-1:-1:-1;;;13647:31:1;;13701:4;13698:1;13691:15;13729:4;13654:1;13719:15;13612:2;-1:-1:-1;13758:9:1;;13602:171::o;13778:168::-;13818:7;13884:1;13880;13876:6;13872:14;13869:1;13866:21;13861:1;13854:9;13847:17;13843:45;13840:2;;;13891:18;;:::i;:::-;-1:-1:-1;13931:9:1;;13830:116::o;13951:125::-;13991:4;14019:1;14016;14013:8;14010:2;;;14024:18;;:::i;:::-;-1:-1:-1;14061:9:1;;14000:76::o;14081:258::-;14153:1;14163:113;14177:6;14174:1;14171:13;14163:113;;;14253:11;;;14247:18;14234:11;;;14227:39;14199:2;14192:10;14163:113;;;14294:6;14291:1;14288:13;14285:2;;;14329:1;14320:6;14315:3;14311:16;14304:27;14285:2;;14134:205;;;:::o;14344:127::-;14405:10;14400:3;14396:20;14393:1;14386:31;14436:4;14433:1;14426:15;14460:4;14457:1;14450:15;14476:127;14537:10;14532:3;14528:20;14525:1;14518:31;14568:4;14565:1;14558:15;14592:4;14589:1;14582:15;14608:131;-1:-1:-1;;;;;14683:31:1;;14673:42;;14663:2;;14729:1;14726;14719:12
Swarm Source
ipfs://d26dfb6ef1996a0cb13090aa538d762a0281e1e6e738dd3fe4de612ddb400c08
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.