ERC-20
Overview
Max Total Supply
94,318,065.147723 ERC20 ***
Holders
236
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 6 Decimals)
Balance
0.971025 ERC20 ***Value
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
VaultUSDC
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-31 */ // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @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 {ERC20Mintable}. * * 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; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: contracts/hardworkInterface/IStrategy.sol pragma solidity 0.5.16; interface IStrategy { function unsalvagableTokens(address tokens) external view returns (bool); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function vault() external view returns (address); function withdrawAllToVault() external; function withdrawToVault(uint256 amount) external; function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch() // should only be called by controller function salvage(address recipient, address token, uint256 amount) external; function doHardWork() external; function depositArbCheck() external view returns(bool); } // File: contracts/hardworkInterface/IController.sol pragma solidity 0.5.16; interface IController { // [Grey list] // An EOA can safely interact with the system no matter what. // If you're using Metamask, you're using an EOA. // Only smart contracts may be affected by this grey list. // // This contract will not be able to ban any EOA from the system // even if an EOA is being added to the greyList, he/she will still be able // to interact with the whole system as if nothing happened. // Only smart contracts will be affected by being added to the greyList. // This grey list is only used in Vault.sol, see the code there for reference function greyList(address _target) external returns(bool); function addVaultAndStrategy(address _vault, address _strategy) external; function doHardWork(address _vault) external; function hasVault(address _vault) external returns(bool); function salvage(address _token, uint256 amount) external; function salvageStrategy(address _strategy, address _token, uint256 amount) external; function notifyFee(address _underlying, uint256 fee) external; function profitSharingNumerator() external view returns (uint256); function profitSharingDenominator() external view returns (uint256); } // File: contracts/Storage.sol pragma solidity 0.5.16; contract Storage { address public governance; address public controller; constructor() public { governance = msg.sender; } modifier onlyGovernance() { require(isGovernance(msg.sender), "Not governance"); _; } function setGovernance(address _governance) public onlyGovernance { require(_governance != address(0), "new governance shouldn't be empty"); governance = _governance; } function setController(address _controller) public onlyGovernance { require(_controller != address(0), "new controller shouldn't be empty"); controller = _controller; } function isGovernance(address account) public view returns (bool) { return account == governance; } function isController(address account) public view returns (bool) { return account == controller; } } // File: contracts/Governable.sol pragma solidity 0.5.16; contract Governable { Storage public store; constructor(address _store) public { require(_store != address(0), "new storage shouldn't be empty"); store = Storage(_store); } modifier onlyGovernance() { require(store.isGovernance(msg.sender), "Not governance"); _; } function setStorage(address _store) public onlyGovernance { require(_store != address(0), "new storage shouldn't be empty"); store = Storage(_store); } function governance() public view returns (address) { return store.governance(); } } // File: contracts/hardworkInterface/IVault.sol pragma solidity 0.5.16; interface IVault { // the IERC20 part is the share function underlyingBalanceInVault() external view returns (uint256); function underlyingBalanceWithInvestment() external view returns (uint256); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function strategy() external view returns (address); function setStrategy(address _strategy) external; function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external; function deposit(uint256 amountWei) external; function depositFor(uint256 amountWei, address holder) external; function withdrawAll() external; function withdraw(uint256 numberOfShares) external; function getPricePerFullShare() external view returns (uint256); function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256); // hard work should be callable only by the controller (by the hard worker) or by governance function doHardWork() external; function rebalance() external; } // File: contracts/Controllable.sol pragma solidity 0.5.16; contract Controllable is Governable { constructor(address _storage) Governable(_storage) public { } modifier onlyController() { require(store.isController(msg.sender), "Not a controller"); _; } modifier onlyControllerOrGovernance(){ require((store.isController(msg.sender) || store.isGovernance(msg.sender)), "The caller must be controller or governance"); _; } function controller() public view returns (address) { return store.controller(); } } // File: contracts/Vault.sol pragma solidity 0.5.16; contract Vault is ERC20, ERC20Detailed, IVault, Controllable { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; event Withdraw(address indexed beneficiary, uint256 amount); event Deposit(address indexed beneficiary, uint256 amount); event Invest(uint256 amount); IStrategy public strategy; IERC20 public underlying; uint256 public underlyingUnit; mapping(address => uint256) public contributions; mapping(address => uint256) public withdrawals; uint256 public vaultFractionToInvestNumerator; uint256 public vaultFractionToInvestDenominator; constructor(address _storage, address _underlying, uint256 _toInvestNumerator, uint256 _toInvestDenominator ) ERC20Detailed( string(abi.encodePacked("FARM_", ERC20Detailed(_underlying).symbol())), string(abi.encodePacked("f", ERC20Detailed(_underlying).symbol())), ERC20Detailed(_underlying).decimals() ) Controllable(_storage) public { underlying = IERC20(_underlying); require(_toInvestNumerator <= _toInvestDenominator, "cannot invest more than 100%"); require(_toInvestDenominator != 0, "cannot divide by 0"); vaultFractionToInvestDenominator = _toInvestDenominator; vaultFractionToInvestNumerator = _toInvestNumerator; underlyingUnit = 10 ** uint256(ERC20Detailed(address(underlying)).decimals()); } modifier whenStrategyDefined() { require(address(strategy) != address(0), "Strategy must be defined"); _; } // Only smart contracts will be affected by this modifier modifier defense() { require( (msg.sender == tx.origin) || // If it is a normal user and not smart contract, // then the requirement will pass !IController(controller()).greyList(msg.sender), // If it is a smart contract, then "This smart contract has been grey listed" // make sure that it is not on our greyList. ); _; } /** * Chooses the best strategy and re-invests. If the strategy did not change, it just calls * doHardWork on the current strategy. Call this through controller to claim hard rewards. */ function doHardWork() whenStrategyDefined onlyControllerOrGovernance external { // ensure that new funds are invested too invest(); strategy.doHardWork(); } /* * Returns the cash balance across all users in this contract. */ function underlyingBalanceInVault() view public returns (uint256) { return underlying.balanceOf(address(this)); } /* Returns the current underlying (e.g., DAI's) balance together with * the invested amount (if DAI is invested elsewhere by the strategy). */ function underlyingBalanceWithInvestment() view public returns (uint256) { if (address(strategy) == address(0)) { // initial state, when not set return underlyingBalanceInVault(); } return underlyingBalanceInVault().add(strategy.investedUnderlyingBalance()); } /* * Allows for getting the total contributions ever made. */ function getContributions(address holder) view public returns (uint256) { return contributions[holder]; } /* * Allows for getting the total withdrawals ever made. */ function getWithdrawals(address holder) view public returns (uint256) { return withdrawals[holder]; } function getPricePerFullShare() public view returns (uint256) { return totalSupply() == 0 ? underlyingUnit : underlyingUnit.mul(underlyingBalanceWithInvestment()).div(totalSupply()); } /* get the user's share (in underlying) */ function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256) { if (totalSupply() == 0) { return 0; } return underlyingBalanceWithInvestment() .mul(balanceOf(holder)) .div(totalSupply()); } function setStrategy(address _strategy) public onlyControllerOrGovernance { require(_strategy != address(0), "new _strategy cannot be empty"); require(IStrategy(_strategy).underlying() == address(underlying), "Vault underlying must match Strategy underlying"); require(IStrategy(_strategy).vault() == address(this), "the strategy does not belong to this vault"); if (address(_strategy) != address(strategy)) { if (address(strategy) != address(0)) { // if the original strategy (no underscore) is defined underlying.safeApprove(address(strategy), 0); strategy.withdrawAllToVault(); } strategy = IStrategy(_strategy); underlying.safeApprove(address(strategy), 0); underlying.safeApprove(address(strategy), uint256(~0)); } } function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external onlyGovernance { require(denominator > 0, "denominator must be greater than 0"); require(numerator < denominator, "denominator must be greater than numerator"); vaultFractionToInvestNumerator = numerator; vaultFractionToInvestDenominator = denominator; } function rebalance() external onlyControllerOrGovernance { withdrawAll(); invest(); } function availableToInvestOut() public view returns (uint256) { uint256 wantInvestInTotal = underlyingBalanceWithInvestment() .mul(vaultFractionToInvestNumerator) .div(vaultFractionToInvestDenominator); uint256 alreadyInvested = strategy.investedUnderlyingBalance(); if (alreadyInvested >= wantInvestInTotal) { return 0; } else { uint256 remainingToInvest = wantInvestInTotal.sub(alreadyInvested); return remainingToInvest <= underlyingBalanceInVault() // TODO: we think that the "else" branch of the ternary operation is not // going to get hit ? remainingToInvest : underlyingBalanceInVault(); } } function invest() internal whenStrategyDefined { uint256 availableAmount = availableToInvestOut(); if (availableAmount > 0) { underlying.safeTransfer(address(strategy), availableAmount); emit Invest(availableAmount); } } /* * Allows for depositing the underlying asset in exchange for shares. * Approval is assumed. */ function deposit(uint256 amount) external defense { _deposit(amount, msg.sender, msg.sender); } /* * Allows for depositing the underlying asset in exchange for shares * assigned to the holder. * This facilitates depositing for someone else (using DepositHelper) */ function depositFor(uint256 amount, address holder) public defense { _deposit(amount, msg.sender, holder); } function withdrawAll() public onlyControllerOrGovernance whenStrategyDefined { strategy.withdrawAllToVault(); } function withdraw(uint256 numberOfShares) external { require(totalSupply() > 0, "Vault has no shares"); require(numberOfShares > 0, "numberOfShares must be greater than 0"); uint256 totalSupply = totalSupply(); _burn(msg.sender, numberOfShares); uint256 underlyingAmountToWithdraw = underlyingBalanceWithInvestment() .mul(numberOfShares) .div(totalSupply); if (underlyingAmountToWithdraw > underlyingBalanceInVault()) { // withdraw everything from the strategy to accurately check the share value if (numberOfShares == totalSupply) { strategy.withdrawAllToVault(); } else { uint256 missing = underlyingAmountToWithdraw.sub(underlyingBalanceInVault()); strategy.withdrawToVault(missing); } // recalculate to improve accuracy underlyingAmountToWithdraw = Math.min(underlyingBalanceWithInvestment() .mul(numberOfShares) .div(totalSupply), underlyingBalanceInVault()); } underlying.safeTransfer(msg.sender, underlyingAmountToWithdraw); // update the withdrawal amount for the holder withdrawals[msg.sender] = withdrawals[msg.sender].add(underlyingAmountToWithdraw); emit Withdraw(msg.sender, underlyingAmountToWithdraw); } function _deposit(uint256 amount, address sender, address beneficiary) internal { require(amount > 0, "Cannot deposit 0"); require(beneficiary != address(0), "holder must be defined"); if (address(strategy) != address(0)) { require(strategy.depositArbCheck(), "Too much arb"); } /* todo: Potentially exploitable with a flashloan if strategy under-reports the value. */ uint256 toMint = totalSupply() == 0 ? amount : amount.mul(totalSupply()).div(underlyingBalanceWithInvestment()); _mint(beneficiary, toMint); underlying.safeTransferFrom(sender, address(this), amount); // update the contribution amount for the beneficiary contributions[beneficiary] = contributions[beneficiary].add(amount); emit Deposit(beneficiary, amount); } } // File: contracts/vaults/VaultUSDC.sol pragma solidity 0.5.16; contract VaultUSDC is Vault { constructor(address _controller, address _underlying, uint256 _toInvestNumerator, uint256 _toInvestDenominator ) Vault( _controller, _underlying, _toInvestNumerator, _toInvestDenominator ) public { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_toInvestNumerator","type":"uint256"},{"internalType":"uint256","name":"_toInvestDenominator","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Invest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"availableToInvestOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"depositFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doHardWork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getContributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_store","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setVaultFractionToInvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"store","outputs":[{"internalType":"contract Storage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategy","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceInVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceWithInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"underlyingBalanceWithInvestmentForHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numberOfShares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200343138038062003431833981810160405260808110156200003757600080fd5b508051602082015160408084015160609094015181516395d89b4160e01b815291519394929390918591859185918591859182916001600160a01b038716916395d89b4191600480820192600092909190829003018186803b1580156200009d57600080fd5b505afa158015620000b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620000dc57600080fd5b8101908080516040519392919084640100000000821115620000fd57600080fd5b9083019060208201858111156200011357600080fd5b82516401000000008111828201881017156200012e57600080fd5b82525081516020918201929091019080838360005b838110156200015d57818101518382015260200162000143565b50505050905090810190601f1680156200018b5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080644641524d5f60d81b81525060050182805190602001908083835b60208310620001d65780518252601f199092019160209182019101620001b5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156200024457600080fd5b505afa15801562000259573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200028357600080fd5b8101908080516040519392919084640100000000821115620002a457600080fd5b908301906020820185811115620002ba57600080fd5b8251640100000000811182820188101715620002d557600080fd5b82525081516020918201929091019080838360005b8381101562000304578181015183820152602001620002ea565b50505050905090810190601f168015620003325780820380516001836020036101000a031916815260200191505b506040525050506040516020018080603360f91b81525060010182805190602001908083835b60208310620003795780518252601f19909201916020918201910162000358565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e757600080fd5b505afa158015620003fc573d6000803e3d6000fd5b505050506040513d60208110156200041357600080fd5b505182516200042a90600390602086019062000620565b5081516200044090600490602085019062000620565b506005805460ff191660ff9290921691909117905550506001600160a01b038116620004b3576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b60058054610100600160a81b0319166101006001600160a01b0393841602179055600780546001600160a01b031916918616919091179055508082111562000542576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b806200058a576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b600c819055600b8290556007546040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015620005da57600080fd5b505afa158015620005ef573d6000803e3d6000fd5b505050506040513d60208110156200060657600080fd5b505160ff16600a0a60085550620006c59650505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200066357805160ff191683800117855562000693565b8280016001018555821562000693579182015b828111156200069357825182559160200191906001019062000676565b50620006a1929150620006a5565b5090565b620006c291905b80821115620006a15760008155600101620006ac565b90565b612d5c80620006d56000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806370a0823111610130578063a457c2d7116100b8578063b6b55f251161007c578063b6b55f25146105fd578063c2baf3561461061a578063dd62ed3e14610622578063f2768c1e14610650578063f77c47911461065857610227565b8063a457c2d714610572578063a5b1a24d1461059e578063a8c62e76146105c1578063a9059cbb146105c9578063b592c390146105f557610227565b8063853828b6116100ff578063853828b61461050e5780638cb1d67f146105165780639137c1a71461053c57806395d89b4114610562578063975057e71461056a57610227565b806370a08231146104b257806377c7b8fc146104d85780637a9262a2146104e05780637d7c2a1c1461050657610227565b806339509351116101b35780634af1758b116101825780634af1758b1461046e5780634fa5d8541461047657806353ceb01c1461047e5780635aa6e675146104865780636f307dc3146104aa57610227565b806339509351146103d05780633a2b643a146103fc5780633f19d0431461042257806342e94c901461044857610227565b806323b872dd116101fa57806323b872dd1461030b5780632e1a7d4d14610341578063313ce5671461036057806333a100ca1461037e57806336efd16f146103a457610227565b806306fdde031461022c578063095ea7b3146102a957806318160ddd146102e95780631bf8e7be14610303575b600080fd5b610234610660565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360408110156102bf57600080fd5b506001600160a01b0381351690602001356106f7565b604080519115158252519081900360200190f35b6102f1610715565b60408051918252519081900360200190f35b6102f161071b565b6102d56004803603606081101561032157600080fd5b506001600160a01b038135811691602081013590911690604001356107c8565b61035e6004803603602081101561035757600080fd5b5035610855565b005b610368610ade565b6040805160ff9092168252519081900360200190f35b61035e6004803603602081101561039457600080fd5b50356001600160a01b0316610ae7565b61035e600480360360408110156103ba57600080fd5b50803590602001356001600160a01b0316610ef5565b6102d5600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610fd5565b6102f16004803603602081101561041257600080fd5b50356001600160a01b0316611029565b6102f16004803603602081101561043857600080fd5b50356001600160a01b0316611048565b6102f16004803603602081101561045e57600080fd5b50356001600160a01b0316611063565b6102f1611075565b61035e61107b565b6102f161127d565b61048e611283565b604080516001600160a01b039092168252519081900360200190f35b61048e611304565b6102f1600480360360208110156104c857600080fd5b50356001600160a01b0316611313565b6102f161132e565b6102f1600480360360208110156104f657600080fd5b50356001600160a01b031661136e565b61035e611380565b61035e6114ca565b6102f16004803603602081101561052c57600080fd5b50356001600160a01b03166116aa565b61035e6004803603602081101561055257600080fd5b50356001600160a01b03166116df565b61023461181f565b61048e611880565b6102d56004803603604081101561058857600080fd5b506001600160a01b038135169060200135611894565b61035e600480360360408110156105b457600080fd5b5080359060200135611902565b61048e611a47565b6102d5600480360360408110156105df57600080fd5b506001600160a01b038135169060200135611a56565b6102f1611a6a565b61035e6004803603602081101561061357600080fd5b5035611b4f565b6102f1611c2b565b6102f16004803603604081101561063857600080fd5b506001600160a01b0381358116916020013516611c76565b6102f1611ca1565b61048e611ca7565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b505050505090505b90565b600061070b610704611cf7565b8484611cfb565b5060015b92915050565b60025490565b6006546000906001600160a01b031661073d57610736611c2b565b90506106f4565b600654604080516322e80f2560e11b815290516107c3926001600160a01b0316916345d01e4a916004808301926020929190829003018186803b15801561078357600080fd5b505afa158015610797573d6000803e3d6000fd5b505050506040513d60208110156107ad57600080fd5b50516107b7611c2b565b9063ffffffff611de716565b905090565b60006107d5848484611e48565b61084b846107e1611cf7565b61084685604051806060016040528060288152602001612bec602891396001600160a01b038a1660009081526001602052604081209061081f611cf7565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611fa416565b611cfb565b5060019392505050565b600061085f610715565b116108a7576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b600081116108e65760405162461bcd60e51b8152600401808060200182810382526025815260200180612c146025913960400191505060405180910390fd5b60006108f0610715565b90506108fc338361203b565b60006109268261091a8561090e61071b565b9063ffffffff61213716565b9063ffffffff61219016565b9050610930611c2b565b811115610a5357818314156109ac57600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b50505050610a30565b60006109c66109b9611c2b565b839063ffffffff6121d216565b600654604080516319d1885d60e31b81526004810184905290519293506001600160a01b039091169163ce8c42e89160248082019260009290919082900301818387803b158015610a1657600080fd5b505af1158015610a2a573d6000803e3d6000fd5b50505050505b610a50610a438361091a8661090e61071b565b610a4b611c2b565b612214565b90505b600754610a70906001600160a01b0316338363ffffffff61222a16565b336000908152600a6020526040902054610a90908263ffffffff611de716565b336000818152600a6020908152604091829020939093558051848152905191927f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436492918290030190a2505050565b60055460ff1690565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b158015610b3657600080fd5b505afa158015610b4a573d6000803e3d6000fd5b505050506040513d6020811015610b6057600080fd5b505180610be45750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d6020811015610be157600080fd5b50515b610c1f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6001600160a01b038116610c7a576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b60075460408051636f307dc360e01b815290516001600160a01b0392831692841691636f307dc3916004808301926020929190829003018186803b158015610cc157600080fd5b505afa158015610cd5573d6000803e3d6000fd5b505050506040513d6020811015610ceb57600080fd5b50516001600160a01b031614610d325760405162461bcd60e51b815260040180806020018281038252602f815260200180612b9c602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7557600080fd5b505afa158015610d89573d6000803e3d6000fd5b505050506040513d6020811015610d9f57600080fd5b50516001600160a01b031614610de65760405162461bcd60e51b815260040180806020018281038252602a815260200180612b24602a913960400191505060405180910390fd5b6006546001600160a01b03828116911614610ef2576006546001600160a01b031615610e9957600654600754610e30916001600160a01b039182169116600063ffffffff61228116565b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e8057600080fd5b505af1158015610e94573d6000803e3d6000fd5b505050505b600680546001600160a01b0319166001600160a01b038381169190911791829055600754610ecd9290821691166000612281565b600654600754610ef2916001600160a01b03918216911660001963ffffffff61228116565b50565b33321480610f8b5750610f06611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d6020811015610f8757600080fd5b5051155b610fc65760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610fd1823383612394565b5050565b600061070b610fe2611cf7565b846108468560016000610ff3611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611de716565b6001600160a01b0381166000908152600a60205260409020545b919050565b6001600160a01b031660009081526009602052604090205490565b60096020526000908152604090205481565b600b5481565b6006546001600160a01b03166110d3576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561112257600080fd5b505afa158015611136573d6000803e3d6000fd5b505050506040513d602081101561114c57600080fd5b5051806111d05750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50515b61120b5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6112136125df565b600660009054906101000a90046001600160a01b03166001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b50505050565b60085481565b6000600560019054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b5051905090565b6007546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6000611338610715565b1561136757611362611348610715565b61091a61135361071b565b6008549063ffffffff61213716565b6107c3565b5060085490565b600a6020526000908152604090205481565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d60208110156113f957600080fd5b50518061147d5750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b50515b6114b85760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6114c06114ca565b6114c86125df565b565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b5051806115c75750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b50515b6116025760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6006546001600160a01b031661165a576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b60006116b4610715565b6116c057506000611043565b61070f6116cb610715565b61091a6116d785611313565b61090e61071b565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b505161179c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166117f7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b60055461010090046001600160a01b031681565b600061070b6118a1611cf7565b8461084685604051806060016040528060258152602001612d0360259139600160006118cb611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611fa416565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50516119bf576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116119fe5760405162461bcd60e51b8152600401808060200182810382526022815260200180612a946022913960400191505060405180910390fd5b808210611a3c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612afa602a913960400191505060405180910390fd5b600b91909155600c55565b6006546001600160a01b031681565b600061070b611a63611cf7565b8484611e48565b600080611a81600c5461091a600b5461090e61071b565b90506000600660009054906101000a90046001600160a01b03166001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d6020811015611afd57600080fd5b50519050818110611b13576000925050506106f4565b6000611b25838363ffffffff6121d216565b9050611b2f611c2b565b811115611b4357611b3e611c2b565b611b45565b805b93505050506106f4565b33321480611be55750611b60611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611bb757600080fd5b505af1158015611bcb573d6000803e3d6000fd5b505050506040513d6020811015611be157600080fd5b5051155b611c205760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610ef2813333612394565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156112d357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5481565b6000600560019054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b3390565b6001600160a01b038316611d405760405162461bcd60e51b8152600401808060200182810382526024815260200180612c7f6024913960400191505060405180910390fd5b6001600160a01b038216611d855760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad86022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015611e41576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316611e8d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c5a6025913960400191505060405180910390fd5b6001600160a01b038216611ed25760405162461bcd60e51b8152600401808060200182810382526023815260200180612a716023913960400191505060405180910390fd5b611f1581604051806060016040528060268152602001612b4e602691396001600160a01b038616600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f4a908263ffffffff611de716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156120335760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166120805760405162461bcd60e51b8152600401808060200182810382526021815260200180612c396021913960400191505060405180910390fd5b6120c381604051806060016040528060228152602001612ab6602291396001600160a01b038516600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b0383166000908152602081905260409020556002546120ef908263ffffffff6121d216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826121465750600061070f565b8282028284828161215357fe5b0414611e415760405162461bcd60e51b8152600401808060200182810382526021815260200180612bcb6021913960400191505060405180910390fd5b6000611e4183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126a2565b6000611e4183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fa4565b60008183106122235781611e41565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261227c908490612707565b505050565b801580612307575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156122d957600080fd5b505afa1580156122ed573d6000803e3d6000fd5b505050506040513d602081101561230357600080fd5b5051155b6123425760405162461bcd60e51b8152600401808060200182810382526036815260200180612ccd6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261227c908490612707565b600083116123dc576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b038116612430576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b6006546001600160a01b0316156124fb57600660009054906101000a90046001600160a01b03166001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561248f57600080fd5b505afa1580156124a3573d6000803e3d6000fd5b505050506040513d60208110156124b957600080fd5b50516124fb576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000612505610715565b156125325761252d61251561071b565b61091a612520610715565b879063ffffffff61213716565b612534565b835b905061254082826128bf565b60075461255e906001600160a01b031684308763ffffffff6129af16565b6001600160a01b038216600090815260096020526040902054612587908563ffffffff611de716565b6001600160a01b038316600081815260096020908152604091829020939093558051878152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a250505050565b6006546001600160a01b0316612637576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000612641611a6a565b90508015610ef25760065460075461266c916001600160a01b0391821691168363ffffffff61222a16565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b600081836126f15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ff8578181015183820152602001611fe0565b5060008385816126fd57fe5b0495945050505050565b612719826001600160a01b0316612a09565b61276a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081612866576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112775780806020019051602081101561288257600080fd5b50516112775760405162461bcd60e51b815260040180806020018281038252602a815260200180612ca3602a913960400191505060405180910390fd5b6001600160a01b03821661291a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461292d908263ffffffff611de716565b6002556001600160a01b038216600090815260208190526040902054612959908263ffffffff611de716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611277908590612707565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612a3d57508115155b94935050505056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e206e756d657261746f7274686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63656e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582074f422220e065f367bed473695fde1cd637a4794edf71401ab87c97b9440956564736f6c63430005100032000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000023280000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c806370a0823111610130578063a457c2d7116100b8578063b6b55f251161007c578063b6b55f25146105fd578063c2baf3561461061a578063dd62ed3e14610622578063f2768c1e14610650578063f77c47911461065857610227565b8063a457c2d714610572578063a5b1a24d1461059e578063a8c62e76146105c1578063a9059cbb146105c9578063b592c390146105f557610227565b8063853828b6116100ff578063853828b61461050e5780638cb1d67f146105165780639137c1a71461053c57806395d89b4114610562578063975057e71461056a57610227565b806370a08231146104b257806377c7b8fc146104d85780637a9262a2146104e05780637d7c2a1c1461050657610227565b806339509351116101b35780634af1758b116101825780634af1758b1461046e5780634fa5d8541461047657806353ceb01c1461047e5780635aa6e675146104865780636f307dc3146104aa57610227565b806339509351146103d05780633a2b643a146103fc5780633f19d0431461042257806342e94c901461044857610227565b806323b872dd116101fa57806323b872dd1461030b5780632e1a7d4d14610341578063313ce5671461036057806333a100ca1461037e57806336efd16f146103a457610227565b806306fdde031461022c578063095ea7b3146102a957806318160ddd146102e95780631bf8e7be14610303575b600080fd5b610234610660565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360408110156102bf57600080fd5b506001600160a01b0381351690602001356106f7565b604080519115158252519081900360200190f35b6102f1610715565b60408051918252519081900360200190f35b6102f161071b565b6102d56004803603606081101561032157600080fd5b506001600160a01b038135811691602081013590911690604001356107c8565b61035e6004803603602081101561035757600080fd5b5035610855565b005b610368610ade565b6040805160ff9092168252519081900360200190f35b61035e6004803603602081101561039457600080fd5b50356001600160a01b0316610ae7565b61035e600480360360408110156103ba57600080fd5b50803590602001356001600160a01b0316610ef5565b6102d5600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610fd5565b6102f16004803603602081101561041257600080fd5b50356001600160a01b0316611029565b6102f16004803603602081101561043857600080fd5b50356001600160a01b0316611048565b6102f16004803603602081101561045e57600080fd5b50356001600160a01b0316611063565b6102f1611075565b61035e61107b565b6102f161127d565b61048e611283565b604080516001600160a01b039092168252519081900360200190f35b61048e611304565b6102f1600480360360208110156104c857600080fd5b50356001600160a01b0316611313565b6102f161132e565b6102f1600480360360208110156104f657600080fd5b50356001600160a01b031661136e565b61035e611380565b61035e6114ca565b6102f16004803603602081101561052c57600080fd5b50356001600160a01b03166116aa565b61035e6004803603602081101561055257600080fd5b50356001600160a01b03166116df565b61023461181f565b61048e611880565b6102d56004803603604081101561058857600080fd5b506001600160a01b038135169060200135611894565b61035e600480360360408110156105b457600080fd5b5080359060200135611902565b61048e611a47565b6102d5600480360360408110156105df57600080fd5b506001600160a01b038135169060200135611a56565b6102f1611a6a565b61035e6004803603602081101561061357600080fd5b5035611b4f565b6102f1611c2b565b6102f16004803603604081101561063857600080fd5b506001600160a01b0381358116916020013516611c76565b6102f1611ca1565b61048e611ca7565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b505050505090505b90565b600061070b610704611cf7565b8484611cfb565b5060015b92915050565b60025490565b6006546000906001600160a01b031661073d57610736611c2b565b90506106f4565b600654604080516322e80f2560e11b815290516107c3926001600160a01b0316916345d01e4a916004808301926020929190829003018186803b15801561078357600080fd5b505afa158015610797573d6000803e3d6000fd5b505050506040513d60208110156107ad57600080fd5b50516107b7611c2b565b9063ffffffff611de716565b905090565b60006107d5848484611e48565b61084b846107e1611cf7565b61084685604051806060016040528060288152602001612bec602891396001600160a01b038a1660009081526001602052604081209061081f611cf7565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611fa416565b611cfb565b5060019392505050565b600061085f610715565b116108a7576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b600081116108e65760405162461bcd60e51b8152600401808060200182810382526025815260200180612c146025913960400191505060405180910390fd5b60006108f0610715565b90506108fc338361203b565b60006109268261091a8561090e61071b565b9063ffffffff61213716565b9063ffffffff61219016565b9050610930611c2b565b811115610a5357818314156109ac57600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b50505050610a30565b60006109c66109b9611c2b565b839063ffffffff6121d216565b600654604080516319d1885d60e31b81526004810184905290519293506001600160a01b039091169163ce8c42e89160248082019260009290919082900301818387803b158015610a1657600080fd5b505af1158015610a2a573d6000803e3d6000fd5b50505050505b610a50610a438361091a8661090e61071b565b610a4b611c2b565b612214565b90505b600754610a70906001600160a01b0316338363ffffffff61222a16565b336000908152600a6020526040902054610a90908263ffffffff611de716565b336000818152600a6020908152604091829020939093558051848152905191927f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436492918290030190a2505050565b60055460ff1690565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b158015610b3657600080fd5b505afa158015610b4a573d6000803e3d6000fd5b505050506040513d6020811015610b6057600080fd5b505180610be45750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d6020811015610be157600080fd5b50515b610c1f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6001600160a01b038116610c7a576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b60075460408051636f307dc360e01b815290516001600160a01b0392831692841691636f307dc3916004808301926020929190829003018186803b158015610cc157600080fd5b505afa158015610cd5573d6000803e3d6000fd5b505050506040513d6020811015610ceb57600080fd5b50516001600160a01b031614610d325760405162461bcd60e51b815260040180806020018281038252602f815260200180612b9c602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7557600080fd5b505afa158015610d89573d6000803e3d6000fd5b505050506040513d6020811015610d9f57600080fd5b50516001600160a01b031614610de65760405162461bcd60e51b815260040180806020018281038252602a815260200180612b24602a913960400191505060405180910390fd5b6006546001600160a01b03828116911614610ef2576006546001600160a01b031615610e9957600654600754610e30916001600160a01b039182169116600063ffffffff61228116565b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e8057600080fd5b505af1158015610e94573d6000803e3d6000fd5b505050505b600680546001600160a01b0319166001600160a01b038381169190911791829055600754610ecd9290821691166000612281565b600654600754610ef2916001600160a01b03918216911660001963ffffffff61228116565b50565b33321480610f8b5750610f06611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d6020811015610f8757600080fd5b5051155b610fc65760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610fd1823383612394565b5050565b600061070b610fe2611cf7565b846108468560016000610ff3611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611de716565b6001600160a01b0381166000908152600a60205260409020545b919050565b6001600160a01b031660009081526009602052604090205490565b60096020526000908152604090205481565b600b5481565b6006546001600160a01b03166110d3576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561112257600080fd5b505afa158015611136573d6000803e3d6000fd5b505050506040513d602081101561114c57600080fd5b5051806111d05750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50515b61120b5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6112136125df565b600660009054906101000a90046001600160a01b03166001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b50505050565b60085481565b6000600560019054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b5051905090565b6007546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6000611338610715565b1561136757611362611348610715565b61091a61135361071b565b6008549063ffffffff61213716565b6107c3565b5060085490565b600a6020526000908152604090205481565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d60208110156113f957600080fd5b50518061147d5750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b50515b6114b85760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6114c06114ca565b6114c86125df565b565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b5051806115c75750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b50515b6116025760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6006546001600160a01b031661165a576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b60006116b4610715565b6116c057506000611043565b61070f6116cb610715565b61091a6116d785611313565b61090e61071b565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b505161179c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166117f7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b60055461010090046001600160a01b031681565b600061070b6118a1611cf7565b8461084685604051806060016040528060258152602001612d0360259139600160006118cb611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611fa416565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50516119bf576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116119fe5760405162461bcd60e51b8152600401808060200182810382526022815260200180612a946022913960400191505060405180910390fd5b808210611a3c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612afa602a913960400191505060405180910390fd5b600b91909155600c55565b6006546001600160a01b031681565b600061070b611a63611cf7565b8484611e48565b600080611a81600c5461091a600b5461090e61071b565b90506000600660009054906101000a90046001600160a01b03166001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d6020811015611afd57600080fd5b50519050818110611b13576000925050506106f4565b6000611b25838363ffffffff6121d216565b9050611b2f611c2b565b811115611b4357611b3e611c2b565b611b45565b805b93505050506106f4565b33321480611be55750611b60611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611bb757600080fd5b505af1158015611bcb573d6000803e3d6000fd5b505050506040513d6020811015611be157600080fd5b5051155b611c205760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610ef2813333612394565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156112d357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5481565b6000600560019054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b3390565b6001600160a01b038316611d405760405162461bcd60e51b8152600401808060200182810382526024815260200180612c7f6024913960400191505060405180910390fd5b6001600160a01b038216611d855760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad86022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015611e41576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316611e8d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c5a6025913960400191505060405180910390fd5b6001600160a01b038216611ed25760405162461bcd60e51b8152600401808060200182810382526023815260200180612a716023913960400191505060405180910390fd5b611f1581604051806060016040528060268152602001612b4e602691396001600160a01b038616600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f4a908263ffffffff611de716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156120335760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166120805760405162461bcd60e51b8152600401808060200182810382526021815260200180612c396021913960400191505060405180910390fd5b6120c381604051806060016040528060228152602001612ab6602291396001600160a01b038516600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b0383166000908152602081905260409020556002546120ef908263ffffffff6121d216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826121465750600061070f565b8282028284828161215357fe5b0414611e415760405162461bcd60e51b8152600401808060200182810382526021815260200180612bcb6021913960400191505060405180910390fd5b6000611e4183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126a2565b6000611e4183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fa4565b60008183106122235781611e41565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261227c908490612707565b505050565b801580612307575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156122d957600080fd5b505afa1580156122ed573d6000803e3d6000fd5b505050506040513d602081101561230357600080fd5b5051155b6123425760405162461bcd60e51b8152600401808060200182810382526036815260200180612ccd6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261227c908490612707565b600083116123dc576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b038116612430576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b6006546001600160a01b0316156124fb57600660009054906101000a90046001600160a01b03166001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561248f57600080fd5b505afa1580156124a3573d6000803e3d6000fd5b505050506040513d60208110156124b957600080fd5b50516124fb576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000612505610715565b156125325761252d61251561071b565b61091a612520610715565b879063ffffffff61213716565b612534565b835b905061254082826128bf565b60075461255e906001600160a01b031684308763ffffffff6129af16565b6001600160a01b038216600090815260096020526040902054612587908563ffffffff611de716565b6001600160a01b038316600081815260096020908152604091829020939093558051878152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a250505050565b6006546001600160a01b0316612637576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000612641611a6a565b90508015610ef25760065460075461266c916001600160a01b0391821691168363ffffffff61222a16565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b600081836126f15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ff8578181015183820152602001611fe0565b5060008385816126fd57fe5b0495945050505050565b612719826001600160a01b0316612a09565b61276a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081612866576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112775780806020019051602081101561288257600080fd5b50516112775760405162461bcd60e51b815260040180806020018281038252602a815260200180612ca3602a913960400191505060405180910390fd5b6001600160a01b03821661291a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461292d908263ffffffff611de716565b6002556001600160a01b038216600090815260208190526040902054612959908263ffffffff611de716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611277908590612707565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612a3d57508115155b94935050505056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e206e756d657261746f7274686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63656e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582074f422220e065f367bed473695fde1cd637a4794edf71401ab87c97b9440956564736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000023280000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _controller (address): 0xc95CbE4ca30055c787CB784BE99D6a8494d0d197
Arg [1] : _underlying (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [2] : _toInvestNumerator (uint256): 9000
Arg [3] : _toInvestDenominator (uint256): 10000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002328
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode Sourcemap
42040:285:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42040:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26335:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26335:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19879:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19879:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18900:91;;;:::i;:::-;;;;;;;;;;;;;;;;35725:292;;;:::i;20503:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20503:304:0;;;;;;;;;;;;;;;;;:::i;39823:1293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39823:1293:0;;:::i;:::-;;27187:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36936:804;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36936:804:0;-1:-1:-1;;;;;36936:804:0;;:::i;39576:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39576:116:0;;;;;;-1:-1:-1;;;;;39576:116:0;;:::i;21216:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21216:210:0;;;;;;;;:::i;36282:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36282:109:0;-1:-1:-1;;;;;36282:109:0;;:::i;36094:113::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36094:113:0;-1:-1:-1;;;;;36094:113:0;;:::i;33373:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33373:48:0;-1:-1:-1;;;;;33373:48:0;;:::i;33479:45::-;;;:::i;35188:174::-;;;:::i;33337:29::-;;;:::i;30937:90::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30937:90:0;;;;;;;;;;;;;;33306:24;;;:::i;19054:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19054:110:0;-1:-1:-1;;;;;19054:110:0;;:::i;36397:210::-;;;:::i;33426:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33426:46:0;-1:-1:-1;;;;;33426:46:0;;:::i;38112:98::-;;;:::i;39698:119::-;;;:::i;36662:268::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36662:268:0;-1:-1:-1;;;;;36662:268:0;;:::i;30767:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30767:164:0;-1:-1:-1;;;;;30767:164:0;;:::i;26537:87::-;;;:::i;30483:20::-;;;:::i;21929:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21929:261:0;;;;;;;;:::i;37746:360::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37746:360:0;;;;;;;:::i;33276:25::-;;;:::i;19377:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19377:158:0;;;;;;;;:::i;38216:693::-;;;:::i;39283:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39283:103:0;;:::i;35445:121::-;;;:::i;19598:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19598:134:0;;;;;;;;;;:::i;33529:47::-;;;:::i;32774:90::-;;;:::i;26335:83::-;26405:5;26398:12;;;;;;;;-1:-1:-1;;26398:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26372:13;;26398:12;;26405:5;;26398:12;;26405:5;26398:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26335:83;;:::o;19879:152::-;19945:4;19962:39;19971:12;:10;:12::i;:::-;19985:7;19994:6;19962:8;:39::i;:::-;-1:-1:-1;20019:4:0;19879:152;;;;;:::o;18900:91::-;18971:12;;18900:91;:::o;35725:292::-;35817:8;;35789:7;;-1:-1:-1;;;;;35817:8:0;35805:125;;35896:26;:24;:26::i;:::-;35889:33;;;;35805:125;35974:8;;:36;;;-1:-1:-1;;;35974:36:0;;;;35943:68;;-1:-1:-1;;;;;35974:8:0;;:34;;:36;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;35974:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35974:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35974:36:0;35943:26;:24;:26::i;:::-;:30;:68;:30;:68;:::i;:::-;35936:75;;35725:292;:::o;20503:304::-;20592:4;20609:36;20619:6;20627:9;20638:6;20609:9;:36::i;:::-;20656:121;20665:6;20673:12;:10;:12::i;:::-;20687:89;20725:6;20687:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20687:19:0;;;;;;:11;:19;;;;;;20707:12;:10;:12::i;:::-;-1:-1:-1;;;;;20687:33:0;;;;;;;;;;;;-1:-1:-1;20687:33:0;;;:89;;:37;:89;:::i;:::-;20656:8;:121::i;:::-;-1:-1:-1;20795:4:0;20503:304;;;;;:::o;39823:1293::-;39905:1;39889:13;:11;:13::i;:::-;:17;39881:49;;;;;-1:-1:-1;;;39881:49:0;;;;;;;;;;;;-1:-1:-1;;;39881:49:0;;;;;;;;;;;;;;;39962:1;39945:14;:18;39937:68;;;;-1:-1:-1;;;39937:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40012:19;40034:13;:11;:13::i;:::-;40012:35;;40054:33;40060:10;40072:14;40054:5;:33::i;:::-;40096:34;40133:90;40211:11;40133:63;40181:14;40133:33;:31;:33::i;:::-;:47;:63;:47;:63;:::i;:::-;:77;:90;:77;:90;:::i;:::-;40096:127;;40265:26;:24;:26::i;:::-;40236;:55;40232:605;;;40408:11;40390:14;:29;40386:232;;;40432:8;;;;;;;;;-1:-1:-1;;;;;40432:8:0;-1:-1:-1;;;;;40432:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40432:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40432:29:0;;;;40386:232;;;40488:15;40506:58;40537:26;:24;:26::i;:::-;40506;;:58;:30;:58;:::i;:::-;40575:8;;:33;;;-1:-1:-1;;;40575:33:0;;;;;;;;;;40488:76;;-1:-1:-1;;;;;;40575:8:0;;;;:24;;:33;;;;;:8;;:33;;;;;;;;:8;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;40575:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40575:33:0;;;;40386:232;;40697:132;40706:94;40788:11;40706:65;40756:14;40706:33;:31;:33::i;:94::-;40802:26;:24;:26::i;:::-;40697:8;:132::i;:::-;40668:161;;40232:605;40845:10;;:63;;-1:-1:-1;;;;;40845:10:0;40869;40881:26;40845:63;:23;:63;:::i;:::-;41007:10;40995:23;;;;:11;:23;;;;;;:55;;41023:26;40995:55;:27;:55;:::i;:::-;40981:10;40969:23;;;;:11;:23;;;;;;;;;:81;;;;41062:48;;;;;;;40981:10;;41062:48;;;;;;;;;39823:1293;;;:::o;27187:83::-;27253:9;;;;27187:83;:::o;36936:804::-;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37025:23:0;;37017:65;;;;;-1:-1:-1;;;37017:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37142:10;;37097:33;;;-1:-1:-1;;;37097:33:0;;;;-1:-1:-1;;;;;37142:10:0;;;;37097:31;;;;;:33;;;;;;;;;;;;;;:31;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;37097:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37097:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37097:33:0;-1:-1:-1;;;;;37097:56:0;;37089:116;;;;-1:-1:-1;;;37089:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37260:4;-1:-1:-1;;;;;37220:45:0;37230:9;-1:-1:-1;;;;;37220:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37220:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37220:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37220:28:0;-1:-1:-1;;;;;37220:45:0;;37212:100;;;;-1:-1:-1;;;37212:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37355:8;;-1:-1:-1;;;;;37325:39:0;;;37355:8;;37325:39;37321:414;;37387:8;;-1:-1:-1;;;;;37387:8:0;37379:31;37375:197;;37509:8;;37478:10;;:44;;-1:-1:-1;;;;;37478:10:0;;;;37509:8;;37478:44;:22;:44;:::i;:::-;37533:8;;;;;;;;;-1:-1:-1;;;;;37533:8:0;-1:-1:-1;;;;;37533:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37533:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37533:29:0;;;;37375:197;37580:8;:31;;-1:-1:-1;;;;;;37580:31:0;-1:-1:-1;;;;;37580:31:0;;;;;;;;;;;37620:10;;:44;;:10;;;;37651:8;-1:-1:-1;37620:22:0;:44::i;:::-;37704:8;;37673:10;;:54;;-1:-1:-1;;;;;37673:10:0;;;;37704:8;-1:-1:-1;;37673:54:0;:22;:54;:::i;:::-;36936:804;:::o;39576:116::-;34598:10;34612:9;34598:23;;34597:233;;;34796:12;:10;:12::i;:::-;-1:-1:-1;;;;;34784:34:0;;34819:10;34784:46;;;;;;;;;;;;;-1:-1:-1;;;;;34784:46:0;-1:-1:-1;;;;;34784:46:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34784:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34784:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34784:46:0;34783:47;34597:233;34581:388;;;;-1:-1:-1;;;34581:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39650:36;39659:6;39667:10;39679:6;39650:8;:36::i;:::-;39576:116;;:::o;21216:210::-;21296:4;21313:83;21322:12;:10;:12::i;:::-;21336:7;21345:50;21384:10;21345:11;:25;21357:12;:10;:12::i;:::-;-1:-1:-1;;;;;21345:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21345:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;36282:109::-;-1:-1:-1;;;;;36366:19:0;;36343:7;36366:19;;;:11;:19;;;;;;36282:109;;;;:::o;36094:113::-;-1:-1:-1;;;;;36180:21:0;36157:7;36180:21;;;:13;:21;;;;;;;36094:113::o;33373:48::-;;;;;;;;;;;;;:::o;33479:45::-;;;;:::o;35188:174::-;34422:8;;-1:-1:-1;;;;;34422:8:0;34406:68;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;;;;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35320:8;:6;:8::i;:::-;35335;;;;;;;;;-1:-1:-1;;;;;35335:8:0;-1:-1:-1;;;;;35335:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35335:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35335:21:0;;;;35188:174::o;33337:29::-;;;;:::o;30937:90::-;30980:7;31003:5;;;;;;;;;-1:-1:-1;;;;;31003:5:0;-1:-1:-1;;;;;31003:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31003:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31003:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31003:18:0;;-1:-1:-1;30937:90:0;:::o;33306:24::-;;;-1:-1:-1;;;;;33306:24:0;;:::o;19054:110::-;-1:-1:-1;;;;;19138:18:0;19111:7;19138:18;;;;;;;;;;;;19054:110::o;36397:210::-;36450:7;36473:13;:11;:13::i;:::-;:18;:128;;36529:72;36587:13;:11;:13::i;:::-;36529:53;36548:33;:31;:33::i;:::-;36529:14;;;:53;:18;:53;:::i;:72::-;36473:128;;;-1:-1:-1;36503:14:0;;;36397:210::o;33426:46::-;;;;;;;;;;;;;:::o;38112:98::-;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38176:13;:11;:13::i;:::-;38196:8;:6;:8::i;:::-;38112:98::o;39698:119::-;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34422:8;;-1:-1:-1;;;;;34422:8:0;34406:68;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;;;;39782:8;;;;;;;;;-1:-1:-1;;;;;39782:8:0;-1:-1:-1;;;;;39782:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;36662:268:0;36751:7;36771:13;:11;:13::i;:::-;36767:49;;-1:-1:-1;36807:1:0;36800:8;;36767:49;36829:95;36910:13;:11;:13::i;:::-;36829:66;36877:17;36887:6;36877:9;:17::i;:::-;36829:33;:31;:33::i;30767:164::-;30698:5;;:30;;;-1:-1:-1;;;30698:30:0;;30717:10;30698:30;;;;;;:5;;;;-1:-1:-1;;;;;30698:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;30698:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30698:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30698:30:0;30690:57;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30840:20:0;;30832:63;;;;;-1:-1:-1;;;30832:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30902:5;:23;;-1:-1:-1;;;;;30902:23:0;;;;;-1:-1:-1;;;;;;30902:23:0;;;;;;;;;30767:164::o;26537:87::-;26609:7;26602:14;;;;;;;;-1:-1:-1;;26602:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26576:13;;26602:14;;26609:7;;26602:14;;26609:7;26602:14;;;;;;;;;;;;;;;;;;;;;;;;30483:20;;;;;;-1:-1:-1;;;;;30483:20:0;;:::o;21929:261::-;22014:4;22031:129;22040:12;:10;:12::i;:::-;22054:7;22063:96;22102:15;22063:96;;;;;;;;;;;;;;;;;:11;:25;22075:12;:10;:12::i;:::-;-1:-1:-1;;;;;22063:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;22063:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;37746:360::-;30698:5;;:30;;;-1:-1:-1;;;30698:30:0;;30717:10;30698:30;;;;;;:5;;;;-1:-1:-1;;;;;30698:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;30698:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30698:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30698:30:0;30690:57;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;;;;37873:1;37859:11;:15;37851:62;;;;-1:-1:-1;;;37851:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37940:11;37928:9;:23;37920:78;;;;-1:-1:-1;;;37920:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38005:30;:42;;;;38054:32;:46;37746:360::o;33276:25::-;;;-1:-1:-1;;;;;33276:25:0;;:::o;19377:158::-;19446:4;19463:42;19473:12;:10;:12::i;:::-;19487:9;19498:6;19463:9;:42::i;38216:693::-;38269:7;38285:25;38313:127;38407:32;;38313:79;38361:30;;38313:33;:31;:33::i;:127::-;38285:155;;38447:23;38473:8;;;;;;;;;-1:-1:-1;;;;;38473:8:0;-1:-1:-1;;;;;38473:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38473:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38473:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38473:36:0;;-1:-1:-1;38520:36:0;;;38516:388;;38574:1;38567:8;;;;;;38516:388;38598:25;38626:38;:17;38648:15;38626:38;:21;:38;:::i;:::-;38598:66;;38701:26;:24;:26::i;:::-;38680:17;:47;;:216;;38870:26;:24;:26::i;:::-;38680:216;;;38850:17;38680:216;38673:223;;;;;;;39283:103;34598:10;34612:9;34598:23;;34597:233;;;34796:12;:10;:12::i;:::-;-1:-1:-1;;;;;34784:34:0;;34819:10;34784:46;;;;;;;;;;;;;-1:-1:-1;;;;;34784:46:0;-1:-1:-1;;;;;34784:46:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34784:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34784:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34784:46:0;34783:47;34597:233;34581:388;;;;-1:-1:-1;;;34581:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39340:40;39349:6;39357:10;39369;39340:8;:40::i;35445:121::-;35525:10;;:35;;;-1:-1:-1;;;35525:35:0;;35554:4;35525:35;;;;;;35502:7;;-1:-1:-1;;;;;35525:10:0;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;5:2:-1;;;;30:1;27;20:12;19598:134:0;-1:-1:-1;;;;;19697:18:0;;;19670:7;19697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19598:134::o;33529:47::-;;;;:::o;32774:90::-;32817:7;32840:5;;;;;;;;;-1:-1:-1;;;;;32840:5:0;-1:-1:-1;;;;;32840:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;16991:98:0;17071:10;16991:98;:::o;24860:338::-;-1:-1:-1;;;;;24954:19:0;;24946:68;;;;-1:-1:-1;;;24946:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25033:21:0;;25025:68;;;;-1:-1:-1;;;25025:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25106:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25158:32;;;;;;;;;;;;;;;;;24860:338;;;:::o;4843:181::-;4901:7;4933:5;;;4957:6;;;;4949:46;;;;;-1:-1:-1;;;4949:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5015:1;4843:181;-1:-1:-1;;;4843:181:0:o;22680:471::-;-1:-1:-1;;;;;22778:20:0;;22770:70;;;;-1:-1:-1;;;22770:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22859:23:0;;22851:71;;;;-1:-1:-1;;;22851:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22955;22977:6;22955:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22955:17:0;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;22935:17:0;;;:9;:17;;;;;;;;;;;:91;;;;23060:20;;;;;;;:32;;23085:6;23060:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;23037:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;23108:35;;;;;;;23037:20;;23108:35;;;;;;;;;;;;;22680:471;;;:::o;5772:192::-;5858:7;5894:12;5886:6;;;;5878:29;;;;-1:-1:-1;;;5878:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5878:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5930:5:0;;;5772:192::o;24072:348::-;-1:-1:-1;;;;;24148:21:0;;24140:67;;;;-1:-1:-1;;;24140:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24241:68;24264:6;24241:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24241:18:0;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;24220:18:0;;:9;:18;;;;;;;;;;:89;24335:12;;:24;;24352:6;24335:24;:16;:24;:::i;:::-;24320:12;:39;24375:37;;;;;;;;24401:1;;-1:-1:-1;;;;;24375:37:0;;;;;;;;;;;;24072:348;;:::o;6215:471::-;6273:7;6518:6;6514:47;;-1:-1:-1;6548:1:0;6541:8;;6514:47;6585:5;;;6589:1;6585;:5;:1;6609:5;;;;;:10;6601:56;;;;-1:-1:-1;;;6601:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7154:132;7212:7;7239:39;7243:1;7246;7239:39;;;;;;;;;;;;;;;;;:3;:39::i;5299:136::-;5357:7;5384:43;5388:1;5391;5384:43;;;;;;;;;;;;;;;;;:3;:43::i;3505:106::-;3563:7;3594:1;3590;:5;:13;;3602:1;3590:13;;;-1:-1:-1;3598:1:0;;3505:106;-1:-1:-1;3505:106:0:o;12973:176::-;13082:58;;;-1:-1:-1;;;;;13082:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13082:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13056:85:0;;13075:5;;13056:18;:85::i;:::-;12973:176;;;:::o;13369:621::-;13739:10;;;13738:62;;-1:-1:-1;13755:39:0;;;-1:-1:-1;;;13755:39:0;;13779:4;13755:39;;;;-1:-1:-1;;;;;13755:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;13755:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13755:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13755:39:0;:44;13738:62;13730:152;;;;-1:-1:-1;;;13730:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13919:62;;;-1:-1:-1;;;;;13919:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13919:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13893:89:0;;13912:5;;13893:18;:89::i;41122:839::-;41226:1;41217:6;:10;41209:39;;;;;-1:-1:-1;;;41209:39:0;;;;;;;;;;;;-1:-1:-1;;;41209:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41263:25:0;;41255:60;;;;;-1:-1:-1;;;41255:60:0;;;;;;;;;;;;-1:-1:-1;;;41255:60:0;;;;;;;;;;;;;;;41336:8;;-1:-1:-1;;;;;41336:8:0;41328:31;41324:105;;41378:8;;;;;;;;;-1:-1:-1;;;;;41378:8:0;-1:-1:-1;;;;;41378:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41378:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41378:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41378:26:0;41370:51;;;;;-1:-1:-1;;;41370:51:0;;;;;;;;;;;;-1:-1:-1;;;41370:51:0;;;;;;;;;;;;;;;41551:14;41568:13;:11;:13::i;:::-;:18;:112;;41616:64;41646:33;:31;:33::i;:::-;41616:25;41627:13;:11;:13::i;:::-;41616:6;;:25;:10;:25;:::i;:64::-;41568:112;;;41598:6;41568:112;41551:129;;41687:26;41693:11;41706:6;41687:5;:26::i;:::-;41722:10;;:58;;-1:-1:-1;;;;;41722:10:0;41750:6;41766:4;41773:6;41722:58;:27;:58;:::i;:::-;-1:-1:-1;;;;;41877:26:0;;;;;;:13;:26;;;;;;:38;;41908:6;41877:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;41848:26:0;;;;;;:13;:26;;;;;;;;;:67;;;;41927:28;;;;;;;41848:26;;41927:28;;;;;;;;;41122:839;;;;:::o;38915:252::-;34422:8;;-1:-1:-1;;;;;34422:8:0;34406:68;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;;;;38969:23;38995:22;:20;:22::i;:::-;38969:48;-1:-1:-1;39028:19:0;;39024:138;;39090:8;;39058:10;;:59;;-1:-1:-1;;;;;39058:10:0;;;;39090:8;39101:15;39058:59;:23;:59;:::i;:::-;39131:23;;;;;;;;;;;;;;;;;34481:1;38915:252::o;7816:345::-;7902:7;8004:12;7997:5;7989:28;;;;-1:-1:-1;;;7989:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7989:28:0;;8028:9;8044:1;8040;:5;;;;;;;7816:345;-1:-1:-1;;;;;7816:345:0:o;15012:1114::-;15616:27;15624:5;-1:-1:-1;;;;;15616:25:0;;:27::i;:::-;15608:71;;;;;-1:-1:-1;;;15608:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:12;15767:23;15802:5;-1:-1:-1;;;;;15794:19:0;15814:4;15794:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15794:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15752:67:0;;;;15838:7;15830:52;;;;;-1:-1:-1;;;15830:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15899:17;;:21;15895:224;;16041:10;16030:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16030:30:0;16022:85;;;;-1:-1:-1;;;16022:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23432:308;-1:-1:-1;;;;;23508:21:0;;23500:65;;;;;-1:-1:-1;;;23500:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23593:12;;:24;;23610:6;23593:24;:16;:24;:::i;:::-;23578:12;:39;-1:-1:-1;;;;;23649:18:0;;:9;:18;;;;;;;;;;;:30;;23672:6;23649:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;23628:18:0;;:9;:18;;;;;;;;;;;:51;;;;23695:37;;;;;;;23628:18;;:9;;23695:37;;;;;;;;;;23432:308;;:::o;13157:204::-;13284:68;;;-1:-1:-1;;;;;13284:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13284:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13258:95:0;;13277:5;;13258:18;:95::i;763:619::-;823:4;1291:20;;1134:66;1331:23;;;;;;:42;;-1:-1:-1;1358:15:0;;;1331:42;1323:51;763:619;-1:-1:-1;;;;763:619:0:o
Swarm Source
bzzr://74f422220e065f367bed473695fde1cd637a4794edf71401ab87c97b94409565
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.