Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12678528 | 1145 days ago | IN | 0 ETH | 0.08509648 |
Loading...
Loading
Contract Name:
BzxLiquidateV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-21 */ pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; /// SPDX-License-Identifier: MIT /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IBZx { function underlyingToLoanPool(address underlying) external returns (address loanPool); function swapsImpl() external returns (address); function setupLoanParams(LoanParams[] calldata loanParamsList) external returns (bytes32[] memory loanParamsIdList); function disableLoanParams(bytes32[] calldata loanParamsIdList) external; function getLoanParams(bytes32[] calldata loanParamsIdList) external view returns (LoanParams[] memory loanParamsList); function getLoanParamsList( address owner, uint256 start, uint256 count ) external view returns (bytes32[] memory loanParamsList); function getTotalPrincipal(address lender, address loanToken) external view returns (uint256); function borrowOrTradeFromPool( bytes32 loanParamsId, bytes32 loanId, bool isTorqueLoan, uint256 initialMargin, address[4] calldata sentAddresses, uint256[5] calldata sentValues, bytes calldata loanDataBytes ) external payable returns (LoanOpenData memory); function setDelegatedManager( bytes32 loanId, address delegated, bool toggle ) external; function getEstimatedMarginExposure( address loanToken, address collateralToken, uint256 loanTokenSent, uint256 collateralTokenSent, uint256 interestRate, uint256 newPrincipal ) external view returns (uint256); function getRequiredCollateral( address loanToken, address collateralToken, uint256 newPrincipal, uint256 marginAmount, bool isTorqueLoan ) external view returns (uint256 collateralAmountRequired); function getRequiredCollateralByParams( bytes32 loanParamsId, uint256 newPrincipal ) external view returns (uint256 collateralAmountRequired); function getBorrowAmount( address loanToken, address collateralToken, uint256 collateralTokenAmount, uint256 marginAmount, bool isTorqueLoan ) external view returns (uint256 borrowAmount); function getBorrowAmountByParams( bytes32 loanParamsId, uint256 collateralTokenAmount ) external view returns (uint256 borrowAmount); function liquidate( bytes32 loanId, address receiver, uint256 closeAmount ) external payable returns ( uint256 loanCloseAmount, uint256 seizedAmount, address seizedToken ); function rollover(bytes32 loanId, bytes calldata loanDataBytes) external returns (address rebateToken, uint256 gasRebate); function closeWithDeposit( bytes32 loanId, address receiver, uint256 depositAmount // denominated in loanToken ) external payable returns ( uint256 loanCloseAmount, uint256 withdrawAmount, address withdrawToken ); function closeWithSwap( bytes32 loanId, address receiver, uint256 swapAmount, // denominated in collateralToken bool returnTokenIsCollateral, // true: withdraws collateralToken, false: withdraws loanToken bytes calldata loanDataBytes ) external returns ( uint256 loanCloseAmount, uint256 withdrawAmount, address withdrawToken ); function liquidateWithGasToken( bytes32 loanId, address receiver, address gasTokenUser, uint256 closeAmount // denominated in loanToken ) external payable returns ( uint256 loanCloseAmount, uint256 seizedAmount, address seizedToken ); function rolloverWithGasToken( bytes32 loanId, address gasTokenUser, bytes calldata /*loanDataBytes*/ ) external returns (address rebateToken, uint256 gasRebate); function closeWithDepositWithGasToken( bytes32 loanId, address receiver, address gasTokenUser, uint256 depositAmount ) external payable returns ( uint256 loanCloseAmount, uint256 withdrawAmount, address withdrawToken ); function closeWithSwapWithGasToken( bytes32 loanId, address receiver, address gasTokenUser, uint256 swapAmount, bool returnTokenIsCollateral, bytes memory /*loanDataBytes*/ ) external returns ( uint256 loanCloseAmount, uint256 withdrawAmount, address withdrawToken ); function depositCollateral(bytes32 loanId, uint256 depositAmount) external payable; function withdrawCollateral( bytes32 loanId, address receiver, uint256 withdrawAmount ) external returns (uint256 actualWithdrawAmount); function withdrawAccruedInterest(address loanToken) external; function extendLoanDuration( bytes32 loanId, uint256 depositAmount, bool useCollateral, bytes calldata // for future use /*loanDataBytes*/ ) external payable returns (uint256 secondsExtended); function reduceLoanDuration( bytes32 loanId, address receiver, uint256 withdrawAmount ) external returns (uint256 secondsReduced); function claimRewards(address receiver) external returns (uint256 claimAmount); function rewardsBalanceOf(address user) external view returns (uint256 rewardsBalance); function getLenderInterestData(address lender, address loanToken) external view returns ( uint256 interestPaid, uint256 interestPaidDate, uint256 interestOwedPerDay, uint256 interestUnPaid, uint256 interestFeePercent, uint256 principalTotal ); function getLoanInterestData(bytes32 loanId) external view returns ( address loanToken, uint256 interestOwedPerDay, uint256 interestDepositTotal, uint256 interestDepositRemaining ); function getUserLoans( address user, uint256 start, uint256 count, LoanType loanType, bool isLender, bool unsafeOnly ) external view returns (LoanReturnData[] memory loansData); function getUserLoansCount(address user, bool isLender) external view returns (uint256); function getLoan(bytes32 loanId) external view returns (LoanReturnData memory loanData); function getActiveLoans( uint256 start, uint256 count, bool unsafeOnly ) external view returns (LoanReturnData[] memory loansData); function getActiveLoansCount() external view returns (uint256); function swapExternal( address sourceToken, address destToken, address receiver, address returnToSender, uint256 sourceTokenAmount, uint256 requiredDestTokenAmount, bytes calldata swapData ) external payable returns ( uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed ); function swapExternalWithGasToken( address sourceToken, address destToken, address receiver, address returnToSender, address gasTokenUser, uint256 sourceTokenAmount, uint256 requiredDestTokenAmount, bytes calldata swapData ) external payable returns ( uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed ); function getSwapExpectedReturn( address sourceToken, address destToken, uint256 sourceTokenAmount ) external view returns (uint256); struct LoanReturnData { bytes32 loanId; // id of the loan uint96 endTimestamp; // loan end timestamp address loanToken; // loan token address address collateralToken; // collateral token address uint256 principal; // principal amount of the loan uint256 collateral; // collateral amount of the loan uint256 interestOwedPerDay; // interest owned per day uint256 interestDepositRemaining; // remaining unspent interest uint256 startRate; // collateralToLoanRate uint256 startMargin; // margin with which loan was open uint256 maintenanceMargin; // maintenance margin uint256 currentMargin; // current margin uint256 maxLoanTerm; // maximum term of the loan uint256 maxLiquidatable; // is the collateral you can get liquidating uint256 maxSeizable; // is the loan you available for liquidation uint256 depositValue; // value of loan opening deposit uint256 withdrawalValue; // value of loan closing withdrawal } struct LoanParams { bytes32 id; // id of loan params object bool active; // if false, this object has been disabled by the owner and can't be used for future loans address owner; // owner of this object address loanToken; // the token being loaned address collateralToken; // the required collateral token uint256 minInitialMargin; // the minimum allowed initial margin uint256 maintenanceMargin; // an unhealthy loan when current margin is at or below this value uint256 maxLoanTerm; // the maximum term for new loans (0 means there's no max term) } struct LoanOpenData { bytes32 loanId; uint256 principal; uint256 collateral; } enum LoanType {All, Margin, NonMargin} } interface IToken { function flashBorrow( uint256 borrowAmount, address borrower, address target, string calldata signature, bytes calldata data ) external payable returns (bytes memory); } interface ISwapsImpl { function dexSwap( address sourceTokenAddress, address destTokenAddress, address receiverAddress, address returnToSenderAddress, uint256 minSourceTokenAmount, uint256 maxSourceTokenAmount, uint256 requiredDestTokenAmount) external returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed); function dexExpectedRate( address sourceTokenAddress, address destTokenAddress, uint256 sourceTokenAmount) external view returns (uint256); } interface IKyber { function swapTokenToToken( IERC20 src, uint256 srcAmount, IERC20 dest, uint256 minConversionRate ) external returns (uint256); function getExpectedRate( IERC20 src, IERC20 dest, uint256 srcQty ) external view returns (uint256 expectedRate, uint256 slippageRate); } interface KeeperCompatibleInterface { /** * @notice method that is simulated by the keepers to see if any work actually * needs to be performed. This method does does not actually need to be * executable, and since it is only ever simulated it can consume lots of gas. * @dev To ensure that it is never called, you may want to add the * cannotExecute modifier from KeeperBase to your implementation of this * method. * @param checkData specified in the upkeep registration so it is always the * same for a registered upkeep. This can easily be broken down into specific * arguments using `abi.decode`, so multiple upkeeps can be registered on the * same contract and easily differentiated by the contract. * @return upkeepNeeded boolean to indicate whether the keeper should call * performUpkeep or not. * @return performData bytes that the keeper should call performUpkeep with, if * upkeep is needed. If you would like to encode data to decode later, try * `abi.encode`. */ function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); /** * @notice method that is actually executed by the keepers, via the registry. * The data returned by the checkUpkeep simulation will be passed into * this method to actually be executed. * @dev The input to this method should not be trusted, and the caller of the * method should not even be restricted to any single registry. Anyone should * be able call it, and the input should be validated, there is no guarantee * that the data passed in is the performData returned from checkUpkeep. This * could happen due to malicious keepers, racing keepers, or simply a state * change while the performUpkeep transaction is waiting for confirmation. * Always validate the data passed in. * @param performData is the data which was passed back from the checkData * simulation. If it is encoded, it can easily be decoded into other types by * calling `abi.decode`. This data should not be trusted, and should be * validated against the contract's current state. */ function performUpkeep(bytes calldata performData) external; } interface IKeep3rV1 { function isKeeper(address) external returns (bool); function worked(address keeper) external; } interface IWeth { function deposit() external payable; function withdraw(uint256 wad) external; } contract BzxLiquidateV2 is Ownable, KeeperCompatibleInterface { using SafeERC20 for IERC20; IBZx public constant BZX = IBZx(0xD8Ee69652E4e4838f2531732a46d1f7F584F0b7f); IKyber public constant KYBER_PROXY = IKyber(0x9AAb3f75489902f3a48495025729a0AF77d4b11e); IKeep3rV1 public constant KP3R = IKeep3rV1(0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44); IWeth public constant WETH = IWeth(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); modifier upkeep() { require( KP3R.isKeeper(msg.sender), "::isKeeper: keeper is not registered" ); _; KP3R.worked(msg.sender); } fallback() external payable {} receive() external payable {} function liquidateInternal( bytes32 loanId, address loanToken, address collateralToken, uint256 maxLiquidatable, address flashLoanToken, bool allowLoss, bool checkBeforeExecuting ) internal returns (address, uint256) { if (checkBeforeExecuting) { IBZx.LoanReturnData memory loan = BZX.getLoan(loanId); require( loan.maxLiquidatable > 0 && loan.maxSeizable > 0, "healty loan" ); } bytes memory b = IToken(flashLoanToken).flashBorrow( maxLiquidatable, address(this), address(this), "", abi.encodeWithSignature( "executeOperation(bytes32,address,address,uint256,address,bool,address)", loanId, loanToken, collateralToken, maxLiquidatable, flashLoanToken, allowLoss, msg.sender ) ); (, , , uint256 profitAmount) = abi.decode(b, (uint256, uint256, address, uint256)); return (loanToken, profitAmount); } function liquidate( bytes32 loanId, address loanToken, address collateralToken, uint256 maxLiquidatable, address flashLoanToken ) external upkeep returns (address, uint256) { return liquidateInternal( loanId, loanToken, collateralToken, maxLiquidatable, flashLoanToken, false, false ); } function liquidateCheckBeforeExecuting( bytes32 loanId, address loanToken, address collateralToken, uint256 maxLiquidatable, address flashLoanToken ) external upkeep returns (address, uint256) { return liquidateInternal( loanId, loanToken, collateralToken, maxLiquidatable, flashLoanToken, false, true ); } function liquidatePublic( bytes32 loanId, address loanToken, address collateralToken, uint256 maxLiquidatable, address flashLoanToken ) external returns (address, uint256) { return liquidateInternal( loanId, loanToken, collateralToken, maxLiquidatable, flashLoanToken, false, false ); } function liquidateAllowLoss( bytes32 loanId, address loanToken, address collateralToken, uint256 maxLiquidatable, address flashLoanToken, bool checkBeforeExecuting ) external onlyOwner returns (address, uint256) { return liquidateInternal( loanId, loanToken, collateralToken, maxLiquidatable, flashLoanToken, true, checkBeforeExecuting ); } function executeOperation( bytes32 loanId, address loanToken, address collateralToken, uint256 maxLiquidatable, address iToken, bool allowLoss, address gasTokenUser ) external returns (bytes memory) { (uint256 _liquidatedLoanAmount, uint256 _liquidatedCollateral, ) = BZX.liquidate(loanId, address(this), uint256(-1)); if (collateralToken == address(WETH) && address(this).balance != 0) { WETH.deposit{value: address(this).balance}(); } // his is testnet // (uint256 _realLiquidatedLoanAmount,) = ISwapsImpl(BZX.swapsImpl()).dexSwap( // collateralToken, // loanToken, // address(this), // address(this), // _liquidatedCollateral, // _liquidatedCollateral, // 0 // ); uint256 _realLiquidatedLoanAmount = KYBER_PROXY.swapTokenToToken( IERC20(collateralToken), _liquidatedCollateral, IERC20(loanToken), 0 ); if (!allowLoss) { require( _realLiquidatedLoanAmount > _liquidatedLoanAmount, "no profit" ); } // repay flash loan IERC20(loanToken).safeTransfer(iToken, maxLiquidatable); return abi.encode( loanToken, uint256(_realLiquidatedLoanAmount - _liquidatedLoanAmount) ); } function wrapEther() public onlyOwner { if (address(this).balance != 0) { WETH.deposit{value: address(this).balance}(); } } function withdrawIERC20(IERC20 token) public onlyOwner { token.safeTransfer(msg.sender, token.balanceOf(address(this))); } function infiniteApproveIERC20(IERC20[] calldata tokens) public onlyOwner { for (uint256 i = 0; i < tokens.length; i++) { if (tokens[i].allowance(address(this), address(BZX)) != 0) { tokens[i].safeApprove(address(BZX), 0); } tokens[i].safeApprove(address(BZX), uint256(-1)); if (tokens[i].allowance(address(this), address(KYBER_PROXY)) != 0) { tokens[i].safeApprove(address(KYBER_PROXY), 0); } tokens[i].safeApprove(address(KYBER_PROXY), uint256(-1)); } } // chainlink registry mainnet 0x109A81F1E0A35D4c1D0cae8aCc6597cd54b47Bc6 // chainlink registry kovan 0xAaaD7966EBE0663b8C9C6f683FB9c3e66E03467F // link token mainnet 0x514910771AF9Ca656af840dff83E8264EcF986CA // link token kovan 0xa36085F69e2889c224210F603D836748e7dC0088 function infiniteApproveLinkRegistry(address registry, IERC20 token) public onlyOwner { if ( token.allowance( address(this), registry ) != 0 ) { token.safeApprove( registry, 0 ); } token.safeApprove( registry, uint256(-1) ); } function getLiquidatableLoans() public view returns (bytes32[] memory liquidatableLoans) { IBZx.LoanReturnData[] memory loans; loans = BZX.getActiveLoans(0, 500, true); liquidatableLoans = new bytes32[](loans.length); for (uint256 i = 0; i < loans.length; i++) { if ( isProfitalbe( loans[i].loanToken, loans[i].collateralToken, loans[i].maxLiquidatable, loans[i].maxSeizable ) ) { liquidatableLoans[i] = loans[i].loanId; } } } function isProfitalbe( address loanToken, address collateralToken, uint256 maxLiquidatable, uint256 maxSeizable ) public view returns (bool) { (uint256 rate, ) = KYBER_PROXY.getExpectedRate( IERC20(collateralToken), IERC20(loanToken), maxLiquidatable ); return (rate * maxLiquidatable) / 10**uint256(ERC20(collateralToken).decimals()) > maxSeizable; } function checkUpkeep(bytes calldata checkData) external override returns (bool upkeepNeeded, bytes memory performData) { bytes32 [] memory liquidatableLoans = getLiquidatableLoans(); return (liquidatableLoans.length > 0, abi.encodePacked(liquidatableLoans)); } function performUpkeep(bytes calldata performData) external override { bytes32[] memory loanIds = abi.decode(performData, (bytes32[])); require(loanIds.length > 0, "Cannot execute"); // liquidation uses approximately 1.6m gas lets round to 2m. current ethereum gasLimit ~12.5m uint256 numberOfLiquidaitonsFitInBlock = 6; if (loanIds.length < numberOfLiquidaitonsFitInBlock) { numberOfLiquidaitonsFitInBlock = loanIds.length; } for (uint256 i = 0; i < numberOfLiquidaitonsFitInBlock; i++) { IBZx.LoanReturnData memory loan = BZX.getLoan(loanIds[0]); // solhint-disable-next-line address(this).call( abi.encodeWithSignature( "liquidateCheckBeforeExecuting(bytes32,address,address,uint256,address,bool)", loan.loanId, loan.loanToken, loan.collateralToken, loan.maxLiquidatable, BZX.underlyingToLoanPool(loan.loanToken), true ) ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BZX","outputs":[{"internalType":"contract IBZx","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KP3R","outputs":[{"internalType":"contract IKeep3rV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KYBER_PROXY","outputs":[{"internalType":"contract IKyber","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWeth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"checkData","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"maxLiquidatable","type":"uint256"},{"internalType":"address","name":"iToken","type":"address"},{"internalType":"bool","name":"allowLoss","type":"bool"},{"internalType":"address","name":"gasTokenUser","type":"address"}],"name":"executeOperation","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLiquidatableLoans","outputs":[{"internalType":"bytes32[]","name":"liquidatableLoans","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"}],"name":"infiniteApproveIERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registry","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"infiniteApproveLinkRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"maxLiquidatable","type":"uint256"},{"internalType":"uint256","name":"maxSeizable","type":"uint256"}],"name":"isProfitalbe","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"maxLiquidatable","type":"uint256"},{"internalType":"address","name":"flashLoanToken","type":"address"}],"name":"liquidate","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"maxLiquidatable","type":"uint256"},{"internalType":"address","name":"flashLoanToken","type":"address"},{"internalType":"bool","name":"checkBeforeExecuting","type":"bool"}],"name":"liquidateAllowLoss","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"maxLiquidatable","type":"uint256"},{"internalType":"address","name":"flashLoanToken","type":"address"}],"name":"liquidateCheckBeforeExecuting","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"loanId","type":"bytes32"},{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"maxLiquidatable","type":"uint256"},{"internalType":"address","name":"flashLoanToken","type":"address"}],"name":"liquidatePublic","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawIERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6125108061007d6000396000f3fe6080604052600436106101235760003560e01c806388be5926116100a0578063bcb7f95e11610064578063bcb7f95e146102fe578063c0452f0a1461031e578063c10142291461034b578063f2fde38b1461036b578063f60f76c91461038b5761012a565b806388be5926146102675780638da5cb5b14610294578063949ef0c6146102a9578063ad5c4648146102c9578063af383f2b146102de5761012a565b80636f1296d2116100e75780636f1296d2146101cf578063715018a6146101e45780637f49a8d3146101f9578063850336dd14610227578063888ae177146102475761012a565b806305e0b9a01461012c5780631ddfa252146101575780634585e33b1461016c5780634fb7db3f1461018c5780636e04ff0d146101a15761012a565b3661012a57005b005b34801561013857600080fd5b506101416103ad565b60405161014e9190612029565b60405180910390f35b34801561016357600080fd5b506101416103c5565b34801561017857600080fd5b5061012a610187366004611dd6565b6103dd565b34801561019857600080fd5b50610141610628565b3480156101ad57600080fd5b506101c16101bc366004611dd6565b610640565b60405161014e9291906120bf565b3480156101db57600080fd5b5061012a610680565b3480156101f057600080fd5b5061012a610720565b34801561020557600080fd5b50610219610214366004611ce4565b61079f565b60405161014e929190612057565b34801561023357600080fd5b50610219610242366004611c86565b6107f6565b34801561025357600080fd5b50610219610262366004611c86565b610927565b34801561027357600080fd5b50610287610282366004611a4a565b610948565b60405161014e91906120b4565b3480156102a057600080fd5b50610141610a6a565b3480156102b557600080fd5b506102196102c4366004611c86565b610a79565b3480156102d557600080fd5b50610141610b34565b3480156102ea57600080fd5b5061012a6102f9366004611a8f565b610b4c565b34801561030a57600080fd5b5061012a610319366004611a0b565b610c33565b34801561032a57600080fd5b5061033e610339366004611d53565b610cfc565b60405161014e9190612177565b34801561035757600080fd5b5061012a610366366004611b5c565b610f32565b34801561037757600080fd5b5061012a610386366004611a0b565b6111ac565b34801561039757600080fd5b506103a0611262565b60405161014e9190612070565b731ceb5cb57c4d4e2b2433641b95dd330a33185a4481565b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f81565b60606103eb82840184611ac7565b905060008151116104175760405162461bcd60e51b815260040161040e90612236565b60405180910390fd5b8051600690811115610427575080515b60005b818110156106215761043a61184b565b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f6001600160a01b0316638932f5f78560008151811061046a57fe5b60200260200101516040518263ffffffff1660e01b815260040161048e91906120da565b6102206040518083038186803b1580156104a757600080fd5b505afa1580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df9190611ebd565b805160408083015160608401516101a085015192516310c59ce360e11b815294955030949192909173d8ee69652e4e4838f2531732a46d1f7f584f0b7f9063218b39c690610531908690600401612029565b602060405180830381600087803b15801561054b57600080fd5b505af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105839190611a2e565b600160405160240161059a96959493929190612102565b60408051601f198184030181529181526020820180516001600160e01b03166360519af560e11b179052516105cf919061200d565b6000604051808303816000865af19150503d806000811461060c576040519150601f19603f3d011682016040523d82523d6000602084013e610611565b606091505b50506001909201915061042a9050565b5050505050565b739aab3f75489902f3a48495025729a0af77d4b11e81565b600060608061064d611262565b90506000815111816040516020016106659190611fd7565b60405160208183030381529060405292509250509250929050565b6106886113fa565b6000546001600160a01b039081169116146106b55760405162461bcd60e51b815260040161040e9061225e565b471561071e5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561070a57600080fd5b505af1158015610621573d6000803e3d6000fd5b565b6107286113fa565b6000546001600160a01b039081169116146107555760405162461bcd60e51b815260040161040e9061225e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806107aa6113fa565b6000546001600160a01b039081169116146107d75760405162461bcd60e51b815260040161040e9061225e565b6107e788888888886001896113fe565b91509150965096945050505050565b6040516335d2155560e11b81526000908190731ceb5cb57c4d4e2b2433641b95dd330a33185a4490636ba42aaa90610832903390600401612029565b602060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108849190611c6a565b6108a05760405162461bcd60e51b815260040161040e90612293565b6108b087878787876000806113fe565b915091506040516317fbade560e21b8152731ceb5cb57c4d4e2b2433641b95dd330a33185a4490635feeb794906108eb903390600401612029565b600060405180830381600087803b15801561090557600080fd5b505af1158015610919573d6000803e3d6000fd5b505050509550959350505050565b60008061093a87878787876000806113fe565b915091509550959350505050565b60405163809a9e5560e01b81526000908190739aab3f75489902f3a48495025729a0af77d4b11e9063809a9e55906109889088908a90899060040161218a565b604080518083038186803b15801561099f57600080fd5b505afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d79190611ef1565b50905082856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4c9190611f8a565b60ff16600a0a85830281610a5c57fe5b04119150505b949350505050565b6000546001600160a01b031690565b6040516335d2155560e11b81526000908190731ceb5cb57c4d4e2b2433641b95dd330a33185a4490636ba42aaa90610ab5903390600401612029565b602060405180830381600087803b158015610acf57600080fd5b505af1158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b079190611c6a565b610b235760405162461bcd60e51b815260040161040e90612293565b6108b08787878787600060016113fe565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b610b546113fa565b6000546001600160a01b03908116911614610b815760405162461bcd60e51b815260040161040e9061225e565b604051636eb1769f60e11b81526001600160a01b0382169063dd62ed3e90610baf903090869060040161203d565b60206040518083038186803b158015610bc757600080fd5b505afa158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff9190611ed9565b15610c1957610c196001600160a01b0382168360006115cf565b610c2f6001600160a01b038216836000196115cf565b5050565b610c3b6113fa565b6000546001600160a01b03908116911614610c685760405162461bcd60e51b815260040161040e9061225e565b610cf933826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c989190612029565b60206040518083038186803b158015610cb057600080fd5b505afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce89190611ed9565b6001600160a01b03841691906116c9565b50565b60405163e4f3e73960e01b8152606090600090819073d8ee69652e4e4838f2531732a46d1f7f584f0b7f9063e4f3e73990610d41908d903090600019906004016120e3565b606060405180830381600087803b158015610d5b57600080fd5b505af1158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d939190611f14565b5090925090506001600160a01b03881673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2148015610dc457504715155b15610e325773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e1857600080fd5b505af1158015610e2c573d6000803e3d6000fd5b50505050505b604051637409e2eb60e01b8152600090739aab3f75489902f3a48495025729a0af77d4b11e90637409e2eb90610e72908c9086908f9087906004016121ae565b602060405180830381600087803b158015610e8c57600080fd5b505af1158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec49190611ed9565b905085610eea57828111610eea5760405162461bcd60e51b815260040161040e90612333565b610efe6001600160a01b038b16888a6116c9565b89838203604051602001610f13929190612057565b6040516020818303038152906040529350505050979650505050505050565b610f3a6113fa565b6000546001600160a01b03908116911614610f675760405162461bcd60e51b815260040161040e9061225e565b60005b818110156111a757828282818110610f7e57fe5b9050602002016020810190610f939190611a0b565b6001600160a01b031663dd62ed3e3073d8ee69652e4e4838f2531732a46d1f7f584f0b7f6040518363ffffffff1660e01b8152600401610fd492919061203d565b60206040518083038186803b158015610fec57600080fd5b505afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190611ed9565b156110745761107473d8ee69652e4e4838f2531732a46d1f7f584f0b7f600085858581811061104f57fe5b90506020020160208101906110649190611a0b565b6001600160a01b031691906115cf565b61109b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f60001985858581811061104f57fe5b8282828181106110a757fe5b90506020020160208101906110bc9190611a0b565b6001600160a01b031663dd62ed3e30739aab3f75489902f3a48495025729a0af77d4b11e6040518363ffffffff1660e01b81526004016110fd92919061203d565b60206040518083038186803b15801561111557600080fd5b505afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d9190611ed9565b1561117857611178739aab3f75489902f3a48495025729a0af77d4b11e600085858581811061104f57fe5b61119f739aab3f75489902f3a48495025729a0af77d4b11e60001985858581811061104f57fe5b600101610f6a565b505050565b6111b46113fa565b6000546001600160a01b039081169116146111e15760405162461bcd60e51b815260040161040e9061225e565b6001600160a01b0381166112075760405162461bcd60e51b815260040161040e906121f0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516318215f0b60e21b8152606090819073d8ee69652e4e4838f2531732a46d1f7f584f0b7f906360857c2c906112a6906000906101f4906001906004016121d8565b60006040518083038186803b1580156112be57600080fd5b505afa1580156112d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112fa9190810190611bcb565b9050805167ffffffffffffffff8111801561131457600080fd5b5060405190808252806020026020018201604052801561133e578160200160208202803683370190505b50915060005b81518110156113f5576113b782828151811061135c57fe5b60200260200101516040015183838151811061137457fe5b60200260200101516060015184848151811061138c57fe5b60200260200101516101a001518585815181106113a557fe5b60200260200101516101c00151610948565b156113ed578181815181106113c857fe5b6020026020010151600001518382815181106113e057fe5b6020026020010181815250505b600101611344565b505090565b3390565b60008082156114d15761140f61184b565b604051638932f5f760e01b815273d8ee69652e4e4838f2531732a46d1f7f584f0b7f90638932f5f790611446908d906004016120da565b6102206040518083038186803b15801561145f57600080fd5b505afa158015611473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114979190611ebd565b90506000816101a001511180156114b357506000816101c00151115b6114cf5760405162461bcd60e51b815260040161040e906122d7565b505b6060856001600160a01b031663c5bf0e9d8830308e8e8e8e8e8e33604051602401611502979695949392919061213a565b60408051601f198184030181529181526020820180516001600160e01b0316636022978560e11b1790525160e086901b6001600160e01b031916815261154e94939291906004016123f6565b600060405180830381600087803b15801561156857600080fd5b505af115801561157c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a49190810190611e31565b90506000818060200190518101906115bc9190611f4c565b9c9e9c9d50505050505050505050505050565b8015806116575750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611605903090869060040161203d565b60206040518083038186803b15801561161d57600080fd5b505afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190611ed9565b155b6116735760405162461bcd60e51b815260040161040e906123a0565b6111a78363095ea7b360e01b8484604051602401611692929190612057565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526116e8565b6111a78363a9059cbb60e01b8484604051602401611692929190612057565b606061173d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117779092919063ffffffff16565b8051909150156111a7578080602001905181019061175b9190611c6a565b6111a75760405162461bcd60e51b815260040161040e90612356565b6060610a628484600085606061178c85611845565b6117a85760405162461bcd60e51b815260040161040e906122fc565b60006060866001600160a01b031685876040516117c5919061200d565b60006040518083038185875af1925050503d8060008114611802576040519150601f19603f3d011682016040523d82523d6000602084013e611807565b606091505b5091509150811561181b579150610a629050565b80511561182b5780518082602001fd5b8360405162461bcd60e51b815260040161040e9190612177565b3b151590565b6040518061022001604052806000801916815260200160006bffffffffffffffffffffffff16815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516118fd816124b7565b92915050565b6000610220808385031215611916578182fd5b61191f81612440565b9150508151815261193383602084016119ef565b602082015261194583604084016118f2565b604082015261195783606084016118f2565b60608201526080828101519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e080830151908201526102009182015191810191909152919050565b80516bffffffffffffffffffffffff811681146118fd57600080fd5b600060208284031215611a1c578081fd5b8135611a27816124b7565b9392505050565b600060208284031215611a3f578081fd5b8151611a27816124b7565b60008060008060808587031215611a5f578283fd5b8435611a6a816124b7565b93506020850135611a7a816124b7565b93969395505050506040820135916060013590565b60008060408385031215611aa1578182fd5b8235611aac816124b7565b91506020830135611abc816124b7565b809150509250929050565b60006020808385031215611ad9578182fd5b823567ffffffffffffffff811115611aef578283fd5b8301601f81018513611aff578283fd5b8035611b12611b0d82612467565b612440565b8181528381019083850185840285018601891015611b2e578687fd5b8694505b83851015611b50578035835260019490940193918501918501611b32565b50979650505050505050565b60008060208385031215611b6e578182fd5b823567ffffffffffffffff80821115611b85578384fd5b818501915085601f830112611b98578384fd5b813581811115611ba6578485fd5b8660208083028501011115611bb9578485fd5b60209290920196919550909350505050565b60006020808385031215611bdd578182fd5b825167ffffffffffffffff811115611bf3578283fd5b8301601f81018513611c03578283fd5b8051611c11611b0d82612467565b81815283810190838501610220808502860187018a1015611c30578788fd5b8795505b84861015611c5c57611c468a83611903565b8452600195909501949286019290810190611c34565b509098975050505050505050565b600060208284031215611c7b578081fd5b8151611a27816124cc565b600080600080600060a08688031215611c9d578283fd5b853594506020860135611caf816124b7565b93506040860135611cbf816124b7565b9250606086013591506080860135611cd6816124b7565b809150509295509295909350565b60008060008060008060c08789031215611cfc578384fd5b863595506020870135611d0e816124b7565b94506040870135611d1e816124b7565b9350606087013592506080870135611d35816124b7565b915060a0870135611d45816124cc565b809150509295509295509295565b600080600080600080600060e0888a031215611d6d578485fd5b873596506020880135611d7f816124b7565b95506040880135611d8f816124b7565b9450606088013593506080880135611da6816124b7565b925060a0880135611db6816124cc565b915060c0880135611dc6816124b7565b8091505092959891949750929550565b60008060208385031215611de8578182fd5b823567ffffffffffffffff80821115611dff578384fd5b818501915085601f830112611e12578384fd5b813581811115611e20578485fd5b866020828501011115611bb9578485fd5b600060208284031215611e42578081fd5b815167ffffffffffffffff80821115611e59578283fd5b818401915084601f830112611e6c578283fd5b815181811115611e7a578384fd5b611e8d601f8201601f1916602001612440565b9150808252856020828501011115611ea3578384fd5b611eb4816020840160208601612487565b50949350505050565b60006102208284031215611ecf578081fd5b611a278383611903565b600060208284031215611eea578081fd5b5051919050565b60008060408385031215611f03578182fd5b505080516020909101519092909150565b600080600060608486031215611f28578081fd5b83519250602084015191506040840151611f41816124b7565b809150509250925092565b60008060008060808587031215611f61578182fd5b84519350602085015192506040850151611f7a816124b7565b6060959095015193969295505050565b600060208284031215611f9b578081fd5b815160ff81168114611a27578182fd5b60008151808452611fc3816020860160208601612487565b601f01601f19169290920160200192915050565b815160009082906020808601845b8381101561200157815185529382019390820190600101611fe5565b50929695505050505050565b6000825161201f818460208701612487565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156120a85783518352928401929184019160010161208c565b50909695505050505050565b901515815260200190565b6000831515825260406020830152610a626040830184611fab565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b9586526001600160a01b039485166020870152928416604086015260608501919091529091166080830152151560a082015260c00190565b9687526001600160a01b0395861660208801529385166040870152606086019290925283166080850152151560a08401521660c082015260e00190565b600060208252611a276020830184611fab565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b92835260208301919091521515604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600e908201526d43616e6e6f74206578656375746560901b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f3a3a69734b65657065723a206b6565706572206973206e6f7420726567697374604082015263195c995960e21b606082015260800190565b6020808252600b908201526a3432b0b63a3c903637b0b760a91b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600990820152681b9bc81c1c9bd99a5d60ba1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b8481526001600160a01b0384811660208301528316604082015260a060608201819052600090820181905260c06080830181905261243690830184611fab565b9695505050505050565b60405181810167ffffffffffffffff8111828210171561245f57600080fd5b604052919050565b600067ffffffffffffffff82111561247d578081fd5b5060209081020190565b60005b838110156124a257818101518382015260200161248a565b838111156124b1576000848401525b50505050565b6001600160a01b0381168114610cf957600080fd5b8015158114610cf957600080fdfea26469706673582212206946f8c3b54265b81a9b60223930473f59eef8b9a9a43290ad5a3aae94f3618b64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101235760003560e01c806388be5926116100a0578063bcb7f95e11610064578063bcb7f95e146102fe578063c0452f0a1461031e578063c10142291461034b578063f2fde38b1461036b578063f60f76c91461038b5761012a565b806388be5926146102675780638da5cb5b14610294578063949ef0c6146102a9578063ad5c4648146102c9578063af383f2b146102de5761012a565b80636f1296d2116100e75780636f1296d2146101cf578063715018a6146101e45780637f49a8d3146101f9578063850336dd14610227578063888ae177146102475761012a565b806305e0b9a01461012c5780631ddfa252146101575780634585e33b1461016c5780634fb7db3f1461018c5780636e04ff0d146101a15761012a565b3661012a57005b005b34801561013857600080fd5b506101416103ad565b60405161014e9190612029565b60405180910390f35b34801561016357600080fd5b506101416103c5565b34801561017857600080fd5b5061012a610187366004611dd6565b6103dd565b34801561019857600080fd5b50610141610628565b3480156101ad57600080fd5b506101c16101bc366004611dd6565b610640565b60405161014e9291906120bf565b3480156101db57600080fd5b5061012a610680565b3480156101f057600080fd5b5061012a610720565b34801561020557600080fd5b50610219610214366004611ce4565b61079f565b60405161014e929190612057565b34801561023357600080fd5b50610219610242366004611c86565b6107f6565b34801561025357600080fd5b50610219610262366004611c86565b610927565b34801561027357600080fd5b50610287610282366004611a4a565b610948565b60405161014e91906120b4565b3480156102a057600080fd5b50610141610a6a565b3480156102b557600080fd5b506102196102c4366004611c86565b610a79565b3480156102d557600080fd5b50610141610b34565b3480156102ea57600080fd5b5061012a6102f9366004611a8f565b610b4c565b34801561030a57600080fd5b5061012a610319366004611a0b565b610c33565b34801561032a57600080fd5b5061033e610339366004611d53565b610cfc565b60405161014e9190612177565b34801561035757600080fd5b5061012a610366366004611b5c565b610f32565b34801561037757600080fd5b5061012a610386366004611a0b565b6111ac565b34801561039757600080fd5b506103a0611262565b60405161014e9190612070565b731ceb5cb57c4d4e2b2433641b95dd330a33185a4481565b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f81565b60606103eb82840184611ac7565b905060008151116104175760405162461bcd60e51b815260040161040e90612236565b60405180910390fd5b8051600690811115610427575080515b60005b818110156106215761043a61184b565b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f6001600160a01b0316638932f5f78560008151811061046a57fe5b60200260200101516040518263ffffffff1660e01b815260040161048e91906120da565b6102206040518083038186803b1580156104a757600080fd5b505afa1580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df9190611ebd565b805160408083015160608401516101a085015192516310c59ce360e11b815294955030949192909173d8ee69652e4e4838f2531732a46d1f7f584f0b7f9063218b39c690610531908690600401612029565b602060405180830381600087803b15801561054b57600080fd5b505af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105839190611a2e565b600160405160240161059a96959493929190612102565b60408051601f198184030181529181526020820180516001600160e01b03166360519af560e11b179052516105cf919061200d565b6000604051808303816000865af19150503d806000811461060c576040519150601f19603f3d011682016040523d82523d6000602084013e610611565b606091505b50506001909201915061042a9050565b5050505050565b739aab3f75489902f3a48495025729a0af77d4b11e81565b600060608061064d611262565b90506000815111816040516020016106659190611fd7565b60405160208183030381529060405292509250509250929050565b6106886113fa565b6000546001600160a01b039081169116146106b55760405162461bcd60e51b815260040161040e9061225e565b471561071e5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561070a57600080fd5b505af1158015610621573d6000803e3d6000fd5b565b6107286113fa565b6000546001600160a01b039081169116146107555760405162461bcd60e51b815260040161040e9061225e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806107aa6113fa565b6000546001600160a01b039081169116146107d75760405162461bcd60e51b815260040161040e9061225e565b6107e788888888886001896113fe565b91509150965096945050505050565b6040516335d2155560e11b81526000908190731ceb5cb57c4d4e2b2433641b95dd330a33185a4490636ba42aaa90610832903390600401612029565b602060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108849190611c6a565b6108a05760405162461bcd60e51b815260040161040e90612293565b6108b087878787876000806113fe565b915091506040516317fbade560e21b8152731ceb5cb57c4d4e2b2433641b95dd330a33185a4490635feeb794906108eb903390600401612029565b600060405180830381600087803b15801561090557600080fd5b505af1158015610919573d6000803e3d6000fd5b505050509550959350505050565b60008061093a87878787876000806113fe565b915091509550959350505050565b60405163809a9e5560e01b81526000908190739aab3f75489902f3a48495025729a0af77d4b11e9063809a9e55906109889088908a90899060040161218a565b604080518083038186803b15801561099f57600080fd5b505afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d79190611ef1565b50905082856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4c9190611f8a565b60ff16600a0a85830281610a5c57fe5b04119150505b949350505050565b6000546001600160a01b031690565b6040516335d2155560e11b81526000908190731ceb5cb57c4d4e2b2433641b95dd330a33185a4490636ba42aaa90610ab5903390600401612029565b602060405180830381600087803b158015610acf57600080fd5b505af1158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b079190611c6a565b610b235760405162461bcd60e51b815260040161040e90612293565b6108b08787878787600060016113fe565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b610b546113fa565b6000546001600160a01b03908116911614610b815760405162461bcd60e51b815260040161040e9061225e565b604051636eb1769f60e11b81526001600160a01b0382169063dd62ed3e90610baf903090869060040161203d565b60206040518083038186803b158015610bc757600080fd5b505afa158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff9190611ed9565b15610c1957610c196001600160a01b0382168360006115cf565b610c2f6001600160a01b038216836000196115cf565b5050565b610c3b6113fa565b6000546001600160a01b03908116911614610c685760405162461bcd60e51b815260040161040e9061225e565b610cf933826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c989190612029565b60206040518083038186803b158015610cb057600080fd5b505afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce89190611ed9565b6001600160a01b03841691906116c9565b50565b60405163e4f3e73960e01b8152606090600090819073d8ee69652e4e4838f2531732a46d1f7f584f0b7f9063e4f3e73990610d41908d903090600019906004016120e3565b606060405180830381600087803b158015610d5b57600080fd5b505af1158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d939190611f14565b5090925090506001600160a01b03881673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2148015610dc457504715155b15610e325773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e1857600080fd5b505af1158015610e2c573d6000803e3d6000fd5b50505050505b604051637409e2eb60e01b8152600090739aab3f75489902f3a48495025729a0af77d4b11e90637409e2eb90610e72908c9086908f9087906004016121ae565b602060405180830381600087803b158015610e8c57600080fd5b505af1158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec49190611ed9565b905085610eea57828111610eea5760405162461bcd60e51b815260040161040e90612333565b610efe6001600160a01b038b16888a6116c9565b89838203604051602001610f13929190612057565b6040516020818303038152906040529350505050979650505050505050565b610f3a6113fa565b6000546001600160a01b03908116911614610f675760405162461bcd60e51b815260040161040e9061225e565b60005b818110156111a757828282818110610f7e57fe5b9050602002016020810190610f939190611a0b565b6001600160a01b031663dd62ed3e3073d8ee69652e4e4838f2531732a46d1f7f584f0b7f6040518363ffffffff1660e01b8152600401610fd492919061203d565b60206040518083038186803b158015610fec57600080fd5b505afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190611ed9565b156110745761107473d8ee69652e4e4838f2531732a46d1f7f584f0b7f600085858581811061104f57fe5b90506020020160208101906110649190611a0b565b6001600160a01b031691906115cf565b61109b73d8ee69652e4e4838f2531732a46d1f7f584f0b7f60001985858581811061104f57fe5b8282828181106110a757fe5b90506020020160208101906110bc9190611a0b565b6001600160a01b031663dd62ed3e30739aab3f75489902f3a48495025729a0af77d4b11e6040518363ffffffff1660e01b81526004016110fd92919061203d565b60206040518083038186803b15801561111557600080fd5b505afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d9190611ed9565b1561117857611178739aab3f75489902f3a48495025729a0af77d4b11e600085858581811061104f57fe5b61119f739aab3f75489902f3a48495025729a0af77d4b11e60001985858581811061104f57fe5b600101610f6a565b505050565b6111b46113fa565b6000546001600160a01b039081169116146111e15760405162461bcd60e51b815260040161040e9061225e565b6001600160a01b0381166112075760405162461bcd60e51b815260040161040e906121f0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516318215f0b60e21b8152606090819073d8ee69652e4e4838f2531732a46d1f7f584f0b7f906360857c2c906112a6906000906101f4906001906004016121d8565b60006040518083038186803b1580156112be57600080fd5b505afa1580156112d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112fa9190810190611bcb565b9050805167ffffffffffffffff8111801561131457600080fd5b5060405190808252806020026020018201604052801561133e578160200160208202803683370190505b50915060005b81518110156113f5576113b782828151811061135c57fe5b60200260200101516040015183838151811061137457fe5b60200260200101516060015184848151811061138c57fe5b60200260200101516101a001518585815181106113a557fe5b60200260200101516101c00151610948565b156113ed578181815181106113c857fe5b6020026020010151600001518382815181106113e057fe5b6020026020010181815250505b600101611344565b505090565b3390565b60008082156114d15761140f61184b565b604051638932f5f760e01b815273d8ee69652e4e4838f2531732a46d1f7f584f0b7f90638932f5f790611446908d906004016120da565b6102206040518083038186803b15801561145f57600080fd5b505afa158015611473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114979190611ebd565b90506000816101a001511180156114b357506000816101c00151115b6114cf5760405162461bcd60e51b815260040161040e906122d7565b505b6060856001600160a01b031663c5bf0e9d8830308e8e8e8e8e8e33604051602401611502979695949392919061213a565b60408051601f198184030181529181526020820180516001600160e01b0316636022978560e11b1790525160e086901b6001600160e01b031916815261154e94939291906004016123f6565b600060405180830381600087803b15801561156857600080fd5b505af115801561157c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a49190810190611e31565b90506000818060200190518101906115bc9190611f4c565b9c9e9c9d50505050505050505050505050565b8015806116575750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611605903090869060040161203d565b60206040518083038186803b15801561161d57600080fd5b505afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190611ed9565b155b6116735760405162461bcd60e51b815260040161040e906123a0565b6111a78363095ea7b360e01b8484604051602401611692929190612057565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526116e8565b6111a78363a9059cbb60e01b8484604051602401611692929190612057565b606061173d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117779092919063ffffffff16565b8051909150156111a7578080602001905181019061175b9190611c6a565b6111a75760405162461bcd60e51b815260040161040e90612356565b6060610a628484600085606061178c85611845565b6117a85760405162461bcd60e51b815260040161040e906122fc565b60006060866001600160a01b031685876040516117c5919061200d565b60006040518083038185875af1925050503d8060008114611802576040519150601f19603f3d011682016040523d82523d6000602084013e611807565b606091505b5091509150811561181b579150610a629050565b80511561182b5780518082602001fd5b8360405162461bcd60e51b815260040161040e9190612177565b3b151590565b6040518061022001604052806000801916815260200160006bffffffffffffffffffffffff16815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516118fd816124b7565b92915050565b6000610220808385031215611916578182fd5b61191f81612440565b9150508151815261193383602084016119ef565b602082015261194583604084016118f2565b604082015261195783606084016118f2565b60608201526080828101519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e080830151908201526102009182015191810191909152919050565b80516bffffffffffffffffffffffff811681146118fd57600080fd5b600060208284031215611a1c578081fd5b8135611a27816124b7565b9392505050565b600060208284031215611a3f578081fd5b8151611a27816124b7565b60008060008060808587031215611a5f578283fd5b8435611a6a816124b7565b93506020850135611a7a816124b7565b93969395505050506040820135916060013590565b60008060408385031215611aa1578182fd5b8235611aac816124b7565b91506020830135611abc816124b7565b809150509250929050565b60006020808385031215611ad9578182fd5b823567ffffffffffffffff811115611aef578283fd5b8301601f81018513611aff578283fd5b8035611b12611b0d82612467565b612440565b8181528381019083850185840285018601891015611b2e578687fd5b8694505b83851015611b50578035835260019490940193918501918501611b32565b50979650505050505050565b60008060208385031215611b6e578182fd5b823567ffffffffffffffff80821115611b85578384fd5b818501915085601f830112611b98578384fd5b813581811115611ba6578485fd5b8660208083028501011115611bb9578485fd5b60209290920196919550909350505050565b60006020808385031215611bdd578182fd5b825167ffffffffffffffff811115611bf3578283fd5b8301601f81018513611c03578283fd5b8051611c11611b0d82612467565b81815283810190838501610220808502860187018a1015611c30578788fd5b8795505b84861015611c5c57611c468a83611903565b8452600195909501949286019290810190611c34565b509098975050505050505050565b600060208284031215611c7b578081fd5b8151611a27816124cc565b600080600080600060a08688031215611c9d578283fd5b853594506020860135611caf816124b7565b93506040860135611cbf816124b7565b9250606086013591506080860135611cd6816124b7565b809150509295509295909350565b60008060008060008060c08789031215611cfc578384fd5b863595506020870135611d0e816124b7565b94506040870135611d1e816124b7565b9350606087013592506080870135611d35816124b7565b915060a0870135611d45816124cc565b809150509295509295509295565b600080600080600080600060e0888a031215611d6d578485fd5b873596506020880135611d7f816124b7565b95506040880135611d8f816124b7565b9450606088013593506080880135611da6816124b7565b925060a0880135611db6816124cc565b915060c0880135611dc6816124b7565b8091505092959891949750929550565b60008060208385031215611de8578182fd5b823567ffffffffffffffff80821115611dff578384fd5b818501915085601f830112611e12578384fd5b813581811115611e20578485fd5b866020828501011115611bb9578485fd5b600060208284031215611e42578081fd5b815167ffffffffffffffff80821115611e59578283fd5b818401915084601f830112611e6c578283fd5b815181811115611e7a578384fd5b611e8d601f8201601f1916602001612440565b9150808252856020828501011115611ea3578384fd5b611eb4816020840160208601612487565b50949350505050565b60006102208284031215611ecf578081fd5b611a278383611903565b600060208284031215611eea578081fd5b5051919050565b60008060408385031215611f03578182fd5b505080516020909101519092909150565b600080600060608486031215611f28578081fd5b83519250602084015191506040840151611f41816124b7565b809150509250925092565b60008060008060808587031215611f61578182fd5b84519350602085015192506040850151611f7a816124b7565b6060959095015193969295505050565b600060208284031215611f9b578081fd5b815160ff81168114611a27578182fd5b60008151808452611fc3816020860160208601612487565b601f01601f19169290920160200192915050565b815160009082906020808601845b8381101561200157815185529382019390820190600101611fe5565b50929695505050505050565b6000825161201f818460208701612487565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156120a85783518352928401929184019160010161208c565b50909695505050505050565b901515815260200190565b6000831515825260406020830152610a626040830184611fab565b90815260200190565b9283526001600160a01b03919091166020830152604082015260600190565b9586526001600160a01b039485166020870152928416604086015260608501919091529091166080830152151560a082015260c00190565b9687526001600160a01b0395861660208801529385166040870152606086019290925283166080850152151560a08401521660c082015260e00190565b600060208252611a276020830184611fab565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b92835260208301919091521515604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252600e908201526d43616e6e6f74206578656375746560901b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f3a3a69734b65657065723a206b6565706572206973206e6f7420726567697374604082015263195c995960e21b606082015260800190565b6020808252600b908201526a3432b0b63a3c903637b0b760a91b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600990820152681b9bc81c1c9bd99a5d60ba1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b8481526001600160a01b0384811660208301528316604082015260a060608201819052600090820181905260c06080830181905261243690830184611fab565b9695505050505050565b60405181810167ffffffffffffffff8111828210171561245f57600080fd5b604052919050565b600067ffffffffffffffff82111561247d578081fd5b5060209081020190565b60005b838110156124a257818101518382015260200161248a565b838111156124b1576000848401525b50505050565b6001600160a01b0381168114610cf957600080fd5b8015158114610cf957600080fdfea26469706673582212206946f8c3b54265b81a9b60223930473f59eef8b9a9a43290ad5a3aae94f3618b64736f6c634300060c0033
Deployed Bytecode Sourcemap
45816:10120:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46107:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45918:75;;;;;;;;;;;;;:::i;54778:1155::-;;;;;;;;;;-1:-1:-1;54778:1155:0;;;;;:::i;:::-;;:::i;46002:96::-;;;;;;;;;;;;;:::i;54454:316::-;;;;;;;;;;-1:-1:-1;54454:316:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;51588:159::-;;;;;;;;;;;;;:::i;2648:148::-;;;;;;;;;;;;;:::i;49424:558::-;;;;;;;;;;-1:-1:-1;49424:558:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;47894:496::-;;;;;;;;;;-1:-1:-1;47894:496:0;;;;;:::i;:::-;;:::i;48921:495::-;;;;;;;;;;-1:-1:-1;48921:495:0;;;;;:::i;:::-;;:::i;53909:535::-;;;;;;;;;;-1:-1:-1;53909:535:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2006:79::-;;;;;;;;;;;;;:::i;48398:515::-;;;;;;;;;;-1:-1:-1;48398:515:0;;;;;:::i;:::-;;:::i;46211:87::-;;;;;;;;;;;;;:::i;52789:422::-;;;;;;;;;;-1:-1:-1;52789:422:0;;;;;:::i;:::-;;:::i;51755:136::-;;;;;;;;;;-1:-1:-1;51755:136:0;;;;;:::i;:::-;;:::i;49990:1590::-;;;;;;;;;;-1:-1:-1;49990:1590:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51899:592::-;;;;;;;;;;-1:-1:-1;51899:592:0;;;;;:::i;:::-;;:::i;2951:244::-;;;;;;;;;;-1:-1:-1;2951:244:0;;;;;:::i;:::-;;:::i;53219:682::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46107:95::-;46159:42;46107:95;:::o;45918:75::-;45950:42;45918:75;:::o;54778:1155::-;54858:24;54885:36;;;;54896:11;54885:36;:::i;:::-;54858:63;;54957:1;54940:7;:14;:18;54932:45;;;;-1:-1:-1;;;54932:45:0;;;;;;;:::i;:::-;;;;;;;;;55150:14;;55134:1;;55150:47;-1:-1:-1;55146:127:0;;;-1:-1:-1;55247:14:0;;55146:127;55288:9;55283:643;55307:30;55303:1;:34;55283:643;;;55359:31;;:::i;:::-;45950:42;-1:-1:-1;;;;;55393:11:0;;55405:7;55413:1;55405:10;;;;;;;;;;;;;;55393:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55656:11;;55690:14;;;;;55727:20;;;;55770;;;;55813:40;;-1:-1:-1;;;55813:40:0;;55359:57;;-1:-1:-1;55481:4:0;;55690:14;;55727:20;;45950:42;;55813:24;;:40;;55690:14;;55813:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55876:4;55510:389;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55510:389:0;;;;;;;;;;;;;;-1:-1:-1;;;;;55510:389:0;-1:-1:-1;;;55510:389:0;;;55473:441;;;55510:389;55473:441;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55339:3:0;;;;;-1:-1:-1;55283:643:0;;-1:-1:-1;55283:643:0;;;54778:1155;;;;:::o;46002:96::-;46055:42;46002:96;:::o;54454:316::-;54546:17;54565:24;54607:35;54645:22;:20;:22::i;:::-;54607:60;;54723:1;54696:17;:24;:28;54743:17;54726:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;54688:74;;;;;54454:316;;;;;:::o;51588:159::-;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;51641:21:::1;:26:::0;51637:103:::1;;46255:42;-1:-1:-1::0;;;;;51684:12:0::1;;51704:21;51684:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;51637:103;51588:159::o:0;2648:148::-;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;2755:1:::1;2739:6:::0;;2718:40:::1;::::0;-1:-1:-1;;;;;2739:6:0;;::::1;::::0;2718:40:::1;::::0;2755:1;;2718:40:::1;2786:1;2769:19:::0;;-1:-1:-1;;;;;;2769:19:0::1;::::0;;2648:148::o;49424:558::-;49677:7;49686;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;49726:248:::1;49762:6;49787:9;49815:15;49849;49883:14;49916:4;49939:20;49726:17;:248::i;:::-;49706:268;;;;49424:558:::0;;;;;;;;;:::o;47894:496::-;46358:25;;-1:-1:-1;;;46358:25:0;;48099:7;;;;46159:42;;46358:13;;:25;;46372:10;;46358:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46336:111;;;;-1:-1:-1;;;46336:111:0;;;;;;;:::i;:::-;48148:234:::1;48184:6;48209:9;48237:15;48271;48305:14;48338:5;48362::::0;48148:17:::1;:234::i;:::-;48128:254;;;;46470:23:::0;;-1:-1:-1;;;46470:23:0;;46159:42;;46470:11;;:23;;46482:10;;46470:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47894:496;;;;;;;;:::o;48921:495::-;49125:7;49134;49174:234;49210:6;49235:9;49263:15;49297;49331:14;49364:5;49388;49174:17;:234::i;:::-;49154:254;;;;48921:495;;;;;;;;:::o;53909:535::-;54134:154;;-1:-1:-1;;;54134:154:0;;54085:4;;;;46055:42;;54134:27;;:154;;54187:15;;54229:9;;54258:15;;54134:154;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54102:186;;;54425:11;54381:15;-1:-1:-1;;;;;54375:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54367:42;;54363:2;:46;54327:15;54320:4;:22;54319:90;;;;;;:117;54299:137;;;53909:535;;;;;;;:::o;2006:79::-;2044:7;2071:6;-1:-1:-1;;;;;2071:6:0;2006:79;:::o;48398:515::-;46358:25;;-1:-1:-1;;;46358:25:0;;48623:7;;;;46159:42;;46358:13;;:25;;46372:10;;46358:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46336:111;;;;-1:-1:-1;;;46336:111:0;;;;;;;:::i;:::-;48672:233:::1;48708:6;48733:9;48761:15;48795;48829:14;48862:5;48886:4;48672:17;:233::i;46211:87::-:0;46255:42;46211:87;:::o;52789:422::-;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;52904:89:::1;::::0;-1:-1:-1;;;52904:89:0;;-1:-1:-1;;;;;52904:15:0;::::1;::::0;::::1;::::0;:89:::1;::::0;52946:4:::1;::::0;52970:8;;52904:89:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:94:::0;52886:230:::1;;53025:79;-1:-1:-1::0;;;;;53025:17:0;::::1;53061:8:::0;53088:1:::1;53025:17;:79::i;:::-;53126:77;-1:-1:-1::0;;;;;53126:17:0;::::1;53158:8:::0;-1:-1:-1;;53126:17:0::1;:77::i;:::-;52789:422:::0;;:::o;51755:136::-;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;51821:62:::1;51840:10;51852:5;-1:-1:-1::0;;;;;51852:15:0::1;;51876:4;51852:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51821:18:0;::::1;::::0;:62;:18:::1;:62::i;:::-;51755:136:::0;:::o;49990:1590::-;50348:49;;-1:-1:-1;;;50348:49:0;;50243:12;;50269:29;;;;45950:42;;50348:13;;:49;;50362:6;;50378:4;;-1:-1:-1;;50393:2:0;50348:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50268:129:0;;-1:-1:-1;50268:129:0;-1:-1:-1;;;;;;50414:32:0;;46255:42;50414:32;:62;;;;-1:-1:-1;50450:21:0;:26;;50414:62;50410:139;;;46255:42;-1:-1:-1;;;;;50493:12:0;;50513:21;50493:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50410:139;50956:181;;-1:-1:-1;;;50956:181:0;;50907:33;;46055:42;;50956:28;;:181;;51010:15;;51045:21;;51092:9;;50907:33;;50956:181;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50907:230;;51155:9;51150:163;;51235:21;51207:25;:49;51181:120;;;;-1:-1:-1;;;51181:120:0;;;;;;;:::i;:::-;51354:55;-1:-1:-1;;;;;51354:30:0;;51385:6;51393:15;51354:30;:55::i;:::-;51471:9;51535:21;51507:25;:49;51442:130;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51422:150;;;;;49990:1590;;;;;;;;;:::o;51899:592::-;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;51989:9:::1;51984:500;52004:17:::0;;::::1;51984:500;;;52047:6;;52054:1;52047:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52047:19:0::1;;52075:4;45950:42;52047:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53:::0;52043:132:::1;;52121:38;45950:42;52157:1;52121:6;;52128:1;52121:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52121:21:0::1;::::0;:38;:21:::1;:38::i;:::-;52189:48;45950:42;-1:-1:-1::0;;52189:6:0::1;;52196:1;52189:9;;;;;;:48;52258:6;;52265:1;52258:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52258:19:0::1;;52286:4;46055:42;52258:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61:::0;52254:148:::1;;52340:46;46055:42;52384:1;52340:6;;52347:1;52340:9;;;;;;:46;52416:56;46055:42;-1:-1:-1::0;;52416:6:0::1;;52423:1;52416:9;;;;;;:56;52023:3;;51984:500;;;;51899:592:::0;;:::o;2951:244::-;2228:12;:10;:12::i;:::-;2218:6;;-1:-1:-1;;;;;2218:6:0;;;:22;;;2210:67;;;;-1:-1:-1;;;2210:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3040:22:0;::::1;3032:73;;;;-1:-1:-1::0;;;3032:73:0::1;;;;;;;:::i;:::-;3142:6;::::0;;3121:38:::1;::::0;-1:-1:-1;;;;;3121:38:0;;::::1;::::0;3142:6;::::1;::::0;3121:38:::1;::::0;::::1;3170:6;:17:::0;;-1:-1:-1;;;;;;3170:17:0::1;-1:-1:-1::0;;;;;3170:17:0;;;::::1;::::0;;;::::1;::::0;;2951:244::o;53219:682::-;53404:32;;-1:-1:-1;;;53404:32:0;;53299:34;;;;45950:42;;53404:18;;:32;;53423:1;;53426:3;;53431:4;;53404:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53404:32:0;;;;;;;;;;;;:::i;:::-;53396:40;;53481:5;:12;53467:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53467:27:0;;53447:47;;53510:9;53505:389;53529:5;:12;53525:1;:16;53505:389;;;53585:209;53620:5;53626:1;53620:8;;;;;;;;;;;;;;:18;;;53661:5;53667:1;53661:8;;;;;;;;;;;;;;:24;;;53708:5;53714:1;53708:8;;;;;;;;;;;;;;:24;;;53755:5;53761:1;53755:8;;;;;;;;;;;;;;:20;;;53585:12;:209::i;:::-;53563:320;;;53852:5;53858:1;53852:8;;;;;;;;;;;;;;:15;;;53829:17;53847:1;53829:20;;;;;;;;;;;;;:38;;;;;53563:320;53543:3;;53505:389;;;;53219:682;;:::o;644:106::-;732:10;644:106;:::o;46584:1302::-;46851:7;46860;46884:20;46880:242;;;46921:31;;:::i;:::-;46955:19;;-1:-1:-1;;;46955:19:0;;45950:42;;46955:11;;:19;;46967:6;;46955:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46921:53;;47038:1;47015:4;:20;;;:24;:48;;;;;47062:1;47043:4;:16;;;:20;47015:48;46989:121;;;;-1:-1:-1;;;46989:121:0;;;;;;;:::i;:::-;46880:242;;47134:14;47171;-1:-1:-1;;;;;47164:34:0;;47217:15;47259:4;47291;47477:6;47506:9;47538:15;47576;47614:14;47651:9;47683:10;47336:376;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47336:376:0;;;;;;;;;;;;;;-1:-1:-1;;;;;47336:376:0;-1:-1:-1;;;47336:376:0;;;47164:563;;;;;-1:-1:-1;;;;;;47164:563:0;;;;;;;;47336:376;47164:563;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47164:563:0;;;;;;;;;;;;:::i;:::-;47134:593;;47747:20;47795:1;47784:51;;;;;;;;;;;;:::i;:::-;47854:9;;47740:95;;-1:-1:-1;;;;;;;;;;;;;46584:1302:0:o;29303:622::-;29673:10;;;29672:62;;-1:-1:-1;29689:39:0;;-1:-1:-1;;;29689:39:0;;-1:-1:-1;;;;;29689:15:0;;;;;:39;;29713:4;;29720:7;;29689:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;29672:62;29664:152;;;;-1:-1:-1;;;29664:152:0;;;;;;;:::i;:::-;29827:90;29847:5;29877:22;;;29901:7;29910:5;29854:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29854:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29854:62:0;-1:-1:-1;;;;;;29854:62:0;;;;;;;;;;29827:19;:90::i;28644:177::-;28727:86;28747:5;28777:23;;;28802:2;28806:5;28754:58;;;;;;;;;:::i;30949:761::-;31373:23;31399:69;31427:4;31399:69;;;;;;;;;;;;;;;;;31407:5;-1:-1:-1;;;;;31399:27:0;;;:69;;;;;:::i;:::-;31483:17;;31373:95;;-1:-1:-1;31483:21:0;31479:224;;31625:10;31614:30;;;;;;;;;;;;:::i;:::-;31606:85;;;;-1:-1:-1;;;31606:85:0;;;;;;;:::i;12101:196::-;12204:12;12236:53;12259:6;12267:4;12273:1;12276:12;13608;13641:18;13652:6;13641:10;:18::i;:::-;13633:60;;;;-1:-1:-1;;;13633:60:0;;;;;;;:::i;:::-;13767:12;13781:23;13808:6;-1:-1:-1;;;;;13808:11:0;13828:8;13839:4;13808:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13766:78;;;;13859:7;13855:595;;;13890:10;-1:-1:-1;13883:17:0;;-1:-1:-1;13883:17:0;13855:595;14004:17;;:21;14000:439;;14267:10;14261:17;14328:15;14315:10;14311:2;14307:19;14300:44;14215:148;14410:12;14403:20;;-1:-1:-1;;;14403:20:0;;;;;;;;:::i;9183:422::-;9550:20;9589:8;;;9183:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;142:134::-;220:13;;238:33;220:13;238:33;:::i;:::-;205:71;;;;:::o;3991:3015::-;;4123:6;;4111:9;4106:3;4102:19;4098:32;4095:2;;;-1:-1;;4133:12;4095:2;4161:22;4123:6;4161:22;:::i;:::-;4152:31;;;4299:22;2921:13;4249:16;4242:86;4430:59;4485:3;4397:2;4465:9;4461:22;4430:59;:::i;:::-;4397:2;4416:5;4412:16;4405:85;4589:60;4645:3;4556:2;4625:9;4621:22;4589:60;:::i;:::-;4556:2;4575:5;4571:16;4564:86;4755:60;4811:3;4722:2;4791:9;4787:22;4755:60;:::i;:::-;4722:2;4737:16;;4730:86;4882:3;4948:22;;;7228:13;4898:16;;;4891:86;5044:3;5110:22;;;7228:13;5060:16;;;5053:86;5214:3;5280:22;;;7228:13;5230:16;;;5223:86;5390:3;5456:22;;;7228:13;5406:16;;;5399:86;5551:3;5619:22;;;7228:13;5567:18;;;5560:88;5716:3;5784:22;;;7228:13;5732:18;;;5725:88;5887:3;5955:22;;;7228:13;5903:18;;;5896:88;6054:3;6122:22;;;7228:13;6070:18;;;6063:88;6219:3;6287:22;;;7228:13;6235:18;;;6228:88;6388:3;6456:22;;;7228:13;6404:18;;;6397:88;6553:3;6621:22;;;7228:13;6569:18;;;6562:88;6719:3;6787:22;;;7228:13;6735:18;;;6728:88;6888:3;6956:22;;;7228:13;6904:18;;;6897:88;;;;4741:5;4089:2917;-1:-1;4089:2917::o;7428:132::-;7505:13;;42544:26;42533:38;;45989:34;;45979:2;;46037:1;;46027:12;7567:241;;7671:2;7659:9;7650:7;7646:23;7642:32;7639:2;;;-1:-1;;7677:12;7639:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7729:63;7633:175;-1:-1;;;7633:175::o;7815:263::-;;7930:2;7918:9;7909:7;7905:23;7901:32;7898:2;;;-1:-1;;7936:12;7898:2;226:6;220:13;238:33;265:5;238:33;:::i;8085:617::-;;;;;8240:3;8228:9;8219:7;8215:23;8211:33;8208:2;;;-1:-1;;8247:12;8208:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8299:63;-1:-1;8399:2;8438:22;;72:20;97:33;72:20;97:33;:::i;:::-;8202:500;;8407:63;;-1:-1;;;;8507:2;8546:22;;7080:20;;8615:2;8654:22;7080:20;;8202:500::o;8709:394::-;;;8844:2;8832:9;8823:7;8819:23;8815:32;8812:2;;;-1:-1;;8850:12;8812:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8902:63;-1:-1;9002:2;9055:22;;3874:20;3899:47;3874:20;3899:47;:::i;:::-;9010:77;;;;8806:297;;;;;:::o;9110:377::-;;9239:2;;9227:9;9218:7;9214:23;9210:32;9207:2;;;-1:-1;;9245:12;9207:2;9303:17;9290:31;9341:18;9333:6;9330:30;9327:2;;;-1:-1;;9363:12;9327:2;9439:22;;568:4;556:17;;552:27;-1:-1;542:2;;-1:-1;;583:12;542:2;630:6;617:20;652:80;667:64;724:6;667:64;:::i;:::-;652:80;:::i;:::-;760:21;;;817:14;;;;792:17;;;906;;;897:27;;;;894:36;-1:-1;891:2;;;-1:-1;;933:12;891:2;-1:-1;959:10;;953:206;978:6;975:1;972:13;953:206;;;2773:20;;1046:50;;1000:1;993:9;;;;;1110:14;;;;1138;;953:206;;;-1:-1;9383:88;9201:286;-1:-1;;;;;;;9201:286::o;9494:425::-;;;9647:2;9635:9;9626:7;9622:23;9618:32;9615:2;;;-1:-1;;9653:12;9615:2;9711:17;9698:31;9749:18;;9741:6;9738:30;9735:2;;;-1:-1;;9771:12;9735:2;9886:6;9875:9;9871:22;;;1343:3;1336:4;1328:6;1324:17;1320:27;1310:2;;-1:-1;;1351:12;1310:2;1394:6;1381:20;9749:18;1413:6;1410:30;1407:2;;;-1:-1;;1443:12;1407:2;1538:3;9647:2;;1522:6;1518:17;1479:6;1504:32;;1501:41;1498:2;;;-1:-1;;1545:12;1498:2;9647;1475:17;;;;;9791:112;;-1:-1;9609:310;;-1:-1;;;;9609:310::o;9926:456::-;;10098:2;;10086:9;10077:7;10073:23;10069:32;10066:2;;;-1:-1;;10104:12;10066:2;10155:17;10149:24;10193:18;10185:6;10182:30;10179:2;;;-1:-1;;10215:12;10179:2;10334:22;;1763:4;1751:17;;1747:27;-1:-1;1737:2;;-1:-1;;1778:12;1737:2;1818:6;1812:13;1840:112;1855:96;1944:6;1855:96;:::i;1840:112::-;1980:21;;;2037:14;;;;2012:17;;;2138:6;2126:19;;;2117:29;;;;2114:38;-1:-1;2111:2;;;-1:-1;;2155:12;2111:2;-1:-1;2181:10;;2175:251;2200:6;2197:1;2194:13;2175:251;;;2280:80;2356:3;2344:10;2280:80;:::i;:::-;2268:93;;2222:1;2215:9;;;;;2375:14;;;;2403:16;;;;2175:251;;;-1:-1;10235:131;;10060:322;-1:-1;;;;;;;;10060:322::o;10389:257::-;;10501:2;10489:9;10480:7;10476:23;10472:32;10469:2;;;-1:-1;;10507:12;10469:2;2652:6;2646:13;2664:30;2688:5;2664:30;:::i;10653:743::-;;;;;;10825:3;10813:9;10804:7;10800:23;10796:33;10793:2;;;-1:-1;;10832:12;10793:2;2786:6;2773:20;10884:63;;10984:2;11027:9;11023:22;72:20;97:33;124:5;97:33;:::i;:::-;10992:63;-1:-1;11092:2;11131:22;;72:20;97:33;72:20;97:33;:::i;:::-;11100:63;-1:-1;11200:2;11239:22;;7080:20;;-1:-1;11308:3;11348:22;;72:20;97:33;72:20;97:33;:::i;:::-;11317:63;;;;10787:609;;;;;;;;:::o;11403:863::-;;;;;;;11589:3;11577:9;11568:7;11564:23;11560:33;11557:2;;;-1:-1;;11596:12;11557:2;2786:6;2773:20;11648:63;;11748:2;11791:9;11787:22;72:20;97:33;124:5;97:33;:::i;:::-;11756:63;-1:-1;11856:2;11895:22;;72:20;97:33;72:20;97:33;:::i;:::-;11864:63;-1:-1;11964:2;12003:22;;7080:20;;-1:-1;12072:3;12112:22;;72:20;97:33;72:20;97:33;:::i;:::-;12081:63;-1:-1;12181:3;12218:22;;2504:20;2529:30;2504:20;2529:30;:::i;:::-;12190:60;;;;11551:715;;;;;;;;:::o;12273:989::-;;;;;;;;12476:3;12464:9;12455:7;12451:23;12447:33;12444:2;;;-1:-1;;12483:12;12444:2;2786:6;2773:20;12535:63;;12635:2;12678:9;12674:22;72:20;97:33;124:5;97:33;:::i;:::-;12643:63;-1:-1;12743:2;12782:22;;72:20;97:33;72:20;97:33;:::i;:::-;12751:63;-1:-1;12851:2;12890:22;;7080:20;;-1:-1;12959:3;12999:22;;72:20;97:33;72:20;97:33;:::i;:::-;12968:63;-1:-1;13068:3;13105:22;;2504:20;2529:30;2504:20;2529:30;:::i;:::-;13077:60;-1:-1;13174:3;13214:22;;72:20;97:33;72:20;97:33;:::i;:::-;13183:63;;;;12438:824;;;;;;;;;;:::o;13269:365::-;;;13392:2;13380:9;13371:7;13367:23;13363:32;13360:2;;;-1:-1;;13398:12;13360:2;13456:17;13443:31;13494:18;;13486:6;13483:30;13480:2;;;-1:-1;;13516:12;13480:2;13601:6;13590:9;13586:22;;;3112:3;3105:4;3097:6;3093:17;3089:27;3079:2;;-1:-1;;3120:12;3079:2;3163:6;3150:20;13494:18;3182:6;3179:30;3176:2;;;-1:-1;;3212:12;3176:2;3307:3;13392:2;3287:17;3248:6;3273:32;;3270:41;3267:2;;;-1:-1;;3314:12;13641:360;;13765:2;13753:9;13744:7;13740:23;13736:32;13733:2;;;-1:-1;;13771:12;13733:2;13822:17;13816:24;13860:18;;13852:6;13849:30;13846:2;;;-1:-1;;13882:12;13846:2;13968:6;13957:9;13953:22;;;3455:3;3448:4;3440:6;3436:17;3432:27;3422:2;;-1:-1;;3463:12;3422:2;3503:6;3497:13;13860:18;39971:6;39968:30;39965:2;;;-1:-1;;40001:12;39965:2;3525:64;40074:9;40055:17;;-1:-1;;40051:33;13765:2;40132:15;3525:64;:::i;:::-;3516:73;;3609:6;3602:5;3595:21;3713:3;13765:2;3704:6;3637;3695:16;;3692:25;3689:2;;;-1:-1;;3720:12;3689:2;3740:39;3772:6;13765:2;3671:5;3667:16;13765:2;3637:6;3633:17;3740:39;:::i;:::-;-1:-1;13902:83;13727:274;-1:-1;;;;13727:274::o;14284:328::-;;14431:3;14419:9;14410:7;14406:23;14402:33;14399:2;;;-1:-1;;14438:12;14399:2;14500:96;14588:7;14564:22;14500:96;:::i;14619:263::-;;14734:2;14722:9;14713:7;14709:23;14705:32;14702:2;;;-1:-1;;14740:12;14702:2;-1:-1;7228:13;;14696:186;-1:-1;14696:186::o;14889:399::-;;;15021:2;15009:9;15000:7;14996:23;14992:32;14989:2;;;-1:-1;;15027:12;14989:2;-1:-1;;7228:13;;15190:2;15240:22;;;7228:13;;;;;-1:-1;14983:305::o;15295:535::-;;;;15444:2;15432:9;15423:7;15419:23;15415:32;15412:2;;;-1:-1;;15450:12;15412:2;7234:6;7228:13;15502:74;;15613:2;15667:9;15663:22;7228:13;15621:74;;15732:2;15786:9;15782:22;220:13;238:33;265:5;238:33;:::i;:::-;15740:74;;;;15406:424;;;;;:::o;15837:688::-;;;;;16011:3;15999:9;15990:7;15986:23;15982:33;15979:2;;;-1:-1;;16018:12;15979:2;7234:6;7228:13;16070:74;;16181:2;16235:9;16231:22;7228:13;16189:74;;16300:2;16362:9;16358:22;369:13;387:41;422:5;387:41;:::i;:::-;16427:2;16477:22;;;;7228:13;15973:552;;;;-1:-1;;;15973:552::o;16532:259::-;;16645:2;16633:9;16624:7;16620:23;16616:32;16613:2;;;-1:-1;;16651:12;16613:2;7373:6;7367:13;42455:4;45894:5;42444:16;45871:5;45868:33;45858:2;;-1:-1;;45905:12;19552:343;;19694:5;40425:12;40969:6;40964:3;40957:19;19787:52;19832:6;41006:4;41001:3;40997:14;41006:4;19813:5;19809:16;19787:52;:::i;:::-;40074:9;44992:14;-1:-1;;44988:28;19851:39;;;;41006:4;19851:39;;19642:253;-1:-1;;19642:253::o;25318:335::-;40425:12;;25318:335;;25503:125;;40288:4;40279:14;;;25318:335;18795:268;18820:6;18817:1;18814:13;18795:268;;;18881:13;;19265:37;;16952:14;;;;40812;;;;18842:1;18835:9;18795:268;;;-1:-1;25638:10;;25484:169;-1:-1;;;;;;25484:169::o;25660:271::-;;20062:5;40425:12;20173:52;20218:6;20213:3;20206:4;20199:5;20195:16;20173:52;:::i;:::-;20237:16;;;;;25794:137;-1:-1;;25794:137::o;25938:222::-;-1:-1;;;;;42239:54;;;;17414:45;;26065:2;26050:18;;26036:124::o;26412:349::-;-1:-1;;;;;42239:54;;;17257:58;;42239:54;;26747:2;26732:18;;17414:45;26575:2;26560:18;;26546:215::o;27108:333::-;-1:-1;;;;;42239:54;;;;17414:45;;27427:2;27412:18;;19265:37;27263:2;27248:18;;27234:207::o;27448:370::-;27625:2;27639:47;;;40425:12;;27610:18;;;40957:19;;;27448:370;;27625:2;40279:14;;;;40997;;;;27448:370;18030:260;18055:6;18052:1;18049:13;18030:260;;;18116:13;;19265:37;;40812:14;;;;16952;;;;18077:1;18070:9;18030:260;;;-1:-1;27692:116;;27596:222;-1:-1;;;;;;27596:222::o;27825:210::-;41960:13;;41953:21;19158:34;;27946:2;27931:18;;27917:118::o;28042:405::-;;19185:5;41960:13;41953:21;19165:3;19158:34;28209:2;28321;28310:9;28306:18;28299:48;28361:76;28209:2;28198:9;28194:18;28423:6;28361:76;:::i;28454:222::-;19265:37;;;28581:2;28566:18;;28552:124::o;28683:460::-;19265:37;;;-1:-1;;;;;42239:54;;;;29046:2;29031:18;;17257:58;29129:2;29114:18;;19265:37;28874:2;28859:18;;28845:298::o;29150:768::-;19265:37;;;-1:-1;;;;;42239:54;;;29576:2;29561:18;;17414:45;42239:54;;;29659:2;29644:18;;17414:45;29742:2;29727:18;;19265:37;;;;42239:54;;;29825:3;29810:19;;17414:45;41960:13;41953:21;42250:42;29888:19;;19158:34;29411:3;29396:19;;29382:536::o;29925:912::-;19265:37;;;-1:-1;;;;;42239:54;;;30395:2;30380:18;;17414:45;42239:54;;;30478:2;30463:18;;17414:45;30561:2;30546:18;;19265:37;;;;42239:54;;30644:3;30629:19;;17414:45;41960:13;41953:21;42250:42;30707:19;;19158:34;42239:54;30822:3;30807:19;;17414:45;30230:3;30215:19;;30201:636::o;30844:306::-;;30989:2;31010:17;31003:47;31064:76;30989:2;30978:9;30974:18;31126:6;31064:76;:::i;31412:500::-;-1:-1;;;;;42239:54;;;20349:63;;42239:54;;;;31815:2;31800:18;;20349:63;31898:2;31883:18;;19265:37;;;;31623:2;31608:18;;31594:318::o;31919:628::-;-1:-1;;;;;42239:54;;;20349:63;;32345:2;32330:18;;19265:37;;;;42239:54;;32442:2;32427:18;;20349:63;32533:2;32518:18;;21157:58;;;;32166:3;32151:19;;32137:410::o;33335:468::-;21157:58;;;33712:2;33697:18;;21157:58;;;;41960:13;41953:21;33789:2;33774:18;;19158:34;33530:2;33515:18;;33501:302::o;34127:416::-;34327:2;34341:47;;;21959:2;34312:18;;;40957:19;21995:34;40997:14;;;21975:55;-1:-1;;;22050:12;;;22043:30;22092:12;;;34298:245::o;34550:416::-;34750:2;34764:47;;;22343:2;34735:18;;;40957:19;-1:-1;;;40997:14;;;22359:37;22415:12;;;34721:245::o;34973:416::-;35173:2;35187:47;;;35158:18;;;40957:19;22702:34;40997:14;;;22682:55;22756:12;;;35144:245::o;35396:416::-;35596:2;35610:47;;;23007:2;35581:18;;;40957:19;23043:34;40997:14;;;23023:55;-1:-1;;;23098:12;;;23091:28;23138:12;;;35567:245::o;35819:416::-;36019:2;36033:47;;;23389:2;36004:18;;;40957:19;-1:-1;;;40997:14;;;23405:34;23458:12;;;35990:245::o;36242:416::-;36442:2;36456:47;;;23980:2;36427:18;;;40957:19;24016:31;40997:14;;;23996:52;24067:12;;;36413:245::o;36665:416::-;36865:2;36879:47;;;24318:1;36850:18;;;40957:19;-1:-1;;;40997:14;;;24333:32;24384:12;;;36836:245::o;37088:416::-;37288:2;37302:47;;;24635:2;37273:18;;;40957:19;24671:34;40997:14;;;24651:55;-1:-1;;;24726:12;;;24719:34;24772:12;;;37259:245::o;37511:416::-;37711:2;37725:47;;;25023:2;37696:18;;;40957:19;25059:34;40997:14;;;25039:55;-1:-1;;;25114:12;;;25107:46;25172:12;;;37682:245::o;37934:978::-;19265:37;;;-1:-1;;;;;42239:54;;;38453:2;38438:18;;17257:58;42239:54;;38544:2;38529:18;;17257:58;42250:42;38581:2;38566:18;;38559:48;;;37934:978;38265:19;;;40957;;;40997:14;38785:3;38770:19;;38763:49;;;38826:76;;40997:14;;38888:6;38826:76;:::i;:::-;38818:84;38251:661;-1:-1;;;;;;38251:661::o;38919:256::-;38981:2;38975:9;39007:17;;;39082:18;39067:34;;39103:22;;;39064:62;39061:2;;;39139:1;;39129:12;39061:2;38981;39148:22;38959:216;;-1:-1;38959:216::o;39182:304::-;;39341:18;39333:6;39330:30;39327:2;;;-1:-1;;39363:12;39327:2;-1:-1;39408:4;39396:17;;;39461:15;;39264:222::o;44648:268::-;44713:1;44720:101;44734:6;44731:1;44728:13;44720:101;;;44801:11;;;44795:18;44782:11;;;44775:39;44756:2;44749:10;44720:101;;;44836:6;44833:1;44830:13;44827:2;;;44713:1;44892:6;44887:3;44883:16;44876:27;44827:2;;44697:219;;;:::o;45029:117::-;-1:-1;;;;;42239:54;;45088:35;;45078:2;;45137:1;;45127:12;45293:111;45374:5;41960:13;41953:21;45352:5;45349:32;45339:2;;45395:1;;45385:12
Swarm Source
ipfs://6946f8c3b54265b81a9b60223930473f59eef8b9a9a43290ad5a3aae94f3618b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.