Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12456869 | 1289 days ago | IN | 0 ETH | 0.16684014 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
LendingPair
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-18 */ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IERC20 { function initialize() external; function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function symbol() external view returns (string memory); function decimals() external view returns (uint); function approve(address spender, uint amount) external returns (bool); function mint(address account, uint amount) external; function burn(address account, uint amount) external; function transferFrom(address sender, address recipient, uint amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } interface IInterestRateModel { function systemRate(ILendingPair _pair) external view returns(uint); function supplyRatePerBlock(ILendingPair _pair, address _token) external view returns(uint); function borrowRatePerBlock(ILendingPair _pair, address _token) external view returns(uint); } interface IController { function interestRateModel() external view returns(IInterestRateModel); function feeRecipient() external view returns(address); function liqMinHealth() external view returns(uint); function liqFeePool() external view returns(uint); function liqFeeSystem() external view returns(uint); function liqFeeCaller() external view returns(uint); function liqFeesTotal() external view returns(uint); function tokenPrice(address _token) external view returns(uint); function depositLimit(address _lendingPair, address _token) external view returns(uint); function setFeeRecipient(address _feeRecipient) external; function tokenSupported(address _token) external view returns(bool); } interface ILendingPair { function checkAccountHealth(address _account) external view; function accrueAccount(address _account) external; function accrue() external; function accountHealth(address _account) external view returns(uint); function totalDebt(address _token) external view returns(uint); function tokenA() external view returns(address); function tokenB() external view returns(address); function lpToken(address _token) external view returns(IERC20); function debtOf(address _account, address _token) external view returns(uint); function deposit(address _token, uint _amount) external; function withdraw(address _token, uint _amount) external; function borrow(address _token, uint _amount) external; function repay(address _token, uint _amount) external; function withdrawRepay(address _token, uint _amount) external; function withdrawBorrow(address _token, uint _amount) external; function controller() external view returns(IController); function convertTokenValues( address _fromToken, address _toToken, uint _inputAmount ) external view returns(uint); } interface IWETH { function deposit() external payable; function withdraw(uint wad) external; function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function approve(address spender, uint amount) external returns (bool); } contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { owner = msg.sender; emit OwnershipTransferred(address(0), owner); } modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } function isOwner() public view returns (bool) { return msg.sender == owner; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `master`. * * This function uses the create opcode, which should never revert. */ function clone(address master) internal returns (address instance) { // solhint-disable-next-line no-inline-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, master)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `master`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `master` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address master, bytes32 salt) internal returns (address instance) { // solhint-disable-next-line no-inline-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, master)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address master, bytes32 salt, address deployer) internal pure returns (address predicted) { // solhint-disable-next-line no-inline-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, master)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address master, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(master, salt, address(this)); } } contract ERC20 is Ownable { event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); mapping (address => uint) public balanceOf; mapping (address => mapping (address => uint)) public allowance; string public name; string public symbol; uint8 public decimals; uint public totalSupply; constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; require(decimals > 0, "decimals"); } function transfer(address _recipient, uint _amount) public returns (bool) { _transfer(msg.sender, _recipient, _amount); return true; } function approve(address _spender, uint _amount) public returns (bool) { _approve(msg.sender, _spender, _amount); return true; } function transferFrom(address _sender, address _recipient, uint _amount) public returns (bool) { require(allowance[_sender][msg.sender] >= _amount, "ERC20: insufficient approval"); _transfer(_sender, _recipient, _amount); _approve(_sender, msg.sender, allowance[_sender][msg.sender] - _amount); return true; } function _transfer(address _sender, address _recipient, uint _amount) internal { require(_sender != address(0), "ERC20: transfer from the zero address"); require(_recipient != address(0), "ERC20: transfer to the zero address"); require(balanceOf[_sender] >= _amount, "ERC20: insufficient funds"); balanceOf[_sender] -= _amount; balanceOf[_recipient] += _amount; emit Transfer(_sender, _recipient, _amount); } function mint(address _account, uint _amount) public onlyOwner { _mint(_account, _amount); } function burn(address _account, uint _amount) public onlyOwner { _burn(_account, _amount); } function _mint(address _account, uint _amount) internal { require(_account != address(0), "ERC20: mint to the zero address"); totalSupply += _amount; balanceOf[_account] += _amount; emit Transfer(address(0), _account, _amount); } function _burn(address _account, uint _amount) internal { require(_account != address(0), "ERC20: burn from the zero address"); balanceOf[_account] -= _amount; totalSupply -= _amount; emit Transfer(_account, address(0), _amount); } function _approve(address _owner, address _spender, uint _amount) internal { require(_owner != address(0), "ERC20: approve from the zero address"); require(_spender != address(0), "ERC20: approve to the zero address"); allowance[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } } contract TransferHelper { IWETH internal constant WETH = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); function _safeTransferFrom(address _token, address _sender, uint _amount) internal virtual { IERC20(_token).transferFrom(_sender, address(this), _amount); require(_amount > 0, "TransferHelper: amount must be > 0"); } function _wethWithdrawTo(address _to, uint _amount) internal virtual { require(_amount > 0, "TransferHelper: amount must be > 0"); WETH.withdraw(_amount); (bool success, ) = _to.call { value: _amount }(new bytes(0)); require(success, 'TransferHelper: ETH transfer failed'); } function _depositWeth() internal { require(msg.value > 0, "TransferHelper: amount must be > 0"); WETH.deposit { value: msg.value }(); } } contract LendingPair is TransferHelper { // Prevents division by zero and other undesirable behaviour uint public constant MIN_RESERVE = 1000; using Address for address; using Clones for address; mapping (address => mapping (address => uint)) public debtOf; mapping (address => mapping (address => uint)) public accountInterestSnapshot; mapping (address => uint) public cumulativeInterestRate; // 100e18 = 100% mapping (address => uint) public totalDebt; mapping (address => IERC20) public lpToken; IController public controller; address public tokenA; address public tokenB; uint public lastBlockAccrued; event Liquidation( address indexed account, uint supplyBurnA, uint supplyBurnB, uint borrowBurnA, uint borrowBurnB ); event Deposit(address indexed token, uint amount); event Withdraw(address indexed token, uint amount); event Borrow(address indexed token, uint amount); event Repay(address indexed token, uint amount); receive() external payable {} function initialize( address _lpTokenMaster, address _controller, IERC20 _tokenA, IERC20 _tokenB ) public { require(address(tokenA) == address(0), "LendingPair: already initialized"); require(address(_tokenA) != address(0) && address(_tokenB) != address(0), "LendingPair: cannot be ZERO address"); controller = IController(_controller); tokenA = address(_tokenA); tokenB = address(_tokenB); lastBlockAccrued = block.number; lpToken[tokenA] = _createLpToken(_lpTokenMaster); lpToken[tokenB] = _createLpToken(_lpTokenMaster); } function depositRepay(address _token, uint _amount) public { _validateToken(_token); accrueAccount(msg.sender); _depositRepay(_token, _amount); _safeTransferFrom(_token, msg.sender, _amount); } function depositRepayETH() public payable { accrueAccount(msg.sender); _depositRepay(address(WETH), msg.value); _depositWeth(); } function deposit(address _token, uint _amount) public { _validateToken(_token); accrueAccount(msg.sender); _deposit(_token, _amount); _safeTransferFrom(_token, msg.sender, _amount); } function withdrawBorrow(address _token, uint _amount) public { _validateToken(_token); accrueAccount(msg.sender); _withdrawBorrow(_token, _amount); _safeTransfer(IERC20(_token), msg.sender, _amount); } function withdrawBorrowETH(uint _amount) public { accrueAccount(msg.sender); _withdrawBorrow(address(WETH), _amount); _wethWithdrawTo(msg.sender, _amount); _checkMinReserve(address(WETH)); } function withdraw(address _token, uint _amount) public { _validateToken(_token); accrueAccount(msg.sender); _withdraw(_token, _amount); _safeTransfer(IERC20(_token), msg.sender, _amount); } function withdrawAll(address _token) public { _validateToken(_token); accrueAccount(msg.sender); uint amount = lpToken[address(_token)].balanceOf(msg.sender); _withdraw(_token, amount); _safeTransfer(IERC20(_token), msg.sender, amount); } function borrow(address _token, uint _amount) public { _validateToken(_token); accrueAccount(msg.sender); _borrow(_token, _amount); _safeTransfer(IERC20(_token), msg.sender, _amount); } function repayAll(address _token) public { _validateToken(_token); accrueAccount(msg.sender); uint amount = debtOf[_token][msg.sender]; _repay(_token, amount); _safeTransferFrom(_token, msg.sender, amount); } function repay(address _token, uint _amount) public { _validateToken(_token); accrueAccount(msg.sender); _repay(_token, _amount); _safeTransferFrom(_token, msg.sender, _amount); } function accrue() public { if (lastBlockAccrued < block.number) { _accrueInterest(tokenA); _accrueInterest(tokenB); lastBlockAccrued = block.number; } } function accrueAccount(address _account) public { accrue(); _accrueAccountInterest(feeRecipient()); _accrueAccountInterest(_account); } function accountHealth(address _account) public view returns(uint) { if (debtOf[tokenA][_account] == 0 && debtOf[tokenB][_account] == 0) { return controller.liqMinHealth(); } uint totalAccountSupply = _supplyBalance(_account, tokenA, tokenA) + _supplyBalance(_account, tokenB, tokenA); uint totalAccountBorrrow = _borrowBalance(_account, tokenA, tokenA) + _borrowBalance(_account, tokenB, tokenA); return totalAccountSupply * 1e18 / totalAccountBorrrow; } // Get borow balance converted to the units of _returnToken function borrowBalance( address _account, address _borrowedToken, address _returnToken ) public view returns(uint) { _validateToken(_borrowedToken); _validateToken(_returnToken); return _borrowBalance(_account, _borrowedToken, _returnToken); } function supplyBalance( address _account, address _suppliedToken, address _returnToken ) public view returns(uint) { _validateToken(_suppliedToken); _validateToken(_returnToken); return _supplyBalance(_account, _suppliedToken, _returnToken); } function supplyRatePerBlock(address _token) public view returns(uint) { _validateToken(_token); return controller.interestRateModel().supplyRatePerBlock(ILendingPair(address(this)), _token); } function borrowRatePerBlock(address _token) public view returns(uint) { _validateToken(_token); return _borrowRatePerBlock(_token); } // Sell collateral to reduce debt and increase accountHealth function liquidateAccount(address _account) public { _accrueAccountInterest(_account); _accrueAccountInterest(msg.sender); _accrueAccountInterest(feeRecipient()); uint health = accountHealth(_account); require(health < controller.liqMinHealth(), "LendingPair: account health > liqMinHealth"); (uint supplyBurnA, uint borrowBurnA) = _liquidateToken(_account, tokenA, tokenB); (uint supplyBurnB, uint borrowBurnB) = _liquidateToken(_account, tokenB, tokenA); emit Liquidation(_account, supplyBurnA, supplyBurnB, borrowBurnA, borrowBurnB); } function pendingSupplyInterest(address _token, address _account) public view returns(uint) { _validateToken(_token); uint newInterest = _newInterest(lpToken[_token].balanceOf(_account), _token, _account); return newInterest * _lpRate() / 100e18; } function pendingBorrowInterest(address _token, address _account) public view returns(uint) { _validateToken(_token); return _pendingBorrowInterest(_token, _account); } function feeRecipient() public view returns(address) { return controller.feeRecipient(); } function checkAccountHealth(address _account) public view { uint health = accountHealth(_account); require(health >= controller.liqMinHealth(), "LendingPair: insufficient accountHealth"); } function convertTokenValues( address _fromToken, address _toToken, uint _inputAmount ) public view returns(uint) { _validateToken(_fromToken); _validateToken(_toToken); return _convertTokenValues(_fromToken, _toToken, _inputAmount); } function _depositRepay(address _token, uint _amount) internal { uint debt = debtOf[_token][msg.sender]; uint repayAmount = debt > _amount ? _amount : debt; if (repayAmount > 0) { _repay(_token, repayAmount); } uint depositAmount = _amount - repayAmount; if (depositAmount > 0) { _deposit(_token, depositAmount); } } function _withdrawBorrow(address _token, uint _amount) internal { uint supplyAmount = lpToken[_token].balanceOf(msg.sender); uint withdrawAmount = supplyAmount > _amount ? _amount : supplyAmount; if (withdrawAmount > 0) { _withdraw(_token, withdrawAmount); } uint borrowAmount = _amount - withdrawAmount; if (borrowAmount > 0) { _borrow(_token, borrowAmount); } } function _mintSupply(address _token, address _account, uint _amount) internal { if (_amount > 0) { lpToken[_token].mint(_account, _amount); } } function _burnSupply(address _token, address _account, uint _amount) internal { if (_amount > 0) { lpToken[_token].burn(_account, _amount); } } function _mintDebt(address _token, address _account, uint _amount) internal { debtOf[_token][_account] += _amount; totalDebt[_token] += _amount; } function _burnDebt(address _token, address _account, uint _amount) internal { debtOf[_token][_account] -= _amount; totalDebt[_token] -= _amount; } function _liquidateToken( address _account, address _supplyToken, address _borrowToken ) internal returns(uint, uint) { uint accountSupply = lpToken[_supplyToken].balanceOf(_account); uint accountDebt = debtOf[_borrowToken][_account]; uint supplyDebt = _convertTokenValues(_borrowToken, _supplyToken, accountDebt); uint supplyRequired = supplyDebt + supplyDebt * controller.liqFeesTotal() / 100e18; uint supplyBurn = supplyRequired > accountSupply ? accountSupply : supplyRequired; uint supplyBurnMinusFees = supplyBurn * 100e18 / (100e18 + controller.liqFeesTotal()); uint systemFee = supplyBurnMinusFees * controller.liqFeeSystem() / 100e18; uint callerFee = supplyBurnMinusFees * controller.liqFeeCaller() / 100e18; _burnSupply(_supplyToken, _account, supplyBurn); _mintSupply(_supplyToken, msg.sender, callerFee); _mintSupply(_supplyToken, feeRecipient(), systemFee); _burnDebt(_borrowToken, _account, accountDebt); return (supplyBurn, accountDebt); } function _accrueAccountInterest(address _account) internal { uint lpBalanceA = lpToken[tokenA].balanceOf(_account); uint lpBalanceB = lpToken[tokenB].balanceOf(_account); _accrueAccountSupply(tokenA, lpBalanceA, _account); _accrueAccountSupply(tokenB, lpBalanceB, _account); _accrueAccountDebt(tokenA, _account); _accrueAccountDebt(tokenB, _account); accountInterestSnapshot[tokenA][_account] = cumulativeInterestRate[tokenA]; accountInterestSnapshot[tokenB][_account] = cumulativeInterestRate[tokenB]; } function _accrueAccountSupply(address _token, uint _amount, address _account) internal { if (_amount > 0) { uint supplyInterest = _newInterest(_amount, _token, _account); uint newSupplyAccount = supplyInterest * _lpRate() / 100e18; uint newSupplySystem = supplyInterest * _systemRate() / 100e18; _mintSupply(_token, _account, newSupplyAccount); _mintSupply(_token, feeRecipient(), newSupplySystem); } } function _accrueAccountDebt(address _token, address _account) internal { if (debtOf[_token][_account] > 0) { uint newDebt = _pendingBorrowInterest(_token, _account); _mintDebt(_token, _account, newDebt); } } function _withdraw(address _token, uint _amount) internal { lpToken[address(_token)].burn(msg.sender, _amount); checkAccountHealth(msg.sender); emit Withdraw(_token, _amount); } function _borrow(address _token, uint _amount) internal { require(lpToken[address(_token)].balanceOf(msg.sender) == 0, "LendingPair: cannot borrow supplied token"); _mintDebt(_token, msg.sender, _amount); checkAccountHealth(msg.sender); emit Borrow(_token, _amount); } function _repay(address _token, uint _amount) internal { _burnDebt(_token, msg.sender, _amount); emit Repay(_token, _amount); } function _deposit(address _token, uint _amount) internal { _checkOracleSupport(tokenA); _checkOracleSupport(tokenB); _checkDepositLimit(_token, _amount); require(debtOf[_token][msg.sender] == 0, "LendingPair: cannot deposit borrowed token"); _mintSupply(_token, msg.sender, _amount); emit Deposit(_token, _amount); } function _accrueInterest(address _token) internal { uint blocksElapsed = block.number - lastBlockAccrued; uint newInterest = _borrowRatePerBlock(_token) * blocksElapsed; cumulativeInterestRate[_token] += newInterest; } function _createLpToken(address _lpTokenMaster) internal returns(IERC20) { IERC20 newLPToken = IERC20(_lpTokenMaster.clone()); newLPToken.initialize(); return newLPToken; } function _safeTransfer(IERC20 _token, address _recipient, uint _amount) internal { if (_amount > 0) { _token.transfer(_recipient, _amount); _checkMinReserve(address(_token)); } } function _wethWithdrawTo(address _to, uint _amount) internal override { if (_amount > 0) { TransferHelper._wethWithdrawTo(_to, _amount); _checkMinReserve(address(WETH)); } } function _borrowRatePerBlock(address _token) internal view returns(uint) { return controller.interestRateModel().borrowRatePerBlock(ILendingPair(address(this)), _token); } function _pendingBorrowInterest(address _token, address _account) internal view returns(uint) { return _newInterest(debtOf[_token][_account], _token, _account); } function _borrowBalance( address _account, address _borrowedToken, address _returnToken ) internal view returns(uint) { return _convertTokenValues(_borrowedToken, _returnToken, debtOf[_borrowedToken][_account]); } // Get supply balance converted to the units of _returnToken function _supplyBalance( address _account, address _suppliedToken, address _returnToken ) internal view returns(uint) { return _convertTokenValues(_suppliedToken, _returnToken, lpToken[_suppliedToken].balanceOf(_account)); } function _convertTokenValues( address _fromToken, address _toToken, uint _inputAmount ) internal view returns(uint) { uint priceFrom = controller.tokenPrice(_fromToken) * 1e18 / 10 ** IERC20(_fromToken).decimals(); uint priceTo = controller.tokenPrice(_toToken) * 1e18 / 10 ** IERC20(_toToken).decimals(); return _inputAmount * priceFrom / priceTo; } function _validateToken(address _token) internal view { require(_token == tokenA || _token == tokenB, "LendingPair: invalid token"); } function _checkOracleSupport(address _token) internal view { require(controller.tokenSupported(_token), "LendingPair: token not supported"); } function _checkMinReserve(address _token) internal view { require(IERC20(_token).balanceOf(address(this)) >= MIN_RESERVE, "LendingPair: below MIN_RESERVE"); } function _checkDepositLimit(address _token, uint _amount) internal view { uint depositLimit = controller.depositLimit(address(this), _token); if (depositLimit > 0) { require((lpToken[_token].totalSupply() + _amount) <= depositLimit, "LendingPair: deposit limit reached"); } } function _systemRate() internal view returns(uint) { return controller.interestRateModel().systemRate(ILendingPair(address(this))); } function _lpRate() internal view returns(uint) { return 100e18 - _systemRate(); } function _newInterest(uint _balance, address _token, address _account) internal view returns(uint) { return _balance * (cumulativeInterestRate[_token] - accountInterestSnapshot[_token][_account]) / 100e18; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"supplyBurnA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supplyBurnB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowBurnA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowBurnB","type":"uint256"}],"name":"Liquidation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MIN_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"accountHealth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountInterestSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"accrueAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_borrowedToken","type":"address"},{"internalType":"address","name":"_returnToken","type":"address"}],"name":"borrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"borrowRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"checkAccountHealth","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"},{"internalType":"uint256","name":"_inputAmount","type":"uint256"}],"name":"convertTokenValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cumulativeInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"debtOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRepay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositRepayETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpTokenMaster","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"contract IERC20","name":"_tokenA","type":"address"},{"internalType":"contract IERC20","name":"_tokenB","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastBlockAccrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"liquidateAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingBorrowInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingSupplyInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"repayAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_suppliedToken","type":"address"},{"internalType":"address","name":"_returnToken","type":"address"}],"name":"supplyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"supplyRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBorrowETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50613157806100206000396000f3fe6080604052600436106101fd5760003560e01c806376a562a41161010d578063a652be91116100a0578063f3fef3a31161006f578063f3fef3a31461057f578063f77c47911461059f578063f8ba4cff146105b4578063f8c8765e146105c9578063fa09e630146105e957610204565b8063a652be91146104ff578063ac23cb211461051f578063bfe69c8d1461053f578063e6c04e721461055f57610204565b80638b96b280116100dc5780638b96b2801461048a5780638bf78f5a146104aa57806391a50ee1146104ca5780639d57cf43146104ea57610204565b806376a562a41461040a5780637c27383b1461042a578063808355bf1461044a5780638ac5d4a31461046a57610204565b80633504de60116101905780634b8a35291161015f5780634b8a35291461038d5780634c4ab169146103ad5780635f64b55b146103cd578063673142d1146103e25780636fc905bd1461040257610204565b80633504de60146103185780633d27b54614610338578063469048401461035857806347e7ef241461036d57610204565b80631ff517ff116101cc5780631ff517ff1461029857806322867d78146102b857806325fd7bc8146102d8578063270eaa4d146102f857610204565b8063056af9a51461020957806309dfd0e61461023f5780630fc63d10146102545780631dcea00a1461027657610204565b3661020457005b600080fd5b34801561021557600080fd5b506102296102243660046129de565b610609565b6040516102369190612f50565b60405180910390f35b34801561024b57600080fd5b506102296106df565b34801561026057600080fd5b506102696106e5565b6040516102369190612baf565b34801561028257600080fd5b50610296610291366004612afb565b6106f4565b005b3480156102a457600080fd5b506102296102b33660046129a6565b61071f565b3480156102c457600080fd5b506102966102d3366004612afb565b610731565b3480156102e457600080fd5b506102966102f3366004612b46565b61074d565b34801561030457600080fd5b50610229610313366004612abb565b61079e565b34801561032457600080fd5b506102296103333660046129de565b6107c7565b34801561034457600080fd5b506102296103533660046129de565b6107dc565b34801561036457600080fd5b506102696107f9565b34801561037957600080fd5b50610296610388366004612afb565b61087b565b34801561039957600080fd5b506102966103a8366004612afb565b610897565b3480156103b957600080fd5b506102296103c83660046129de565b6108be565b3480156103d957600080fd5b506102696108d8565b3480156103ee57600080fd5b506102296103fd366004612a16565b6108e7565b610296610906565b34801561041657600080fd5b506102696104253660046129a6565b610937565b34801561043657600080fd5b506102966104453660046129a6565b610952565b34801561045657600080fd5b506102966104653660046129a6565b610990565b34801561047657600080fd5b506102966104853660046129a6565b610a4b565b34801561049657600080fd5b506102296104a53660046129a6565b610bbd565b3480156104b657600080fd5b506102296104c53660046129a6565b610d5b565b3480156104d657600080fd5b506102966104e5366004612afb565b610e6f565b3480156104f657600080fd5b50610229610e8b565b34801561050b57600080fd5b5061022961051a3660046129a6565b610e91565b34801561052b57600080fd5b5061022961053a3660046129a6565b610ea3565b34801561054b57600080fd5b5061029661055a3660046129a6565b610eb7565b34801561056b57600080fd5b5061022961057a366004612a16565b610ed3565b34801561058b57600080fd5b5061029661059a366004612afb565b610ef2565b3480156105ab57600080fd5b50610269610f0e565b3480156105c057600080fd5b50610296610f1d565b3480156105d557600080fd5b506102966105e4366004612a60565b610f57565b3480156105f557600080fd5b506102966106043660046129a6565b611079565b600061061483611126565b6001600160a01b0380841660009081526004602081905260408083205490516370a0823160e01b815292936106af939116916370a082319161065891889101612baf565b60206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a89190612b5e565b858561116b565b905068056bc75e2d631000006106c36111c6565b6106cd90836130c0565b6106d79190612f8c565b949350505050565b6103e881565b6006546001600160a01b031681565b6106fd82611126565b61070633610eb7565b61071082826111e3565b61071b82338361124c565b5050565b60036020526000908152604090205481565b61073a82611126565b61074333610eb7565b61071082826112f4565b61075633610eb7565b61077473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282611344565b61077e3382611416565b61079b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261143f565b50565b60006107a984611126565b6107b283611126565b6107bd8484846114dd565b90505b9392505050565b60006107d283611126565b6107c08383611735565b600160209081526000928352604080842090915290825290205481565b6005546040805163011a412160e61b815290516000926001600160a01b0316916346904840916004808301926020929190829003018186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087691906129c2565b905090565b61088482611126565b61088d33610eb7565b6107108282611766565b6108a082611126565b6108a933610eb7565b6108b3828261181d565b61071b823383611918565b600060208181529281526040808220909352908152205481565b6007546001600160a01b031681565b60006108f283611126565b6108fb82611126565b6107bd8484846119a8565b61090f33610eb7565b61092d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2346111e3565b610935611a46565b565b6004602052600090815260409020546001600160a01b031681565b61095b81611126565b61096433610eb7565b6001600160a01b03811660009081526020818152604080832033845290915290205461071082826112f4565b600061099b82610bbd565b9050600560009054906101000a90046001600160a01b03166001600160a01b03166327a358b26040518163ffffffff1660e01b815260040160206040518083038186803b1580156109eb57600080fd5b505afa1580156109ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a239190612b5e565b81101561071b5760405162461bcd60e51b8152600401610a4290612ed4565b60405180910390fd5b610a5481611ac9565b610a5d33611ac9565b610a6d610a686107f9565b611ac9565b6000610a7882610bbd565b9050600560009054906101000a90046001600160a01b03166001600160a01b03166327a358b26040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b009190612b5e565b8110610b1e5760405162461bcd60e51b8152600401610a4290612e05565b6006546007546000918291610b419186916001600160a01b039182169116611cad565b6007546006549294509092506000918291610b6a9188916001600160a01b039081169116611cad565b91509150856001600160a01b03167fa3f221854f649364e9a3bb384dd1ff938482664f4a0eac0f6e39a542f5193bd385848685604051610bad9493929190612f59565b60405180910390a2505050505050565b6006546001600160a01b03908116600090815260208181526040808320938516835292905290812054158015610c1757506007546001600160a01b0390811660009081526020818152604080832093861683529290522054155b15610ca957600560009054906101000a90046001600160a01b03166001600160a01b03166327a358b26040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6a57600080fd5b505afa158015610c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190612b5e565b9050610d56565b600754600654600091610cca9185916001600160a01b0390811691166119a8565b600654610ce29085906001600160a01b0316806119a8565b610cec9190612f74565b600754600654919250600091610d109186916001600160a01b03918216911661208e565b600654610d289086906001600160a01b03168061208e565b610d329190612f74565b905080610d4783670de0b6b3a76400006130c0565b610d519190612f8c565b925050505b919050565b6000610d6682611126565b600560009054906101000a90046001600160a01b03166001600160a01b031663f3fdb15a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906129c2565b6001600160a01b031663772e36ea30846040518363ffffffff1660e01b8152600401610e19929190612bc3565b60206040518083038186803b158015610e3157600080fd5b505afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e699190612b5e565b92915050565b610e7882611126565b610e8133610eb7565b6108b38282611344565b60085481565b60026020526000908152604090205481565b6000610eae82611126565b610e69826120c1565b610ebf610f1d565b610eca610a686107f9565b61079b81611ac9565b6000610ede83611126565b610ee782611126565b6107bd84848461208e565b610efb82611126565b610f0433610eb7565b6108b3828261216b565b6005546001600160a01b031681565b43600854101561093557600654610f3c906001600160a01b0316612222565b600754610f51906001600160a01b0316612222565b43600855565b6006546001600160a01b031615610f805760405162461bcd60e51b8152600401610a4290612dd0565b6001600160a01b03821615801590610fa057506001600160a01b03811615155b610fbc5760405162461bcd60e51b8152600401610a4290612d0d565b600580546001600160a01b038086166001600160a01b0319928316179092556006805485841690831617905560078054928416929091169190911790554360085561100684612281565b6006546001600160a01b03908116600090815260046020526040902080546001600160a01b0319169290911691909117905561104184612281565b6007546001600160a01b03908116600090815260046020526040902080546001600160a01b0319169290911691909117905550505050565b61108281611126565b61108b33610eb7565b6001600160a01b0380821660009081526004602081905260408083205490516370a0823160e01b8152929316916370a08231916110ca91339101612baf565b60206040518083038186803b1580156110e257600080fd5b505afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a9190612b5e565b90506108b3828261216b565b6006546001600160a01b038281169116148061114f57506007546001600160a01b038281169116145b61079b5760405162461bcd60e51b8152600401610a4290612d50565b6001600160a01b038083166000818152600160209081526040808320948616835293815283822054928252600290529182205468056bc75e2d63100000916111b2916130df565b6111bc90866130c0565b6107bd9190612f8c565b60006111d06122f2565b6108769068056bc75e2d631000006130df565b6001600160a01b038216600090815260208181526040808320338452909152812054908282116112135781611215565b825b905080156112275761122784826112f4565b600061123382856130df565b90508015611245576112458582611766565b5050505050565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd9061127c90859030908690600401612bdd565b602060405180830381600087803b15801561129657600080fd5b505af11580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190612b26565b50600081116112ef5760405162461bcd60e51b8152600401610a4290612c64565b505050565b6112ff8233836123ea565b816001600160a01b03167f5c16de4f8b59bd9caf0f49a545f25819a895ed223294290b408242e72a594231826040516113389190612f50565b60405180910390a25050565b6001600160a01b0380831660009081526004602081905260408083205490516370a0823160e01b8152929316916370a082319161138391339101612baf565b60206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190612b5e565b905060008282116113e457816113e6565b825b905080156113f8576113f8848261216b565b600061140482856130df565b9050801561124557611245858261181d565b801561071b57611426828261244c565b61071b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b6040516370a0823160e01b81526103e8906001600160a01b038316906370a082319061146f903090600401612baf565b60206040518083038186803b15801561148757600080fd5b505afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf9190612b5e565b101561079b5760405162461bcd60e51b8152600401610a4290612ca6565b600080846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115519190612b5e565b61155c90600a612ff2565b6005546040516384ba3f6960e01b81526001600160a01b03909116906384ba3f699061158c908990600401612baf565b60206040518083038186803b1580156115a457600080fd5b505afa1580156115b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dc9190612b5e565b6115ee90670de0b6b3a76400006130c0565b6115f89190612f8c565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561163557600080fd5b505afa158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d9190612b5e565b61167890600a612ff2565b6005546040516384ba3f6960e01b81526001600160a01b03909116906384ba3f69906116a8908990600401612baf565b60206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f89190612b5e565b61170a90670de0b6b3a76400006130c0565b6117149190612f8c565b90508061172183866130c0565b61172b9190612f8c565b9695505050505050565b6001600160a01b038083166000908152602081815260408083209385168352929052908120546107c090848461116b565b60065461177b906001600160a01b0316612561565b600754611790906001600160a01b0316612561565b61179a82826125fc565b6001600160a01b038216600090815260208181526040808320338452909152902054156117d95760405162461bcd60e51b8152600401610a4290612c1a565b6117e482338361273c565b816001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516113389190612f50565b6001600160a01b038083166000908152600460208190526040918290205491516370a0823160e01b815291909216916370a082319161185e91339101612baf565b60206040518083038186803b15801561187657600080fd5b505afa15801561188a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ae9190612b5e565b156118cb5760405162461bcd60e51b8152600401610a4290612d87565b6118d68233836127bc565b6118df33610990565b816001600160a01b03167fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750826040516113389190612f50565b80156112ef5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb9061194c9085908590600401612c01565b602060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199e9190612b26565b506112ef8361143f565b6001600160a01b0380831660009081526004602081905260408083205490516370a0823160e01b815292936107bd9387938793909216916370a08231916119f1918b9101612baf565b60206040518083038186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a419190612b5e565b6114dd565b60003411611a665760405162461bcd60e51b8152600401610a4290612c64565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ab557600080fd5b505af1158015611245573d6000803e3d6000fd5b6006546001600160a01b0390811660009081526004602081905260408083205490516370a0823160e01b8152929316916370a0823191611b0b91869101612baf565b60206040518083038186803b158015611b2357600080fd5b505afa158015611b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5b9190612b5e565b6007546001600160a01b0390811660009081526004602081905260408083205490516370a0823160e01b8152949550919391909216916370a0823191611ba391879101612baf565b60206040518083038186803b158015611bbb57600080fd5b505afa158015611bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf39190612b5e565b600654909150611c0d906001600160a01b0316838561281e565b600754611c24906001600160a01b0316828561281e565b600654611c3a906001600160a01b0316846128ac565b600754611c50906001600160a01b0316846128ac565b50506006546001600160a01b03908116600090815260026020818152604080842054600180845282862097871680875297845282862091909155600754909516845291815281832054938152818320948352939093529190912055565b6001600160a01b0380831660009081526004602081905260408083205490516370a0823160e01b815292938493849392909116916370a0823191611cf3918a9101612baf565b60206040518083038186803b158015611d0b57600080fd5b505afa158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d439190612b5e565b6001600160a01b03808616600090815260208181526040808320938b16835292905290812054919250611d778688846114dd565b9050600068056bc75e2d63100000600560009054906101000a90046001600160a01b03166001600160a01b0316635bad76066040518163ffffffff1660e01b815260040160206040518083038186803b158015611dd357600080fd5b505afa158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b9190612b5e565b611e1590846130c0565b611e1f9190612f8c565b611e299083612f74565b90506000848211611e3a5781611e3c565b845b90506000600560009054906101000a90046001600160a01b03166001600160a01b0316635bad76066040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8e57600080fd5b505afa158015611ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec69190612b5e565b611ed99068056bc75e2d63100000612f74565b611eec8368056bc75e2d631000006130c0565b611ef69190612f8c565b9050600068056bc75e2d63100000600560009054906101000a90046001600160a01b03166001600160a01b0316639222f80d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5257600080fd5b505afa158015611f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8a9190612b5e565b611f9490846130c0565b611f9e9190612f8c565b9050600068056bc75e2d63100000600560009054906101000a90046001600160a01b03166001600160a01b031663e88d76da6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ffa57600080fd5b505afa15801561200e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120329190612b5e565b61203c90856130c0565b6120469190612f8c565b90506120538c8e866128ee565b61205e8c338361273c565b6120708c61206a6107f9565b8461273c565b61207b8b8e896123ea565b50919b949a509398505050505050505050565b6001600160a01b038083166000908152602081815260408083209387168352929052908120546107bd90849084906114dd565b600554604080516379fed8ad60e11b815290516000926001600160a01b03169163f3fdb15a916004808301926020929190829003018186803b15801561210657600080fd5b505afa15801561211a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213e91906129c2565b6001600160a01b031663c65324c730846040518363ffffffff1660e01b8152600401610e19929190612bc3565b6001600160a01b03808316600090815260046020819052604091829020549151632770a7eb60e21b81529190921691639dc29fac916121ae913391869101612c01565b600060405180830381600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050506121e933610990565b816001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516113389190612f50565b60006008544361223291906130df565b9050600081612240846120c1565b61224a91906130c0565b6001600160a01b038416600090815260026020526040812080549293508392909190612277908490612f74565b9091555050505050565b600080612296836001600160a01b0316612937565b9050806001600160a01b0316638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156122d357600080fd5b505af11580156122e7573d6000803e3d6000fd5b509295945050505050565b600554604080516379fed8ad60e11b815290516000926001600160a01b03169163f3fdb15a916004808301926020929190829003018186803b15801561233757600080fd5b505afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f91906129c2565b6001600160a01b031663a6fb93f6306040518263ffffffff1660e01b815260040161239a9190612baf565b60206040518083038186803b1580156123b257600080fd5b505afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190612b5e565b6001600160a01b038084166000908152602081815260408083209386168352929052908120805483929061241f9084906130df565b90915550506001600160a01b038316600090815260036020526040812080548392906122779084906130df565b6000811161246c5760405162461bcd60e51b8152600401610a4290612c64565b604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d906124a3908490600401612f50565b600060405180830381600087803b1580156124bd57600080fd5b505af11580156124d1573d6000803e3d6000fd5b5050604080516000808252602082019283905293506001600160a01b038616925084916124fe9190612b76565b60006040518083038185875af1925050503d806000811461253b576040519150601f19603f3d011682016040523d82523d6000602084013e612540565b606091505b50509050806112ef5760405162461bcd60e51b8152600401610a4290612e91565b6005546040516262143f60e41b81526001600160a01b039091169063062143f090612590908490600401612baf565b60206040518083038186803b1580156125a857600080fd5b505afa1580156125bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e09190612b26565b61079b5760405162461bcd60e51b8152600401610a4290612f1b565b6005546040516341f8a85b60e11b81526000916001600160a01b0316906383f150b69061262f9030908790600401612bc3565b60206040518083038186803b15801561264757600080fd5b505afa15801561265b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267f9190612b5e565b905080156112ef576001600160a01b038084166000908152600460208181526040928390205483516318160ddd60e01b81529351869588959216936318160ddd938382019390929190829003018186803b1580156126dc57600080fd5b505afa1580156126f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127149190612b5e565b61271e9190612f74565b11156112ef5760405162461bcd60e51b8152600401610a4290612e4f565b80156112ef576001600160a01b038084166000908152600460208190526040918290205491516340c10f1960e01b815291909216916340c10f1991612785918691869101612c01565b600060405180830381600087803b15801561279f57600080fd5b505af11580156127b3573d6000803e3d6000fd5b50505050505050565b6001600160a01b03808416600090815260208181526040808320938616835292905290812080548392906127f1908490612f74565b90915550506001600160a01b03831660009081526003602052604081208054839290612277908490612f74565b81156112ef57600061283183858461116b565b9050600068056bc75e2d631000006128476111c6565b61285190846130c0565b61285b9190612f8c565b9050600068056bc75e2d631000006128716122f2565b61287b90856130c0565b6128859190612f8c565b905061289286858461273c565b6128a48661289e6107f9565b8361273c565b505050505050565b6001600160a01b03808316600090815260208181526040808320938516835292905220541561071b5760006128e18383611735565b90506112ef8383836127bc565b80156112ef576001600160a01b03808416600090815260046020819052604091829020549151632770a7eb60e21b81529190921691639dc29fac91612785918691869101612c01565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610d565760405162461bcd60e51b8152600401610a4290612cdd565b6000602082840312156129b7578081fd5b81356107c08161310c565b6000602082840312156129d3578081fd5b81516107c08161310c565b600080604083850312156129f0578081fd5b82356129fb8161310c565b91506020830135612a0b8161310c565b809150509250929050565b600080600060608486031215612a2a578081fd5b8335612a358161310c565b92506020840135612a458161310c565b91506040840135612a558161310c565b809150509250925092565b60008060008060808587031215612a75578081fd5b8435612a808161310c565b93506020850135612a908161310c565b92506040850135612aa08161310c565b91506060850135612ab08161310c565b939692955090935050565b600080600060608486031215612acf578283fd5b8335612ada8161310c565b92506020840135612aea8161310c565b929592945050506040919091013590565b60008060408385031215612b0d578182fd5b8235612b188161310c565b946020939093013593505050565b600060208284031215612b37578081fd5b815180151581146107c0578182fd5b600060208284031215612b57578081fd5b5035919050565b600060208284031215612b6f578081fd5b5051919050565b60008251815b81811015612b965760208186018101518583015201612b7c565b81811115612ba45782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252602a908201527f4c656e64696e67506169723a2063616e6e6f74206465706f73697420626f727260408201526937bbb2b2103a37b5b2b760b11b606082015260800190565b60208082526022908201527f5472616e7366657248656c7065723a20616d6f756e74206d757374206265203e604082015261020360f41b606082015260800190565b6020808252601e908201527f4c656e64696e67506169723a2062656c6f77204d494e5f524553455256450000604082015260600190565b602080825260169082015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604082015260600190565b60208082526023908201527f4c656e64696e67506169723a2063616e6e6f74206265205a45524f206164647260408201526265737360e81b606082015260800190565b6020808252601a908201527f4c656e64696e67506169723a20696e76616c696420746f6b656e000000000000604082015260600190565b60208082526029908201527f4c656e64696e67506169723a2063616e6e6f7420626f72726f7720737570706c60408201526834b2b2103a37b5b2b760b91b606082015260800190565b6020808252818101527f4c656e64696e67506169723a20616c726561647920696e697469616c697a6564604082015260600190565b6020808252602a908201527f4c656e64696e67506169723a206163636f756e74206865616c7468203e206c696040820152690e29ad2dc90cac2d8e8d60b31b606082015260800190565b60208082526022908201527f4c656e64696e67506169723a206465706f736974206c696d6974207265616368604082015261195960f21b606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a20455448207472616e73666572206661696040820152621b195960ea1b606082015260800190565b60208082526027908201527f4c656e64696e67506169723a20696e73756666696369656e74206163636f756e6040820152660e890cac2d8e8d60cb1b606082015260800190565b6020808252818101527f4c656e64696e67506169723a20746f6b656e206e6f7420737570706f72746564604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b60008219821115612f8757612f876130f6565b500190565b600082612fa757634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611612fbe5750612fe9565b818704821115612fd057612fd06130f6565b80861615612fdd57918102915b9490941c938002612faf565b94509492505050565b60006107c0600019848460008261300b575060016107c0565b81613018575060006107c0565b816001811461302e576002811461303857613065565b60019150506107c0565b60ff841115613049576130496130f6565b6001841b91508482111561305f5761305f6130f6565b506107c0565b5060208310610133831016604e8410600b8410161715613098575081810a83811115613093576130936130f6565b6107c0565b6130a58484846001612fac565b8086048211156130b7576130b76130f6565b02949350505050565b60008160001904831182151516156130da576130da6130f6565b500290565b6000828210156130f1576130f16130f6565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461079b57600080fdfea2646970667358221220d5f9a2fc3435891b8de51e4b22f2b2d956d193de429fe194f9db36103cfe238c64736f6c63430008010033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c806376a562a41161010d578063a652be91116100a0578063f3fef3a31161006f578063f3fef3a31461057f578063f77c47911461059f578063f8ba4cff146105b4578063f8c8765e146105c9578063fa09e630146105e957610204565b8063a652be91146104ff578063ac23cb211461051f578063bfe69c8d1461053f578063e6c04e721461055f57610204565b80638b96b280116100dc5780638b96b2801461048a5780638bf78f5a146104aa57806391a50ee1146104ca5780639d57cf43146104ea57610204565b806376a562a41461040a5780637c27383b1461042a578063808355bf1461044a5780638ac5d4a31461046a57610204565b80633504de60116101905780634b8a35291161015f5780634b8a35291461038d5780634c4ab169146103ad5780635f64b55b146103cd578063673142d1146103e25780636fc905bd1461040257610204565b80633504de60146103185780633d27b54614610338578063469048401461035857806347e7ef241461036d57610204565b80631ff517ff116101cc5780631ff517ff1461029857806322867d78146102b857806325fd7bc8146102d8578063270eaa4d146102f857610204565b8063056af9a51461020957806309dfd0e61461023f5780630fc63d10146102545780631dcea00a1461027657610204565b3661020457005b600080fd5b34801561021557600080fd5b506102296102243660046129de565b610609565b6040516102369190612f50565b60405180910390f35b34801561024b57600080fd5b506102296106df565b34801561026057600080fd5b506102696106e5565b6040516102369190612baf565b34801561028257600080fd5b50610296610291366004612afb565b6106f4565b005b3480156102a457600080fd5b506102296102b33660046129a6565b61071f565b3480156102c457600080fd5b506102966102d3366004612afb565b610731565b3480156102e457600080fd5b506102966102f3366004612b46565b61074d565b34801561030457600080fd5b50610229610313366004612abb565b61079e565b34801561032457600080fd5b506102296103333660046129de565b6107c7565b34801561034457600080fd5b506102296103533660046129de565b6107dc565b34801561036457600080fd5b506102696107f9565b34801561037957600080fd5b50610296610388366004612afb565b61087b565b34801561039957600080fd5b506102966103a8366004612afb565b610897565b3480156103b957600080fd5b506102296103c83660046129de565b6108be565b3480156103d957600080fd5b506102696108d8565b3480156103ee57600080fd5b506102296103fd366004612a16565b6108e7565b610296610906565b34801561041657600080fd5b506102696104253660046129a6565b610937565b34801561043657600080fd5b506102966104453660046129a6565b610952565b34801561045657600080fd5b506102966104653660046129a6565b610990565b34801561047657600080fd5b506102966104853660046129a6565b610a4b565b34801561049657600080fd5b506102296104a53660046129a6565b610bbd565b3480156104b657600080fd5b506102296104c53660046129a6565b610d5b565b3480156104d657600080fd5b506102966104e5366004612afb565b610e6f565b3480156104f657600080fd5b50610229610e8b565b34801561050b57600080fd5b5061022961051a3660046129a6565b610e91565b34801561052b57600080fd5b5061022961053a3660046129a6565b610ea3565b34801561054b57600080fd5b5061029661055a3660046129a6565b610eb7565b34801561056b57600080fd5b5061022961057a366004612a16565b610ed3565b34801561058b57600080fd5b5061029661059a366004612afb565b610ef2565b3480156105ab57600080fd5b50610269610f0e565b3480156105c057600080fd5b50610296610f1d565b3480156105d557600080fd5b506102966105e4366004612a60565b610f57565b3480156105f557600080fd5b506102966106043660046129a6565b611079565b600061061483611126565b6001600160a01b0380841660009081526004602081905260408083205490516370a0823160e01b815292936106af939116916370a082319161065891889101612baf565b60206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a89190612b5e565b858561116b565b905068056bc75e2d631000006106c36111c6565b6106cd90836130c0565b6106d79190612f8c565b949350505050565b6103e881565b6006546001600160a01b031681565b6106fd82611126565b61070633610eb7565b61071082826111e3565b61071b82338361124c565b5050565b60036020526000908152604090205481565b61073a82611126565b61074333610eb7565b61071082826112f4565b61075633610eb7565b61077473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282611344565b61077e3382611416565b61079b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261143f565b50565b60006107a984611126565b6107b283611126565b6107bd8484846114dd565b90505b9392505050565b60006107d283611126565b6107c08383611735565b600160209081526000928352604080842090915290825290205481565b6005546040805163011a412160e61b815290516000926001600160a01b0316916346904840916004808301926020929190829003018186803b15801561083e57600080fd5b505afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087691906129c2565b905090565b61088482611126565b61088d33610eb7565b6107108282611766565b6108a082611126565b6108a933610eb7565b6108b3828261181d565b61071b823383611918565b600060208181529281526040808220909352908152205481565b6007546001600160a01b031681565b60006108f283611126565b6108fb82611126565b6107bd8484846119a8565b61090f33610eb7565b61092d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2346111e3565b610935611a46565b565b6004602052600090815260409020546001600160a01b031681565b61095b81611126565b61096433610eb7565b6001600160a01b03811660009081526020818152604080832033845290915290205461071082826112f4565b600061099b82610bbd565b9050600560009054906101000a90046001600160a01b03166001600160a01b03166327a358b26040518163ffffffff1660e01b815260040160206040518083038186803b1580156109eb57600080fd5b505afa1580156109ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a239190612b5e565b81101561071b5760405162461bcd60e51b8152600401610a4290612ed4565b60405180910390fd5b610a5481611ac9565b610a5d33611ac9565b610a6d610a686107f9565b611ac9565b6000610a7882610bbd565b9050600560009054906101000a90046001600160a01b03166001600160a01b03166327a358b26040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b009190612b5e565b8110610b1e5760405162461bcd60e51b8152600401610a4290612e05565b6006546007546000918291610b419186916001600160a01b039182169116611cad565b6007546006549294509092506000918291610b6a9188916001600160a01b039081169116611cad565b91509150856001600160a01b03167fa3f221854f649364e9a3bb384dd1ff938482664f4a0eac0f6e39a542f5193bd385848685604051610bad9493929190612f59565b60405180910390a2505050505050565b6006546001600160a01b03908116600090815260208181526040808320938516835292905290812054158015610c1757506007546001600160a01b0390811660009081526020818152604080832093861683529290522054155b15610ca957600560009054906101000a90046001600160a01b03166001600160a01b03166327a358b26040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6a57600080fd5b505afa158015610c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190612b5e565b9050610d56565b600754600654600091610cca9185916001600160a01b0390811691166119a8565b600654610ce29085906001600160a01b0316806119a8565b610cec9190612f74565b600754600654919250600091610d109186916001600160a01b03918216911661208e565b600654610d289086906001600160a01b03168061208e565b610d329190612f74565b905080610d4783670de0b6b3a76400006130c0565b610d519190612f8c565b925050505b919050565b6000610d6682611126565b600560009054906101000a90046001600160a01b03166001600160a01b031663f3fdb15a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906129c2565b6001600160a01b031663772e36ea30846040518363ffffffff1660e01b8152600401610e19929190612bc3565b60206040518083038186803b158015610e3157600080fd5b505afa158015610e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e699190612b5e565b92915050565b610e7882611126565b610e8133610eb7565b6108b38282611344565b60085481565b60026020526000908152604090205481565b6000610eae82611126565b610e69826120c1565b610ebf610f1d565b610eca610a686107f9565b61079b81611ac9565b6000610ede83611126565b610ee782611126565b6107bd84848461208e565b610efb82611126565b610f0433610eb7565b6108b3828261216b565b6005546001600160a01b031681565b43600854101561093557600654610f3c906001600160a01b0316612222565b600754610f51906001600160a01b0316612222565b43600855565b6006546001600160a01b031615610f805760405162461bcd60e51b8152600401610a4290612dd0565b6001600160a01b03821615801590610fa057506001600160a01b03811615155b610fbc5760405162461bcd60e51b8152600401610a4290612d0d565b600580546001600160a01b038086166001600160a01b0319928316179092556006805485841690831617905560078054928416929091169190911790554360085561100684612281565b6006546001600160a01b03908116600090815260046020526040902080546001600160a01b0319169290911691909117905561104184612281565b6007546001600160a01b03908116600090815260046020526040902080546001600160a01b0319169290911691909117905550505050565b61108281611126565b61108b33610eb7565b6001600160a01b0380821660009081526004602081905260408083205490516370a0823160e01b8152929316916370a08231916110ca91339101612baf565b60206040518083038186803b1580156110e257600080fd5b505afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a9190612b5e565b90506108b3828261216b565b6006546001600160a01b038281169116148061114f57506007546001600160a01b038281169116145b61079b5760405162461bcd60e51b8152600401610a4290612d50565b6001600160a01b038083166000818152600160209081526040808320948616835293815283822054928252600290529182205468056bc75e2d63100000916111b2916130df565b6111bc90866130c0565b6107bd9190612f8c565b60006111d06122f2565b6108769068056bc75e2d631000006130df565b6001600160a01b038216600090815260208181526040808320338452909152812054908282116112135781611215565b825b905080156112275761122784826112f4565b600061123382856130df565b90508015611245576112458582611766565b5050505050565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd9061127c90859030908690600401612bdd565b602060405180830381600087803b15801561129657600080fd5b505af11580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190612b26565b50600081116112ef5760405162461bcd60e51b8152600401610a4290612c64565b505050565b6112ff8233836123ea565b816001600160a01b03167f5c16de4f8b59bd9caf0f49a545f25819a895ed223294290b408242e72a594231826040516113389190612f50565b60405180910390a25050565b6001600160a01b0380831660009081526004602081905260408083205490516370a0823160e01b8152929316916370a082319161138391339101612baf565b60206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190612b5e565b905060008282116113e457816113e6565b825b905080156113f8576113f8848261216b565b600061140482856130df565b9050801561124557611245858261181d565b801561071b57611426828261244c565b61071b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b6040516370a0823160e01b81526103e8906001600160a01b038316906370a082319061146f903090600401612baf565b60206040518083038186803b15801561148757600080fd5b505afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf9190612b5e565b101561079b5760405162461bcd60e51b8152600401610a4290612ca6565b600080846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115519190612b5e565b61155c90600a612ff2565b6005546040516384ba3f6960e01b81526001600160a01b03909116906384ba3f699061158c908990600401612baf565b60206040518083038186803b1580156115a457600080fd5b505afa1580156115b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dc9190612b5e565b6115ee90670de0b6b3a76400006130c0565b6115f89190612f8c565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561163557600080fd5b505afa158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d9190612b5e565b61167890600a612ff2565b6005546040516384ba3f6960e01b81526001600160a01b03909116906384ba3f69906116a8908990600401612baf565b60206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f89190612b5e565b61170a90670de0b6b3a76400006130c0565b6117149190612f8c565b90508061172183866130c0565b61172b9190612f8c565b9695505050505050565b6001600160a01b038083166000908152602081815260408083209385168352929052908120546107c090848461116b565b60065461177b906001600160a01b0316612561565b600754611790906001600160a01b0316612561565b61179a82826125fc565b6001600160a01b038216600090815260208181526040808320338452909152902054156117d95760405162461bcd60e51b8152600401610a4290612c1a565b6117e482338361273c565b816001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516113389190612f50565b6001600160a01b038083166000908152600460208190526040918290205491516370a0823160e01b815291909216916370a082319161185e91339101612baf565b60206040518083038186803b15801561187657600080fd5b505afa15801561188a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ae9190612b5e565b156118cb5760405162461bcd60e51b8152600401610a4290612d87565b6118d68233836127bc565b6118df33610990565b816001600160a01b03167fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750826040516113389190612f50565b80156112ef5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb9061194c9085908590600401612c01565b602060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199e9190612b26565b506112ef8361143f565b6001600160a01b0380831660009081526004602081905260408083205490516370a0823160e01b815292936107bd9387938793909216916370a08231916119f1918b9101612baf565b60206040518083038186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a419190612b5e565b6114dd565b60003411611a665760405162461bcd60e51b8152600401610a4290612c64565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ab557600080fd5b505af1158015611245573d6000803e3d6000fd5b6006546001600160a01b0390811660009081526004602081905260408083205490516370a0823160e01b8152929316916370a0823191611b0b91869101612baf565b60206040518083038186803b158015611b2357600080fd5b505afa158015611b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5b9190612b5e565b6007546001600160a01b0390811660009081526004602081905260408083205490516370a0823160e01b8152949550919391909216916370a0823191611ba391879101612baf565b60206040518083038186803b158015611bbb57600080fd5b505afa158015611bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf39190612b5e565b600654909150611c0d906001600160a01b0316838561281e565b600754611c24906001600160a01b0316828561281e565b600654611c3a906001600160a01b0316846128ac565b600754611c50906001600160a01b0316846128ac565b50506006546001600160a01b03908116600090815260026020818152604080842054600180845282862097871680875297845282862091909155600754909516845291815281832054938152818320948352939093529190912055565b6001600160a01b0380831660009081526004602081905260408083205490516370a0823160e01b815292938493849392909116916370a0823191611cf3918a9101612baf565b60206040518083038186803b158015611d0b57600080fd5b505afa158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d439190612b5e565b6001600160a01b03808616600090815260208181526040808320938b16835292905290812054919250611d778688846114dd565b9050600068056bc75e2d63100000600560009054906101000a90046001600160a01b03166001600160a01b0316635bad76066040518163ffffffff1660e01b815260040160206040518083038186803b158015611dd357600080fd5b505afa158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b9190612b5e565b611e1590846130c0565b611e1f9190612f8c565b611e299083612f74565b90506000848211611e3a5781611e3c565b845b90506000600560009054906101000a90046001600160a01b03166001600160a01b0316635bad76066040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8e57600080fd5b505afa158015611ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec69190612b5e565b611ed99068056bc75e2d63100000612f74565b611eec8368056bc75e2d631000006130c0565b611ef69190612f8c565b9050600068056bc75e2d63100000600560009054906101000a90046001600160a01b03166001600160a01b0316639222f80d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5257600080fd5b505afa158015611f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8a9190612b5e565b611f9490846130c0565b611f9e9190612f8c565b9050600068056bc75e2d63100000600560009054906101000a90046001600160a01b03166001600160a01b031663e88d76da6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ffa57600080fd5b505afa15801561200e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120329190612b5e565b61203c90856130c0565b6120469190612f8c565b90506120538c8e866128ee565b61205e8c338361273c565b6120708c61206a6107f9565b8461273c565b61207b8b8e896123ea565b50919b949a509398505050505050505050565b6001600160a01b038083166000908152602081815260408083209387168352929052908120546107bd90849084906114dd565b600554604080516379fed8ad60e11b815290516000926001600160a01b03169163f3fdb15a916004808301926020929190829003018186803b15801561210657600080fd5b505afa15801561211a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213e91906129c2565b6001600160a01b031663c65324c730846040518363ffffffff1660e01b8152600401610e19929190612bc3565b6001600160a01b03808316600090815260046020819052604091829020549151632770a7eb60e21b81529190921691639dc29fac916121ae913391869101612c01565b600060405180830381600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050506121e933610990565b816001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516113389190612f50565b60006008544361223291906130df565b9050600081612240846120c1565b61224a91906130c0565b6001600160a01b038416600090815260026020526040812080549293508392909190612277908490612f74565b9091555050505050565b600080612296836001600160a01b0316612937565b9050806001600160a01b0316638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156122d357600080fd5b505af11580156122e7573d6000803e3d6000fd5b509295945050505050565b600554604080516379fed8ad60e11b815290516000926001600160a01b03169163f3fdb15a916004808301926020929190829003018186803b15801561233757600080fd5b505afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f91906129c2565b6001600160a01b031663a6fb93f6306040518263ffffffff1660e01b815260040161239a9190612baf565b60206040518083038186803b1580156123b257600080fd5b505afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190612b5e565b6001600160a01b038084166000908152602081815260408083209386168352929052908120805483929061241f9084906130df565b90915550506001600160a01b038316600090815260036020526040812080548392906122779084906130df565b6000811161246c5760405162461bcd60e51b8152600401610a4290612c64565b604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d906124a3908490600401612f50565b600060405180830381600087803b1580156124bd57600080fd5b505af11580156124d1573d6000803e3d6000fd5b5050604080516000808252602082019283905293506001600160a01b038616925084916124fe9190612b76565b60006040518083038185875af1925050503d806000811461253b576040519150601f19603f3d011682016040523d82523d6000602084013e612540565b606091505b50509050806112ef5760405162461bcd60e51b8152600401610a4290612e91565b6005546040516262143f60e41b81526001600160a01b039091169063062143f090612590908490600401612baf565b60206040518083038186803b1580156125a857600080fd5b505afa1580156125bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e09190612b26565b61079b5760405162461bcd60e51b8152600401610a4290612f1b565b6005546040516341f8a85b60e11b81526000916001600160a01b0316906383f150b69061262f9030908790600401612bc3565b60206040518083038186803b15801561264757600080fd5b505afa15801561265b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267f9190612b5e565b905080156112ef576001600160a01b038084166000908152600460208181526040928390205483516318160ddd60e01b81529351869588959216936318160ddd938382019390929190829003018186803b1580156126dc57600080fd5b505afa1580156126f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127149190612b5e565b61271e9190612f74565b11156112ef5760405162461bcd60e51b8152600401610a4290612e4f565b80156112ef576001600160a01b038084166000908152600460208190526040918290205491516340c10f1960e01b815291909216916340c10f1991612785918691869101612c01565b600060405180830381600087803b15801561279f57600080fd5b505af11580156127b3573d6000803e3d6000fd5b50505050505050565b6001600160a01b03808416600090815260208181526040808320938616835292905290812080548392906127f1908490612f74565b90915550506001600160a01b03831660009081526003602052604081208054839290612277908490612f74565b81156112ef57600061283183858461116b565b9050600068056bc75e2d631000006128476111c6565b61285190846130c0565b61285b9190612f8c565b9050600068056bc75e2d631000006128716122f2565b61287b90856130c0565b6128859190612f8c565b905061289286858461273c565b6128a48661289e6107f9565b8361273c565b505050505050565b6001600160a01b03808316600090815260208181526040808320938516835292905220541561071b5760006128e18383611735565b90506112ef8383836127bc565b80156112ef576001600160a01b03808416600090815260046020819052604091829020549151632770a7eb60e21b81529190921691639dc29fac91612785918691869101612c01565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610d565760405162461bcd60e51b8152600401610a4290612cdd565b6000602082840312156129b7578081fd5b81356107c08161310c565b6000602082840312156129d3578081fd5b81516107c08161310c565b600080604083850312156129f0578081fd5b82356129fb8161310c565b91506020830135612a0b8161310c565b809150509250929050565b600080600060608486031215612a2a578081fd5b8335612a358161310c565b92506020840135612a458161310c565b91506040840135612a558161310c565b809150509250925092565b60008060008060808587031215612a75578081fd5b8435612a808161310c565b93506020850135612a908161310c565b92506040850135612aa08161310c565b91506060850135612ab08161310c565b939692955090935050565b600080600060608486031215612acf578283fd5b8335612ada8161310c565b92506020840135612aea8161310c565b929592945050506040919091013590565b60008060408385031215612b0d578182fd5b8235612b188161310c565b946020939093013593505050565b600060208284031215612b37578081fd5b815180151581146107c0578182fd5b600060208284031215612b57578081fd5b5035919050565b600060208284031215612b6f578081fd5b5051919050565b60008251815b81811015612b965760208186018101518583015201612b7c565b81811115612ba45782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252602a908201527f4c656e64696e67506169723a2063616e6e6f74206465706f73697420626f727260408201526937bbb2b2103a37b5b2b760b11b606082015260800190565b60208082526022908201527f5472616e7366657248656c7065723a20616d6f756e74206d757374206265203e604082015261020360f41b606082015260800190565b6020808252601e908201527f4c656e64696e67506169723a2062656c6f77204d494e5f524553455256450000604082015260600190565b602080825260169082015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604082015260600190565b60208082526023908201527f4c656e64696e67506169723a2063616e6e6f74206265205a45524f206164647260408201526265737360e81b606082015260800190565b6020808252601a908201527f4c656e64696e67506169723a20696e76616c696420746f6b656e000000000000604082015260600190565b60208082526029908201527f4c656e64696e67506169723a2063616e6e6f7420626f72726f7720737570706c60408201526834b2b2103a37b5b2b760b91b606082015260800190565b6020808252818101527f4c656e64696e67506169723a20616c726561647920696e697469616c697a6564604082015260600190565b6020808252602a908201527f4c656e64696e67506169723a206163636f756e74206865616c7468203e206c696040820152690e29ad2dc90cac2d8e8d60b31b606082015260800190565b60208082526022908201527f4c656e64696e67506169723a206465706f736974206c696d6974207265616368604082015261195960f21b606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a20455448207472616e73666572206661696040820152621b195960ea1b606082015260800190565b60208082526027908201527f4c656e64696e67506169723a20696e73756666696369656e74206163636f756e6040820152660e890cac2d8e8d60cb1b606082015260800190565b6020808252818101527f4c656e64696e67506169723a20746f6b656e206e6f7420737570706f72746564604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b60008219821115612f8757612f876130f6565b500190565b600082612fa757634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611612fbe5750612fe9565b818704821115612fd057612fd06130f6565b80861615612fdd57918102915b9490941c938002612faf565b94509492505050565b60006107c0600019848460008261300b575060016107c0565b81613018575060006107c0565b816001811461302e576002811461303857613065565b60019150506107c0565b60ff841115613049576130496130f6565b6001841b91508482111561305f5761305f6130f6565b506107c0565b5060208310610133831016604e8410600b8410161715613098575081810a83811115613093576130936130f6565b6107c0565b6130a58484846001612fac565b8086048211156130b7576130b76130f6565b02949350505050565b60008160001904831182151516156130da576130da6130f6565b500290565b6000828210156130f1576130f16130f6565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461079b57600080fdfea2646970667358221220d5f9a2fc3435891b8de51e4b22f2b2d956d193de429fe194f9db36103cfe238c64736f6c63430008010033
Deployed Bytecode Sourcemap
18742:15699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25130:265;;;;;;;;;;-1:-1:-1;25130:265:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18852:39;;;;;;;;;;;;;:::i;19313:21::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20403:218::-;;;;;;;;;;-1:-1:-1;20403:218:0;;;;;:::i;:::-;;:::i;:::-;;19183:42;;;;;;;;;;-1:-1:-1;19183:42:0;;;;;:::i;:::-;;:::i;22403:204::-;;;;;;;;;;-1:-1:-1;22403:204:0;;;;;:::i;:::-;;:::i;21228:215::-;;;;;;;;;;-1:-1:-1;21228:215:0;;;;;:::i;:::-;;:::i;25900:277::-;;;;;;;;;;-1:-1:-1;25900:277:0;;;;;:::i;:::-;;:::i;25401:180::-;;;;;;;;;;-1:-1:-1;25401:180:0;;;;;:::i;:::-;;:::i;19024:77::-;;;;;;;;;;-1:-1:-1;19024:77:0;;;;;:::i;:::-;;:::i;25587:98::-;;;;;;;;;;;;;:::i;20782:208::-;;;;;;;;;;-1:-1:-1;20782:208:0;;;;;:::i;:::-;;:::i;21943:210::-;;;;;;;;;;-1:-1:-1;21943:210:0;;;;;:::i;:::-;;:::i;18959:60::-;;;;;;;;;;-1:-1:-1;18959:60:0;;;;;:::i;:::-;;:::i;19339:21::-;;;;;;;;;;;;;:::i;23819:283::-;;;;;;;;;;-1:-1:-1;23819:283:0;;;;;:::i;:::-;;:::i;20627:149::-;;;:::i;19230:42::-;;;;;;;;;;-1:-1:-1;19230:42:0;;;;;:::i;:::-;;:::i;22159:238::-;;;;;;;;;;-1:-1:-1;22159:238:0;;;;;:::i;:::-;;:::i;25691:203::-;;;;;;;;;;-1:-1:-1;25691:203:0;;;;;:::i;:::-;;:::i;24535:589::-;;;;;;;;;;-1:-1:-1;24535:589:0;;;;;:::i;:::-;;:::i;22964:497::-;;;;;;;;;;-1:-1:-1;22964:497:0;;;;;:::i;:::-;;:::i;24108:205::-;;;;;;;;;;-1:-1:-1;24108:205:0;;;;;:::i;:::-;;:::i;20996:226::-;;;;;;;;;;-1:-1:-1;20996:226:0;;;;;:::i;:::-;;:::i;19365:28::-;;;;;;;;;;;;;:::i;19106:55::-;;;;;;;;;;-1:-1:-1;19106:55:0;;;;;:::i;:::-;;:::i;24319:146::-;;;;;;;;;;-1:-1:-1;24319:146:0;;;;;:::i;:::-;;:::i;22805:153::-;;;;;;;;;;-1:-1:-1;22805:153:0;;;;;:::i;:::-;;:::i;23530:283::-;;;;;;;;;;-1:-1:-1;23530:283:0;;;;;:::i;:::-;;:::i;21449:214::-;;;;;;;;;;-1:-1:-1;21449:214:0;;;;;:::i;:::-;;:::i;19279:29::-;;;;;;;;;;;;;:::i;22613:186::-;;;;;;;;;;;;;:::i;19802:595::-;;;;;;;;;;-1:-1:-1;19802:595:0;;;;;:::i;:::-;;:::i;21669:268::-;;;;;;;;;;-1:-1:-1;21669:268:0;;;;;:::i;:::-;;:::i;25130:265::-;25215:4;25228:22;25243:6;25228:14;:22::i;:::-;-1:-1:-1;;;;;25289:15:0;;;25257:16;25289:15;;;:7;:15;;;;;;;;;:35;;-1:-1:-1;;;25289:35:0;;25257:16;;25276:67;;25289:15;;;:25;;:35;;25315:8;;25289:35;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25326:6;25334:8;25276:12;:67::i;:::-;25257:86;;25383:6;25371:9;:7;:9::i;:::-;25357:23;;:11;:23;:::i;:::-;:32;;;;:::i;:::-;25350:39;25130:265;-1:-1:-1;;;;25130:265:0:o;18852:39::-;18887:4;18852:39;:::o;19313:21::-;;;-1:-1:-1;;;;;19313:21:0;;:::o;20403:218::-;20469:22;20484:6;20469:14;:22::i;:::-;20498:25;20512:10;20498:13;:25::i;:::-;20532:30;20546:6;20554:7;20532:13;:30::i;:::-;20569:46;20587:6;20595:10;20607:7;20569:17;:46::i;:::-;20403:218;;:::o;19183:42::-;;;;;;;;;;;;;:::o;22403:204::-;22462:22;22477:6;22462:14;:22::i;:::-;22491:25;22505:10;22491:13;:25::i;:::-;22525:23;22532:6;22540:7;22525:6;:23::i;21228:215::-;21283:25;21297:10;21283:13;:25::i;:::-;21317:39;17998:42;21348:7;21317:15;:39::i;:::-;21363:36;21379:10;21391:7;21363:15;:36::i;:::-;21406:31;17998:42;21406:16;:31::i;:::-;21228:215;:::o;25900:277::-;26028:4;26043:26;26058:10;26043:14;:26::i;:::-;26076:24;26091:8;26076:14;:24::i;:::-;26116:55;26136:10;26148:8;26158:12;26116:19;:55::i;:::-;26109:62;;25900:277;;;;;;:::o;25401:180::-;25486:4;25499:22;25514:6;25499:14;:22::i;:::-;25535:40;25558:6;25566:8;25535:22;:40::i;19024:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25587:98::-;25654:10;;:25;;;-1:-1:-1;;;25654:25:0;;;;25631:7;;-1:-1:-1;;;;;25654:10:0;;:23;;:25;;;;;;;;;;;;;;:10;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25647:32;;25587:98;:::o;20782:208::-;20843:22;20858:6;20843:14;:22::i;:::-;20872:25;20886:10;20872:13;:25::i;:::-;20906;20915:6;20923:7;20906:8;:25::i;21943:210::-;22003:22;22018:6;22003:14;:22::i;:::-;22032:25;22046:10;22032:13;:25::i;:::-;22066:24;22074:6;22082:7;22066;:24::i;:::-;22097:50;22118:6;22127:10;22139:7;22097:13;:50::i;18959:60::-;;;;;;;;;;;;;;;;;;;;;;:::o;19339:21::-;;;-1:-1:-1;;;;;19339:21:0;;:::o;23819:283::-;23946:4;23961:30;23976:14;23961;:30::i;:::-;23998:28;24013:12;23998:14;:28::i;:::-;24042:54;24057:8;24067:14;24083:12;24042:14;:54::i;20627:149::-;20676:25;20690:10;20676:13;:25::i;:::-;20710:39;17998:42;20739:9;20710:13;:39::i;:::-;20756:14;:12;:14::i;:::-;20627:149::o;19230:42::-;;;;;;;;;;;;-1:-1:-1;;;;;19230:42:0;;:::o;22159:238::-;22207:22;22222:6;22207:14;:22::i;:::-;22236:25;22250:10;22236:13;:25::i;:::-;-1:-1:-1;;;;;22284:14:0;;22270:11;22284:14;;;;;;;;;;;22299:10;22284:26;;;;;;;;22317:22;22291:6;22284:26;22317:6;:22::i;25691:203::-;25757:11;25771:23;25785:8;25771:13;:23::i;:::-;25757:37;;25819:10;;;;;;;;;-1:-1:-1;;;;;25819:10:0;-1:-1:-1;;;;;25819:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25809:6;:35;;25801:87;;;;-1:-1:-1;;;25801:87:0;;;;;;;:::i;:::-;;;;;;;;24535:589;24595:32;24618:8;24595:22;:32::i;:::-;24634:34;24657:10;24634:22;:34::i;:::-;24675:38;24698:14;:12;:14::i;:::-;24675:22;:38::i;:::-;24722:11;24736:23;24750:8;24736:13;:23::i;:::-;24722:37;;24783:10;;;;;;;;;-1:-1:-1;;;;;24783:10:0;-1:-1:-1;;;;;24783:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24774:6;:34;24766:89;;;;-1:-1:-1;;;24766:89:0;;;;;;;:::i;:::-;24929:6;;24937;;24865:16;;;;24903:41;;24919:8;;-1:-1:-1;;;;;24929:6:0;;;;24937;24903:15;:41::i;:::-;25016:6;;25024;;24864:80;;-1:-1:-1;24864:80:0;;-1:-1:-1;24952:16:0;;;;24990:41;;25006:8;;-1:-1:-1;;;;;25016:6:0;;;;25024;24990:15;:41::i;:::-;24951:80;;;;25057:8;-1:-1:-1;;;;;25045:73:0;;25067:11;25080;25093;25106;25045:73;;;;;;;;;:::i;:::-;;;;;;;;24535:589;;;;;;:::o;22964:497::-;23051:6;;-1:-1:-1;;;;;23051:6:0;;;23025:4;23044:14;;;;;;;;;;;:24;;;;;;;;;;;;:29;:62;;;;-1:-1:-1;23084:6:0;;-1:-1:-1;;;;;23084:6:0;;;23077;:14;;;;;;;;;;;:24;;;;;;;;;;:29;23044:62;23040:117;;;23124:10;;;;;;;;;-1:-1:-1;;;;;23124:10:0;-1:-1:-1;;;;;23124:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23117:32;;;;23040:117;23260:6;;23268;;23165:23;;23235:40;;23250:8;;-1:-1:-1;;;;;23260:6:0;;;;23268;23235:14;:40::i;:::-;23217:6;;23192:40;;23207:8;;-1:-1:-1;;;;;23217:6:0;;23192:14;:40::i;:::-;:83;;;;:::i;:::-;23377:6;;23385;;23165:110;;-1:-1:-1;23282:24:0;;23352:40;;23367:8;;-1:-1:-1;;;;;23377:6:0;;;;23385;23352:14;:40::i;:::-;23334:6;;23309:40;;23324:8;;-1:-1:-1;;;;;23334:6:0;;23309:14;:40::i;:::-;:83;;;;:::i;:::-;23282:110;-1:-1:-1;23282:110:0;23408:25;:18;23429:4;23408:25;:::i;:::-;:47;;;;:::i;:::-;23401:54;;;;22964:497;;;;:::o;24108:205::-;24172:4;24185:22;24200:6;24185:14;:22::i;:::-;24221:10;;;;;;;;;-1:-1:-1;;;;;24221:10:0;-1:-1:-1;;;;;24221:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24221:49:0;;24292:4;24300:6;24221:86;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24214:93;24108:205;-1:-1:-1;;24108:205:0:o;20996:226::-;21064:22;21079:6;21064:14;:22::i;:::-;21093:25;21107:10;21093:13;:25::i;:::-;21127:32;21143:6;21151:7;21127:15;:32::i;19365:28::-;;;;:::o;19106:55::-;;;;;;;;;;;;;:::o;24319:146::-;24383:4;24396:22;24411:6;24396:14;:22::i;:::-;24432:27;24452:6;24432:19;:27::i;22805:153::-;22860:8;:6;:8::i;:::-;22875:38;22898:14;:12;:14::i;22875:38::-;22920:32;22943:8;22920:22;:32::i;23530:283::-;23657:4;23672:30;23687:14;23672;:30::i;:::-;23709:28;23724:12;23709:14;:28::i;:::-;23753:54;23768:8;23778:14;23794:12;23753:14;:54::i;21449:214::-;21511:22;21526:6;21511:14;:22::i;:::-;21540:25;21554:10;21540:13;:25::i;:::-;21574:26;21584:6;21592:7;21574:9;:26::i;19279:29::-;;;-1:-1:-1;;;;;19279:29:0;;:::o;22613:186::-;22668:12;22649:16;;:31;22645:149;;;22707:6;;22691:23;;-1:-1:-1;;;;;22707:6:0;22691:15;:23::i;:::-;22739:6;;22723:23;;-1:-1:-1;;;;;22739:6:0;22723:15;:23::i;:::-;22774:12;22755:16;:31;22613:186::o;19802:595::-;19954:6;;-1:-1:-1;;;;;19954:6:0;19946:29;19938:74;;;;-1:-1:-1;;;19938:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20027:30:0;;;;;;:64;;-1:-1:-1;;;;;;20061:30:0;;;;20027:64;20019:112;;;;-1:-1:-1;;;20019:112:0;;;;;;;:::i;:::-;20140:10;:37;;-1:-1:-1;;;;;20140:37:0;;;-1:-1:-1;;;;;;20140:37:0;;;;;;;20184:6;:25;;;;;;;;;;;20216:6;:25;;;;;;;;;;;;;;;20267:12;20248:16;:31;20306:30;20321:14;20306;:30::i;:::-;20296:6;;-1:-1:-1;;;;;20296:6:0;;;20288:15;;;;:7;:15;;;;;:48;;-1:-1:-1;;;;;;20288:48:0;;;;;;;;;;;20361:30;20376:14;20361;:30::i;:::-;20351:6;;-1:-1:-1;;;;;20351:6:0;;;20343:15;;;;:7;:15;;;;;:48;;-1:-1:-1;;;;;;20343:48:0;;;;;;;;;;;-1:-1:-1;;;;19802:595:0:o;21669:268::-;21720:22;21735:6;21720:14;:22::i;:::-;21749:25;21763:10;21749:13;:25::i;:::-;-1:-1:-1;;;;;21797:24:0;;;21783:11;21797:24;;;:7;:24;;;;;;;;;:46;;-1:-1:-1;;;21797:46:0;;21783:11;;21797:24;;:34;;:46;;21832:10;;21797:46;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21783:60;;21850:25;21860:6;21868;21850:9;:25::i;33197:142::-;33276:6;;-1:-1:-1;;;;;33266:16:0;;;33276:6;;33266:16;;:36;;-1:-1:-1;33296:6:0;;-1:-1:-1;;;;;33286:16:0;;;33296:6;;33286:16;33266:36;33258:75;;;;-1:-1:-1;;;33258:75:0;;;;;;;:::i;34223:215::-;-1:-1:-1;;;;;34381:31:0;;;34316:4;34381:31;;;:23;:31;;;;;;;;:41;;;;;;;;;;;;34348:30;;;:22;:30;;;;;;34426:6;;34348:74;;;:::i;:::-;34336:87;;:8;:87;:::i;:::-;:96;;;;:::i;34128:89::-;34169:4;34198:13;:11;:13::i;:::-;34189:22;;:6;:22;:::i;26183:375::-;-1:-1:-1;;;;;26266:14:0;;26254:9;26266:14;;;;;;;;;;;26281:10;26266:26;;;;;;;;;26318:14;;;:31;;26345:4;26318:31;;;26335:7;26318:31;26299:50;-1:-1:-1;26362:15:0;;26358:65;;26388:27;26395:6;26403:11;26388:6;:27::i;:::-;26431:18;26452:21;26462:11;26452:7;:21;:::i;:::-;26431:42;-1:-1:-1;26486:17:0;;26482:71;;26514:31;26523:6;26531:13;26514:8;:31::i;:::-;26183:375;;;;;:::o;18048:229::-;18146:60;;-1:-1:-1;;;18146:60:0;;-1:-1:-1;;;;;18146:27:0;;;;;:60;;18174:7;;18191:4;;18198:7;;18146:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18231:1;18221:7;:11;18213:58;;;;-1:-1:-1;;;18213:58:0;;;;;;;:::i;:::-;18048:229;;;:::o;30498:142::-;30560:38;30570:6;30578:10;30590:7;30560:9;:38::i;:::-;30618:6;-1:-1:-1;;;;;30612:22:0;;30626:7;30612:22;;;;;;:::i;:::-;;;;;;;;30498:142;;:::o;26564:423::-;-1:-1:-1;;;;;26657:15:0;;;26637:17;26657:15;;;:7;:15;;;;;;;;;:37;;-1:-1:-1;;;26657:37:0;;26637:17;;26657:15;;:25;;:37;;26683:10;;26657:37;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26637:57;;26701:19;26738:7;26723:12;:22;:47;;26758:12;26723:47;;;26748:7;26723:47;26701:69;-1:-1:-1;26783:18:0;;26779:74;;26812:33;26822:6;26830:14;26812:9;:33::i;:::-;26861:17;26881:24;26891:14;26881:7;:24;:::i;:::-;26861:44;-1:-1:-1;26918:16:0;;26914:68;;26945:29;26953:6;26961:12;26945:7;:29::i;31658:200::-;31739:11;;31735:118;;31761:44;31792:3;31797:7;31761:30;:44::i;:::-;31814:31;17998:42;33501:166;33572:39;;-1:-1:-1;;;33572:39:0;;18887:4;;-1:-1:-1;;;;;33572:24:0;;;;;:39;;33605:4;;33572:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;33564:97;;;;-1:-1:-1;;;33564:97:0;;;;;;;:::i;32794:397::-;32925:4;32940:14;33013:10;-1:-1:-1;;;;;33006:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33000:35;;:2;:35;:::i;:::-;32957:10;;:33;;-1:-1:-1;;;32957:33:0;;-1:-1:-1;;;;;32957:10:0;;;;:21;;:33;;32979:10;;32957:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;32993:4;32957:40;:::i;:::-;:78;;;;:::i;:::-;32940:95;;33042:12;33115:8;-1:-1:-1;;;;;33108:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33102:33;;:2;:33;:::i;:::-;33059:10;;:31;;-1:-1:-1;;;33059:31:0;;-1:-1:-1;;;;;33059:10:0;;;;:21;;:31;;33081:8;;33059:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;33095:4;33059:40;:::i;:::-;:76;;;;:::i;:::-;33042:93;-1:-1:-1;33042:93:0;33151:24;33166:9;33151:12;:24;:::i;:::-;:34;;;;:::i;:::-;33144:41;32794:397;-1:-1:-1;;;;;;32794:397:0:o;32049:170::-;-1:-1:-1;;;;;32170:14:0;;;32137:4;32170:14;;;;;;;;;;;:24;;;;;;;;;;;;32157:56;;32177:6;32185:8;32157:12;:56::i;30646:357::-;30732:6;;30712:27;;-1:-1:-1;;;;;30732:6:0;30712:19;:27::i;:::-;30766:6;;30746:27;;-1:-1:-1;;;;;30766:6:0;30746:19;:27::i;:::-;30780:35;30799:6;30807:7;30780:18;:35::i;:::-;-1:-1:-1;;;;;30832:14:0;;:6;:14;;;;;;;;;;;30847:10;30832:26;;;;;;;;:31;30824:86;;;;-1:-1:-1;;;30824:86:0;;;;;;;:::i;:::-;30919:40;30931:6;30939:10;30951:7;30919:11;:40::i;:::-;30981:6;-1:-1:-1;;;;;30973:24:0;;30989:7;30973:24;;;;;;:::i;30193:299::-;-1:-1:-1;;;;;30266:24:0;;;;;;;:7;:24;;;;;;;;;;:46;;-1:-1:-1;;;30266:46:0;;:24;;;;;:34;;:46;;30301:10;;30266:46;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;30258:105;;;;-1:-1:-1;;;30258:105:0;;;;;;;:::i;:::-;30372:38;30382:6;30390:10;30402:7;30372:9;:38::i;:::-;30419:30;30438:10;30419:18;:30::i;:::-;30470:6;-1:-1:-1;;;;;30463:23:0;;30478:7;30463:23;;;;;;:::i;31447:205::-;31539:11;;31535:112;;31561:36;;-1:-1:-1;;;31561:36:0;;-1:-1:-1;;;;;31561:15:0;;;;;:36;;31577:10;;31589:7;;31561:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31606:33;31631:6;31606:16;:33::i;32536:252::-;-1:-1:-1;;;;;32738:23:0;;;32666:4;32738:23;;;:7;:23;;;;;;;;;:43;;-1:-1:-1;;;32738:43:0;;32666:4;;32688:94;;32708:14;;32724:12;;32738:23;;;;:33;;:43;;32772:8;;32738:43;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32688:19;:94::i;18587:148::-;18647:1;18635:9;:13;18627:60;;;;-1:-1:-1;;;18627:60:0;;;;;;;:::i;:::-;17998:42;-1:-1:-1;;;;;18694:12:0;;18716:9;18694:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28728:551;28820:6;;-1:-1:-1;;;;;28820:6:0;;;28794:15;28812;;;:7;:15;;;;;;;;;:35;;-1:-1:-1;;;28812:35:0;;28794:15;;28812;;:25;;:35;;28838:8;;28812:35;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28880:6;;-1:-1:-1;;;;;28880:6:0;;;28854:15;28872;;;:7;:15;;;;;;;;;:35;;-1:-1:-1;;;28872:35:0;;28794:53;;-1:-1:-1;28854:15:0;;28872;;;;;:25;;:35;;28898:8;;28872:35;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28937:6;;28854:53;;-1:-1:-1;28916:50:0;;-1:-1:-1;;;;;28937:6:0;28945:10;28957:8;28916:20;:50::i;:::-;28994:6;;28973:50;;-1:-1:-1;;;;;28994:6:0;29002:10;29014:8;28973:20;:50::i;:::-;29049:6;;29030:36;;-1:-1:-1;;;;;29049:6:0;29057:8;29030:18;:36::i;:::-;29092:6;;29073:36;;-1:-1:-1;;;;;29092:6:0;29100:8;29073:18;:36::i;:::-;-1:-1:-1;;29185:6:0;;-1:-1:-1;;;;;29185:6:0;;;29162:30;;;;:22;:30;;;;;;;;;29185:6;29118:31;;;;;;:41;;;;;;;;;;;;:74;;;;29266:6;;;;;29243:30;;;;;;;;;29199:31;;;;;;:41;;;;;;;;;;;:74;28728:551::o;27661:1061::-;-1:-1:-1;;;;;27828:21:0;;;27785:4;27828:21;;;:7;:21;;;;;;;;;:41;;-1:-1:-1;;;27828:41:0;;27785:4;;;;;;27828:21;;;;;:31;;:41;;27860:8;;27828:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27898:20:0;;;27876:16;27898:20;;;;;;;;;;;:30;;;;;;;;;;;;27806:63;;-1:-1:-1;27957:60:0;27905:12;27991;27898:30;27957:19;:60::i;:::-;27935:82;;28024:19;28100:6;28072:10;;;;;;;;;-1:-1:-1;;;;;28072:10:0;-1:-1:-1;;;;;28072:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28059:38;;:10;:38;:::i;:::-;:47;;;;:::i;:::-;28046:60;;:10;:60;:::i;:::-;28024:82;;28115:15;28150:13;28133:14;:30;:63;;28182:14;28133:63;;;28166:13;28133:63;28115:81;;28205:24;28264:10;;;;;;;;;-1:-1:-1;;;;;28264:10:0;-1:-1:-1;;;;;28264:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28255:34;;:6;:34;:::i;:::-;28232:19;:10;28245:6;28232:19;:::i;:::-;:58;;;;:::i;:::-;28205:85;;28297:14;28364:6;28336:10;;;;;;;;;-1:-1:-1;;;;;28336:10:0;-1:-1:-1;;;;;28336:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28314:47;;:19;:47;:::i;:::-;:56;;;;:::i;:::-;28297:73;;28377:14;28444:6;28416:10;;;;;;;;;-1:-1:-1;;;;;28416:10:0;-1:-1:-1;;;;;28416:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28394:47;;:19;:47;:::i;:::-;:56;;;;:::i;:::-;28377:73;;28459:47;28471:12;28485:8;28495:10;28459:11;:47::i;:::-;28513:48;28525:12;28539:10;28551:9;28513:11;:48::i;:::-;28568:52;28580:12;28594:14;:12;:14::i;:::-;28610:9;28568:11;:52::i;:::-;28629:46;28639:12;28653:8;28663:11;28629:9;:46::i;:::-;-1:-1:-1;28692:10:0;;28704:11;;-1:-1:-1;27661:1061:0;;-1:-1:-1;;;;;;;;;27661:1061:0:o;32225:241::-;-1:-1:-1;;;;;32427:22:0;;;32355:4;32427:22;;;;;;;;;;;:32;;;;;;;;;;;;32377:83;;32397:14;;32413:12;;32377:19;:83::i;31864:179::-;31951:10;;:30;;;-1:-1:-1;;;31951:30:0;;;;31931:4;;-1:-1:-1;;;;;31951:10:0;;:28;;:30;;;;;;;;;;;;;;:10;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31951:49:0;;32022:4;32030:6;31951:86;;;;;;;;;;;;;;;;:::i;29986:201::-;-1:-1:-1;;;;;30053:24:0;;;;;;;:7;:24;;;;;;;;;;:50;;-1:-1:-1;;;30053:50:0;;:24;;;;;:29;;:50;;30083:10;;30095:7;;30053:50;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30112:30;30131:10;30112:18;:30::i;:::-;30165:6;-1:-1:-1;;;;;30156:25:0;;30173:7;30156:25;;;;;;:::i;31009:236::-;31066:18;31102:16;;31087:12;:31;;;;:::i;:::-;31066:52;;31125:16;31174:13;31144:27;31164:6;31144:19;:27::i;:::-;:43;;;;:::i;:::-;-1:-1:-1;;;;;31194:30:0;;;;;;:22;:30;;;;;:45;;31125:62;;-1:-1:-1;31125:62:0;;31194:30;;;:45;;31125:62;;31194:45;:::i;:::-;;;;-1:-1:-1;;;;;31009:236:0:o;31251:190::-;31316:6;31331:17;31358:22;:14;-1:-1:-1;;;;;31358:20:0;;:22::i;:::-;31331:50;;31388:10;-1:-1:-1;;;;;31388:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31425:10:0;;31251:190;-1:-1:-1;;;;;31251:190:0:o;33981:141::-;34046:10;;:30;;;-1:-1:-1;;;34046:30:0;;;;34026:4;;-1:-1:-1;;;;;34046:10:0;;:28;;:30;;;;;;;;;;;;;;:10;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34046:41:0;;34109:4;34046:70;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27496:159::-;-1:-1:-1;;;;;27579:14:0;;;:6;:14;;;;;;;;;;;:24;;;;;;;;;;;:35;;27607:7;;27579:6;:35;;27607:7;;27579:35;:::i;:::-;;;;-1:-1:-1;;;;;;;27621:17:0;;;;;;:9;:17;;;;;:28;;27642:7;;27621:17;:28;;27642:7;;27621:28;:::i;18283:298::-;18377:1;18367:7;:11;18359:58;;;;-1:-1:-1;;;18359:58:0;;;;;;;:::i;:::-;18424:22;;-1:-1:-1;;;18424:22:0;;17998:42;;18424:13;;:22;;18438:7;;18424:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18500:12:0;;;18454;18500;;;;;;;;;;18454;-1:-1:-1;;;;;;18472:8:0;;;-1:-1:-1;18490:7:0;;18472:41;;18500:12;18472:41;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18453:60;;;18528:7;18520:55;;;;-1:-1:-1;;;18520:55:0;;;;;;;:::i;33345:150::-;33419:10;;:33;;-1:-1:-1;;;33419:33:0;;-1:-1:-1;;;;;33419:10:0;;;;:25;;:33;;33445:6;;33419:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33411:78;;;;-1:-1:-1;;;33411:78:0;;;;;;;:::i;33673:302::-;33772:10;;:46;;-1:-1:-1;;;33772:46:0;;33752:17;;-1:-1:-1;;;;;33772:10:0;;:23;;:46;;33804:4;;33811:6;;33772:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33752:66;-1:-1:-1;33831:16:0;;33827:143;;-1:-1:-1;;;;;33867:15:0;;;;;;;:7;:15;;;;;;;;;;:29;;-1:-1:-1;;;33867:29:0;;;;33911:12;;33899:7;;33867:15;;;:27;;:29;;;;:15;;:29;;;;;;;:15;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;:::i;:::-;33866:57;;33858:104;;;;-1:-1:-1;;;33858:104:0;;;;;;;:::i;26993:163::-;27082:11;;27078:73;;-1:-1:-1;;;;;27104:15:0;;;;;;;:7;:15;;;;;;;;;;:39;;-1:-1:-1;;;27104:39:0;;:15;;;;;:20;;:39;;27125:8;;27135:7;;27104:39;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26993:163;;;:::o;27331:159::-;-1:-1:-1;;;;;27414:14:0;;;:6;:14;;;;;;;;;;;:24;;;;;;;;;;;:35;;27442:7;;27414:6;:35;;27442:7;;27414:35;:::i;:::-;;;;-1:-1:-1;;;;;;;27456:17:0;;;;;;:9;:17;;;;;:28;;27477:7;;27456:17;:28;;27477:7;;27456:28;:::i;29285:455::-;29383:11;;29379:356;;29405:19;29429:39;29442:7;29451:6;29459:8;29429:12;:39::i;:::-;29405:63;;29477:21;29530:6;29518:9;:7;:9::i;:::-;29501:26;;:14;:26;:::i;:::-;:35;;;;:::i;:::-;29477:59;;29545:20;29602:6;29586:13;:11;:13::i;:::-;29569:30;;:14;:30;:::i;:::-;:39;;;;:::i;:::-;29545:63;;29619:47;29631:6;29639:8;29649:16;29619:11;:47::i;:::-;29675:52;29687:6;29695:14;:12;:14::i;:::-;29711:15;29675:11;:52::i;:::-;29379:356;;;29285:455;;;:::o;29746:234::-;-1:-1:-1;;;;;29828:14:0;;;29855:1;29828:14;;;;;;;;;;;:24;;;;;;;;;;:28;29824:151;;29867:12;29882:40;29905:6;29913:8;29882:22;:40::i;:::-;29867:55;;29931:36;29941:6;29949:8;29959:7;29931:9;:36::i;27162:163::-;27251:11;;27247:73;;-1:-1:-1;;;;;27273:15:0;;;;;;;:7;:15;;;;;;;;;;:39;;-1:-1:-1;;;27273:39:0;;:15;;;;;:20;;:39;;27294:8;;27304:7;;27273:39;;:::i;12467:565::-;12516:16;12643:4;12637:11;-1:-1:-1;;;12669:3:0;12662:79;12788:6;12782:4;12778:17;12771:4;12766:3;12762:14;12755:41;-1:-1:-1;;;12826:4:0;12821:3;12817:14;12810:90;12941:4;12936:3;12933:1;12926:20;12914:32;-1:-1:-1;;;;;;;12975:22:0;;12967:57;;;;-1:-1:-1;;;12967:57:0;;;;;;;:::i;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:1;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:545::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:1;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1359:7;-1:-1:-1;1418:2:1;1403:18;;1390:32;1431:35;1390:32;1431:35;:::i;:::-;1485:7;1475:17;;;1057:441;;;;;:::o;1503:715::-;;;;;1692:3;1680:9;1671:7;1667:23;1663:33;1660:2;;;1714:6;1706;1699:22;1660:2;1758:9;1745:23;1777:33;1804:5;1777:33;:::i;:::-;1829:5;-1:-1:-1;1886:2:1;1871:18;;1858:32;1899:35;1858:32;1899:35;:::i;:::-;1953:7;-1:-1:-1;2012:2:1;1997:18;;1984:32;2025:35;1984:32;2025:35;:::i;:::-;2079:7;-1:-1:-1;2138:2:1;2123:18;;2110:32;2151:35;2110:32;2151:35;:::i;:::-;1650:568;;;;-1:-1:-1;1650:568:1;;-1:-1:-1;;1650:568:1:o;2223:470::-;;;;2369:2;2357:9;2348:7;2344:23;2340:32;2337:2;;;2390:6;2382;2375:22;2337:2;2434:9;2421:23;2453:33;2480:5;2453:33;:::i;:::-;2505:5;-1:-1:-1;2562:2:1;2547:18;;2534:32;2575:35;2534:32;2575:35;:::i;:::-;2327:366;;2629:7;;-1:-1:-1;;;2683:2:1;2668:18;;;;2655:32;;2327:366::o;2698:327::-;;;2827:2;2815:9;2806:7;2802:23;2798:32;2795:2;;;2848:6;2840;2833:22;2795:2;2892:9;2879:23;2911:33;2938:5;2911:33;:::i;:::-;2963:5;3015:2;3000:18;;;;2987:32;;-1:-1:-1;;;2785:240:1:o;3030:297::-;;3150:2;3138:9;3129:7;3125:23;3121:32;3118:2;;;3171:6;3163;3156:22;3118:2;3208:9;3202:16;3261:5;3254:13;3247:21;3240:5;3237:32;3227:2;;3288:6;3280;3273:22;3626:190;;3738:2;3726:9;3717:7;3713:23;3709:32;3706:2;;;3759:6;3751;3744:22;3706:2;-1:-1:-1;3787:23:1;;3696:120;-1:-1:-1;3696:120:1:o;3821:194::-;;3944:2;3932:9;3923:7;3919:23;3915:32;3912:2;;;3965:6;3957;3950:22;3912:2;-1:-1:-1;3993:16:1;;3902:113;-1:-1:-1;3902:113:1:o;4020:430::-;;4187:6;4181:13;4212:3;4224:129;4238:6;4235:1;4232:13;4224:129;;;4336:4;4320:14;;;4316:25;;4310:32;4297:11;;;4290:53;4253:12;4224:129;;;4371:6;4368:1;4365:13;4362:2;;;4406:3;4397:6;4392:3;4388:16;4381:29;4362:2;-1:-1:-1;4428:16:1;;;;;4157:293;-1:-1:-1;;4157:293:1:o;4455:203::-;-1:-1:-1;;;;;4619:32:1;;;;4601:51;;4589:2;4574:18;;4556:102::o;4663:304::-;-1:-1:-1;;;;;4893:15:1;;;4875:34;;4945:15;;4940:2;4925:18;;4918:43;4825:2;4810:18;;4792:175::o;4972:375::-;-1:-1:-1;;;;;5230:15:1;;;5212:34;;5282:15;;;;5277:2;5262:18;;5255:43;5329:2;5314:18;;5307:34;;;;5162:2;5147:18;;5129:218::o;5352:274::-;-1:-1:-1;;;;;5544:32:1;;;;5526:51;;5608:2;5593:18;;5586:34;5514:2;5499:18;;5481:145::o;6636:406::-;6838:2;6820:21;;;6877:2;6857:18;;;6850:30;6916:34;6911:2;6896:18;;6889:62;-1:-1:-1;;;6982:2:1;6967:18;;6960:40;7032:3;7017:19;;6810:232::o;7047:398::-;7249:2;7231:21;;;7288:2;7268:18;;;7261:30;7327:34;7322:2;7307:18;;7300:62;-1:-1:-1;;;7393:2:1;7378:18;;7371:32;7435:3;7420:19;;7221:224::o;7450:354::-;7652:2;7634:21;;;7691:2;7671:18;;;7664:30;7730:32;7725:2;7710:18;;7703:60;7795:2;7780:18;;7624:180::o;7809:346::-;8011:2;7993:21;;;8050:2;8030:18;;;8023:30;-1:-1:-1;;;8084:2:1;8069:18;;8062:52;8146:2;8131:18;;7983:172::o;8160:399::-;8362:2;8344:21;;;8401:2;8381:18;;;8374:30;8440:34;8435:2;8420:18;;8413:62;-1:-1:-1;;;8506:2:1;8491:18;;8484:33;8549:3;8534:19;;8334:225::o;8564:350::-;8766:2;8748:21;;;8805:2;8785:18;;;8778:30;8844:28;8839:2;8824:18;;8817:56;8905:2;8890:18;;8738:176::o;8919:405::-;9121:2;9103:21;;;9160:2;9140:18;;;9133:30;9199:34;9194:2;9179:18;;9172:62;-1:-1:-1;;;9265:2:1;9250:18;;9243:39;9314:3;9299:19;;9093:231::o;9329:356::-;9531:2;9513:21;;;9550:18;;;9543:30;9609:34;9604:2;9589:18;;9582:62;9676:2;9661:18;;9503:182::o;9690:406::-;9892:2;9874:21;;;9931:2;9911:18;;;9904:30;9970:34;9965:2;9950:18;;9943:62;-1:-1:-1;;;10036:2:1;10021:18;;10014:40;10086:3;10071:19;;9864:232::o;10101:398::-;10303:2;10285:21;;;10342:2;10322:18;;;10315:30;10381:34;10376:2;10361:18;;10354:62;-1:-1:-1;;;10447:2:1;10432:18;;10425:32;10489:3;10474:19;;10275:224::o;10504:399::-;10706:2;10688:21;;;10745:2;10725:18;;;10718:30;10784:34;10779:2;10764:18;;10757:62;-1:-1:-1;;;10850:2:1;10835:18;;10828:33;10893:3;10878:19;;10678:225::o;10908:403::-;11110:2;11092:21;;;11149:2;11129:18;;;11122:30;11188:34;11183:2;11168:18;;11161:62;-1:-1:-1;;;11254:2:1;11239:18;;11232:37;11301:3;11286:19;;11082:229::o;11316:356::-;11518:2;11500:21;;;11537:18;;;11530:30;11596:34;11591:2;11576:18;;11569:62;11663:2;11648:18;;11490:182::o;11677:177::-;11823:25;;;11811:2;11796:18;;11778:76::o;11859:391::-;12090:25;;;12146:2;12131:18;;12124:34;;;;12189:2;12174:18;;12167:34;12232:2;12217:18;;12210:34;12077:3;12062:19;;12044:206::o;12255:128::-;;12326:1;12322:6;12319:1;12316:13;12313:2;;;12332:18;;:::i;:::-;-1:-1:-1;12368:9:1;;12303:80::o;12388:217::-;;12454:1;12444:2;;-1:-1:-1;;;12479:31:1;;12533:4;12530:1;12523:15;12561:4;12486:1;12551:15;12444:2;-1:-1:-1;12590:9:1;;12434:171::o;12610:453::-;12706:6;12729:5;12743:314;12792:1;12829:2;12819:8;12816:16;12806:2;;12836:5;;;12806:2;12877:4;12872:3;12868:14;12862:4;12859:24;12856:2;;;12886:18;;:::i;:::-;12936:2;12926:8;12922:17;12919:2;;;12951:16;;;;12919:2;13030:17;;;;;12990:15;;12743:314;;;12687:376;;;;;;;:::o;13068:139::-;;13157:44;-1:-1:-1;;13184:8:1;13178:4;13212:922;13296:8;13286:2;;-1:-1:-1;13337:1:1;13351:5;;13286:2;13385:4;13375:2;;-1:-1:-1;13422:1:1;13436:5;;13375:2;13467:4;13485:1;13480:59;;;;13553:1;13548:183;;;;13460:271;;13480:59;13510:1;13501:10;;13524:5;;;13548:183;13585:3;13575:8;13572:17;13569:2;;;13592:18;;:::i;:::-;13648:1;13638:8;13634:16;13625:25;;13676:3;13669:5;13666:14;13663:2;;;13683:18;;:::i;:::-;13716:5;;;13460:271;;13815:2;13805:8;13802:16;13796:3;13790:4;13787:13;13783:36;13777:2;13767:8;13764:16;13759:2;13753:4;13750:12;13746:35;13743:77;13740:2;;;-1:-1:-1;13852:19:1;;;13887:14;;;13884:2;;;13904:18;;:::i;:::-;13937:5;;13740:2;13984:42;14022:3;14012:8;14006:4;14003:1;13984:42;:::i;:::-;14059:6;14054:3;14050:16;14041:7;14038:29;14035:2;;;14070:18;;:::i;:::-;14108:20;;13276:858;-1:-1:-1;;;;13276:858:1:o;14139:168::-;;14245:1;14241;14237:6;14233:14;14230:1;14227:21;14222:1;14215:9;14208:17;14204:45;14201:2;;;14252:18;;:::i;:::-;-1:-1:-1;14292:9:1;;14191:116::o;14312:125::-;;14380:1;14377;14374:8;14371:2;;;14385:18;;:::i;:::-;-1:-1:-1;14422:9:1;;14361:76::o;14442:127::-;14503:10;14498:3;14494:20;14491:1;14484:31;14534:4;14531:1;14524:15;14558:4;14555:1;14548:15;14574:133;-1:-1:-1;;;;;14651:31:1;;14641:42;;14631:2;;14697:1;14694;14687:12
Swarm Source
ipfs://d5f9a2fc3435891b8de51e4b22f2b2d956d193de429fe194f9db36103cfe238c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.