Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 40 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Slippage Pro... | 14758486 | 1024 days ago | IN | 0 ETH | 0.00240187 | ||||
Set Min Ratio | 14758483 | 1024 days ago | IN | 0 ETH | 0.00197734 | ||||
Keep Min Ratio | 14755239 | 1024 days ago | IN | 0 ETH | 0.39496854 | ||||
Set Harvest Rese... | 14748166 | 1025 days ago | IN | 0 ETH | 0.0011514 | ||||
Keep Min Ratio | 14741991 | 1026 days ago | IN | 0 ETH | 0.06103648 | ||||
Keep Min Ratio | 14737281 | 1027 days ago | IN | 0 ETH | 0.06859044 | ||||
Set Harvest Rese... | 14733739 | 1027 days ago | IN | 0 ETH | 0.00091516 | ||||
Keep Min Ratio | 14723840 | 1029 days ago | IN | 0 ETH | 0.07854934 | ||||
Keep Min Ratio | 14718130 | 1030 days ago | IN | 0 ETH | 0.0512622 | ||||
Keep Min Ratio | 14717828 | 1030 days ago | IN | 0 ETH | 0.09118473 | ||||
Keep Min Ratio | 14661413 | 1039 days ago | IN | 0 ETH | 0.05996049 | ||||
Keep Min Ratio | 14607038 | 1047 days ago | IN | 0 ETH | 0.08378985 | ||||
Keep Min Ratio | 14566256 | 1054 days ago | IN | 0 ETH | 0.05988325 | ||||
Keep Min Ratio | 14563744 | 1054 days ago | IN | 0 ETH | 0.04933546 | ||||
Keep Min Ratio | 14535406 | 1059 days ago | IN | 0 ETH | 0.04933546 | ||||
Keep Min Ratio | 14529110 | 1060 days ago | IN | 0 ETH | 0.1318775 | ||||
Set Harvest Rese... | 14505181 | 1063 days ago | IN | 0 ETH | 0.00151938 | ||||
Harvest | 14505160 | 1063 days ago | IN | 0 ETH | 0.09015003 | ||||
Harvest | 14452956 | 1071 days ago | IN | 0 ETH | 0.07768928 | ||||
Keep Min Ratio | 14362736 | 1086 days ago | IN | 0 ETH | 0.05346879 | ||||
Keep Min Ratio | 14356941 | 1086 days ago | IN | 0 ETH | 0.0459644 | ||||
Set Harvest Rese... | 14337441 | 1089 days ago | IN | 0 ETH | 0.00092138 | ||||
Set Min Ratio | 14337438 | 1089 days ago | IN | 0 ETH | 0.00070941 | ||||
Keep Min Ratio | 14290647 | 1097 days ago | IN | 0 ETH | 0.20888186 | ||||
Harvest | 14272429 | 1100 days ago | IN | 0 ETH | 0.0975446 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StrategyMakerWBTCV3
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-23 */ pragma solidity 0.6.12; library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } 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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface UniswapRouterV2 { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); } interface IController { function vaults(address) external view returns (address); function devfund() external view returns (address); function treasury() external view returns (address); } interface IMasterchef { function notifyBuybackReward(uint256 _amount) external; } // Strategy Contract Basics abstract contract StrategyBase { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; // caller whom this strategy trust mapping(address => bool) public benignCallers; // Perfomance fee 30% to buyback uint256 public performanceFee = 30000; uint256 public constant performanceMax = 100000; // Withdrawal fee 0.00% to buyback // - 0.00% to treasury // - 0.00% to dev fund uint256 public treasuryFee = 0; uint256 public constant treasuryMax = 100000; uint256 public devFundFee = 0; uint256 public constant devFundMax = 100000; // delay yield profit realization uint256 public delayBlockRequired = 1000; uint256 public lastHarvestBlock; uint256 public lastHarvestInWant; // buyback ready bool public buybackEnabled = true; address public mmToken = 0xa283aA7CfBB27EF0cfBcb2493dD9F4330E0fd304; address public masterChef = 0xf8873a6080e8dbF41ADa900498DE0951074af577; // Tokens address public want; address public constant weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // User accounts address public governance; address public controller; address public strategist; address public timelock; // Dex address public univ2Router2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Sushi address public sushiRouter = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; // child strategy should emit this event in harvest() implementation event Harvest(uint256 _reinvested); constructor( address _want, address _governance, address _strategist, address _controller, address _timelock ) public { want = _want; governance = _governance; strategist = _strategist; controller = _controller; timelock = _timelock; } // **** Modifiers **** // modifier onlyBenevolent { // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3074.md#allowing-txorigin-as-signer require(msg.sender == governance || msg.sender == strategist); _; } modifier onlyBenignCallers { require(msg.sender == governance || msg.sender == strategist || benignCallers[msg.sender]); _; } // **** Views **** // function balanceOfWant() public view returns (uint256) { return IERC20(want).balanceOf(address(this)); } function balanceOfPool() public virtual view returns (uint256); function balanceOf() public view returns (uint256) { uint256 delayReduction = 0; uint256 currentBlock = block.number; if (delayBlockRequired > 0 && lastHarvestInWant > 0 && currentBlock.sub(lastHarvestBlock) < delayBlockRequired){ uint256 diffBlock = lastHarvestBlock.add(delayBlockRequired).sub(currentBlock); delayReduction = lastHarvestInWant.mul(diffBlock).mul(1e18).div(delayBlockRequired).div(1e18); } return balanceOfWant().add(balanceOfPool()).sub(delayReduction); } function getName() external virtual pure returns (string memory); // **** Setters **** // function setBenignCallers(address _caller, bool _enabled) external{ require(msg.sender == governance, "!governance"); benignCallers[_caller] = _enabled; } function setDelayBlockRequired(uint256 _delayBlockRequired) external { require(msg.sender == governance, "!governance"); delayBlockRequired = _delayBlockRequired; } function setDevFundFee(uint256 _devFundFee) external { require(msg.sender == timelock, "!timelock"); devFundFee = _devFundFee; } function setTreasuryFee(uint256 _treasuryFee) external { require(msg.sender == timelock, "!timelock"); treasuryFee = _treasuryFee; } function setPerformanceFee(uint256 _performanceFee) external { require(msg.sender == timelock, "!timelock"); performanceFee = _performanceFee; } function setStrategist(address _strategist) external { require(msg.sender == governance, "!governance"); strategist = _strategist; } function setGovernance(address _governance) external { require(msg.sender == governance, "!governance"); governance = _governance; } function setTimelock(address _timelock) external { require(msg.sender == timelock, "!timelock"); timelock = _timelock; } function setController(address _controller) external { require(msg.sender == timelock, "!timelock"); controller = _controller; } function setBuybackEnabled(bool _buybackEnabled) external { require(msg.sender == governance, "!governance"); buybackEnabled = _buybackEnabled; } function setMasterChef(address _masterChef) external { require(msg.sender == governance, "!governance"); masterChef = _masterChef; } // **** State mutations **** // function deposit() public virtual; function withdraw(IERC20 _asset) external virtual returns (uint256 balance); // Controller only function for creating additional rewards from dust function _withdrawNonWantAsset(IERC20 _asset) internal returns (uint256 balance) { require(msg.sender == controller, "!controller"); require(want != address(_asset), "want"); balance = _asset.balanceOf(address(this)); _asset.safeTransfer(controller, balance); } // Withdraw partial funds, normally used with a vault withdrawal function withdraw(uint256 _amount) external { require(msg.sender == controller, "!controller"); uint256 _balance = IERC20(want).balanceOf(address(this)); if (_balance < _amount) { _amount = _withdrawSome(_amount.sub(_balance)); _amount = _amount.add(_balance); } uint256 _feeDev = devFundFee > 0? _amount.mul(devFundFee).div(devFundMax) : 0; uint256 _feeTreasury = treasuryFee > 0? _amount.mul(treasuryFee).div(treasuryMax) : 0; address _vault = IController(controller).vaults(address(want)); if (buybackEnabled == true && (_feeDev > 0 || _feeTreasury > 0)) { (address _buybackPrinciple, uint256 _buybackAmount) = _convertWantToBuyback(_feeDev.add(_feeTreasury)); buybackAndNotify(_buybackPrinciple, _buybackAmount); } _amount = _feeDev > 0 ? _amount.sub(_feeDev) : _amount; _amount = _feeTreasury > 0 ? _amount.sub(_feeTreasury) : _amount; IERC20(want).safeTransfer(_vault, _amount); } // buyback MM and notify MasterChef function buybackAndNotify(address _buybackPrinciple, uint256 _buybackAmount) internal { if (buybackEnabled == true && _buybackAmount > 0) { _swapUniswap(_buybackPrinciple, mmToken, _buybackAmount); uint256 _mmBought = IERC20(mmToken).balanceOf(address(this)); IERC20(mmToken).safeTransfer(masterChef, _mmBought); IMasterchef(masterChef).notifyBuybackReward(_mmBought); } } // Withdraw all funds, normally used when migrating strategies function withdrawAll() external returns (uint256 balance) { require(msg.sender == controller, "!controller"); _withdrawAll(); balance = IERC20(want).balanceOf(address(this)); address _vault = IController(controller).vaults(address(want)); IERC20(want).safeTransfer(_vault, balance); } function _withdrawAll() internal { _withdrawSome(balanceOfPool()); } function _withdrawSome(uint256 _amount) internal virtual returns (uint256); // convert LP to buyback principle token function _convertWantToBuyback(uint256 _lpAmount) internal virtual returns (address, uint256); // each harvest need to update `lastHarvestBlock=block.number` and `lastHarvestInWant=yield profit converted to want for re-invest` // add modifier onlyBenignCallers function harvest() public virtual; // **** Emergency functions **** // **** Internal functions **** function figureOutPath(address _from, address _to, uint256 _amount) public view returns (bool useSushi, address[] memory swapPath){ address[] memory path; address[] memory sushipath; path = new address[](2); path[0] = _from; path[1] = _to; sushipath = new address[](2); sushipath[0] = _from; sushipath[1] = _to; uint256 _sushiOut = sushipath.length > 0? UniswapRouterV2(sushiRouter).getAmountsOut(_amount, sushipath)[sushipath.length - 1] : 0; uint256 _uniOut = sushipath.length > 0? UniswapRouterV2(univ2Router2).getAmountsOut(_amount, path)[path.length - 1] : 1; bool useSushi = _sushiOut > _uniOut? true : false; address[] memory swapPath = useSushi ? sushipath : path; return (useSushi, swapPath); } function _swapUniswap( address _from, address _to, uint256 _amount ) internal { if (_amount > 0){ (bool useSushi, address[] memory swapPath) = figureOutPath(_from, _to, _amount); _swapUniswapWithDetailConfig(_from, _to, _amount, 1, swapPath, (useSushi? sushiRouter : univ2Router2)); } } function _swapUniswapWithDetailConfig( address _from, address _to, uint256 _amount, uint256 _amountOutMin, address[] memory _swapPath, address _router ) internal { if (_amount > 0){ IERC20(_from).safeApprove(_router, 0); IERC20(_from).safeApprove(_router, _amount); UniswapRouterV2(_router).swapExactTokensForTokens( _amount, _amountOutMin, _swapPath, address(this), now ); } } } interface AggregatorV3Interface { function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } interface ManagerLike { function ilks(uint256) external view returns (bytes32); function owns(uint256) external view returns (address); function urns(uint256) external view returns (address); function vat() external view returns (address); function open(bytes32, address) external returns (uint256); function give(uint256, address) external; function frob(uint256, int256, int256) external; function flux(uint256, address, uint256) external; function move(uint256, address, uint256) external; function exit(address, uint256, address, uint256) external; function quit(uint256, address) external; function enter(address, uint256) external; } interface VatLike { function can(address, address) external view returns (uint256); function ilks(bytes32) external view returns (uint256, uint256, uint256, uint256, uint256); function dai(address) external view returns (uint256); function urns(bytes32, address) external view returns (uint256, uint256); function frob(bytes32, address, address, address, int256, int256) external; function hope(address) external; function move(address, address, uint256) external; } interface GemJoinLike { function dec() external returns (uint256); function join(address, uint256) external payable; function exit(address, uint256) external; } interface DaiJoinLike { function join(address, uint256) external payable; function exit(address, uint256) external; } interface JugLike { function drip(bytes32) external returns (uint256); } // Base contract for MakerDAO based DAI-minting strategies abstract contract StrategyMakerBase is StrategyBase { // MakerDAO modules address public constant dssCdpManager = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39; address public constant daiJoin = 0x9759A6Ac90977b93B58547b4A71c78317f391A28; address public constant jug = 0x19c0976f590D67707E62397C87829d896Dc0f1F1; address public constant vat = 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B; address public constant debtToken = 0x6B175474E89094C44Da98b954EedeAC495271d0F; uint256 public minDebt = 15001000000000000000000; address public constant eth_usd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; // sub-strategy related constants address public collateral; uint256 public collateralDecimal = 1e18; address public gemJoin; address public collateralOracle; bytes32 public collateralIlk; AggregatorV3Interface internal priceFeed; uint256 public collateralPriceDecimal = 1; bool public collateralPriceEth = false; // singleton CDP for this strategy uint256 public cdpId = 0; // configurable minimum collateralization percent this strategy would hold for CDP uint256 public minRatio = 150; // collateralization percent buffer in CDP debt actions uint256 public ratioBuff = 150; uint256 public constant ratioBuffMax = 10000; uint256 constant RAY = 10 ** 27; constructor( address _collateralJoin, bytes32 _collateralIlk, address _collateral, uint256 _collateralDecimal, address _collateralOracle, uint256 _collateralPriceDecimal, bool _collateralPriceEth, address _want, address _governance, address _strategist, address _controller, address _timelock ) public StrategyBase(_want, _governance, _strategist, _controller, _timelock) { require(_want == _collateral, '!mismatchWant'); gemJoin = _collateralJoin; collateralIlk = _collateralIlk; collateral = _collateral; collateralDecimal = _collateralDecimal; collateralOracle = _collateralOracle; priceFeed = AggregatorV3Interface(collateralOracle); collateralPriceDecimal = _collateralPriceDecimal; collateralPriceEth = _collateralPriceEth; } // **** Modifiers **** // modifier onlyCDPInitiated { require(cdpId > 0, '!noCDP'); _; } modifier onlyAboveMinDebt(uint256 _daiAmt) { uint256 debtAmt = getDebtBalance(); require((_daiAmt < debtAmt && (debtAmt.sub(_daiAmt) >= minDebt)) || debtAmt <= _daiAmt, '!minDebt'); _; } function getCollateralBalance() public view returns (uint256) { (uint256 ink, ) = VatLike(vat).urns(collateralIlk, ManagerLike(dssCdpManager).urns(cdpId)); return ink.mul(collateralDecimal).div(1e18); } function getDebtBalance() public view returns (uint256) { address urnHandler = ManagerLike(dssCdpManager).urns(cdpId); (, uint256 art) = VatLike(vat).urns(collateralIlk, urnHandler); (, uint256 rate, , , ) = VatLike(vat).ilks(collateralIlk); uint rad = mul(art, rate); if (rad == 0) { return 0; } uint256 wad = rad / RAY; return mul(wad, RAY) < rad ? wad + 1 : wad; } function ilkDebts() public view returns(uint256, uint256, bool){ (uint256 Art, uint256 rate,,uint256 line,) = VatLike(vat).ilks(collateralIlk); uint256 currentDebt = Art.mul(rate).div(RAY); uint256 maxDebt = line.div(RAY); return (currentDebt, maxDebt, maxDebt > currentDebt); } // **** Getters **** function balanceOfPool() public override view returns (uint256){ return getCollateralBalance(); } function collateralValue(uint256 collateralAmt) public view returns (uint256){ uint256 collateralPrice = getLatestCollateralPrice(); return collateralAmt.mul(collateralPrice).mul(1e18).div(collateralDecimal).div(collateralPriceDecimal); } function currentRatio() public view returns (uint256) { uint256 _collateral = cdpId > 0? getCollateralBalance() : 0; if (_collateral > 0){ uint256 collateralAmt = collateralValue(_collateral).mul(100); uint256 debtAmt = getDebtBalance(); return collateralAmt.div(debtAmt); }else{ return 0; } } // if borrow is true (for lockAndDraw): return (maxDebt - currentDebt) if positive value, otherwise return 0 // if borrow is false (for redeemAndFree): return (currentDebt - maxDebt) if positive value, otherwise return 0 function calculateDebtFor(uint256 collateralAmt, bool borrow) public view returns (uint256) { uint256 maxDebt = collateralAmt > 0? collateralValue(collateralAmt).mul(ratioBuffMax).div(_getBufferedMinRatio(ratioBuffMax)) : 0; uint256 debtAmt = getDebtBalance(); uint256 debt = 0; if (borrow && maxDebt >= debtAmt){ debt = maxDebt.sub(debtAmt); } else if (!borrow && debtAmt >= maxDebt){ debt = debtAmt.sub(maxDebt); } return (debt > 0)? debt : 0; } function _getBufferedMinRatio(uint256 _multiplier) internal view returns (uint256){ return _multiplier.mul(minRatio).mul(ratioBuffMax.add(ratioBuff)).div(ratioBuffMax).div(100); } function borrowableDebt() public view returns (uint256) { uint256 collateralAmt = getCollateralBalance(); return calculateDebtFor(collateralAmt, true); } function requiredPaidDebt(uint256 _redeemCollateralAmt) public view returns (uint256) { uint256 totalCollateral = getCollateralBalance(); uint256 collateralAmt = _redeemCollateralAmt >= totalCollateral? 0 : totalCollateral.sub(_redeemCollateralAmt); return calculateDebtFor(collateralAmt, false); } // **** sub-strategy implementation **** function _convertWantToBuyback(uint256 _lpAmount) internal virtual override returns (address, uint256); function _depositDAI(uint256 _daiAmt) internal virtual; function _withdrawDAI(uint256 _daiAmt) internal virtual; // **** Oracle (using chainlink) **** function getLatestCollateralPrice() public view returns (uint256){ require(collateralOracle != address(0), '!_collateralOracle'); ( uint80 roundID, int price, uint startedAt, uint timeStamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); if (price > 0){ int ethPrice = 1; if (collateralPriceEth){ (,ethPrice,,,) = AggregatorV3Interface(eth_usd).latestRoundData(); } return uint256(price).mul(collateralPriceDecimal).mul(uint256(ethPrice)).div(1e8).div(collateralPriceEth? 1e18 : 1); } else{ return 0; } } // **** Setters **** function setMinDebt(uint256 _minDebt) external onlyBenevolent { minDebt = _minDebt; } function setMinRatio(uint256 _minRatio) external onlyBenevolent { minRatio = _minRatio; } function setRatioBuff(uint256 _ratioBuff) external onlyBenevolent { ratioBuff = _ratioBuff; } // **** MakerDAO CDP actions **** function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "mul-overflow"); } function toRad(uint256 wad) internal pure returns (uint256 rad) { rad = mul(wad, RAY); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "sub-overflow"); } function toInt(uint256 x) internal pure returns (int256 y) { y = int256(x); require(y >= 0, "int-overflow"); } function convertTo18(address gemJoin, uint256 amt) internal returns (uint256 wad) { wad = mul(amt, 10 ** (18 - GemJoinLike(gemJoin).dec())); } function _getDrawDart(address vat, address jug, address urn, bytes32 ilk, uint wad) internal returns (int256 dart) { uint256 rate = JugLike(jug).drip(ilk); uint256 dai = VatLike(vat).dai(urn); if (dai < toRad(wad)) { dart = toInt(sub(toRad(wad), dai).div(rate)); dart = mul(uint256(dart), rate) < toRad(wad) ? dart + 1 : dart; } } function _getWipeDart(address vat, uint dai, address urn, bytes32 ilk) internal view returns (int256 dart) { (, uint256 rate,,,) = VatLike(vat).ilks(ilk); (, uint256 art) = VatLike(vat).urns(ilk, urn); dart = toInt(dai.div(rate)); dart = uint256(dart) <= art ? - dart : - toInt(art); } function openCDP() external onlyBenevolent{ require(cdpId <= 0, "!cdpAlreadyOpened"); cdpId = ManagerLike(dssCdpManager).open(collateralIlk, address(this)); IERC20(collateral).approve(gemJoin, uint256(-1)); IERC20(debtToken).approve(daiJoin, uint256(-1)); } function getUrnVatIlk() internal returns (address, address, bytes32){ return (ManagerLike(dssCdpManager).urns(cdpId), ManagerLike(dssCdpManager).vat(), ManagerLike(dssCdpManager).ilks(cdpId)); } function addCollateralAndBorrow(uint256 _collateralAmt, uint256 _daiAmt) internal onlyCDPInitiated { require(_daiAmt.add(getDebtBalance()) >= minDebt, '!minDebt'); (address urn, address vat, bytes32 ilk) = getUrnVatIlk(); GemJoinLike(gemJoin).join(urn, _collateralAmt); ManagerLike(dssCdpManager).frob(cdpId, toInt(convertTo18(gemJoin, _collateralAmt)), _getDrawDart(vat, jug, urn, ilk, _daiAmt)); ManagerLike(dssCdpManager).move(cdpId, address(this), toRad(_daiAmt)); if (VatLike(vat).can(address(this), address(daiJoin)) == 0) { VatLike(vat).hope(daiJoin); } DaiJoinLike(daiJoin).exit(address(this), _daiAmt); } function repayAndRedeemCollateral(uint256 _collateralAmt, uint _daiAmt) internal onlyCDPInitiated onlyAboveMinDebt(_daiAmt) { (address urn, address vat, bytes32 ilk) = getUrnVatIlk(); if (_daiAmt > 0){ DaiJoinLike(daiJoin).join(urn, _daiAmt); } uint256 wad18 = _collateralAmt > 0? convertTo18(gemJoin, _collateralAmt) : 0; ManagerLike(dssCdpManager).frob(cdpId, -toInt(wad18), _getWipeDart(vat, VatLike(vat).dai(urn), urn, ilk)); if (_collateralAmt > 0){ ManagerLike(dssCdpManager).flux(cdpId, address(this), wad18); GemJoinLike(gemJoin).exit(address(this), _collateralAmt); } } // **** State Mutation functions **** function keepMinRatio() external onlyBenignCallers { uint256 requiredPaidback = requiredPaidDebt(0); if (requiredPaidback > 0){ _withdrawDAI(requiredPaidback); uint256 wad = IERC20(debtToken).balanceOf(address(this)); require(wad >= requiredPaidback, '!keepMinRatioRedeem'); repayAndRedeemCollateral(0, requiredPaidback); uint256 goodRatio = currentRatio(); require(goodRatio >= minRatio.sub(1), '!stillBelowMinRatio'); } } function deposit() public override { uint256 _want = balanceOfWant(); (,,bool roomForNewMint) = ilkDebts(); if (_want > 0 && roomForNewMint) { uint256 _newDebt = calculateDebtFor(_want.add(getCollateralBalance()), true); if(_newDebt > 0 && _newDebt.add(getDebtBalance()) >= minDebt){ addCollateralAndBorrow(_want, _newDebt); uint256 wad = IERC20(debtToken).balanceOf(address(this)); _depositDAI(_newDebt > wad? wad : _newDebt); } } } function _withdrawSome(uint256 _amount) internal override returns (uint256) { bool _full = _amount >= getCollateralBalance(); if (_full && _amount > 0){ _withdrawDAI(uint256(-1)); uint256 _debtOwe = getDebtBalance(); require(IERC20(debtToken).balanceOf(address(this)) >= _debtOwe, '!mismatchAfterWithdrawAll'); repayAndRedeemCollateral(_amount, _debtOwe); } else{ uint256 requiredPaidback = requiredPaidDebt(_amount); if (requiredPaidback > 0){ _withdrawDAI(requiredPaidback); require(IERC20(debtToken).balanceOf(address(this)) >= requiredPaidback, '!mismatchAfterWithdraw'); } repayAndRedeemCollateral(_amount, requiredPaidback); } return _amount; } } // for Curve LP staking mining interface ICvxBaseRewardPool { function getReward(address _account, bool _claimExtras) external returns(bool); function earned(address account) external view returns (uint256); function balanceOf(address account) external view returns (uint256); function withdrawAndUnwrap(uint256 amount, bool claim) external returns(bool); function pid() external view returns (uint256); } // for Curve LP staking interface ICvxBooster { function depositAll(uint256 _pid, bool _stake) external returns(bool); function withdraw(uint256 _pid, uint256 _amount) external returns(bool); function withdrawAll(uint256 _pid) external returns(bool); } interface ICurveZap_4 { function calc_withdraw_one_coin(address _pool, uint256 _token_amount, int128 i) external view returns (uint256); function add_liquidity(address _pool, uint256[4] calldata _deposit_amounts, uint256 _min_mint_amount) external; function remove_liquidity_one_coin(address _pool, uint256 _burn_amount, int128 i, uint256 _min_amount) external; function calc_token_amount(address _pool, uint256[4] calldata _amounts, bool _is_deposit) external view returns (uint256); } interface ICurveFi_3 { function exchange(int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount) external; function get_virtual_price() external view returns (uint256); } interface ICurveFi_2 { function get_virtual_price() external view returns (uint256); } contract StrategyMakerWBTCV3 is StrategyMakerBase { // strategy specific: https://github.com/makerdao/mcd-changelog address public wbtc_collateral = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; address public link_btc_usd = 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c; uint256 public wbtc_collateral_decimal = 1e8; bytes32 public wbtc_ilk = "WBTC-A"; address public wbtc_apt = 0xBF72Da2Bd84c5170618Fbe5914B0ECA9638d5eb5; uint256 public constant wbtc_price_decimal = 1; bool public constant wbtc_price_eth = false; address public constant curve3crvPool = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7; // convex staking constants address public stakingPool = 0xF403C135812408BFbE8713b5A23a04b3D48AAE31; address public constant rewardTokenCRV = 0xD533a949740bb3306d119CC777fa900bA034cd52; address public constant rewardTokenCVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B; address public constant curveZap = 0xA79828DF1850E8a3A3064576f380D90aECDD3359; // convex staking configurable uint256 public stakingPoolId = 59;//ust-worm address public rewardPool = 0x7e2b9B5244bcFa5108A76D5E7b507CFD5581AD4A;//ust-worm // curve LP configurable address public curvePool = 0xCEAF7747579696A2F0bb206a14210e3c9e6fB269; address public curveLpToken = 0xCEAF7747579696A2F0bb206a14210e3c9e6fB269; // slippage protection for one-sided ape in/out uint256 public harvestReserveDebt = 2500; // reserved for debt repayment uint256 public harvestReserveIL = 2500; // reserved for LP IL uint256 public harvestReserve = 5000; uint256 public removeLiquidityBuffer = 300; // remove liquidity buffer uint256 public slippageProtectionIn = 50; // max 0.5% uint256 public slippageProtectionOut = 50; // max 0.5% uint256 public constant DENOMINATOR = 10000; constructor(address _governance, address _strategist, address _controller, address _timelock) public StrategyMakerBase( wbtc_apt, wbtc_ilk, wbtc_collateral, wbtc_collateral_decimal, link_btc_usd, wbtc_price_decimal, wbtc_price_eth, wbtc_collateral, _governance, _strategist, _controller, _timelock ) { IERC20(debtToken).safeApprove(curveZap, uint256(-1)); _setupPoolApprovals(); } // **** Setters **** function setSlippageProtection(uint256 _in, uint256 _out) public onlyBenevolent{ slippageProtectionIn = _in; slippageProtectionOut = _out; } function setHarvestReserves(uint256 _debtReserve, uint256 _ilReserve) public onlyBenevolent{ harvestReserveDebt = _debtReserve; harvestReserveIL = _ilReserve; harvestReserve = harvestReserveDebt.add(harvestReserveIL); } function setRemoveLiquidityBuffer(uint256 _rlpBuffer) public onlyBenevolent{ removeLiquidityBuffer = _rlpBuffer; } // **** State Mutation functions **** function _setupPoolApprovals() internal { IERC20(curveLpToken).safeApprove(curveZap, 0); IERC20(curveLpToken).safeApprove(curveZap, uint256(-1)); IERC20(curveLpToken).safeApprove(stakingPool, 0); IERC20(curveLpToken).safeApprove(stakingPool, uint256(-1)); } function migratePool(address _newCurvePool, address _newCurveLp, address _newConvexPool) public { require(msg.sender == timelock, '!timelock'); // withdraw all debt token if needed if (ICvxBaseRewardPool(rewardPool).balanceOf(address(this)) > 0){ _withdrawDAI(uint256(-1)); require(ICvxBaseRewardPool(rewardPool).balanceOf(address(this)) == 0, '!stillGotSomeInConvex'); require(IERC20(curveLpToken).balanceOf(address(this)) == 0, '!stillGotSomeInCurve'); } // migrate to new destination curvePool = _newCurvePool; curveLpToken = _newCurveLp; rewardPool = _newConvexPool; stakingPoolId = ICvxBaseRewardPool(rewardPool).pid(); // setup for new pool _setupPoolApprovals(); // reinvest to new pool _depositDAI(IERC20(debtToken).balanceOf(address(this))); } function harvest() public override onlyBenevolent { // Collects reward tokens ICvxBaseRewardPool(rewardPool).getReward(address(this), true); uint256 _rewardCRV = IERC20(rewardTokenCRV).balanceOf(address(this)); uint256 _rewardCVX = IERC20(rewardTokenCVX).balanceOf(address(this)); if (_rewardCRV > 0) { _convertWithSushi(rewardTokenCRV, weth, _rewardCRV); } if (_rewardCVX > 0) { _convertWithSushi(rewardTokenCVX, weth, _rewardCVX); } uint256 _wethAmount = IERC20(weth).balanceOf(address(this)); if (_wethAmount > 0){ // repay debt uint256 _debtBal = IERC20(debtToken).balanceOf(address(this)); _convertWithSushi(weth, debtToken, _wethAmount.mul(harvestReserve).div(DENOMINATOR)); uint256 _debtBalAfter= IERC20(debtToken).balanceOf(address(this)); repayAndRedeemCollateral(0, (_debtBalAfter.sub(_debtBal)).mul(harvestReserveDebt).div(harvestReserve)); // Buyback and Reinvest if (buybackEnabled == true){ uint256 _buybackLpAmount = _wethAmount.mul(performanceFee).div(performanceMax); buybackAndNotify(weth, _buybackLpAmount); } _swapUniswap(weth, want, IERC20(weth).balanceOf(address(this))); uint256 _wantBal = balanceOfWant(); if (_wantBal > 0){ lastHarvestBlock = block.number; lastHarvestInWant = _wantBal; deposit(); emit Harvest(_wantBal); } } } function _convertWithSushi(address _from, address _to, uint256 _inAmt) internal { address[] memory _swapPath = new address[](2); _swapPath[0] = _from; _swapPath[1] = _to; _swapUniswapWithDetailConfig(_from, _to, _inAmt, 1, _swapPath, sushiRouter); } function _convertWantToBuyback(uint256 _lpAmount) internal override returns (address, uint256){ if (_lpAmount <= 0){ return (weth, 0); } _swapUniswap(want, weth, _lpAmount); return (weth, IERC20(weth).balanceOf(address(this))); } function _depositDAI(uint256 _daiAmt) internal override{ uint256 _debt = IERC20(debtToken).balanceOf(address(this)); if (_debt == 0){ return; } uint256 _debtAmt = IERC20(debtToken).balanceOf(address(this)); uint256 _expectedOut = estimateRequiredLP(_debtAmt); uint256 _maxSlip = _expectedOut.mul(DENOMINATOR.sub(slippageProtectionIn)).div(DENOMINATOR); if (_debtAmt > 0 && checkDepositSlip(_debtAmt, _maxSlip)) { uint256[4] memory amounts = [0, _debtAmt, 0, 0]; ICurveZap_4(curveZap).add_liquidity(curvePool, amounts, _maxSlip); } uint256 _lpAmt = IERC20(curveLpToken).balanceOf(address(this)); require(_lpAmt > 0, "!_lpAmt"); ICvxBooster(stakingPool).depositAll(stakingPoolId, true); } function _withdrawDAI(uint256 _daiAmt) internal override{ if (_daiAmt == 0){ return; } else if(_daiAmt >= uint256(-1)){ ICvxBaseRewardPool(rewardPool).withdrawAndUnwrap(ICvxBaseRewardPool(rewardPool).balanceOf(address(this)), false); _removeLpFromCurve(IERC20(curveLpToken).balanceOf(address(this))); return; } uint256 requiredLP = estimateRequiredLP(_daiAmt); requiredLP = requiredLP.mul(DENOMINATOR.add(removeLiquidityBuffer)).div(DENOMINATOR);// try to remove bit more uint256 _lpAmount = IERC20(curveLpToken).balanceOf(address(this)); uint256 _withdrawFromStaking = _lpAmount < requiredLP? requiredLP.sub(_lpAmount) : 0; if (_withdrawFromStaking > 0){ uint256 maxInStaking = ICvxBaseRewardPool(rewardPool).balanceOf(address(this)); uint256 _toWithdraw = maxInStaking < _withdrawFromStaking? maxInStaking : _withdrawFromStaking; ICvxBaseRewardPool(rewardPool).withdrawAndUnwrap(_toWithdraw, false); } _removeLpFromCurve(requiredLP); } function _removeLpFromCurve(uint256 requiredLP) internal{ uint256 _lpAmount = IERC20(curveLpToken).balanceOf(address(this)); if (_lpAmount > 0){ requiredLP = requiredLP > _lpAmount? _lpAmount : requiredLP; uint256 maxSlippage = requiredLP.mul(DENOMINATOR.sub(slippageProtectionOut)).div(DENOMINATOR); ICurveZap_4(curveZap).remove_liquidity_one_coin(curvePool, requiredLP, 1, maxSlippage); } } // Controller only function for creating additional rewards from dust function withdraw(IERC20 _asset) external override returns (uint256 balance) { require(address(_asset) != curveLpToken, '!curveLpToken'); _withdrawNonWantAsset(_asset); } // **** Views **** function balanceOfDebtToken() public view returns (uint256){ uint256 lpAmt = ICvxBaseRewardPool(rewardPool).balanceOf(address(this)); lpAmt = lpAmt.add(IERC20(curveLpToken).balanceOf(address(this))); return IERC20(debtToken).balanceOf(address(this)).add(crvLPToDebt(lpAmt)); } function virtualPriceToDebt() public view returns (uint256) { return ICurveFi_2(curvePool).get_virtual_price().mul(ICurveFi_3(curve3crvPool).get_virtual_price()).div(1e18); } function estimateRequiredLP(uint256 _debtAmt) public view returns (uint256) { return _debtAmt.mul(1e18).div(virtualPriceToDebt()); } function checkDepositSlip(uint256 _debtAmt, uint256 _maxSlip) public view returns (bool){ uint256[4] memory amounts = [0, _debtAmt, 0, 0]; return ICurveZap_4(curveZap).calc_token_amount(curvePool, amounts, true) >= _maxSlip; } function crvLPToDebt(uint256 _lpAmount) public view returns (uint256) { if (_lpAmount == 0){ return 0; } uint256 virtualOut = virtualPriceToDebt().mul(_lpAmount).div(1e18); return virtualOut; } // only include CRV earned function getHarvestable() public view returns (uint256) { return ICvxBaseRewardPool(rewardPool).earned(address(this)); } function getName() external override pure returns (string memory) { return "StrategyMakerWBTCV3"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_reinvested","type":"uint256"}],"name":"Harvest","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfDebtToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"benignCallers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowableDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmt","type":"uint256"},{"internalType":"bool","name":"borrow","type":"bool"}],"name":"calculateDebtFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdpId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtAmt","type":"uint256"},{"internalType":"uint256","name":"_maxSlip","type":"uint256"}],"name":"checkDepositSlip","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralIlk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralPriceDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralPriceEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmt","type":"uint256"}],"name":"collateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpAmount","type":"uint256"}],"name":"crvLPToDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve3crvPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveLpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curvePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveZap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayBlockRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dssCdpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtAmt","type":"uint256"}],"name":"estimateRequiredLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eth_usd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"figureOutPath","outputs":[{"internalType":"bool","name":"useSushi","type":"bool"},{"internalType":"address[]","name":"swapPath","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gemJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDebtBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHarvestable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestCollateralPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReserveDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReserveIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ilkDebts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jug","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepMinRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastHarvestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestInWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"link_btc_usd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newCurvePool","type":"address"},{"internalType":"address","name":"_newCurveLp","type":"address"},{"internalType":"address","name":"_newConvexPool","type":"address"}],"name":"migratePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mmToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openCDP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioBuff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioBuffMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLiquidityBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_redeemCollateralAmt","type":"uint256"}],"name":"requiredPaidDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenCRV","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenCVX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBenignCallers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_buybackEnabled","type":"bool"}],"name":"setBuybackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delayBlockRequired","type":"uint256"}],"name":"setDelayBlockRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFundFee","type":"uint256"}],"name":"setDevFundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtReserve","type":"uint256"},{"internalType":"uint256","name":"_ilReserve","type":"uint256"}],"name":"setHarvestReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"}],"name":"setMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minDebt","type":"uint256"}],"name":"setMinDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minRatio","type":"uint256"}],"name":"setMinRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ratioBuff","type":"uint256"}],"name":"setRatioBuff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rlpBuffer","type":"uint256"}],"name":"setRemoveLiquidityBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"setSlippageProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippageProtectionIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slippageProtectionOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"univ2Router2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualPriceToDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_apt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_collateral_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_price_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc_price_eth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261753060019081556000600281905560038190556103e86004556007805474a283aa7cfbb27ef0cfbcb2493dd9f4330e0fd30400610100600160a81b031960ff1992831686171617909155600880546001600160a01b031990811673f8873a6080e8dbf41ada900498de0951074af57717909155600e80548216737a250d5630b4cf539739df2c5dacb4c659f2488d179055600f8054821673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f17905569032d34b1e54bb2c40000601055670de0b6b3a76400006012556017939093556018805490911690556019556096601a819055601b55601c80548216732260fac5e5542a773aa44fbcfedf7c193bc2c599179055601d8054821673f4030086522a5beea4988f8ca5b36dbc97bee88c1790556305f5e100601e5565574254432d4160d01b601f5560208054821673bf72da2bd84c5170618fbe5914b0eca9638d5eb517905560218054821673f403c135812408bfbe8713b5a23a04b3d48aae31179055603b602255602380548216737e2b9b5244bcfa5108a76d5e7b507cfd5581ad4a17905560248054821673ceaf7747579696a2f0bb206a14210e3c9e6fb269908117909155602580549092161790556109c4602681905560275561138860285561012c6029556032602a819055602b55348015620001f357600080fd5b50604051620066ef380380620066ef833981810160405260808110156200021957600080fd5b50805160208083015160408401516060909401518254601f54601c54601e54601d54600980546001600160a01b03199081166001600160a01b03958616908117909255600a8054868d16908316179055600c8054868b16908316179055600b8054868e16908316179055600d8054868a1690831617905560138054821697861697909717909655601594909455601180548616909417909355601255601480548416928216929092179182905560168054909316911617905560016017556018805460ff191690559293909290916200032b90736b175474e89094c44da98b954eedeac495271d0f9073a79828df1850e8a3a3064576f380d90aecdd33599060001990620039d76200033f821b17901c565b6200033562000463565b50505050620007fa565b801580620003c9575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200039957600080fd5b505afa158015620003ae573d6000803e3d6000fd5b505050506040513d6020811015620003c557600080fd5b5051155b620004065760405162461bcd60e51b8152600401808060200182810382526036815260200180620066b96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200045e9185916200053316565b505050565b6025546200049d906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd335960006200033f602090811b620039d717901c565b602554620004d8906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd33596000196200033f602090811b620039d717901c565b60215460255462000504916001600160a01b03918216911660006200033f602090811b620039d717901c565b60215460255462000531916001600160a01b0391821691166000196200033f602090811b620039d717901c565b565b60606200058f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620005ef60201b62003aea179092919060201c565b8051909150156200045e57808060200190516020811015620005b057600080fd5b50516200045e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806200668f602a913960400191505060405180910390fd5b606062000600848460008562000608565b949350505050565b60606200061585620007c0565b62000667576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620006a85780518252601f19909201916020918201910162000687565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146200070c576040519150601f19603f3d011682016040523d82523d6000602084013e62000711565b606091505b5091509150811562000727579150620006009050565b805115620007385780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007845781810151838201526020016200076a565b50505050905090810190601f168015620007b25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000600575050151592915050565b615e85806200080a6000396000f3fe608060405234801561001057600080fd5b50600436106106595760003560e01c806386d8745b11610351578063b635b8ae116101c3578063d8dfeb451161010f578063eb319441116100ad578063f17336d711610087578063f17336d714610d83578063f6ff935214610d8b578063f77c479114610db0578063f8d8989814610db857610659565b8063eb31944114610d56578063ec029a4414610d5e578063ef55105014610d7b57610659565b8063e13f8513116100e9578063e13f851314610ce3578063e3a58e1814610d09578063e420557614610d26578063e4c01d3714610d4e57610659565b8063d8dfeb4514610ccb578063df1b27ac14610cd3578063e0c9cf0614610cdb57610659565b8063c7b9d5301161017c578063cc32d17611610156578063cc32d17614610cab578063d0e30db014610cb3578063d33219b414610cbb578063d89281e814610cc357610659565b8063c7b9d53014610c75578063c90b65de14610c9b578063c954e5cc14610ca357610659565b8063b635b8ae14610c0c578063b78e0c5a14610c14578063b9e3748914610c37578063bdacb30314610c3f578063c11645bc14610c65578063c1a3d44c14610c6d57610659565b8063a0e2c3411161029d578063a8e879951161023b578063ab43be7111610215578063ab43be7114610bec578063af4f170514610bf4578063b0fd087114610bfc578063b131da4014610c0457610659565b8063a8e8799514610b2b578063aa87484c14610b33578063ab033ea914610bc657610659565b8063a36f063e11610277578063a36f063e14610b0b578063a46c850514610b13578063a6d09de614610b1b578063a890dd9014610b2357610659565b8063a0e2c34114610aa5578063a217d5ce14610add578063a2d9f4dc14610ae557610659565b80639658e68f1161030a5780639a9b567d116102e45780639a9b567d14610a535780639aa5f0d214610a725780639ac9752c14610a955780639d1e73cb14610a9d57610659565b80639658e68f14610a26578063981879a614610a2e5780639868607c14610a3657610659565b806386d8745b146109e057806387788782146109e85780638ce47ff0146109f0578063918f86741461086957806392eefe9b146109f857806394d0737b14610a1e57610659565b80633fc8cef3116104ea5780635ffe27b41161043657806370897b23116103d45780637b756553116103ae5780637b756553146109c85780637cc79113146106e357806384718d89146109d0578063853828b6146109d857610659565b806370897b2314610986578063722713f7146109a357806377e741c7146109ab57610659565b80636480b8ad116104105780636480b8ad1461095157806366666aa9146109595780636765d6fb146109615780636d13582c1461097e57610659565b80635ffe27b4146109095780636234dc211461092c578063646780df1461094957610659565b806351cff8d9116104a3578063596b93e41161047d578063596b93e4146108d45780635aa6e675146108f15780635ccbbdf1146108f95780635d1583501461090157610659565b806351cff8d91461089e578063561c20dc146108c4578063575a86b2146108cc57610659565b80633fc8cef31461085957806344015ed41461086157806345d3bdff146108695780634641257d14610871578063475411ab146108795780634a1a066b1461089657610659565b8063160d0da5116105a9578063218751b21161056257806331e635c81161053c57806331e635c8146108135780633203d5611461081b57806335eb11861461084957806336569e771461085157610659565b8063218751b2146107e65780632e1a7d4d146107ee5780632eba33f61461080b57610659565b8063160d0da51461071857806317d7de7c1461073457806319ec5df5146107b15780631ba89442146107ce5780631f1fcd51146107d65780631fe4a686146107de57610659565b8063115880861161061657806314a1fe02116105f057806314a1fe02146106e357806314b74d9a146106eb57806314e6ac09146106f35780631529a6391461071057610659565b806311588086146106d35780631378e347146106db57806313bd4b95146106e357610659565b806301664f661461065e5780630547104d14610682578063057d66a21461069c5780630872b81d146106a457806308d50063146106ac5780630c56ae3b146106cb575b600080fd5b610666610dc0565b604080516001600160a01b039092168252519081900360200190f35b61068a610dcf565b60408051918252519081900360200190f35b61068a610e4a565b610666610e68565b6106c9600480360360208110156106c257600080fd5b5035610e80565b005b610666610eb1565b61068a610ec0565b61068a610ecf565b61068a610ed5565b61068a610edc565b6106c96004803603602081101561070957600080fd5b5035610ee2565b61068a610f32565b61072061107b565b604080519115158252519081900360200190f35b61073c611084565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561077657818101518382015260200161075e565b50505050905090810190601f1680156107a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61068a600480360360208110156107c757600080fd5b50356110b1565b61068a6110d8565b6106666110de565b6106666110ed565b6106666110fc565b6106c96004803603602081101561080457600080fd5b503561110b565b61068a61137c565b610666611382565b6106c96004803603604081101561083157600080fd5b506001600160a01b0381351690602001351515611391565b61068a611409565b61066661140e565b610666611426565b61068a61143e565b61068a6115ca565b6106c96115d0565b61068a6004803603602081101561088f57600080fd5b5035611b2f565b61068a611b6e565b61068a600480360360208110156108b457600080fd5b50356001600160a01b0316611b74565b610720611bd9565b610666611bde565b61068a600480360360208110156108ea57600080fd5b5035611bed565b610666611c2b565b61068a611c3a565b61068a611e4a565b6106c96004803603604081101561091f57600080fd5b5080359060200135611e50565b6106c96004803603602081101561094257600080fd5b5035611e87565b610666611eb8565b610666611ec7565b610666611edf565b6106c96004803603602081101561097757600080fd5b5035611eee565b610666611f1f565b6106c96004803603602081101561099c57600080fd5b5035611f2e565b61068a611f7e565b6106c9600480360360208110156109c157600080fd5b5035612037565b61068a612087565b61066661208d565b61068a6120a5565b61068a612214565b61068a61221a565b61068a612220565b6106c960048036036020811015610a0e57600080fd5b50356001600160a01b0316612226565b6106c9612293565b61068a612431565b610666612437565b61068a60048036036020811015610a4c57600080fd5b503561244f565b6106c960048036036020811015610a6957600080fd5b50351515612478565b61072060048036036040811015610a8857600080fd5b50803590602001356124d8565b6106c96125ef565b61066661280d565b6106c960048036036060811015610abb57600080fd5b506001600160a01b03813581169160208101358216916040909101351661281c565b610666612b9f565b6106c960048036036020811015610afb57600080fd5b50356001600160a01b0316612bae565b61068a612c1d565b61068a612e12565b610720612e18565b610666612e21565b61068a612e35565b610b6960048036036060811015610b4957600080fd5b506001600160a01b03813581169160208101359091169060400135612e3b565b60405180831515815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bb1578181015183820152602001610b99565b50505050905001935050505060405180910390f35b6106c960048036036020811015610bdc57600080fd5b50356001600160a01b031661326e565b6106666132dd565b61068a6132f5565b6106666132fb565b61068a613313565b61068a613373565b6106c960048036036040811015610c2a57600080fd5b5080359060200135613379565b6106666133c0565b6106c960048036036020811015610c5557600080fd5b50356001600160a01b03166133cf565b61066661343c565b61068a613454565b6106c960048036036020811015610c8b57600080fd5b50356001600160a01b031661349f565b61068a61350e565b61068a613514565b61068a613615565b6106c961361b565b610666613733565b610666613742565b61066661375a565b610666613769565b61068a613778565b61072060048036036020811015610cf957600080fd5b50356001600160a01b031661377e565b6106c960048036036020811015610d1f57600080fd5b5035613793565b610d2e6137e5565b604080519384526020840192909252151582820152519081900360600190f35b61068a6138d0565b61068a6138d6565b6106c960048036036020811015610d7457600080fd5b50356138dc565b61068a61390d565b61068a613913565b61068a60048036036040811015610da157600080fd5b50803590602001351515613919565b6106666139b6565b6106666139c5565b6013546001600160a01b031681565b602354604080516246613160e11b815230600482015290516000926001600160a01b031691628cc262916024808301926020929190829003018186803b158015610e1857600080fd5b505afa158015610e2c573d6000803e3d6000fd5b505050506040513d6020811015610e4257600080fd5b505190505b90565b600080610e55610f32565b9050610e62816001613919565b91505090565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600a546001600160a01b0316331480610ea35750600c546001600160a01b031633145b610eac57600080fd5b602955565b6021546001600160a01b031681565b6000610eca610f32565b905090565b60295481565b620186a081565b60055481565b600d546001600160a01b03163314610f2d576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600355565b6000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b0316632424be5c601554735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d6020811015610fdf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301528051604480840193829003018186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d604081101561105457600080fd5b5051601254909150610e6290670de0b6b3a764000090611075908490613af9565b90613b52565b60075460ff1681565b60408051808201909152601381527253747261746567794d616b657257425443563360681b602082015290565b60006110d06110be613514565b61107584670de0b6b3a7640000613af9565b90505b919050565b60125481565b6009546001600160a01b031681565b600c546001600160a01b031681565b6024546001600160a01b031681565b600b546001600160a01b03163314611158576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50519050818110156111fa576111eb6111e68383613b94565b613bd6565b91506111f78282613de1565b91505b6000806003541161120c576000611228565b611228620186a061107560035486613af990919063ffffffff16565b90506000806002541161123c576000611258565b611258620186a061107560025487613af990919063ffffffff16565b600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b505160075490915060ff16151560011480156112fe575060008311806112fe5750600082115b15611329576000806113186113138686613de1565b613e3b565b915091506113268282613f1b565b50505b600083116113375784611341565b6113418584613b94565b945060008211611351578461135b565b61135b8583613b94565b600954909550611375906001600160a01b0316828761405f565b5050505050565b601e5481565b601d546001600160a01b031681565b600a546001600160a01b031633146113de576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b600181565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b602354604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561148e57600080fd5b505afa1580156114a2573d6000803e3d6000fd5b505050506040513d60208110156114b857600080fd5b5051602554604080516370a0823160e01b8152306004820152905192935061153f926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50518290613de1565b9050610e6261154d8261244f565b604080516370a0823160e01b81523060048201529051600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d60208110156115c257600080fd5b505190613de1565b61271081565b600a546001600160a01b03163314806115f35750600c546001600160a01b031633145b6115fc57600080fd5b60235460408051637050ccd960e01b81523060048201526001602482015290516001600160a01b0390921691637050ccd9916044808201926020929091908290030181600087803b15801561165057600080fd5b505af1158015611664573d6000803e3d6000fd5b505050506040513d602081101561167a57600080fd5b5050604080516370a0823160e01b8152306004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d60208110156116fb57600080fd5b5051604080516370a0823160e01b81523060048201529051919250600091734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b916370a08231916024808301926020929190829003018186803b15801561175457600080fd5b505afa158015611768573d6000803e3d6000fd5b505050506040513d602081101561177e57600080fd5b5051905081156117bb576117bb73d533a949740bb3306d119cc777fa900ba034cd5273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2846140b1565b80156117f4576117f4734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2836140b1565b604080516370a0823160e01b8152306004820152905160009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a0823191602480820192602092909190829003018186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b505190508015611b2a57604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156118cc57600080fd5b505afa1580156118e0573d6000803e3d6000fd5b505050506040513d60208110156118f657600080fd5b50516028549091506119409073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600080516020615daf8339815191529061193b9061271090611075908890613af9565b6140b1565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d60208110156119b957600080fd5b50516028546026549192506119e8916000916119e391611075906119dd8789613b94565b90613af9565b61413b565b60075460ff16151560011415611a38576000611a16620186a061107560015487613af990919063ffffffff16565b9050611a3673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282613f1b565b505b600954604080516370a0823160e01b81523060048201529051611acf9273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2926001600160a01b039091169183916370a08231916024808301926020929190829003018186803b158015611a9e57600080fd5b505afa158015611ab2573d6000803e3d6000fd5b505050506040513d6020811015611ac857600080fd5b50516144b2565b6000611ad9613454565b90508015611b2657436005556006819055611af261361b565b6040805182815290517f80f97f878e16410266694f134ddf012f2be424f54f8b5cafa107eccc51d00d589181900360200190a15b5050505b505050565b600080611b3a612c1d565b9050611b67601754611075601254611075670de0b6b3a76400006119dd878a613af990919063ffffffff16565b9392505050565b60195481565b6025546000906001600160a01b0383811691161415611bca576040805162461bcd60e51b815260206004820152600d60248201526c10b1bab93b32a6382a37b5b2b760991b604482015290519081900360640190fd5b611bd3826144fc565b50919050565b600081565b6008546001600160a01b031681565b600080611bf8610f32565b9050600081841015611c1357611c0e8285613b94565b611c16565b60005b9050611c23816000613919565b949350505050565b600a546001600160a01b031681565b600080735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c9757600080fd5b505afa158015611cab573d6000803e3d6000fd5b505050506040513d6020811015611cc157600080fd5b5051601554604080516309092f9760e21b815260048101929092526001600160a01b038316602483015280519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c926044808301939192829003018186803b158015611d2b57600080fd5b505afa158015611d3f573d6000803e3d6000fd5b505050506040513d6040811015611d5557600080fd5b506020015160155460408051636cb1c69b60e11b81526004810192909252519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d60a0811015611ddf57600080fd5b506020015190506000611df28383614627565b905080611e06576000945050505050610e47565b60006b033b2e3c9fd0803ce80000008204905081611e30826b033b2e3c9fd0803ce8000000614627565b10611e3b5780611e40565b806001015b9550505050505090565b60045481565b600a546001600160a01b0316331480611e735750600c546001600160a01b031633145b611e7c57600080fd5b602a91909155602b55565b600a546001600160a01b0316331480611eaa5750600c546001600160a01b031633145b611eb357600080fd5b601055565b6025546001600160a01b031681565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6023546001600160a01b031681565b600a546001600160a01b0316331480611f115750600c546001600160a01b031633145b611f1a57600080fd5b601b55565b600f546001600160a01b031681565b600d546001600160a01b03163314611f79576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600155565b6004546000908190439015801590611f9857506000600654115b8015611fb25750600454600554611fb0908390613b94565b105b15612013576000611fda82611fd4600454600554613de190919063ffffffff16565b90613b94565b905061200f670de0b6b3a7640000611075600454611075670de0b6b3a76400006119dd87600654613af990919063ffffffff16565b9250505b61203082611fd4612022610ec0565b61202a613454565b90613de1565b9250505090565b600d546001600160a01b03163314612082576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600255565b60065481565b7319c0976f590d67707e62397c87829d896dc0f1f181565b600b546000906001600160a01b031633146120f5576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6120fd614682565b600954604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156121ca57600080fd5b505afa1580156121de573d6000803e3d6000fd5b505050506040513d60208110156121f457600080fd5b5051600954909150612210906001600160a01b0316828461405f565b5090565b601a5481565b60015481565b60275481565b600d546001600160a01b03163314612271576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314806122b65750600c546001600160a01b031633145b806122d057503360009081526020819052604090205460ff165b6122d957600080fd5b60006122e56000611bed565b9050801561242e576122f68161468d565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561234557600080fd5b505afa158015612359573d6000803e3d6000fd5b505050506040513d602081101561236f57600080fd5b50519050818110156123be576040805162461bcd60e51b8152602060048201526013602482015272216b6565704d696e526174696f52656465656d60681b604482015290519081900360640190fd5b6123c960008361413b565b60006123d3613313565b601a549091506123e4906001613b94565b811015611b2a576040805162461bcd60e51b8152602060048201526013602482015272217374696c6c42656c6f774d696e526174696f60681b604482015290519081900360640190fd5b50565b60285481565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b60008161245e575060006110d3565b6000611b67670de0b6b3a7640000611075856119dd613514565b600a546001600160a01b031633146124c5576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60006124e2615d90565b60405180608001604052806000815260200185815260200160008152602001600081525090508273a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663861cdef0602460009054906101000a90046001600160a01b03168460016040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b8381101561258b578181015183820152602001612573565b505050509050018215158152602001935050505060206040518083038186803b1580156125b757600080fd5b505afa1580156125cb573d6000803e3d6000fd5b505050506040513d60208110156125e157600080fd5b505110159150505b92915050565b600a546001600160a01b03163314806126125750600c546001600160a01b031633145b61261b57600080fd5b60195415612664576040805162461bcd60e51b81526020600482015260116024820152700858d91c105b1c9958591e53dc195b9959607a1b604482015290519081900360640190fd5b60155460408051636090dec560e01b8152600481019290925230602483015251735ef30b9986345249bc32d8928b7ee64de9435e3991636090dec59160448083019260209291908290030181600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b505050506040513d60208110156126eb57600080fd5b50516019556011546013546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561274a57600080fd5b505af115801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051600080516020615daf8339815191529163095ea7b39160448083019260209291908290030181600087803b1580156127df57600080fd5b505af11580156127f3573d6000803e3d6000fd5b505050506040513d602081101561280957600080fd5b5050565b6020546001600160a01b031681565b600d546001600160a01b03163314612867576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156128b257600080fd5b505afa1580156128c6573d6000803e3d6000fd5b505050506040513d60208110156128dc57600080fd5b50511115612a70576128ef60001961468d565b602354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051156129b0576040805162461bcd60e51b8152602060048201526015602482015274042e6e8d2d8d88edee8a6dedaca92dc86dedceccaf605b1b604482015290519081900360640190fd5b602554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156129fb57600080fd5b505afa158015612a0f573d6000803e3d6000fd5b505050506040513d6020811015612a2557600080fd5b505115612a70576040805162461bcd60e51b8152602060048201526014602482015273217374696c6c476f74536f6d65496e437572766560601b604482015290519081900360640190fd5b602480546001600160a01b038086166001600160a01b03199283161790925560258054858416908316179055602380548484169216919091179081905560408051633c41a11560e21b81529051919092169163f1068454916004808301926020929190829003018186803b158015612ae757600080fd5b505afa158015612afb573d6000803e3d6000fd5b505050506040513d6020811015612b1157600080fd5b5051602255612b1e614a08565b604080516370a0823160e01b81523060048201529051611b2a91600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015612b6e57600080fd5b505afa158015612b82573d6000803e3d6000fd5b505050506040513d6020811015612b9857600080fd5b5051614aa0565b6014546001600160a01b031681565b600a546001600160a01b03163314612bfb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6014546000906001600160a01b0316612c72576040805162461bcd60e51b8152602060048201526012602482015271215f636f6c6c61746572616c4f7261636c6560701b604482015290519081900360640190fd5b6000806000806000601660009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d60a0811015612cf257600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506000841315612e045760185460019060ff1615612dad57735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612d7b57600080fd5b505afa158015612d8f573d6000803e3d6000fd5b505050506040513d60a0811015612da557600080fd5b506020015190505b601854612df79060ff16612dc2576001612dcc565b670de0b6b3a76400005b67ffffffffffffffff166110756305f5e100611075856119dd6017548c613af990919063ffffffff16565b9650505050505050610e47565b600095505050505050610e47565b60225481565b60185460ff1681565b60075461010090046001600160a01b031681565b60175481565b604080516002808252606080830184526000939092839283926020830190803683370190505091508682600081518110612e7157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508582600181518110612e9f57fe5b6001600160a01b03929092166020928302919091018201526040805160028082526060820183529092909190830190803683370190505090508681600081518110612ee657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110612f1457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080825111612f455760006130b4565b600f546040805163d06ca61f60e01b815260048101898152602482019283528551604483015285516001600160a01b039094169363d06ca61f938b938893926064909101906020808601910280838360005b83811015612faf578181015183820152602001612f97565b50505050905001935050505060006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561301057600080fd5b810190808051604051939291908464010000000082111561303057600080fd5b90830190602082018581111561304557600080fd5b825186602082028301116401000000008211171561306257600080fd5b82525081516020918201928201910280838360005b8381101561308f578181015183820152602001613077565b505050509050016040525050506001835103815181106130ab57fe5b60200260200101515b90506000808351116130c7576001613236565b600e546040805163d06ca61f60e01b8152600481018a8152602482019283528751604483015287516001600160a01b039094169363d06ca61f938c938a93926064909101906020808601910280838360005b83811015613131578181015183820152602001613119565b50505050905001935050505060006040518083038186803b15801561315557600080fd5b505afa158015613169573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561319257600080fd5b81019080805160405193929190846401000000008211156131b257600080fd5b9083019060208201858111156131c757600080fd5b82518660208202830111640100000000821117156131e457600080fd5b82525081516020918201928201910280838360005b838110156132115781810151838201526020016131f9565b5050505090500160405250505060018551038151811061322d57fe5b60200260200101515b9050600081831161324857600061324b565b60015b905060608161325a578561325c565b845b919b919a509098505050505050505050565b600a546001600160a01b031633146132bb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b601b5481565b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b60008060006019541161332757600061332f565b61332f610f32565b9050801561336957600061334760646119dd84611b2f565b90506000613353611c3a565b905061335f8282613b52565b9350505050610e47565b6000915050610e47565b60035481565b600a546001600160a01b031633148061339c5750600c546001600160a01b031633145b6133a557600080fd5b602682905560278190556133b98282613de1565b6028555050565b600e546001600160a01b031681565b600d546001600160a01b0316331461341a576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610e1857600080fd5b600a546001600160a01b031633146134ec576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b602b5481565b6000610eca670de0b6b3a764000061107573bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561357257600080fd5b505afa158015613586573d6000803e3d6000fd5b505050506040513d602081101561359c57600080fd5b505160245460408051630176f71760e71b815290516001600160a01b039092169163bb7b8b8091600480820192602092909190829003018186803b1580156135e357600080fd5b505afa1580156135f7573d6000803e3d6000fd5b505050506040513d602081101561360d57600080fd5b505190613af9565b60025481565b6000613625613454565b905060006136316137e5565b925050506000821180156136425750805b1561280957600061366561365e613657610f32565b8590613de1565b6001613919565b905060008111801561368a5750601054613687613680611c3a565b8390613de1565b10155b15611b2a576136998382614e23565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156136e857600080fd5b505afa1580156136fc573d6000803e3d6000fd5b505050506040513d602081101561371257600080fd5b5051905061372d8183116137265782613728565b815b614aa0565b50505050565b600d546001600160a01b031681565b73a79828df1850e8a3a3064576f380d90aecdd335981565b6011546001600160a01b031681565b601c546001600160a01b031681565b602a5481565b60006020819052908152604090205460ff1681565b600a546001600160a01b031633146137e0576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600455565b6000806000806000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b031663d9638d366015546040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561384857600080fd5b505afa15801561385c573d6000803e3d6000fd5b505050506040513d60a081101561387257600080fd5b5080516020820151606090920151909450909250905060006138a46b033b2e3c9fd0803ce80000006110758686613af9565b905060006138be836b033b2e3c9fd0803ce8000000613b52565b91989197505087871195509350505050565b60265481565b601f5481565b600a546001600160a01b03163314806138ff5750600c546001600160a01b031633145b61390857600080fd5b601a55565b60155481565b60105481565b6000806000841161392b576000613948565b6139486139396127106151fc565b6110756127106119dd88611b2f565b90506000613954611c3a565b905060008480156139655750818310155b1561397b576139748383613b94565b905061399b565b841580156139895750828210155b1561399b576139988284613b94565b90505b600081116139aa5760006139ac565b805b9695505050505050565b600b546001600160a01b031681565b600080516020615daf83398151915281565b801580613a5d575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613a2f57600080fd5b505afa158015613a43573d6000803e3d6000fd5b505050506040513d6020811015613a5957600080fd5b5051155b613a985760405162461bcd60e51b8152600401808060200182810382526036815260200180615e1a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b2a908490615231565b6060611c2384846000856152e2565b600082613b08575060006125e9565b82820282848281613b1557fe5b0414611b675760405162461bcd60e51b8152600401808060200182810382526021815260200180615dcf6021913960400191505060405180910390fd5b6000611b6783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061548d565b6000611b6783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154f2565b600080613be1610f32565b8310159050808015613bf35750600083115b15613cec57613c0360001961468d565b6000613c0d611c3a565b604080516370a0823160e01b815230600482015290519192508291600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b158015613c5d57600080fd5b505afa158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50511015613cdc576040805162461bcd60e51b815260206004820152601960248201527f216d69736d6174636841667465725769746864726177416c6c00000000000000604482015290519081900360640190fd5b613ce6848261413b565b50613dda565b6000613cf784611bed565b90508015613dce57613d088161468d565b604080516370a0823160e01b815230600482015290518291600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015613d5657600080fd5b505afa158015613d6a573d6000803e3d6000fd5b505050506040513d6020811015613d8057600080fd5b50511015613dce576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b613dd8848261413b565b505b5090919050565b600082820183811015611b67576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060008311613e65575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290506000613f16565b600954613e90906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2856144b2565b604080516370a0823160e01b8152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29182916370a0823191602480820192602092909190829003018186803b158015613ee457600080fd5b505afa158015613ef8573d6000803e3d6000fd5b505050506040513d6020811015613f0e57600080fd5b505190925090505b915091565b60075460ff1615156001148015613f325750600081115b1561280957600754613f5490839061010090046001600160a01b0316836144b2565b600754604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613fa457600080fd5b505afa158015613fb8573d6000803e3d6000fd5b505050506040513d6020811015613fce57600080fd5b5051600854600754919250613ff59161010090046001600160a01b0390811691168361405f565b60085460408051635ad6dca560e11b81526004810184905290516001600160a01b039092169163b5adb94a9160248082019260009290919082900301818387803b15801561404257600080fd5b505af1158015614056573d6000803e3d6000fd5b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611b2a908490615231565b604080516002808252606080830184529260208301908036833701905050905083816000815181106140df57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061410d57fe5b6001600160a01b039283166020918202929092010152600f5461372d9186918691869160019187911661554c565b60006019541161417b576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000614186611c3a565b905080821080156141a2575060105461419f8284613b94565b10155b806141ad5750818111155b6141e9576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b60008060006141f66156fa565b91945092509050851561427e5760408051633b4da69f60e01b81526001600160a01b0385166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b15801561426557600080fd5b505af1158015614279573d6000803e3d6000fd5b505050505b600080881161428e5760006142a4565b6013546142a4906001600160a01b031689615889565b9050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd6019546142d584615901565b60000361435c87886001600160a01b0316636c25b3468b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561432957600080fd5b505afa15801561433d573d6000803e3d6000fd5b505050506040513d602081101561435357600080fd5b50518a89615947565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b1580156143a057600080fd5b505af11580156143b4573d6000803e3d6000fd5b5050505060008811156144a857601954604080516313771f0760e31b815260048101929092523060248301526044820183905251735ef30b9986345249bc32d8928b7ee64de9435e3991639bb8f83891606480830192600092919082900301818387803b15801561442457600080fd5b505af1158015614438573d6000803e3d6000fd5b50506013546040805163ef693bed60e01b8152306004820152602481018d905290516001600160a01b03909216935063ef693bed925060448082019260009290919082900301818387803b15801561448f57600080fd5b505af11580156144a3573d6000803e3d6000fd5b505050505b5050505050505050565b8015611b2a57600060606144c7858585612e3b565b91509150611375858585600185876144ea57600e546001600160a01b03166144f7565b600f546001600160a01b03165b61554c565b600b546000906001600160a01b0316331461454c576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6009546001600160a01b0383811691161415614598576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156145de57600080fd5b505afa1580156145f2573d6000803e3d6000fd5b505050506040513d602081101561460857600080fd5b5051600b549091506110d3906001600160a01b0384811691168361405f565b60008115806146425750508082028282828161463f57fe5b04145b6125e9576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b61242e6111e6610ec0565b806146975761242e565b600019811061481757602354604080516370a0823160e01b815230600482015290516001600160a01b039092169163c32e72029183916370a0823191602480820192602092909190829003018186803b1580156146f357600080fd5b505afa158015614707573d6000803e3d6000fd5b505050506040513d602081101561471d57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925260006024830181905290516044808401936020939083900390910190829087803b15801561476957600080fd5b505af115801561477d573d6000803e3d6000fd5b505050506040513d602081101561479357600080fd5b5050602554604080516370a0823160e01b81523060048201529051614812926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156147e157600080fd5b505afa1580156147f5573d6000803e3d6000fd5b505050506040513d602081101561480b57600080fd5b5051615a78565b61242e565b6000614822826110b1565b905061484b612710611075614844602954612710613de190919063ffffffff16565b8490613af9565b602554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561489c57600080fd5b505afa1580156148b0573d6000803e3d6000fd5b505050506040513d60208110156148c657600080fd5b5051905060008282106148da5760006148e4565b6148e48383613b94565b905080156149ff57602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561493757600080fd5b505afa15801561494b573d6000803e3d6000fd5b505050506040513d602081101561496157600080fd5b5051905060008282106149745782614976565b815b60235460408051636197390160e11b81526004810184905260006024820181905291519394506001600160a01b039092169263c32e7202926044808201936020939283900390910190829087803b1580156149d057600080fd5b505af11580156149e4573d6000803e3d6000fd5b505050506040513d60208110156149fa57600080fd5b505050505b61372d83615a78565b602554614a34906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd335960006139d7565b602554614a61906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd33596000196139d7565b602154602554614a7f916001600160a01b03918216911660006139d7565b602154602554614a9e916001600160a01b0391821691166000196139d7565b565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614aef57600080fd5b505afa158015614b03573d6000803e3d6000fd5b505050506040513d6020811015614b1957600080fd5b5051905080614b28575061242e565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614b7757600080fd5b505afa158015614b8b573d6000803e3d6000fd5b505050506040513d6020811015614ba157600080fd5b505190506000614bb0826110b1565b90506000614bdb612710611075614bd4602a54612710613b9490919063ffffffff16565b8590613af9565b9050600083118015614bf25750614bf283826124d8565b15614cec57614bff615d90565b604051806080016040528060008152602001858152602001600081526020016000815250905073a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663384e03db602460009054906101000a90046001600160a01b031683856040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b83811015614ca6578181015183820152602001614c8e565b505050509050018281526020019350505050600060405180830381600087803b158015614cd257600080fd5b505af1158015614ce6573d6000803e3d6000fd5b50505050505b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015614d3757600080fd5b505afa158015614d4b573d6000803e3d6000fd5b505050506040513d6020811015614d6157600080fd5b5051905080614da1576040805162461bcd60e51b81526020600482015260076024820152660857db1c105b5d60ca1b604482015290519081900360640190fd5b6021546022546040805163303acfe760e11b8152600481019290925260016024830152516001600160a01b03909216916360759fce916044808201926020929091908290030181600087803b158015614df957600080fd5b505af1158015614e0d573d6000803e3d6000fd5b505050506040513d60208110156144a857600080fd5b600060195411614e63576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b601054614e71613680611c3a565b1015614eaf576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000614ebc6156fa565b60135460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018c905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b158015614f1857600080fd5b505af1158015614f2c573d6000803e3d6000fd5b5050601954601354735ef30b9986345249bc32d8928b7ee64de9435e3993506345e6bdcd9250614f6e90614f69906001600160a01b03168a615889565b615901565b614f8f867319c0976f590d67707e62397c87829d896dc0f1f189888c615ba9565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015614fd357600080fd5b505af1158015614fe7573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db66019543061501b88615cf8565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561506857600080fd5b505af115801561507c573d6000803e3d6000fd5b505060408051634538c4eb60e01b8152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290516001600160a01b0386169350634538c4eb92506044808301926020929190829003018186803b1580156150e057600080fd5b505afa1580156150f4573d6000803e3d6000fd5b505050506040513d602081101561510a57600080fd5b505161518457604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290516001600160a01b0384169163a3b22fc491602480830192600092919082900301818387803b15801561516b57600080fd5b505af115801561517f573d6000803e3d6000fd5b505050505b6040805163ef693bed60e01b8152306004820152602481018690529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b1580156151dd57600080fd5b505af11580156151f1573d6000803e3d6000fd5b505050505050505050565b60006110d06064611075612710611075615223601b54612710613de190919063ffffffff16565b601a546119dd908990613af9565b6060615286826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613aea9092919063ffffffff16565b805190915015611b2a578080602001905160208110156152a557600080fd5b5051611b2a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615df0602a913960400191505060405180910390fd5b60606152ed85615d10565b61533e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061537d5780518252601f19909201916020918201910161535e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146153df576040519150601f19603f3d011682016040523d82523d6000602084013e6153e4565b606091505b509150915081156153f8579150611c239050565b8051156154085780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561545257818101518382015260200161543a565b50505050905090810190601f16801561547f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600081836154dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b5060008385816154e857fe5b0495945050505050565b600081848411156155445760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b505050900390565b8315611b26576155676001600160a01b0387168260006139d7565b61557b6001600160a01b03871682866139d7565b806001600160a01b03166338ed173985858530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156155ff5781810151838201526020016155e7565b505050509050019650505050505050600060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561566557600080fd5b810190808051604051939291908464010000000082111561568557600080fd5b90830190602082018581111561569a57600080fd5b82518660208202830111640100000000821117156156b757600080fd5b82525081516020918201928201910280838360005b838110156156e45781810151838201526020016156cc565b5050505090500160405250505050505050505050565b6000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561575957600080fd5b505afa15801561576d573d6000803e3d6000fd5b505050506040513d602081101561578357600080fd5b5051604080516336569e7760e01b81529051735ef30b9986345249bc32d8928b7ee64de9435e39916336569e77916004808301926020929190829003018186803b1580156157d057600080fd5b505afa1580156157e4573d6000803e3d6000fd5b505050506040513d60208110156157fa57600080fd5b505160195460408051632c2cb9fd60e01b8152600481019290925251735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561585157600080fd5b505afa158015615865573d6000803e3d6000fd5b505050506040513d602081101561587b57600080fd5b505191945092509050909192565b6000611b6782846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156158ca57600080fd5b505af11580156158de573d6000803e3d6000fd5b505050506040513d60208110156158f457600080fd5b5051601203600a0a614627565b8060008112156110d3576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561598e57600080fd5b505afa1580156159a2573d6000803e3d6000fd5b505050506040513d60a08110156159b857600080fd5b5060200151604080516309092f9760e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b158015615a0f57600080fd5b505afa158015615a23573d6000803e3d6000fd5b505050506040513d6040811015615a3957600080fd5b50602001519050615a4d614f698784613b52565b925080831115615a6857615a6081615901565b600003615a6d565b826000035b979650505050505050565b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015615ac357600080fd5b505afa158015615ad7573d6000803e3d6000fd5b505050506040513d6020811015615aed57600080fd5b50519050801561280957808211615b045781615b06565b805b91506000615b31612710611075615b2a602b54612710613b9490919063ffffffff16565b8690613af9565b60248054604080516314f6943160e11b81526001600160a01b0390921660048301529181018690526001604482015260648101839052905191925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848082019260009290919082900301818387803b15801561404257600080fd5b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015615bf257600080fd5b505af1158015615c06573d6000803e3d6000fd5b505050506040513d6020811015615c1c57600080fd5b505160408051633612d9a360e11b81526001600160a01b0388811660048301529151929350600092918a1691636c25b34691602480820192602092909190829003018186803b158015615c6e57600080fd5b505afa158015615c82573d6000803e3d6000fd5b505050506040513d6020811015615c9857600080fd5b50519050615ca584615cf8565b811015615ced57615cc5614f6983611075615cbf88615cf8565b85615d49565b9250615cd084615cf8565b615cda8484614627565b10615ce55782615cea565b826001015b92505b505095945050505050565b60006110d0826b033b2e3c9fd0803ce8000000614627565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c23575050151592915050565b808203828111156125e9576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fd5b6040518060800160405280600490602082028036833750919291505056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201448ab3cc765edd3681b66e989cb8845b4bda6382f5d2c3db08898745ea2589c64736f6c634300060c00335361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000000043229759e12efbe3e2a0fb0510b15e516d04644200000000000000000000000043229759e12efbe3e2a0fb0510b15e516d0464420000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d070000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106106595760003560e01c806386d8745b11610351578063b635b8ae116101c3578063d8dfeb451161010f578063eb319441116100ad578063f17336d711610087578063f17336d714610d83578063f6ff935214610d8b578063f77c479114610db0578063f8d8989814610db857610659565b8063eb31944114610d56578063ec029a4414610d5e578063ef55105014610d7b57610659565b8063e13f8513116100e9578063e13f851314610ce3578063e3a58e1814610d09578063e420557614610d26578063e4c01d3714610d4e57610659565b8063d8dfeb4514610ccb578063df1b27ac14610cd3578063e0c9cf0614610cdb57610659565b8063c7b9d5301161017c578063cc32d17611610156578063cc32d17614610cab578063d0e30db014610cb3578063d33219b414610cbb578063d89281e814610cc357610659565b8063c7b9d53014610c75578063c90b65de14610c9b578063c954e5cc14610ca357610659565b8063b635b8ae14610c0c578063b78e0c5a14610c14578063b9e3748914610c37578063bdacb30314610c3f578063c11645bc14610c65578063c1a3d44c14610c6d57610659565b8063a0e2c3411161029d578063a8e879951161023b578063ab43be7111610215578063ab43be7114610bec578063af4f170514610bf4578063b0fd087114610bfc578063b131da4014610c0457610659565b8063a8e8799514610b2b578063aa87484c14610b33578063ab033ea914610bc657610659565b8063a36f063e11610277578063a36f063e14610b0b578063a46c850514610b13578063a6d09de614610b1b578063a890dd9014610b2357610659565b8063a0e2c34114610aa5578063a217d5ce14610add578063a2d9f4dc14610ae557610659565b80639658e68f1161030a5780639a9b567d116102e45780639a9b567d14610a535780639aa5f0d214610a725780639ac9752c14610a955780639d1e73cb14610a9d57610659565b80639658e68f14610a26578063981879a614610a2e5780639868607c14610a3657610659565b806386d8745b146109e057806387788782146109e85780638ce47ff0146109f0578063918f86741461086957806392eefe9b146109f857806394d0737b14610a1e57610659565b80633fc8cef3116104ea5780635ffe27b41161043657806370897b23116103d45780637b756553116103ae5780637b756553146109c85780637cc79113146106e357806384718d89146109d0578063853828b6146109d857610659565b806370897b2314610986578063722713f7146109a357806377e741c7146109ab57610659565b80636480b8ad116104105780636480b8ad1461095157806366666aa9146109595780636765d6fb146109615780636d13582c1461097e57610659565b80635ffe27b4146109095780636234dc211461092c578063646780df1461094957610659565b806351cff8d9116104a3578063596b93e41161047d578063596b93e4146108d45780635aa6e675146108f15780635ccbbdf1146108f95780635d1583501461090157610659565b806351cff8d91461089e578063561c20dc146108c4578063575a86b2146108cc57610659565b80633fc8cef31461085957806344015ed41461086157806345d3bdff146108695780634641257d14610871578063475411ab146108795780634a1a066b1461089657610659565b8063160d0da5116105a9578063218751b21161056257806331e635c81161053c57806331e635c8146108135780633203d5611461081b57806335eb11861461084957806336569e771461085157610659565b8063218751b2146107e65780632e1a7d4d146107ee5780632eba33f61461080b57610659565b8063160d0da51461071857806317d7de7c1461073457806319ec5df5146107b15780631ba89442146107ce5780631f1fcd51146107d65780631fe4a686146107de57610659565b8063115880861161061657806314a1fe02116105f057806314a1fe02146106e357806314b74d9a146106eb57806314e6ac09146106f35780631529a6391461071057610659565b806311588086146106d35780631378e347146106db57806313bd4b95146106e357610659565b806301664f661461065e5780630547104d14610682578063057d66a21461069c5780630872b81d146106a457806308d50063146106ac5780630c56ae3b146106cb575b600080fd5b610666610dc0565b604080516001600160a01b039092168252519081900360200190f35b61068a610dcf565b60408051918252519081900360200190f35b61068a610e4a565b610666610e68565b6106c9600480360360208110156106c257600080fd5b5035610e80565b005b610666610eb1565b61068a610ec0565b61068a610ecf565b61068a610ed5565b61068a610edc565b6106c96004803603602081101561070957600080fd5b5035610ee2565b61068a610f32565b61072061107b565b604080519115158252519081900360200190f35b61073c611084565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561077657818101518382015260200161075e565b50505050905090810190601f1680156107a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61068a600480360360208110156107c757600080fd5b50356110b1565b61068a6110d8565b6106666110de565b6106666110ed565b6106666110fc565b6106c96004803603602081101561080457600080fd5b503561110b565b61068a61137c565b610666611382565b6106c96004803603604081101561083157600080fd5b506001600160a01b0381351690602001351515611391565b61068a611409565b61066661140e565b610666611426565b61068a61143e565b61068a6115ca565b6106c96115d0565b61068a6004803603602081101561088f57600080fd5b5035611b2f565b61068a611b6e565b61068a600480360360208110156108b457600080fd5b50356001600160a01b0316611b74565b610720611bd9565b610666611bde565b61068a600480360360208110156108ea57600080fd5b5035611bed565b610666611c2b565b61068a611c3a565b61068a611e4a565b6106c96004803603604081101561091f57600080fd5b5080359060200135611e50565b6106c96004803603602081101561094257600080fd5b5035611e87565b610666611eb8565b610666611ec7565b610666611edf565b6106c96004803603602081101561097757600080fd5b5035611eee565b610666611f1f565b6106c96004803603602081101561099c57600080fd5b5035611f2e565b61068a611f7e565b6106c9600480360360208110156109c157600080fd5b5035612037565b61068a612087565b61066661208d565b61068a6120a5565b61068a612214565b61068a61221a565b61068a612220565b6106c960048036036020811015610a0e57600080fd5b50356001600160a01b0316612226565b6106c9612293565b61068a612431565b610666612437565b61068a60048036036020811015610a4c57600080fd5b503561244f565b6106c960048036036020811015610a6957600080fd5b50351515612478565b61072060048036036040811015610a8857600080fd5b50803590602001356124d8565b6106c96125ef565b61066661280d565b6106c960048036036060811015610abb57600080fd5b506001600160a01b03813581169160208101358216916040909101351661281c565b610666612b9f565b6106c960048036036020811015610afb57600080fd5b50356001600160a01b0316612bae565b61068a612c1d565b61068a612e12565b610720612e18565b610666612e21565b61068a612e35565b610b6960048036036060811015610b4957600080fd5b506001600160a01b03813581169160208101359091169060400135612e3b565b60405180831515815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bb1578181015183820152602001610b99565b50505050905001935050505060405180910390f35b6106c960048036036020811015610bdc57600080fd5b50356001600160a01b031661326e565b6106666132dd565b61068a6132f5565b6106666132fb565b61068a613313565b61068a613373565b6106c960048036036040811015610c2a57600080fd5b5080359060200135613379565b6106666133c0565b6106c960048036036020811015610c5557600080fd5b50356001600160a01b03166133cf565b61066661343c565b61068a613454565b6106c960048036036020811015610c8b57600080fd5b50356001600160a01b031661349f565b61068a61350e565b61068a613514565b61068a613615565b6106c961361b565b610666613733565b610666613742565b61066661375a565b610666613769565b61068a613778565b61072060048036036020811015610cf957600080fd5b50356001600160a01b031661377e565b6106c960048036036020811015610d1f57600080fd5b5035613793565b610d2e6137e5565b604080519384526020840192909252151582820152519081900360600190f35b61068a6138d0565b61068a6138d6565b6106c960048036036020811015610d7457600080fd5b50356138dc565b61068a61390d565b61068a613913565b61068a60048036036040811015610da157600080fd5b50803590602001351515613919565b6106666139b6565b6106666139c5565b6013546001600160a01b031681565b602354604080516246613160e11b815230600482015290516000926001600160a01b031691628cc262916024808301926020929190829003018186803b158015610e1857600080fd5b505afa158015610e2c573d6000803e3d6000fd5b505050506040513d6020811015610e4257600080fd5b505190505b90565b600080610e55610f32565b9050610e62816001613919565b91505090565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600a546001600160a01b0316331480610ea35750600c546001600160a01b031633145b610eac57600080fd5b602955565b6021546001600160a01b031681565b6000610eca610f32565b905090565b60295481565b620186a081565b60055481565b600d546001600160a01b03163314610f2d576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600355565b6000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b0316632424be5c601554735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fb557600080fd5b505afa158015610fc9573d6000803e3d6000fd5b505050506040513d6020811015610fdf57600080fd5b5051604080516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301528051604480840193829003018186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d604081101561105457600080fd5b5051601254909150610e6290670de0b6b3a764000090611075908490613af9565b90613b52565b60075460ff1681565b60408051808201909152601381527253747261746567794d616b657257425443563360681b602082015290565b60006110d06110be613514565b61107584670de0b6b3a7640000613af9565b90505b919050565b60125481565b6009546001600160a01b031681565b600c546001600160a01b031681565b6024546001600160a01b031681565b600b546001600160a01b03163314611158576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50519050818110156111fa576111eb6111e68383613b94565b613bd6565b91506111f78282613de1565b91505b6000806003541161120c576000611228565b611228620186a061107560035486613af990919063ffffffff16565b90506000806002541161123c576000611258565b611258620186a061107560025487613af990919063ffffffff16565b600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b505160075490915060ff16151560011480156112fe575060008311806112fe5750600082115b15611329576000806113186113138686613de1565b613e3b565b915091506113268282613f1b565b50505b600083116113375784611341565b6113418584613b94565b945060008211611351578461135b565b61135b8583613b94565b600954909550611375906001600160a01b0316828761405f565b5050505050565b601e5481565b601d546001600160a01b031681565b600a546001600160a01b031633146113de576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b600181565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b602354604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561148e57600080fd5b505afa1580156114a2573d6000803e3d6000fd5b505050506040513d60208110156114b857600080fd5b5051602554604080516370a0823160e01b8152306004820152905192935061153f926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50518290613de1565b9050610e6261154d8261244f565b604080516370a0823160e01b81523060048201529051600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b15801561159857600080fd5b505afa1580156115ac573d6000803e3d6000fd5b505050506040513d60208110156115c257600080fd5b505190613de1565b61271081565b600a546001600160a01b03163314806115f35750600c546001600160a01b031633145b6115fc57600080fd5b60235460408051637050ccd960e01b81523060048201526001602482015290516001600160a01b0390921691637050ccd9916044808201926020929091908290030181600087803b15801561165057600080fd5b505af1158015611664573d6000803e3d6000fd5b505050506040513d602081101561167a57600080fd5b5050604080516370a0823160e01b8152306004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d60208110156116fb57600080fd5b5051604080516370a0823160e01b81523060048201529051919250600091734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b916370a08231916024808301926020929190829003018186803b15801561175457600080fd5b505afa158015611768573d6000803e3d6000fd5b505050506040513d602081101561177e57600080fd5b5051905081156117bb576117bb73d533a949740bb3306d119cc777fa900ba034cd5273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2846140b1565b80156117f4576117f4734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2836140b1565b604080516370a0823160e01b8152306004820152905160009173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2916370a0823191602480820192602092909190829003018186803b15801561184957600080fd5b505afa15801561185d573d6000803e3d6000fd5b505050506040513d602081101561187357600080fd5b505190508015611b2a57604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156118cc57600080fd5b505afa1580156118e0573d6000803e3d6000fd5b505050506040513d60208110156118f657600080fd5b50516028549091506119409073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600080516020615daf8339815191529061193b9061271090611075908890613af9565b6140b1565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d60208110156119b957600080fd5b50516028546026549192506119e8916000916119e391611075906119dd8789613b94565b90613af9565b61413b565b60075460ff16151560011415611a38576000611a16620186a061107560015487613af990919063ffffffff16565b9050611a3673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282613f1b565b505b600954604080516370a0823160e01b81523060048201529051611acf9273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2926001600160a01b039091169183916370a08231916024808301926020929190829003018186803b158015611a9e57600080fd5b505afa158015611ab2573d6000803e3d6000fd5b505050506040513d6020811015611ac857600080fd5b50516144b2565b6000611ad9613454565b90508015611b2657436005556006819055611af261361b565b6040805182815290517f80f97f878e16410266694f134ddf012f2be424f54f8b5cafa107eccc51d00d589181900360200190a15b5050505b505050565b600080611b3a612c1d565b9050611b67601754611075601254611075670de0b6b3a76400006119dd878a613af990919063ffffffff16565b9392505050565b60195481565b6025546000906001600160a01b0383811691161415611bca576040805162461bcd60e51b815260206004820152600d60248201526c10b1bab93b32a6382a37b5b2b760991b604482015290519081900360640190fd5b611bd3826144fc565b50919050565b600081565b6008546001600160a01b031681565b600080611bf8610f32565b9050600081841015611c1357611c0e8285613b94565b611c16565b60005b9050611c23816000613919565b949350505050565b600a546001600160a01b031681565b600080735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c9757600080fd5b505afa158015611cab573d6000803e3d6000fd5b505050506040513d6020811015611cc157600080fd5b5051601554604080516309092f9760e21b815260048101929092526001600160a01b038316602483015280519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c926044808301939192829003018186803b158015611d2b57600080fd5b505afa158015611d3f573d6000803e3d6000fd5b505050506040513d6040811015611d5557600080fd5b506020015160155460408051636cb1c69b60e11b81526004810192909252519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d60a0811015611ddf57600080fd5b506020015190506000611df28383614627565b905080611e06576000945050505050610e47565b60006b033b2e3c9fd0803ce80000008204905081611e30826b033b2e3c9fd0803ce8000000614627565b10611e3b5780611e40565b806001015b9550505050505090565b60045481565b600a546001600160a01b0316331480611e735750600c546001600160a01b031633145b611e7c57600080fd5b602a91909155602b55565b600a546001600160a01b0316331480611eaa5750600c546001600160a01b031633145b611eb357600080fd5b601055565b6025546001600160a01b031681565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6023546001600160a01b031681565b600a546001600160a01b0316331480611f115750600c546001600160a01b031633145b611f1a57600080fd5b601b55565b600f546001600160a01b031681565b600d546001600160a01b03163314611f79576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600155565b6004546000908190439015801590611f9857506000600654115b8015611fb25750600454600554611fb0908390613b94565b105b15612013576000611fda82611fd4600454600554613de190919063ffffffff16565b90613b94565b905061200f670de0b6b3a7640000611075600454611075670de0b6b3a76400006119dd87600654613af990919063ffffffff16565b9250505b61203082611fd4612022610ec0565b61202a613454565b90613de1565b9250505090565b600d546001600160a01b03163314612082576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600255565b60065481565b7319c0976f590d67707e62397c87829d896dc0f1f181565b600b546000906001600160a01b031633146120f5576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6120fd614682565b600954604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051600b5460095460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b1580156121ca57600080fd5b505afa1580156121de573d6000803e3d6000fd5b505050506040513d60208110156121f457600080fd5b5051600954909150612210906001600160a01b0316828461405f565b5090565b601a5481565b60015481565b60275481565b600d546001600160a01b03163314612271576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314806122b65750600c546001600160a01b031633145b806122d057503360009081526020819052604090205460ff165b6122d957600080fd5b60006122e56000611bed565b9050801561242e576122f68161468d565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b15801561234557600080fd5b505afa158015612359573d6000803e3d6000fd5b505050506040513d602081101561236f57600080fd5b50519050818110156123be576040805162461bcd60e51b8152602060048201526013602482015272216b6565704d696e526174696f52656465656d60681b604482015290519081900360640190fd5b6123c960008361413b565b60006123d3613313565b601a549091506123e4906001613b94565b811015611b2a576040805162461bcd60e51b8152602060048201526013602482015272217374696c6c42656c6f774d696e526174696f60681b604482015290519081900360640190fd5b50565b60285481565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b60008161245e575060006110d3565b6000611b67670de0b6b3a7640000611075856119dd613514565b600a546001600160a01b031633146124c5576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60006124e2615d90565b60405180608001604052806000815260200185815260200160008152602001600081525090508273a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663861cdef0602460009054906101000a90046001600160a01b03168460016040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b8381101561258b578181015183820152602001612573565b505050509050018215158152602001935050505060206040518083038186803b1580156125b757600080fd5b505afa1580156125cb573d6000803e3d6000fd5b505050506040513d60208110156125e157600080fd5b505110159150505b92915050565b600a546001600160a01b03163314806126125750600c546001600160a01b031633145b61261b57600080fd5b60195415612664576040805162461bcd60e51b81526020600482015260116024820152700858d91c105b1c9958591e53dc195b9959607a1b604482015290519081900360640190fd5b60155460408051636090dec560e01b8152600481019290925230602483015251735ef30b9986345249bc32d8928b7ee64de9435e3991636090dec59160448083019260209291908290030181600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b505050506040513d60208110156126eb57600080fd5b50516019556011546013546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561274a57600080fd5b505af115801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051600080516020615daf8339815191529163095ea7b39160448083019260209291908290030181600087803b1580156127df57600080fd5b505af11580156127f3573d6000803e3d6000fd5b505050506040513d602081101561280957600080fd5b5050565b6020546001600160a01b031681565b600d546001600160a01b03163314612867576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156128b257600080fd5b505afa1580156128c6573d6000803e3d6000fd5b505050506040513d60208110156128dc57600080fd5b50511115612a70576128ef60001961468d565b602354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051156129b0576040805162461bcd60e51b8152602060048201526015602482015274042e6e8d2d8d88edee8a6dedaca92dc86dedceccaf605b1b604482015290519081900360640190fd5b602554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156129fb57600080fd5b505afa158015612a0f573d6000803e3d6000fd5b505050506040513d6020811015612a2557600080fd5b505115612a70576040805162461bcd60e51b8152602060048201526014602482015273217374696c6c476f74536f6d65496e437572766560601b604482015290519081900360640190fd5b602480546001600160a01b038086166001600160a01b03199283161790925560258054858416908316179055602380548484169216919091179081905560408051633c41a11560e21b81529051919092169163f1068454916004808301926020929190829003018186803b158015612ae757600080fd5b505afa158015612afb573d6000803e3d6000fd5b505050506040513d6020811015612b1157600080fd5b5051602255612b1e614a08565b604080516370a0823160e01b81523060048201529051611b2a91600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015612b6e57600080fd5b505afa158015612b82573d6000803e3d6000fd5b505050506040513d6020811015612b9857600080fd5b5051614aa0565b6014546001600160a01b031681565b600a546001600160a01b03163314612bfb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6014546000906001600160a01b0316612c72576040805162461bcd60e51b8152602060048201526012602482015271215f636f6c6c61746572616c4f7261636c6560701b604482015290519081900360640190fd5b6000806000806000601660009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d60a0811015612cf257600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506000841315612e045760185460019060ff1615612dad57735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015612d7b57600080fd5b505afa158015612d8f573d6000803e3d6000fd5b505050506040513d60a0811015612da557600080fd5b506020015190505b601854612df79060ff16612dc2576001612dcc565b670de0b6b3a76400005b67ffffffffffffffff166110756305f5e100611075856119dd6017548c613af990919063ffffffff16565b9650505050505050610e47565b600095505050505050610e47565b60225481565b60185460ff1681565b60075461010090046001600160a01b031681565b60175481565b604080516002808252606080830184526000939092839283926020830190803683370190505091508682600081518110612e7157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508582600181518110612e9f57fe5b6001600160a01b03929092166020928302919091018201526040805160028082526060820183529092909190830190803683370190505090508681600081518110612ee657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110612f1457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080825111612f455760006130b4565b600f546040805163d06ca61f60e01b815260048101898152602482019283528551604483015285516001600160a01b039094169363d06ca61f938b938893926064909101906020808601910280838360005b83811015612faf578181015183820152602001612f97565b50505050905001935050505060006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561301057600080fd5b810190808051604051939291908464010000000082111561303057600080fd5b90830190602082018581111561304557600080fd5b825186602082028301116401000000008211171561306257600080fd5b82525081516020918201928201910280838360005b8381101561308f578181015183820152602001613077565b505050509050016040525050506001835103815181106130ab57fe5b60200260200101515b90506000808351116130c7576001613236565b600e546040805163d06ca61f60e01b8152600481018a8152602482019283528751604483015287516001600160a01b039094169363d06ca61f938c938a93926064909101906020808601910280838360005b83811015613131578181015183820152602001613119565b50505050905001935050505060006040518083038186803b15801561315557600080fd5b505afa158015613169573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561319257600080fd5b81019080805160405193929190846401000000008211156131b257600080fd5b9083019060208201858111156131c757600080fd5b82518660208202830111640100000000821117156131e457600080fd5b82525081516020918201928201910280838360005b838110156132115781810151838201526020016131f9565b5050505090500160405250505060018551038151811061322d57fe5b60200260200101515b9050600081831161324857600061324b565b60015b905060608161325a578561325c565b845b919b919a509098505050505050505050565b600a546001600160a01b031633146132bb576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b601b5481565b735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b60008060006019541161332757600061332f565b61332f610f32565b9050801561336957600061334760646119dd84611b2f565b90506000613353611c3a565b905061335f8282613b52565b9350505050610e47565b6000915050610e47565b60035481565b600a546001600160a01b031633148061339c5750600c546001600160a01b031633145b6133a557600080fd5b602682905560278190556133b98282613de1565b6028555050565b600e546001600160a01b031681565b600d546001600160a01b0316331461341a576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610e1857600080fd5b600a546001600160a01b031633146134ec576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b602b5481565b6000610eca670de0b6b3a764000061107573bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b15801561357257600080fd5b505afa158015613586573d6000803e3d6000fd5b505050506040513d602081101561359c57600080fd5b505160245460408051630176f71760e71b815290516001600160a01b039092169163bb7b8b8091600480820192602092909190829003018186803b1580156135e357600080fd5b505afa1580156135f7573d6000803e3d6000fd5b505050506040513d602081101561360d57600080fd5b505190613af9565b60025481565b6000613625613454565b905060006136316137e5565b925050506000821180156136425750805b1561280957600061366561365e613657610f32565b8590613de1565b6001613919565b905060008111801561368a5750601054613687613680611c3a565b8390613de1565b10155b15611b2a576136998382614e23565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b1580156136e857600080fd5b505afa1580156136fc573d6000803e3d6000fd5b505050506040513d602081101561371257600080fd5b5051905061372d8183116137265782613728565b815b614aa0565b50505050565b600d546001600160a01b031681565b73a79828df1850e8a3a3064576f380d90aecdd335981565b6011546001600160a01b031681565b601c546001600160a01b031681565b602a5481565b60006020819052908152604090205460ff1681565b600a546001600160a01b031633146137e0576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600455565b6000806000806000807335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b031663d9638d366015546040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561384857600080fd5b505afa15801561385c573d6000803e3d6000fd5b505050506040513d60a081101561387257600080fd5b5080516020820151606090920151909450909250905060006138a46b033b2e3c9fd0803ce80000006110758686613af9565b905060006138be836b033b2e3c9fd0803ce8000000613b52565b91989197505087871195509350505050565b60265481565b601f5481565b600a546001600160a01b03163314806138ff5750600c546001600160a01b031633145b61390857600080fd5b601a55565b60155481565b60105481565b6000806000841161392b576000613948565b6139486139396127106151fc565b6110756127106119dd88611b2f565b90506000613954611c3a565b905060008480156139655750818310155b1561397b576139748383613b94565b905061399b565b841580156139895750828210155b1561399b576139988284613b94565b90505b600081116139aa5760006139ac565b805b9695505050505050565b600b546001600160a01b031681565b600080516020615daf83398151915281565b801580613a5d575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613a2f57600080fd5b505afa158015613a43573d6000803e3d6000fd5b505050506040513d6020811015613a5957600080fd5b5051155b613a985760405162461bcd60e51b8152600401808060200182810382526036815260200180615e1a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b2a908490615231565b6060611c2384846000856152e2565b600082613b08575060006125e9565b82820282848281613b1557fe5b0414611b675760405162461bcd60e51b8152600401808060200182810382526021815260200180615dcf6021913960400191505060405180910390fd5b6000611b6783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061548d565b6000611b6783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154f2565b600080613be1610f32565b8310159050808015613bf35750600083115b15613cec57613c0360001961468d565b6000613c0d611c3a565b604080516370a0823160e01b815230600482015290519192508291600080516020615daf833981519152916370a08231916024808301926020929190829003018186803b158015613c5d57600080fd5b505afa158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50511015613cdc576040805162461bcd60e51b815260206004820152601960248201527f216d69736d6174636841667465725769746864726177416c6c00000000000000604482015290519081900360640190fd5b613ce6848261413b565b50613dda565b6000613cf784611bed565b90508015613dce57613d088161468d565b604080516370a0823160e01b815230600482015290518291600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015613d5657600080fd5b505afa158015613d6a573d6000803e3d6000fd5b505050506040513d6020811015613d8057600080fd5b50511015613dce576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b613dd8848261413b565b505b5090919050565b600082820183811015611b67576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060008311613e65575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290506000613f16565b600954613e90906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2856144b2565b604080516370a0823160e01b8152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29182916370a0823191602480820192602092909190829003018186803b158015613ee457600080fd5b505afa158015613ef8573d6000803e3d6000fd5b505050506040513d6020811015613f0e57600080fd5b505190925090505b915091565b60075460ff1615156001148015613f325750600081115b1561280957600754613f5490839061010090046001600160a01b0316836144b2565b600754604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613fa457600080fd5b505afa158015613fb8573d6000803e3d6000fd5b505050506040513d6020811015613fce57600080fd5b5051600854600754919250613ff59161010090046001600160a01b0390811691168361405f565b60085460408051635ad6dca560e11b81526004810184905290516001600160a01b039092169163b5adb94a9160248082019260009290919082900301818387803b15801561404257600080fd5b505af1158015614056573d6000803e3d6000fd5b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611b2a908490615231565b604080516002808252606080830184529260208301908036833701905050905083816000815181106140df57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061410d57fe5b6001600160a01b039283166020918202929092010152600f5461372d9186918691869160019187911661554c565b60006019541161417b576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000614186611c3a565b905080821080156141a2575060105461419f8284613b94565b10155b806141ad5750818111155b6141e9576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b60008060006141f66156fa565b91945092509050851561427e5760408051633b4da69f60e01b81526001600160a01b0385166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b15801561426557600080fd5b505af1158015614279573d6000803e3d6000fd5b505050505b600080881161428e5760006142a4565b6013546142a4906001600160a01b031689615889565b9050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd6019546142d584615901565b60000361435c87886001600160a01b0316636c25b3468b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561432957600080fd5b505afa15801561433d573d6000803e3d6000fd5b505050506040513d602081101561435357600080fd5b50518a89615947565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b1580156143a057600080fd5b505af11580156143b4573d6000803e3d6000fd5b5050505060008811156144a857601954604080516313771f0760e31b815260048101929092523060248301526044820183905251735ef30b9986345249bc32d8928b7ee64de9435e3991639bb8f83891606480830192600092919082900301818387803b15801561442457600080fd5b505af1158015614438573d6000803e3d6000fd5b50506013546040805163ef693bed60e01b8152306004820152602481018d905290516001600160a01b03909216935063ef693bed925060448082019260009290919082900301818387803b15801561448f57600080fd5b505af11580156144a3573d6000803e3d6000fd5b505050505b5050505050505050565b8015611b2a57600060606144c7858585612e3b565b91509150611375858585600185876144ea57600e546001600160a01b03166144f7565b600f546001600160a01b03165b61554c565b600b546000906001600160a01b0316331461454c576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6009546001600160a01b0383811691161415614598576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156145de57600080fd5b505afa1580156145f2573d6000803e3d6000fd5b505050506040513d602081101561460857600080fd5b5051600b549091506110d3906001600160a01b0384811691168361405f565b60008115806146425750508082028282828161463f57fe5b04145b6125e9576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b61242e6111e6610ec0565b806146975761242e565b600019811061481757602354604080516370a0823160e01b815230600482015290516001600160a01b039092169163c32e72029183916370a0823191602480820192602092909190829003018186803b1580156146f357600080fd5b505afa158015614707573d6000803e3d6000fd5b505050506040513d602081101561471d57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925260006024830181905290516044808401936020939083900390910190829087803b15801561476957600080fd5b505af115801561477d573d6000803e3d6000fd5b505050506040513d602081101561479357600080fd5b5050602554604080516370a0823160e01b81523060048201529051614812926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156147e157600080fd5b505afa1580156147f5573d6000803e3d6000fd5b505050506040513d602081101561480b57600080fd5b5051615a78565b61242e565b6000614822826110b1565b905061484b612710611075614844602954612710613de190919063ffffffff16565b8490613af9565b602554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561489c57600080fd5b505afa1580156148b0573d6000803e3d6000fd5b505050506040513d60208110156148c657600080fd5b5051905060008282106148da5760006148e4565b6148e48383613b94565b905080156149ff57602354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561493757600080fd5b505afa15801561494b573d6000803e3d6000fd5b505050506040513d602081101561496157600080fd5b5051905060008282106149745782614976565b815b60235460408051636197390160e11b81526004810184905260006024820181905291519394506001600160a01b039092169263c32e7202926044808201936020939283900390910190829087803b1580156149d057600080fd5b505af11580156149e4573d6000803e3d6000fd5b505050506040513d60208110156149fa57600080fd5b505050505b61372d83615a78565b602554614a34906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd335960006139d7565b602554614a61906001600160a01b031673a79828df1850e8a3a3064576f380d90aecdd33596000196139d7565b602154602554614a7f916001600160a01b03918216911660006139d7565b602154602554614a9e916001600160a01b0391821691166000196139d7565b565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614aef57600080fd5b505afa158015614b03573d6000803e3d6000fd5b505050506040513d6020811015614b1957600080fd5b5051905080614b28575061242e565b604080516370a0823160e01b81523060048201529051600091600080516020615daf833981519152916370a0823191602480820192602092909190829003018186803b158015614b7757600080fd5b505afa158015614b8b573d6000803e3d6000fd5b505050506040513d6020811015614ba157600080fd5b505190506000614bb0826110b1565b90506000614bdb612710611075614bd4602a54612710613b9490919063ffffffff16565b8590613af9565b9050600083118015614bf25750614bf283826124d8565b15614cec57614bff615d90565b604051806080016040528060008152602001858152602001600081526020016000815250905073a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663384e03db602460009054906101000a90046001600160a01b031683856040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183600460200280838360005b83811015614ca6578181015183820152602001614c8e565b505050509050018281526020019350505050600060405180830381600087803b158015614cd257600080fd5b505af1158015614ce6573d6000803e3d6000fd5b50505050505b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015614d3757600080fd5b505afa158015614d4b573d6000803e3d6000fd5b505050506040513d6020811015614d6157600080fd5b5051905080614da1576040805162461bcd60e51b81526020600482015260076024820152660857db1c105b5d60ca1b604482015290519081900360640190fd5b6021546022546040805163303acfe760e11b8152600481019290925260016024830152516001600160a01b03909216916360759fce916044808201926020929091908290030181600087803b158015614df957600080fd5b505af1158015614e0d573d6000803e3d6000fd5b505050506040513d60208110156144a857600080fd5b600060195411614e63576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b601054614e71613680611c3a565b1015614eaf576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000614ebc6156fa565b60135460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018c905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b158015614f1857600080fd5b505af1158015614f2c573d6000803e3d6000fd5b5050601954601354735ef30b9986345249bc32d8928b7ee64de9435e3993506345e6bdcd9250614f6e90614f69906001600160a01b03168a615889565b615901565b614f8f867319c0976f590d67707e62397c87829d896dc0f1f189888c615ba9565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015614fd357600080fd5b505af1158015614fe7573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db66019543061501b88615cf8565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561506857600080fd5b505af115801561507c573d6000803e3d6000fd5b505060408051634538c4eb60e01b8152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290516001600160a01b0386169350634538c4eb92506044808301926020929190829003018186803b1580156150e057600080fd5b505afa1580156150f4573d6000803e3d6000fd5b505050506040513d602081101561510a57600080fd5b505161518457604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290516001600160a01b0384169163a3b22fc491602480830192600092919082900301818387803b15801561516b57600080fd5b505af115801561517f573d6000803e3d6000fd5b505050505b6040805163ef693bed60e01b8152306004820152602481018690529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b1580156151dd57600080fd5b505af11580156151f1573d6000803e3d6000fd5b505050505050505050565b60006110d06064611075612710611075615223601b54612710613de190919063ffffffff16565b601a546119dd908990613af9565b6060615286826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613aea9092919063ffffffff16565b805190915015611b2a578080602001905160208110156152a557600080fd5b5051611b2a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615df0602a913960400191505060405180910390fd5b60606152ed85615d10565b61533e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061537d5780518252601f19909201916020918201910161535e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146153df576040519150601f19603f3d011682016040523d82523d6000602084013e6153e4565b606091505b509150915081156153f8579150611c239050565b8051156154085780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561545257818101518382015260200161543a565b50505050905090810190601f16801561547f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600081836154dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b5060008385816154e857fe5b0495945050505050565b600081848411156155445760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561545257818101518382015260200161543a565b505050900390565b8315611b26576155676001600160a01b0387168260006139d7565b61557b6001600160a01b03871682866139d7565b806001600160a01b03166338ed173985858530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156155ff5781810151838201526020016155e7565b505050509050019650505050505050600060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561566557600080fd5b810190808051604051939291908464010000000082111561568557600080fd5b90830190602082018581111561569a57600080fd5b82518660208202830111640100000000821117156156b757600080fd5b82525081516020918201928201910280838360005b838110156156e45781810151838201526020016156cc565b5050505090500160405250505050505050505050565b6000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561575957600080fd5b505afa15801561576d573d6000803e3d6000fd5b505050506040513d602081101561578357600080fd5b5051604080516336569e7760e01b81529051735ef30b9986345249bc32d8928b7ee64de9435e39916336569e77916004808301926020929190829003018186803b1580156157d057600080fd5b505afa1580156157e4573d6000803e3d6000fd5b505050506040513d60208110156157fa57600080fd5b505160195460408051632c2cb9fd60e01b8152600481019290925251735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561585157600080fd5b505afa158015615865573d6000803e3d6000fd5b505050506040513d602081101561587b57600080fd5b505191945092509050909192565b6000611b6782846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156158ca57600080fd5b505af11580156158de573d6000803e3d6000fd5b505050506040513d60208110156158f457600080fd5b5051601203600a0a614627565b8060008112156110d3576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561598e57600080fd5b505afa1580156159a2573d6000803e3d6000fd5b505050506040513d60a08110156159b857600080fd5b5060200151604080516309092f9760e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b158015615a0f57600080fd5b505afa158015615a23573d6000803e3d6000fd5b505050506040513d6040811015615a3957600080fd5b50602001519050615a4d614f698784613b52565b925080831115615a6857615a6081615901565b600003615a6d565b826000035b979650505050505050565b602554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015615ac357600080fd5b505afa158015615ad7573d6000803e3d6000fd5b505050506040513d6020811015615aed57600080fd5b50519050801561280957808211615b045781615b06565b805b91506000615b31612710611075615b2a602b54612710613b9490919063ffffffff16565b8690613af9565b60248054604080516314f6943160e11b81526001600160a01b0390921660048301529181018690526001604482015260648101839052905191925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848082019260009290919082900301818387803b15801561404257600080fd5b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015615bf257600080fd5b505af1158015615c06573d6000803e3d6000fd5b505050506040513d6020811015615c1c57600080fd5b505160408051633612d9a360e11b81526001600160a01b0388811660048301529151929350600092918a1691636c25b34691602480820192602092909190829003018186803b158015615c6e57600080fd5b505afa158015615c82573d6000803e3d6000fd5b505050506040513d6020811015615c9857600080fd5b50519050615ca584615cf8565b811015615ced57615cc5614f6983611075615cbf88615cf8565b85615d49565b9250615cd084615cf8565b615cda8484614627565b10615ce55782615cea565b826001015b92505b505095945050505050565b60006110d0826b033b2e3c9fd0803ce8000000614627565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c23575050151592915050565b808203828111156125e9576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fd5b6040518060800160405280600490602082028036833750919291505056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201448ab3cc765edd3681b66e989cb8845b4bda6382f5d2c3db08898745ea2589c64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d04644200000000000000000000000043229759e12efbe3e2a0fb0510b15e516d0464420000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d070000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736
-----Decoded View---------------
Arg [0] : _governance (address): 0x43229759E12eFbe3e2A0fB0510B15e516d046442
Arg [1] : _strategist (address): 0x43229759E12eFbe3e2A0fB0510B15e516d046442
Arg [2] : _controller (address): 0x4bF5059065541A2B176500928e91FBfD0B121d07
Arg [3] : _timelock (address): 0x5DAe9B27313670663B34Ac8BfFD18825bB9Df736
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d046442
Arg [1] : 00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d046442
Arg [2] : 0000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d07
Arg [3] : 0000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736
Deployed Bytecode Sourcemap
47499:10992:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33721:22;;;:::i;:::-;;;;-1:-1:-1;;;;;33721:22:0;;;;;;;;;;;;;;58233:134;;;:::i;:::-;;;;;;;;;;;;;;;;38559:176;;;:::i;48267:83::-;;;:::i;50459:128::-;;;;;;;;;;;;;;;;-1:-1:-1;50459:128:0;;:::i;:::-;;48189:71;;;:::i;36759:111::-;;;:::i;49145:42::-;;;:::i;21492:43::-;;;:::i;21630:31::-;;;:::i;24534:151::-;;;;;;;;;;;;;;;;-1:-1:-1;24534:151:0;;:::i;35699:225::-;;;:::i;21731:33::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;58375:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57532:146;;;;;;;;;;;;;;;;-1:-1:-1;57532:146:0;;:::i;33675:39::-;;;:::i;21939:19::-;;;:::i;22133:25::-;;;:::i;48744:69::-;;;:::i;26624:1064::-;;;;;;;;;;;;;;;;-1:-1:-1;26624:1064:0;;:::i;47787:44::-;;;:::i;47708:72::-;;;:::i;24154:177::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24154:177:0;;;;;;;;;;:::i;47954:46::-;;;:::i;33300:72::-;;;:::i;21965:73::-;;;:::i;57018:308::-;;;:::i;34262:44::-;;;:::i;51927:1682::-;;;:::i;36878:261::-;;;;;;;;;;;;;;;;-1:-1:-1;36878:261:0;;:::i;34006:24::-;;;:::i;56790:193::-;;;;;;;;;;;;;;;;-1:-1:-1;56790:193:0;-1:-1:-1;;;;;56790:193:0;;:::i;48007:43::-;;;:::i;21845:70::-;;;:::i;38743:330::-;;;;;;;;;;;;;;;;-1:-1:-1;38743:330:0;;:::i;22069:25::-;;;:::i;35933:457::-;;;:::i;21583:40::-;;;:::i;50021:163::-;;;;;;;;;;;;;;;;-1:-1:-1;50021:163:0;;;;;;;:::i;40180:99::-;;;;;;;;;;;;;;;;-1:-1:-1;40180:99:0;;:::i;48820:72::-;;;:::i;48063:82::-;;;:::i;48624:70::-;;;:::i;40402:107::-;;;;;;;;;;;;;;;;-1:-1:-1;40402:107:0;;:::i;22303:71::-;;;:::i;24856:167::-;;;;;;;;;;;;;;;;-1:-1:-1;24856:167:0;;:::i;23492:550::-;;;:::i;24693:155::-;;;;;;;;;;;;;;;;-1:-1:-1;24693:155:0;;:::i;21668:32::-;;;:::i;33221:72::-;;;:::i;28261:338::-;;;:::i;34128:29::-;;;:::i;21170:37::-;;;:::i;49034:38::-;;;:::i;25508:151::-;;;;;;;;;;;;;;;;-1:-1:-1;25508:151:0;-1:-1:-1;;;;;25508:151:0;;:::i;43986:540::-;;;:::i;49101:36::-;;;:::i;48358:83::-;;;:::i;57945:248::-;;;;;;;;;;;;;;;;-1:-1:-1;57945:248:0;;:::i;25667:168::-;;;;;;;;;;;;;;;;-1:-1:-1;25667:168:0;;;;:::i;57687:249::-;;;;;;;;;;;;;;;;-1:-1:-1;57687:249:0;;;;;;;:::i;42008:308::-;;;:::i;47879:68::-;;;:::i;50967:951::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50967:951:0;;;;;;;;;;;;;;;;;;;:::i;33750:31::-;;;:::i;25843:155::-;;;;;;;;;;;;;;;;-1:-1:-1;25843:155:0;-1:-1:-1;;;;;25843:155:0;;:::i;39414:729::-;;;:::i;48574:33::-;;;:::i;33918:38::-;;;:::i;21771:67::-;;;:::i;33870:41::-;;;:::i;29228:839::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29228:839:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25194:155;;;;;;;;;;;;;;;;-1:-1:-1;25194:155:0;-1:-1:-1;;;;;25194:155:0;;:::i;33049:82::-;;;:::i;34225:30::-;;;:::i;33519:76::-;;;:::i;37147:389::-;;;:::i;21456:29::-;;;:::i;50196:251::-;;;;;;;;;;;;;;;;-1:-1:-1;50196:251:0;;;;;;;:::i;22209:72::-;;;:::i;25357:143::-;;;;;;;;;;;;;;;;-1:-1:-1;25357:143:0;-1:-1:-1;;;;;25357:143:0;;:::i;33138:76::-;;;:::i;23295:118::-;;;:::i;25031:155::-;;;;;;;;;;;;;;;;-1:-1:-1;25031:155:0;-1:-1:-1;;;;;25031:155:0;;:::i;49280:41::-;;;:::i;57335:188::-;;;:::i;21366:30::-;;;:::i;44535:562::-;;;:::i;22165:23::-;;;:::i;48448:77::-;;;:::i;33643:25::-;;;:::i;47626:75::-;;;:::i;49221:40::-;;;:::i;21078:45::-;;;;;;;;;;;;;;;;-1:-1:-1;21078:45:0;-1:-1:-1;;;;;21078:45:0;;:::i;24339:187::-;;;;;;;;;;;;;;;;-1:-1:-1;24339:187:0;;:::i;36403:319::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48956:40;;;:::i;47838:34::-;;;:::i;40289:103::-;;;;;;;;;;;;;;;;-1:-1:-1;40289:103:0;;:::i;33788:28::-;;;:::i;33464:48::-;;;:::i;37780:569::-;;;;;;;;;;;;;;;;-1:-1:-1;37780:569:0;;;;;;;;;:::i;22101:25::-;;;:::i;33379:78::-;;;:::i;33721:22::-;;;-1:-1:-1;;;;;33721:22:0;;:::o;58233:134::-;58326:10;;58307:52;;;-1:-1:-1;;;58307:52:0;;58353:4;58307:52;;;;;;58280:7;;-1:-1:-1;;;;;58326:10:0;;58307:37;;:52;;;;;;;;;;;;;;58326:10;58307:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58307:52:0;;-1:-1:-1;58233:134:0;;:::o;38559:176::-;38606:7;38626:21;38650:22;:20;:22::i;:::-;38626:46;;38690:37;38707:13;38722:4;38690:16;:37::i;:::-;38683:44;;;38559:176;:::o;48267:83::-;48308:42;48267:83;:::o;50459:128::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;50545:21:::1;:34:::0;50459:128::o;48189:71::-;;;-1:-1:-1;;;;;48189:71:0;;:::o;36759:111::-;36814:7;36840:22;:20;:22::i;:::-;36833:29;;36759:111;:::o;49145:42::-;;;;:::o;21492:43::-;21529:6;21492:43;:::o;21630:31::-;;;;:::o;24534:151::-;24620:8;;-1:-1:-1;;;;;24620:8:0;24606:10;:22;24598:44;;;;;-1:-1:-1;;;24598:44:0;;;;;;;;;;;;-1:-1:-1;;;24598:44:0;;;;;;;;;;;;;;;24653:10;:24;24534:151::o;35699:225::-;35752:7;35773:11;33330:42;-1:-1:-1;;;;;35790:17:0;;35808:13;;33089:42;-1:-1:-1;;;;;35823:31:0;;35855:5;;35823:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35823:38:0;35790:72;;;-1:-1:-1;;;;;;35790:72:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35790:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35790:72:0;35888:17;;35790:72;;-1:-1:-1;35880:36:0;;35911:4;;35880:26;;35790:72;;35880:7;:26::i;:::-;:30;;:36::i;21731:33::-;;;;;;:::o;58375:113::-;58452:28;;;;;;;;;;;;-1:-1:-1;;;58452:28:0;;;;58375:113;:::o;57532:146::-;57599:7;57626:44;57649:20;:18;:20::i;:::-;57626:18;:8;57639:4;57626:12;:18::i;:44::-;57619:51;;57532:146;;;;:::o;33675:39::-;;;;:::o;21939:19::-;;;-1:-1:-1;;;;;21939:19:0;;:::o;22133:25::-;;;-1:-1:-1;;;;;22133:25:0;;:::o;48744:69::-;;;-1:-1:-1;;;;;48744:69:0;;:::o;26624:1064::-;26701:10;;-1:-1:-1;;;;;26701:10:0;26687;:24;26679:48;;;;;-1:-1:-1;;;26679:48:0;;;;;;;;;;;;-1:-1:-1;;;26679:48:0;;;;;;;;;;;;;;;26764:4;;26757:37;;;-1:-1:-1;;;26757:37:0;;26788:4;26757:37;;;;;;26738:16;;-1:-1:-1;;;;;26764:4:0;;26757:22;;:37;;;;;;;;;;;;;;26764:4;26757:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26757:37:0;;-1:-1:-1;26809:18:0;;;26805:143;;;26854:36;26868:21;:7;26880:8;26868:11;:21::i;:::-;26854:13;:36::i;:::-;26844:46;-1:-1:-1;26915:21:0;26844:46;26927:8;26915:11;:21::i;:::-;26905:31;;26805:143;26964:15;26995:1;26982:10;;:14;:59;;27040:1;26982:59;;;26998:39;21529:6;26998:23;27010:10;;26998:7;:11;;:23;;;;:::i;:39::-;26964:77;;27052:20;27089:1;27075:11;;:15;:62;;27136:1;27075:62;;;27092:41;21441:6;27092:24;27104:11;;27092:7;:11;;:24;;;;:::i;:41::-;27179:10;;27206:4;;27167:45;;;-1:-1:-1;;;27167:45:0;;-1:-1:-1;;;;;27206:4:0;;;27167:45;;;;;;27052:85;;-1:-1:-1;27150:14:0;;27179:10;;;;;27167:30;;:45;;;;;;;;;;;;;;27179:10;27167:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27167:45:0;27229:14;;27167:45;;-1:-1:-1;27229:14:0;;:22;;:14;:22;:59;;;;;27266:1;27256:7;:11;:31;;;;27286:1;27271:12;:16;27256:31;27225:260;;;27306:25;;27359:48;27381:25;:7;27393:12;27381:11;:25::i;:::-;27359:21;:48::i;:::-;27305:102;;;;27422:51;27439:17;27458:14;27422:16;:51::i;:::-;27225:260;;;27518:1;27508:7;:11;:44;;27545:7;27508:44;;;27522:20;:7;27534;27522:11;:20::i;:::-;27498:54;;27588:1;27573:12;:16;:54;;27620:7;27573:54;;;27592:25;:7;27604:12;27592:11;:25::i;:::-;27645:4;;27563:64;;-1:-1:-1;27638:42:0;;-1:-1:-1;;;;;27645:4:0;27664:6;27563:64;27638:25;:42::i;:::-;26624:1064;;;;;:::o;47787:44::-;;;;:::o;47708:72::-;;;-1:-1:-1;;;;;47708:72:0;;:::o;24154:177::-;24253:10;;-1:-1:-1;;;;;24253:10:0;24239;:24;24231:48;;;;;-1:-1:-1;;;24231:48:0;;;;;;;;;;;;-1:-1:-1;;;24231:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24290:22:0;;;;:13;:22;;;;;;;;;;:33;;-1:-1:-1;;24290:33:0;;;;;;;;;;24154:177::o;47954:46::-;47999:1;47954:46;:::o;33300:72::-;33330:42;33300:72;:::o;21965:73::-;21996:42;21965:73;:::o;57018:308::-;57123:10;;57104:55;;;-1:-1:-1;;;57104:55:0;;57153:4;57104:55;;;;;;57069:7;;;;-1:-1:-1;;;;;57123:10:0;;;;57104:40;;:55;;;;;;;;;;;;;;;57123:10;57104:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57104:55:0;57195:12;;57188:45;;;-1:-1:-1;;;57188:45:0;;57227:4;57188:45;;;;;;57104:55;;-1:-1:-1;57178:56:0;;-1:-1:-1;;;;;57195:12:0;;;;57188:30;;:45;;;;;57104:55;;57188:45;;;;;;;;57195:12;57188:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57188:45:0;57178:5;;:9;:56::i;:::-;57170:64;;57252:66;57299:18;57311:5;57299:11;:18::i;:::-;57252:42;;;-1:-1:-1;;;57252:42:0;;57288:4;57252:42;;;;;;-1:-1:-1;;;;;;;;;;;33415:42:0;57252:27;;:42;;;;;;;;;;;;;;33415;57252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57252:42:0;;:46;:66::i;34262:44::-;34301:5;34262:44;:::o;51927:1682::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;52042:10:::1;::::0;52023:61:::1;::::0;;-1:-1:-1;;;52023:61:0;;52072:4:::1;52023:61;::::0;::::1;::::0;52042:10;52023:61;;;;;;-1:-1:-1;;;;;52042:10:0;;::::1;::::0;52023:40:::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;52042:10:::1;::::0;52023:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;52120:47:0::1;::::0;;-1:-1:-1;;;52120:47:0;;52161:4:::1;52120:47;::::0;::::1;::::0;;;52099:18:::1;::::0;48308:42:::1;::::0;52120:32:::1;::::0;:47;;;;;52023:61:::1;::::0;52120:47;;;;;;;;48308:42;52120:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52120:47:0;52199::::1;::::0;;-1:-1:-1;;;52199:47:0;;52240:4:::1;52199:47;::::0;::::1;::::0;;;52120;;-1:-1:-1;52178:18:0::1;::::0;48399:42:::1;::::0;52199:32:::1;::::0;:47;;;;;52120::::1;::::0;52199;;;;;;;48399:42;52199:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52199:47:0;;-1:-1:-1;52263:14:0;;52259:98:::1;;52294:51;48308:42;21996;52334:10;52294:17;:51::i;:::-;52373:14:::0;;52369:98:::1;;52404:51;48399:42;21996;52444:10;52404:17;:51::i;:::-;52503:37;::::0;;-1:-1:-1;;;52503:37:0;;52534:4:::1;52503:37;::::0;::::1;::::0;;;52481:19:::1;::::0;21996:42:::1;::::0;52503:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;21996:42;52503:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52503:37:0;;-1:-1:-1;52555:15:0;;52551:1051:::1;;52632:42;::::0;;-1:-1:-1;;;52632:42:0;;52668:4:::1;52632:42;::::0;::::1;::::0;;;52613:16:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;52632:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;33415;52632;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52632:42:0;52740:14:::1;::::0;52632:42;;-1:-1:-1;52689:84:0::1;::::0;21996:42:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;52724:48:::1;::::0;49378:5:::1;::::0;52724:31:::1;::::0;:11;;:15:::1;:31::i;:48::-;52689:17;:84::i;:::-;52811:42;::::0;;-1:-1:-1;;;52811:42:0;;52847:4:::1;52811:42;::::0;::::1;::::0;;;52788:21:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;52811:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;33415;52811;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52811:42:0;52954:14:::1;::::0;52930:18:::1;::::0;52811:42;;-1:-1:-1;52868:102:0::1;::::0;52893:1:::1;::::0;52896:73:::1;::::0;:53:::1;::::0;52897:27:::1;52811:42:::0;52915:8;52897:17:::1;:27::i;:::-;52896:33:::0;::::1;:53::i;:73::-;52868:24;:102::i;:::-;53040:14;::::0;::::1;;:22;;:14:::0;:22:::1;53036:199;;;53082:24;53109:51;21255:6;53109:31;53125:14;;53109:11;:15;;:31;;;;:::i;:51::-;53082:78;;53179:40;21996:42;53202:16;53179;:40::i;:::-;53036:199;;53283:4;::::0;53289:37:::1;::::0;;-1:-1:-1;;;53289:37:0;;53320:4:::1;53289:37;::::0;::::1;::::0;;;53264:63:::1;::::0;21996:42:::1;::::0;-1:-1:-1;;;;;53283:4:0;;::::1;::::0;21996:42;;53289:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;21996:42;53289:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53289:37:0;53264:12:::1;:63::i;:::-;53342:16;53361:15;:13;:15::i;:::-;53342:34:::0;-1:-1:-1;53395:12:0;;53391:200:::1;;53446:12;53427:16;:31:::0;53477:17:::1;:28:::0;;;53524:9:::1;:7;:9::i;:::-;53558:17;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;53391:200;52551:1051;;;;23089:1;;;51927:1682::o:0;36878:261::-;36947:7;36966:23;36992:26;:24;:26::i;:::-;36966:52;;37036:95;37108:22;;37036:67;37085:17;;37036:44;37075:4;37036:34;37054:15;37036:13;:17;;:34;;;;:::i;:95::-;37029:102;36878:261;-1:-1:-1;;;36878:261:0:o;34006:24::-;;;;:::o;56790:193::-;56905:12;;56850:15;;-1:-1:-1;;;;;56886:31:0;;;56905:12;;56886:31;;56878:57;;;;;-1:-1:-1;;;56878:57:0;;;;;;;;;;;;-1:-1:-1;;;56878:57:0;;;;;;;;;;;;;;;56946:29;56968:6;56946:21;:29::i;:::-;;56790:193;;;:::o;48007:43::-;48045:5;48007:43;:::o;21845:70::-;;;-1:-1:-1;;;;;21845:70:0;;:::o;38743:330::-;38820:7;38840:23;38866:22;:20;:22::i;:::-;38840:48;;38899:21;38947:15;38923:20;:39;;:86;;38968:41;:15;38988:20;38968:19;:41::i;:::-;38923:86;;;38964:1;38923:86;38899:110;;39027:38;39044:13;39059:5;39027:16;:38::i;:::-;39020:45;38743:330;-1:-1:-1;;;;38743:330:0:o;22069:25::-;;;-1:-1:-1;;;;;22069:25:0;;:::o;35933:457::-;35980:7;36000:18;33089:42;-1:-1:-1;;;;;36021:31:0;;36053:5;;36021:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36021:38:0;36106:13;;36088:44;;;-1:-1:-1;;;36088:44:0;;;;;;;;;-1:-1:-1;;;;;36088:44:0;;;;;;;;36021:38;;-1:-1:-1;36073:11:0;;33330:42;;36088:17;;:44;;;;;;;;;;;;33330:42;36088:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36088:44:0;;;36186:13;;36088:44;36168:32;;-1:-1:-1;;;36168:32:0;;;;;;;;;;36088:44;;-1:-1:-1;36146:12:0;;33330:42;;36168:17;;:32;;;;;;;;;;;;;;33330:42;36168:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36168:32:0;;;;-1:-1:-1;36211:8:0;36222:14;36226:3;36168:32;36222:3;:14::i;:::-;36211:25;-1:-1:-1;36251:8:0;36247:49;;36283:1;36276:8;;;;;;;;36247:49;36306:11;34336:8;36320:3;:9;36306:23;;36363:3;36347:13;36351:3;34336:8;36347:3;:13::i;:::-;:19;:35;;36379:3;36347:35;;;36369:3;36375:1;36369:7;36347:35;36340:42;;;;;;;35933:457;:::o;21583:40::-;;;;:::o;50021:163::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;50111:20:::1;:26:::0;;;;50148:21:::1;:28:::0;50021:163::o;40180:99::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;40253:7:::1;:18:::0;40180:99::o;48820:72::-;;;-1:-1:-1;;;;;48820:72:0;;:::o;48063:82::-;48103:42;48063:82;:::o;48624:70::-;;;-1:-1:-1;;;;;48624:70:0;;:::o;40402:107::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;40479:9:::1;:22:::0;40402:107::o;22303:71::-;;;-1:-1:-1;;;;;22303:71:0;;:::o;24856:167::-;24950:8;;-1:-1:-1;;;;;24950:8:0;24936:10;:22;24928:44;;;;;-1:-1:-1;;;24928:44:0;;;;;;;;;;;;-1:-1:-1;;;24928:44:0;;;;;;;;;;;;;;;24983:14;:32;24856:167::o;23492:550::-;23641:18;;23534:7;;;;23614:12;;23641:22;;;;:47;;;23687:1;23667:17;;:21;23641:47;:106;;;;-1:-1:-1;23729:18:0;;23709:16;;23692:34;;:12;;:16;:34::i;:::-;:55;23641:106;23637:324;;;23763:17;23783:58;23828:12;23783:40;23804:18;;23783:16;;:20;;:40;;;;:::i;:::-;:44;;:58::i;:::-;23763:78;;23873:76;23944:4;23873:66;23920:18;;23873:42;23910:4;23873:32;23895:9;23873:17;;:21;;:32;;;;:::i;:76::-;23856:93;;23637:324;;23978:56;24019:14;23978:36;23998:15;:13;:15::i;:::-;23978;:13;:15::i;:::-;:19;;:36::i;:56::-;23971:63;;;;23492:550;:::o;24693:155::-;24781:8;;-1:-1:-1;;;;;24781:8:0;24767:10;:22;24759:44;;;;;-1:-1:-1;;;24759:44:0;;;;;;;;;;;;-1:-1:-1;;;24759:44:0;;;;;;;;;;;;;;;24814:11;:26;24693:155::o;21668:32::-;;;;:::o;33221:72::-;33251:42;33221:72;:::o;28261:338::-;28352:10;;28302:15;;-1:-1:-1;;;;;28352:10:0;28338;:24;28330:48;;;;;-1:-1:-1;;;28330:48:0;;;;;;;;;;;;-1:-1:-1;;;28330:48:0;;;;;;;;;;;;;;;28389:14;:12;:14::i;:::-;28433:4;;28426:37;;;-1:-1:-1;;;28426:37:0;;28457:4;28426:37;;;;;;-1:-1:-1;;;;;28433:4:0;;;;28426:22;;:37;;;;;;;;;;;;;;;28433:4;28426:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28426:37:0;28505:10;;28532:4;;28493:45;;;-1:-1:-1;;;28493:45:0;;-1:-1:-1;;;;;28532:4:0;;;28493:45;;;;;;28426:37;;-1:-1:-1;28476:14:0;;28505:10;;;;;28493:30;;:45;;;;;28426:37;;28493:45;;;;;;;28505:10;28493:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28493:45:0;28556:4;;28493:45;;-1:-1:-1;28549:42:0;;-1:-1:-1;;;;;28556:4:0;28493:45;28583:7;28549:25;:42::i;:::-;28261:338;;:::o;34128:29::-;;;;:::o;21170:37::-;;;;:::o;49034:38::-;;;;:::o;25508:151::-;25594:8;;-1:-1:-1;;;;;25594:8:0;25580:10;:22;25572:44;;;;;-1:-1:-1;;;25572:44:0;;;;;;;;;;;;-1:-1:-1;;;25572:44:0;;;;;;;;;;;;;;;25627:10;:24;;-1:-1:-1;;;;;;25627:24:0;-1:-1:-1;;;;;25627:24:0;;;;;;;;;;25508:151::o;43986:540::-;23170:10;;-1:-1:-1;;;;;23170:10:0;23156;:24;;:52;;-1:-1:-1;23198:10:0;;-1:-1:-1;;;;;23198:10:0;23184;:24;23156:52;:81;;;-1:-1:-1;23226:10:0;23212:13;:25;;;;;;;;;;;;;23156:81;23148:90;;;;;;44050:24:::1;44077:19;44094:1;44077:16;:19::i;:::-;44050:46:::0;-1:-1:-1;44111:20:0;;44107:412:::1;;44147:30;44160:16;44147:12;:30::i;:::-;44206:42;::::0;;-1:-1:-1;;;44206:42:0;;44242:4:::1;44206:42;::::0;::::1;::::0;;;44192:11:::1;::::0;-1:-1:-1;;;;;;;;;;;33415:42:0;44206:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;33415;44206;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44206:42:0;;-1:-1:-1;44271:23:0;;::::1;;44263:55;;;::::0;;-1:-1:-1;;;44263:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44263:55:0;;;;;;;;;;;;;::::1;;44338:45;44363:1;44366:16;44338:24;:45::i;:::-;44398:17;44418:14;:12;:14::i;:::-;44468:8;::::0;44398:34;;-1:-1:-1;44468:15:0::1;::::0;44481:1:::1;44468:12;:15::i;:::-;44455:9;:28;;44447:60;;;::::0;;-1:-1:-1;;;44447:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44447:60:0;;;;;;;;;;;;;::::1;44107:412;23249:1;43986:540::o:0;49101:36::-;;;;:::o;48358:83::-;48399:42;48358:83;:::o;57945:248::-;58006:7;58030:14;58026:54;;-1:-1:-1;58067:1:0;58060:8;;58026:54;58090:18;58111:45;58151:4;58111:35;58136:9;58111:20;:18;:20::i;25667:168::-;25758:10;;-1:-1:-1;;;;;25758:10:0;25744;:24;25736:48;;;;;-1:-1:-1;;;25736:48:0;;;;;;;;;;;;-1:-1:-1;;;25736:48:0;;;;;;;;;;;;;;;25795:14;:32;;-1:-1:-1;;25795:32:0;;;;;;;;;;25667:168::o;57687:249::-;57770:4;57786:25;;:::i;:::-;:47;;;;;;;;57815:1;57786:47;;;;57818:8;57786:47;;;;57828:1;57786:47;;;;57831:1;57786:47;;;;;57920:8;48483:42;-1:-1:-1;;;;;57851:39:0;;57891:9;;;;;;;;;-1:-1:-1;;;;;57891:9:0;57902:7;57911:4;57851:65;;;;;;;;;;;;;-1:-1:-1;;;;;57851:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57851:65:0;:77;;;-1:-1:-1;;57687:249:0;;;;;:::o;42008:308::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;42069:5:::1;::::0;:10;42061:40:::1;;;::::0;;-1:-1:-1;;;42061:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42061:40:0;;;;;;;;;;;;;::::1;;42156:13;::::0;42124:61:::1;::::0;;-1:-1:-1;;;42124:61:0;;::::1;::::0;::::1;::::0;;;;42179:4:::1;42124:61:::0;;;;;33089:42:::1;::::0;42124:31:::1;::::0;:61;;;;;::::1;::::0;;;;;;;;-1:-1:-1;33089:42:0;42124:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42124:61:0;42116:5:::1;:69:::0;42209:10:::1;::::0;42229:7:::1;::::0;42202:48:::1;::::0;;-1:-1:-1;;;42202:48:0;;-1:-1:-1;;;;;42229:7:0;;::::1;42202:48;::::0;::::1;::::0;-1:-1:-1;;42202:48:0;;;;;;42209:10;;;::::1;::::0;42202:26:::1;::::0;:48;;;;;42124:61:::1;::::0;42202:48;;;;;;;42209:10:::1;::::0;42202:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42261:47:0::1;::::0;;-1:-1:-1;;;42261:47:0;;33172:42:::1;42261:47;::::0;::::1;::::0;-1:-1:-1;;42261:47:0;;;;;;-1:-1:-1;;;;;;;;;;;33415:42:0;42261:25:::1;::::0;:47;;;;;42202:48:::1;::::0;42261:47;;;;;;;-1:-1:-1;33415:42:0;42261:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42008:308:0:o;47879:68::-;;;-1:-1:-1;;;;;47879:68:0;;:::o;50967:951::-;51096:8;;-1:-1:-1;;;;;51096:8:0;51082:10;:22;51074:44;;;;;-1:-1:-1;;;51074:44:0;;;;;;;;;;;;-1:-1:-1;;;51074:44:0;;;;;;;;;;;;;;;51208:10;;51189:55;;;-1:-1:-1;;;51189:55:0;;51238:4;51189:55;;;;;;51247:1;;-1:-1:-1;;;;;51208:10:0;;51189:40;;:55;;;;;;;;;;;;;;51208:10;51189:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51189:55:0;:59;51185:323;;;51264:25;-1:-1:-1;;51264:12:0;:25::i;:::-;51331:10;;51312:55;;;-1:-1:-1;;;51312:55:0;;51361:4;51312:55;;;;;;-1:-1:-1;;;;;51331:10:0;;;;51312:40;;:55;;;;;;;;;;;;;;;51331:10;51312:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51312:55:0;:60;51304:94;;;;;-1:-1:-1;;;51304:94:0;;;;;;;;;;;;-1:-1:-1;;;51304:94:0;;;;;;;;;;;;;;;51428:12;;51421:45;;;-1:-1:-1;;;51421:45:0;;51460:4;51421:45;;;;;;-1:-1:-1;;;;;51428:12:0;;;;51421:30;;:45;;;;;;;;;;;;;;;51428:12;51421:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51421:45:0;:50;51413:83;;;;;-1:-1:-1;;;51413:83:0;;;;;;;;;;;;-1:-1:-1;;;51413:83:0;;;;;;;;;;;;;;;51564:9;:25;;-1:-1:-1;;;;;51564:25:0;;;-1:-1:-1;;;;;;51564:25:0;;;;;;;51600:12;:26;;;;;;;;;;;51637:10;:27;;;;;;;;;;;;;;;51691:36;;;-1:-1:-1;;;51691:36:0;;;;51710:10;;;;;51691:34;;:36;;;;;;;;;;;;;;51710:10;51691:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51691:36:0;51675:13;:52;51779:21;:19;:21::i;:::-;51867:42;;;-1:-1:-1;;;51867:42:0;;51903:4;51867:42;;;;;;51855:55;;-1:-1:-1;;;;;;;;;;;33415:42:0;51867:27;;:42;;;;;;;;;;;;;;;33415;51867;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51867:42:0;51855:11;:55::i;33750:31::-;;;-1:-1:-1;;;;;33750:31:0;;:::o;25843:155::-;25929:10;;-1:-1:-1;;;;;25929:10:0;25915;:24;25907:48;;;;;-1:-1:-1;;;25907:48:0;;;;;;;;;;;;-1:-1:-1;;;25907:48:0;;;;;;;;;;;;;;;25966:10;:24;;-1:-1:-1;;;;;;25966:24:0;-1:-1:-1;;;;;25966:24:0;;;;;;;;;;25843:155::o;39414:729::-;39498:16;;39471:7;;-1:-1:-1;;;;;39498:16:0;39490:61;;;;;-1:-1:-1;;;39490:61:0;;;;;;;;;;;;-1:-1:-1;;;39490:61:0;;;;;;;;;;;;;;;39578:14;39608:9;39632:14;39661;39690:22;39726:9;;;;;;;;;-1:-1:-1;;;;;39726:9:0;-1:-1:-1;;;;;39726:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39726:27:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39726:27:0;;-1:-1:-1;39726:27:0;-1:-1:-1;39726:27:0;;-1:-1:-1;39726:27:0;-1:-1:-1;39780:1:0;39772:9;;39768:368;;;39834:18;;39814:1;;39834:18;;39830:125;;;33553:42;-1:-1:-1;;;;;39888:46:0;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39888:48:0;;;;-1:-1:-1;39830:125:0;40055:18;;39976:108;;40055:18;;:28;;40082:1;40055:28;;;40075:4;40055:28;39976:108;;:74;40046:3;39976:65;40031:8;39976:42;39995:22;;39984:5;39976:18;;:42;;;;:::i;:108::-;39969:115;;;;;;;;;;39768:368;40123:1;40116:8;;;;;;;;;48574:33;;;;:::o;33918:38::-;;;;;;:::o;21771:67::-;;;;;;-1:-1:-1;;;;;21771:67:0;;:::o;33870:41::-;;;;:::o;29228:839::-;29447:16;;;29461:1;29447:16;;;29332:25;29447:16;;;;;29317:13;;29332:25;;;;;;29447:16;;;;;;;;;;-1:-1:-1;29447:16:0;29440:23;;29484:5;29474:4;29479:1;29474:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;29474:15:0;;;-1:-1:-1;;;;;29474:15:0;;;;;29510:3;29500:4;29505:1;29500:7;;;;;;;;-1:-1:-1;;;;;29500:13:0;;;;:7;;;;;;;;;;:13;29538:16;;;29552:1;29538:16;;;;;;;;;;29552:1;;29538:16;;;;;;;;;;-1:-1:-1;29538:16:0;29526:28;;29580:5;29565:9;29575:1;29565:12;;;;;;;;;;;;;:20;-1:-1:-1;;;;;29565:20:0;;;-1:-1:-1;;;;;29565:20:0;;;;;29611:3;29596:9;29606:1;29596:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;29596:18:0;;;-1:-1:-1;;;;;29596:18:0;;;;;29627:17;29666:1;29647:9;:16;:20;:110;;29756:1;29647:110;;;29685:11;;29669:62;;;-1:-1:-1;;;29669:62:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29685:11:0;;;;29669:42;;29712:7;;29721:9;;29669:62;;;;;;;;;;;;;;;29685:11;29669:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29669:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29669:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29751:1;29732:9;:16;:20;29669:84;;;;;;;;;;;;;;29647:110;29627:130;;29768:15;29805:1;29786:9;:16;:20;:101;;29886:1;29786:101;;;29824:12;;29808:58;;;-1:-1:-1;;;29808:58:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29824:12:0;;;;29808:43;;29852:7;;29861:4;;29808:58;;;;;;;;;;;;;;;29824:12;29808:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29808:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29808:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29881:1;29867:4;:11;:15;29808:75;;;;;;;;;;;;;;29786:101;29768:119;;29900:13;29928:7;29916:9;:19;:33;;29944:5;29916:33;;;29937:4;29916:33;29900:49;;29962:25;29990:8;:27;;30013:4;29990:27;;;30001:9;29990:27;30040:8;;;;-1:-1:-1;29228:839:0;;-1:-1:-1;;;;;;;;;29228:839:0:o;25194:155::-;25280:10;;-1:-1:-1;;;;;25280:10:0;25266;:24;25258:48;;;;;-1:-1:-1;;;25258:48:0;;;;;;;;;;;;-1:-1:-1;;;25258:48:0;;;;;;;;;;;;;;;25317:10;:24;;-1:-1:-1;;;;;;25317:24:0;-1:-1:-1;;;;;25317:24:0;;;;;;;;;;25194:155::o;33049:82::-;33089:42;33049:82;:::o;34225:30::-;;;;:::o;33519:76::-;33553:42;33519:76;:::o;37147:389::-;37192:7;37213:19;37243:1;37235:5;;:9;:37;;37271:1;37235:37;;;37246:22;:20;:22::i;:::-;37213:59;-1:-1:-1;37287:15:0;;37283:246;;37318:21;37342:37;37375:3;37342:28;37358:11;37342:15;:28::i;:37::-;37318:61;;37394:15;37412:16;:14;:16::i;:::-;37394:34;-1:-1:-1;37452:26:0;:13;37394:34;37452:17;:26::i;:::-;37445:33;;;;;;;37283:246;37516:1;37509:8;;;;;21456:29;;;;:::o;50196:251::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;50298:18:::1;:33:::0;;;50342:16:::1;:29:::0;;;50399:40:::1;50319:12:::0;50361:10;50399:22:::1;:40::i;:::-;50382:14;:57:::0;-1:-1:-1;;50196:251:0:o;22209:72::-;;;-1:-1:-1;;;;;22209:72:0;;:::o;25357:143::-;25439:8;;-1:-1:-1;;;;;25439:8:0;25425:10;:22;25417:44;;;;;-1:-1:-1;;;25417:44:0;;;;;;;;;;;;-1:-1:-1;;;25417:44:0;;;;;;;;;;;;;;;25472:8;:20;;-1:-1:-1;;;;;;25472:20:0;-1:-1:-1;;;;;25472:20:0;;;;;;;;;;25357:143::o;33138:76::-;33172:42;33138:76;:::o;23295:118::-;23375:4;;23368:37;;;-1:-1:-1;;;23368:37:0;;23399:4;23368:37;;;;;;23341:7;;-1:-1:-1;;;;;23375:4:0;;23368:22;;:37;;;;;;;;;;;;;;23375:4;23368:37;;;;;;;;;;25031:155;25117:10;;-1:-1:-1;;;;;25117:10:0;25103;:24;25095:48;;;;;-1:-1:-1;;;25095:48:0;;;;;;;;;;;;-1:-1:-1;;;25095:48:0;;;;;;;;;;;;;;;25154:10;:24;;-1:-1:-1;;;;;;25154:24:0;-1:-1:-1;;;;;25154:24:0;;;;;;;;;;25031:155::o;49280:41::-;;;;:::o;57335:188::-;57386:7;57413:102;57510:4;57413:92;48103:42;-1:-1:-1;;;;;57459:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57459:45:0;57424:9;;57413:41;;;-1:-1:-1;;;57413:41:0;;;;-1:-1:-1;;;;;57424:9:0;;;;57413:39;;:41;;;;;57459:45;;57413:41;;;;;;;;57424:9;57413:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57413:41:0;;:45;:92::i;21366:30::-;;;;:::o;44535:562::-;44581:13;44597:15;:13;:15::i;:::-;44581:31;;44626:19;44649:10;:8;:10::i;:::-;44623:36;;;;44682:1;44674:5;:9;:27;;;;;44687:14;44674:27;44670:420;;;44719:16;44738:57;44755:33;44765:22;:20;:22::i;:::-;44755:5;;:9;:33::i;:::-;44790:4;44738:16;:57::i;:::-;44719:76;;44824:1;44813:8;:12;:57;;;;;44863:7;;44829:30;44842:16;:14;:16::i;:::-;44829:8;;:12;:30::i;:::-;:41;;44813:57;44810:269;;;44889:39;44912:5;44919:8;44889:22;:39::i;:::-;44960:42;;;-1:-1:-1;;;44960:42:0;;44996:4;44960:42;;;;;;44946:11;;-1:-1:-1;;;;;;;;;;;33415:42:0;44960:27;;:42;;;;;;;;;;;;;;;33415;44960;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44960:42:0;;-1:-1:-1;45020:43:0;45032:14;;;:30;;45054:8;45032:30;;;45048:3;45032:30;45020:11;:43::i;:::-;44810:269;44670:420;44535:562;;:::o;22165:23::-;;;-1:-1:-1;;;;;22165:23:0;;:::o;48448:77::-;48483:42;48448:77;:::o;33643:25::-;;;-1:-1:-1;;;;;33643:25:0;;:::o;47626:75::-;;;-1:-1:-1;;;;;47626:75:0;;:::o;49221:40::-;;;;:::o;21078:45::-;;;;;;;;;;;;;;;;:::o;24339:187::-;24441:10;;-1:-1:-1;;;;;24441:10:0;24427;:24;24419:48;;;;;-1:-1:-1;;;24419:48:0;;;;;;;;;;;;-1:-1:-1;;;24419:48:0;;;;;;;;;;;;;;;24478:18;:40;24339:187::o;36403:319::-;36443:7;36452;36461:4;36478:11;36491:12;36505;33330:42;-1:-1:-1;;;;;36522:17:0;;36540:13;;36522:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36522:32:0;;;;;;;;;;;;;-1:-1:-1;36522:32:0;;-1:-1:-1;36522:32:0;-1:-1:-1;36565:19:0;36587:22;34336:8;36587:13;36522:32;;36587:7;:13::i;:22::-;36565:44;-1:-1:-1;36620:15:0;36638:13;:4;34336:8;36638;:13::i;:::-;36670:11;;;;-1:-1:-1;;36692:21:0;;;;-1:-1:-1;36403:319:0;-1:-1:-1;;;;36403:319:0:o;48956:40::-;;;;:::o;47838:34::-;;;;:::o;40289:103::-;23039:10;;-1:-1:-1;;;;;23039:10:0;23025;:24;;:52;;-1:-1:-1;23067:10:0;;-1:-1:-1;;;;;23067:10:0;23053;:24;23025:52;23017:61;;;;;;40364:8:::1;:20:::0;40289:103::o;33788:28::-;;;;:::o;33464:48::-;;;;:::o;37780:569::-;37863:7;37883:15;37917:1;37901:13;:17;:111;;38011:1;37901:111;;;37920:88;37973:34;34301:5;37973:20;:34::i;:::-;37920:48;34301:5;37920:30;37936:13;37920:15;:30::i;:88::-;37883:129;;38027:15;38045:16;:14;:16::i;:::-;38027:34;;38076:12;38117:6;:28;;;;;38138:7;38127;:18;;38117:28;38113:181;;;38168:20;:7;38180;38168:11;:20::i;:::-;38161:27;;38113:181;;;38211:6;38210:7;:29;;;;;38232:7;38221;:18;;38210:29;38206:88;;;38262:20;:7;38274;38262:11;:20::i;:::-;38255:27;;38206:88;38329:1;38322:4;:8;38321:20;;38340:1;38321:20;;;38333:4;38321:20;38314:27;37780:569;-1:-1:-1;;;;;;37780:569:0:o;22101:25::-;;;-1:-1:-1;;;;;22101:25:0;;:::o;33379:78::-;-1:-1:-1;;;;;;;;;;;33379:78:0;:::o;17734:622::-;18104:10;;;18103:62;;-1:-1:-1;18120:39:0;;;-1:-1:-1;;;18120:39:0;;18144:4;18120:39;;;;-1:-1:-1;;;;;18120:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18120:39:0;:44;18103:62;18095:152;;;;-1:-1:-1;;;18095:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18285:62;;;-1:-1:-1;;;;;18285:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18285:62:0;-1:-1:-1;;;18285:62:0;;;18258:90;;18278:5;;18258:19;:90::i;6027:196::-;6130:12;6162:53;6185:6;6193:4;6199:1;6202:12;6162:22;:53::i;1644:471::-;1702:7;1947:6;1943:47;;-1:-1:-1;1977:1:0;1970:8;;1943:47;2014:5;;;2018:1;2014;:5;:1;2038:5;;;;;:10;2030:56;;;;-1:-1:-1;;;2030:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2591:132;2649:7;2676:39;2680:1;2683;2676:39;;;;;;;;;;;;;;;;;:3;:39::i;754:136::-;812:7;839:43;843:1;846;839:43;;;;;;;;;;;;;;;;;:3;:43::i;45105:866::-;45172:7;45192:10;45216:22;:20;:22::i;:::-;45205:7;:33;;45192:46;;45263:5;:20;;;;;45282:1;45272:7;:11;45263:20;45259:668;;;45299:25;-1:-1:-1;;45299:12:0;:25::i;:::-;45339:16;45358;:14;:16::i;:::-;45397:42;;;-1:-1:-1;;;45397:42:0;;45433:4;45397:42;;;;;;45339:35;;-1:-1:-1;45339:35:0;;-1:-1:-1;;;;;;;;;;;33415:42:0;45397:27;;:42;;;;;;;;;;;;;;33415;45397;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45397:42:0;:54;;45389:92;;;;;-1:-1:-1;;;45389:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45497:43;45522:7;45531:8;45497:24;:43::i;:::-;45259:668;;;;45572:24;45599:25;45616:7;45599:16;:25::i;:::-;45572:52;-1:-1:-1;45643:20:0;;45639:209;;45683:30;45696:16;45683:12;:30::i;:::-;45740:42;;;-1:-1:-1;;;45740:42:0;;45776:4;45740:42;;;;;;45786:16;;-1:-1:-1;;;;;;;;;;;33415:42:0;45740:27;;:42;;;;;;;;;;;;;;;33415;45740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45740:42:0;:62;;45732:97;;;;;-1:-1:-1;;;45732:97:0;;;;;;;;;;;;-1:-1:-1;;;45732:97:0;;;;;;;;;;;;;;;45862:51;45887:7;45896:16;45862:24;:51::i;:::-;45259:668;;-1:-1:-1;45956:7:0;;45105:866;-1:-1:-1;45105:866:0:o;290:181::-;348:7;380:5;;;404:6;;;;396:46;;;;;-1:-1:-1;;;396:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53920:287;53997:7;54006;54042:1;54029:9;:14;54025:62;;-1:-1:-1;21996:42:0;;-1:-1:-1;54073:1:0;54059:16;;54025:62;54112:4;;54099:35;;-1:-1:-1;;;;;54112:4:0;21996:42;54124:9;54099:12;:35::i;:::-;54161:37;;;-1:-1:-1;;;54161:37:0;;54192:4;54161:37;;;;;;21996:42;;;;54161:22;;:37;;;;;;;;;;;;;;;21996:42;54161:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54161:37:0;54147:52;;-1:-1:-1;54161:37:0;-1:-1:-1;53920:287:0;;;;:::o;27738:447::-;27839:14;;;;:22;;:14;:22;:44;;;;;27882:1;27865:14;:18;27839:44;27835:343;;;27932:7;;27900:56;;27913:17;;27932:7;;;-1:-1:-1;;;;;27932:7:0;27941:14;27900:12;:56::i;:::-;27998:7;;27991:40;;;-1:-1:-1;;;27991:40:0;;28025:4;27991:40;;;;;;-1:-1:-1;;27998:7:0;;;-1:-1:-1;;;;;27998:7:0;;27991:25;;:40;;;;;;;;;;;;;;27998:7;27991:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27991:40:0;28075:10;;28053:7;;27991:40;;-1:-1:-1;28046:51:0;;28075:10;28053:7;;-1:-1:-1;;;;;28053:7:0;;;;28075:10;27991:40;28046:28;:51::i;:::-;28124:10;;28112:54;;;-1:-1:-1;;;28112:54:0;;;;;;;;;;-1:-1:-1;;;;;28124:10:0;;;;28112:43;;:54;;;;;28124:10;;28112:54;;;;;;;;28124:10;;28112:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27835:343;27738:447;;:::o;17075:177::-;17185:58;;;-1:-1:-1;;;;;17185:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:58:0;-1:-1:-1;;;17185:58:0;;;17158:86;;17178:5;;17158:19;:86::i;53621:290::-;53741:16;;;53755:1;53741:16;;;53712:26;53741:16;;;;;53712:26;53741:16;;;;;;;;;;-1:-1:-1;53741:16:0;53712:45;;53783:5;53768:9;53778:1;53768:12;;;;;;;;;;;;;:20;-1:-1:-1;;;;;53768:20:0;;;-1:-1:-1;;;;;53768:20:0;;;;;53814:3;53799:9;53809:1;53799:12;;;;;;;;-1:-1:-1;;;;;53799:18:0;;;:12;;;;;;;;;:18;53891:11;;53828:75;;53857:5;;53864:3;;53869:6;;53877:1;;53880:9;;53891:11;53828:28;:75::i;43244:687::-;35422:1;35414:5;;:9;35406:28;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;;;;43359:7:::1;35523:15;35541:16;:14;:16::i;:::-;35523:34;;35590:7;35580;:17;:54;;;;-1:-1:-1::0;35626:7:0::1;::::0;35602:20:::1;:7:::0;35614;35602:11:::1;:20::i;:::-;:31;;35580:54;35579:78;;;;35650:7;35639;:18;;35579:78;35571:99;;;::::0;;-1:-1:-1;;;35571:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35571:99:0;;;;;;;;;;;;;::::1;;43381:11:::2;43394::::0;43407::::2;43422:14;:12;:14::i;:::-;43380:56:::0;;-1:-1:-1;43380:56:0;-1:-1:-1;43380:56:0;-1:-1:-1;43451:11:0;;43447:82:::2;;43478:39;::::0;;-1:-1:-1;;;43478:39:0;;-1:-1:-1;;;;;43478:39:0;::::2;;::::0;::::2;::::0;;;;;;;;;33172:42:::2;::::0;43478:25:::2;::::0;:39;;;;;-1:-1:-1;;43478:39:0;;;;;;;-1:-1:-1;33172:42:0;43478:39;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43447:82;43539:13;43572:1:::0;43555:14:::2;:18;:60;;43614:1;43555:60;;;43587:7;::::0;43575:36:::2;::::0;-1:-1:-1;;;;;43587:7:0::2;43596:14:::0;43575:11:::2;:36::i;:::-;43539:76;;33089:42;-1:-1:-1::0;;;;;43626:31:0::2;;43658:5;;43666:12;43672:5;43666;:12::i;:::-;43665:13;;43681:50;43694:3;43707;-1:-1:-1::0;;;;;43699:16:0::2;;43716:3;43699:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;43699:21:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;43699:21:0;43722:3;43727;43681:12:::2;:50::i;:::-;43626:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43764:1;43747:14;:18;43743:181;;;43813:5;::::0;43781:60:::2;::::0;;-1:-1:-1;;;43781:60:0;;::::2;::::0;::::2;::::0;;;;43828:4:::2;43781:60:::0;;;;;;;;;;;33089:42:::2;::::0;43781:31:::2;::::0;:60;;;;;-1:-1:-1;;43781:60:0;;;;;;;-1:-1:-1;33089:42:0;43781:60;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;43868:7:0::2;::::0;43856:56:::2;::::0;;-1:-1:-1;;;43856:56:0;;43890:4:::2;43856:56;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;43868:7:0;;::::2;::::0;-1:-1:-1;43856:25:0::2;::::0;-1:-1:-1;43856:56:0;;;;;43868:7:::2;::::0;43856:56;;;;;;;;43868:7;;43856:56;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43743:181;35681:1;;;;35446::::1;;43244:687:::0;;:::o;30076:371::-;30201:11;;30197:243;;30229:13;30244:25;30273:34;30287:5;30294:3;30299:7;30273:13;:34::i;:::-;30228:79;;;;30324:102;30353:5;30360:3;30365:7;30374:1;30377:8;30388;:36;;30412:12;;-1:-1:-1;;;;;30412:12:0;30388:36;;;30398:11;;-1:-1:-1;;;;;30398:11:0;30388:36;30324:28;:102::i;26244:302::-;26358:10;;26308:15;;-1:-1:-1;;;;;26358:10:0;26344;:24;26336:48;;;;;-1:-1:-1;;;26336:48:0;;;;;;;;;;;;-1:-1:-1;;;26336:48:0;;;;;;;;;;;;;;;26403:4;;-1:-1:-1;;;;;26403:23:0;;;:4;;:23;;26395:40;;;;;-1:-1:-1;;;26395:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;26395:40:0;;;;;;;;;;;;;;;26456:31;;;-1:-1:-1;;;26456:31:0;;26481:4;26456:31;;;;;;-1:-1:-1;;;;;26456:16:0;;;;;:31;;;;;;;;;;;;;;:16;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26456:31:0;26518:10;;26456:31;;-1:-1:-1;26498:40:0;;-1:-1:-1;;;;;26498:19:0;;;;26518:10;26456:31;26498:19;:40::i;40559:143::-;40617:9;40647:6;;;:30;;-1:-1:-1;;40662:5:0;;;40676:1;40671;40662:5;40671:1;40657:15;;;;;:20;40647:30;40639:55;;;;;-1:-1:-1;;;40639:55:0;;;;;;;;;;;;-1:-1:-1;;;40639:55:0;;;;;;;;;;;;;;28607:82;28651:30;28665:15;:13;:15::i;55068:1165::-;55139:12;55135:334;;55167:7;;55135:334;-1:-1:-1;;55194:7:0;:22;55191:278;;55263:10;;55293:55;;;-1:-1:-1;;;55293:55:0;;55342:4;55293:55;;;;;;-1:-1:-1;;;;;55263:10:0;;;;55244:48;;55263:10;;55293:40;;:55;;;;;;;;;;;;;;;55263:10;55293:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55293:55:0;55244:112;;;-1:-1:-1;;;;;;55244:112:0;;;;;;;;;;;;;;55350:5;55244:112;;;;;;;;;;;;;55293:55;;55244:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55397:12:0;;55390:45;;;-1:-1:-1;;;55390:45:0;;55429:4;55390:45;;;;;;55371:65;;-1:-1:-1;;;;;55397:12:0;;55390:30;;:45;;;;;55244:112;;55390:45;;;;;;;55397:12;55390:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55390:45:0;55371:18;:65::i;:::-;55451:7;;55191:278;55486:18;55507:27;55526:7;55507:18;:27::i;:::-;55486:48;;55558:71;49378:5;55558:54;55573:38;55589:21;;49378:5;55573:15;;:38;;;;:::i;:::-;55558:10;;:14;:54::i;:71::-;55696:12;;55689:45;;;-1:-1:-1;;;55689:45:0;;55728:4;55689:45;;;;;;55545:84;;-1:-1:-1;55669:17:0;;-1:-1:-1;;;;;55696:12:0;;;;55689:30;;:45;;;;;;;;;;;;;;;55696:12;55689:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55689:45:0;;-1:-1:-1;55745:28:0;55776:22;;;:53;;55828:1;55776:53;;;55800:25;:10;55815:9;55800:14;:25::i;:::-;55745:84;-1:-1:-1;55849:24:0;;55845:331;;55931:10;;55912:55;;;-1:-1:-1;;;55912:55:0;;55961:4;55912:55;;;;;;55889:20;;-1:-1:-1;;;;;55931:10:0;;55912:40;;:55;;;;;;;;;;;;;;55931:10;55912:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55912:55:0;;-1:-1:-1;55982:19:0;56004:35;;;:72;;56056:20;56004:72;;;56041:12;56004:72;56112:10;;56093:68;;;-1:-1:-1;;;56093:68:0;;;;;;;;56112:10;56093:68;;;;;;;;55982:94;;-1:-1:-1;;;;;;56112:10:0;;;;56093:48;;:68;;;;;;;;;;;;;;;;;56112:10;56093:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;55845:331:0;56195:30;56214:10;56195:18;:30::i;50645:310::-;50703:12;;50696:45;;-1:-1:-1;;;;;50703:12:0;48483:42;50739:1;50696:32;:45::i;:::-;50759:12;;50752:55;;-1:-1:-1;;;;;50759:12:0;48483:42;-1:-1:-1;;50752:32:0;:55::i;:::-;50861:11;;50835:12;;50828:48;;-1:-1:-1;;;;;50835:12:0;;;;50861:11;;50828:32;:48::i;:::-;50921:11;;50895:12;;50888:58;;-1:-1:-1;;;;;50895:12:0;;;;50921:11;-1:-1:-1;;50888:32:0;:58::i;:::-;50645:310::o;54216:843::-;54298:42;;;-1:-1:-1;;;54298:42:0;;54334:4;54298:42;;;;;;54282:13;;-1:-1:-1;;;;;;;;;;;33415:42:0;54298:27;;:42;;;;;;;;;;;;;;;33415;54298;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54298:42:0;;-1:-1:-1;54355:10:0;54351:48;;54381:7;;;54351:48;54438:42;;;-1:-1:-1;;;54438:42:0;;54474:4;54438:42;;;;;;54419:16;;-1:-1:-1;;;;;;;;;;;33415:42:0;54438:27;;:42;;;;;;;;;;;;;;;33415;54438;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54438:42:0;;-1:-1:-1;54491:20:0;54514:28;54438:42;54514:18;:28::i;:::-;54491:51;;54553:16;54572:72;49378:5;54572:55;54589:37;54605:20;;49378:5;54589:15;;:37;;;;:::i;:::-;54572:12;;:16;:55::i;:72::-;54553:91;;54670:1;54659:8;:12;:52;;;;;54675:36;54692:8;54702;54675:16;:36::i;:::-;54655:212;;;54728:25;;:::i;:::-;:47;;;;;;;;54757:1;54728:47;;;;54760:8;54728:47;;;;54770:1;54728:47;;;;54773:1;54728:47;;;;;48483:42;-1:-1:-1;;;;;54790:35:0;;54826:9;;;;;;;;;-1:-1:-1;;;;;54826:9:0;54837:7;54846:8;54790:65;;;;;;;;;;;;;-1:-1:-1;;;;;54790:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54655:212;;54905:12;;54898:45;;;-1:-1:-1;;;54898:45:0;;54937:4;54898:45;;;;;;54881:14;;-1:-1:-1;;;;;54905:12:0;;54898:30;;:45;;;;;;;;;;;;;;54905:12;54898:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54898:45:0;;-1:-1:-1;54962:10:0;54954:30;;;;;-1:-1:-1;;;54954:30:0;;;;;;;;;;;;-1:-1:-1;;;54954:30:0;;;;;;;;;;;;;;;55007:11;;55031:13;;54995:56;;;-1:-1:-1;;;54995:56:0;;;;;;;;;55007:11;54995:56;;;;;-1:-1:-1;;;;;55007:11:0;;;;54995:35;;:56;;;;;;;;;;;;;;;55007:11;;54995:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42542:692;35422:1;35414:5;;:9;35406:28;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;-1:-1:-1;;;35406:28:0;;;;;;;;;;;;;;;42696:7:::1;;42663:29;42675:16;:14;:16::i;42663:29::-;:40;;42655:61;;;::::0;;-1:-1:-1;;;42655:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42655:61:0;;;;;;;;;;;;;::::1;;42728:11;42741::::0;42754::::1;42769:14;:12;:14::i;:::-;42802:7;::::0;42790:46:::1;::::0;;-1:-1:-1;;;42790:46:0;;-1:-1:-1;;;;;42790:46:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42727:56;;-1:-1:-1;42727:56:0;;-1:-1:-1;42727:56:0;;-1:-1:-1;42802:7:0::1;::::0;42790:25:::1;::::0;:46;;;;;42802:7:::1;::::0;42790:46;;;;;;;;42802:7;;42790:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42875:5:0::1;::::0;42900:7:::1;::::0;33089:42:::1;::::0;-1:-1:-1;42843:31:0::1;::::0;-1:-1:-1;42882:43:0::1;::::0;42888:36:::1;::::0;-1:-1:-1;;;;;42900:7:0::1;42909:14:::0;42888:11:::1;:36::i;:::-;42882:5;:43::i;:::-;42927:41;42940:3;33251:42;42950:3;42955;42960:7;42927:12;:41::i;:::-;42843:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33089:42;-1:-1:-1::0;;;;;42974:31:0::1;;43006:5;;43021:4;43028:14;43034:7;43028:5;:14::i;:::-;42974:69;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42974:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43058:49:0::1;::::0;;-1:-1:-1;;;43058:49:0;;43083:4:::1;43058:49;::::0;::::1;::::0;33172:42:::1;43058:49:::0;;;;;;-1:-1:-1;;;;;43058:16:0;::::1;::::0;-1:-1:-1;43058:16:0::1;::::0;-1:-1:-1;43058:49:0;;;;;::::1;::::0;;;;;;;;:16;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43058:49:0;43054:113:::1;;43129:26;::::0;;-1:-1:-1;;;43129:26:0;;33172:42:::1;43129:26;::::0;::::1;::::0;;;-1:-1:-1;;;;;43129:17:0;::::1;::::0;::::1;::::0;:26;;;;;-1:-1:-1;;43129:26:0;;;;;;;-1:-1:-1;43129:17:0;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43054:113;43177:49;::::0;;-1:-1:-1;;;43177:49:0;;43211:4:::1;43177:49;::::0;::::1;::::0;;;;;;;;;33172:42:::1;::::0;43177:25:::1;::::0;:49;;;;;-1:-1:-1;;43177:49:0;;;;;;;-1:-1:-1;33172:42:0;43177:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35446:1;;;42542:692:::0;;:::o;38358:193::-;38432:7;38458:85;38539:3;38458:76;34301:5;38458:58;38488:27;38505:9;;34301:5;38488:16;;:27;;;;:::i;:::-;38474:8;;38458:25;;:11;;:15;:25::i;19380:761::-;19804:23;19830:69;19858:4;19830:69;;;;;;;;;;;;;;;;;19838:5;-1:-1:-1;;;;;19830:27:0;;;:69;;;;;:::i;:::-;19914:17;;19804:95;;-1:-1:-1;19914:21:0;19910:224;;20056:10;20045:30;;;;;;;;;;;;;;;-1:-1:-1;20045:30:0;20037:85;;;;-1:-1:-1;;;20037:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6231:979;6361:12;6394:18;6405:6;6394:10;:18::i;:::-;6386:60;;;;;-1:-1:-1;;;6386:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6520:12;6534:23;6561:6;-1:-1:-1;;;;;6561:11:0;6581:8;6592:4;6561:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6561:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6519:78;;;;6612:7;6608:595;;;6643:10;-1:-1:-1;6636:17:0;;-1:-1:-1;6636:17:0;6608:595;6757:17;;:21;6753:439;;7020:10;7014:17;7081:15;7068:10;7064:2;7060:19;7053:44;6968:148;7163:12;7156:20;;-1:-1:-1;;;7156:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3219:278;3305:7;3340:12;3333:5;3325:28;;;;-1:-1:-1;;;3325:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:9;3380:1;3376;:5;;;;;;;3219:278;-1:-1:-1;;;;;3219:278:0:o;1193:192::-;1279:7;1315:12;1307:6;;;;1299:29;;;;-1:-1:-1;;;1299:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1351:5:0;;;1193:192::o;30456:601::-;30692:11;;30688:362;;30722:37;-1:-1:-1;;;;;30722:25:0;;30748:7;30757:1;30722:25;:37::i;:::-;30774:43;-1:-1:-1;;;;;30774:25:0;;30800:7;30809;30774:25;:43::i;:::-;30850:7;-1:-1:-1;;;;;30834:49:0;;30902:7;30928:13;30960:9;30996:4;31020:3;30834:204;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30834:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30834:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30834:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30456:601;;;;;;:::o;42325:208::-;42367:7;42376;42385;33089:42;-1:-1:-1;;;;;42412:31:0;;42444:5;;42412:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42412:38:0;42452:32;;;-1:-1:-1;;;42452:32:0;;;;33089:42;;42452:30;;:32;;;;;42412:38;;42452:32;;;;;;;33089:42;42452:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42452:32:0;42518:5;;42486:38;;;-1:-1:-1;;;42486:38:0;;;;;;;;;;33089:42;;42486:31;;:38;;;;;42452:32;;42486:38;;;;;;;33089:42;42486:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42486:38:0;42404:121;;-1:-1:-1;42404:121:0;-1:-1:-1;42486:38:0;-1:-1:-1;42325:208:0;;;:::o;41102:156::-;41171:11;41201:49;41205:3;41234:7;-1:-1:-1;;;;;41222:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41222:26:0;41217:2;:31;41210:2;:39;41201:3;:49::i;40960:133::-;41041:1;41009:8;41062:6;;;41054:31;;;;;-1:-1:-1;;;41054:31:0;;;;;;;;;;;;-1:-1:-1;;;41054:31:0;;;;;;;;;;;;;;41673:326;41767:11;41794:12;41821:3;-1:-1:-1;;;;;41813:17:0;;41831:3;41813:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41813:22:0;;;;41864:27;;-1:-1:-1;;;41864:27:0;;;;;;;;-1:-1:-1;;;;;41864:27:0;;;;;;;;;41813:22;;-1:-1:-1;41849:11:0;;41864:17;;;;;;:27;;;;;;;;;;;:17;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41864:27:0;;;;-1:-1:-1;41909:20:0;41915:13;:3;41923:4;41915:7;:13::i;41909:20::-;41902:27;;41964:3;41955:4;41947:20;;:44;;41981:10;41987:3;41981:5;:10::i;:::-;41979:12;;41947:44;;;41972:4;41970:6;;41947:44;41940:51;41673:326;-1:-1:-1;;;;;;;41673:326:0:o;56242:465::-;56337:12;;56330:45;;;-1:-1:-1;;;56330:45:0;;56369:4;56330:45;;;;;;56310:17;;-1:-1:-1;;;;;56337:12:0;;56330:30;;:45;;;;;;;;;;;;;;56337:12;56330:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56330:45:0;;-1:-1:-1;56390:13:0;;56386:314;;56445:9;56432:10;:22;:47;;56469:10;56432:47;;;56457:9;56432:47;56419:60;;56494:19;56516:71;49378:5;56516:54;56531:38;56547:21;;49378:5;56531:15;;:38;;;;:::i;:::-;56516:10;;:14;:54::i;:71::-;56650:9;;;56602:86;;;-1:-1:-1;;;56602:86:0;;-1:-1:-1;;;;;56650:9:0;;;56602:86;;;;;;;;;;56650:9;56602:86;;;;;;;;;;;;;;-1:-1:-1;48483:42:0;;56602:47;;:86;;;;;-1:-1:-1;;56602:86:0;;;;;;;;-1:-1:-1;48483:42:0;56602:86;;;;;;;;;;41267:397;41369:11;41393:12;41416:3;-1:-1:-1;;;;;41408:17:0;;41426:3;41408:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41408:22:0;41455:21;;;-1:-1:-1;;;41455:21:0;;-1:-1:-1;;;;;41455:21:0;;;;;;;;;41408:22;;-1:-1:-1;41441:11:0;;41455:16;;;;;;:21;;;;;41408:22;;41455:21;;;;;;;;:16;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41455:21:0;;-1:-1:-1;41497:10:0;41503:3;41497:5;:10::i;:::-;41491:3;:16;41487:170;;;41531:37;41537:30;41562:4;41537:20;41541:10;41547:3;41541:5;:10::i;:::-;41553:3;41537;:20::i;41531:37::-;41524:44;;41617:10;41623:3;41617:5;:10::i;:::-;41590:24;41602:4;41609;41590:3;:24::i;:::-;:37;:55;;41641:4;41590:55;;;41630:4;41637:1;41630:8;41590:55;41583:62;;41487:170;41267:397;;;;;;;;;:::o;40711:102::-;40762:11;40792:13;40796:3;34336:8;40792:3;:13::i;5178:619::-;5238:4;5706:20;;5549:66;5746:23;;;;;;:42;;-1:-1:-1;;5773:15:0;;;5178:619;-1:-1:-1;;5178:619:0:o;40822:129::-;40915:5;;;40910:16;;;;40902:41;;;;;-1:-1:-1;;;40902:41:0;;;;;;;;;;;;-1:-1:-1;;;40902:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://1448ab3cc765edd3681b66e989cb8845b4bda6382f5d2c3db08898745ea2589c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.