ETH Price: $3,892.85 (-0.71%)

Contract

0x06f12B17D97EF27152B68cba208e3415EA65369B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Close206202152024-08-27 13:27:11109 days ago1724765231IN
0x06f12B17...5EA65369B
0 ETH0.000649352.22972066
Close205714992024-08-20 18:03:47116 days ago1724177027IN
0x06f12B17...5EA65369B
0 ETH0.001213894.26147314
Close202673292024-07-09 7:04:23158 days ago1720508663IN
0x06f12B17...5EA65369B
0 ETH0.000786552.80749852
Close197570592024-04-28 23:21:35230 days ago1714346495IN
0x06f12B17...5EA65369B
0 ETH0.001699835.98776479
Close197484932024-04-27 18:35:47231 days ago1714242947IN
0x06f12B17...5EA65369B
0 ETH0.00173076.15472043
Close197484872024-04-27 18:34:35231 days ago1714242875IN
0x06f12B17...5EA65369B
0 ETH0.001795676.30110306
Close193970862024-03-09 10:57:23280 days ago1709981843IN
0x06f12B17...5EA65369B
0 ETH0.0129027845.48710148
Close191985052024-02-10 15:11:47308 days ago1707577907IN
0x06f12B17...5EA65369B
0 ETH0.0089829333.73680475
Close186064172023-11-19 14:21:59391 days ago1700403719IN
0x06f12B17...5EA65369B
0 ETH0.0051238217.25612466
Close185582402023-11-12 20:32:59398 days ago1699821179IN
0x06f12B17...5EA65369B
0 ETH0.0081489525.75614061
Close185581332023-11-12 20:11:35398 days ago1699819895IN
0x06f12B17...5EA65369B
0 ETH0.0006690926.76395582
Close184736902023-11-01 0:29:59410 days ago1698798599IN
0x06f12B17...5EA65369B
0 ETH0.0063906222.14306452
Close181525722023-09-17 1:37:11455 days ago1694914631IN
0x06f12B17...5EA65369B
0 ETH0.002827919
Close181303752023-09-13 22:31:59458 days ago1694644319IN
0x06f12B17...5EA65369B
0 ETH0.0032513210.90317636
Close180590512023-09-03 22:50:11468 days ago1693781411IN
0x06f12B17...5EA65369B
0 ETH0.0026740310.96481508
Close180590512023-09-03 22:50:11468 days ago1693781411IN
0x06f12B17...5EA65369B
0 ETH0.0032690910.96481508
Close178971392023-08-12 6:56:59490 days ago1691823419IN
0x06f12B17...5EA65369B
0 ETH0.0051429616.25109694
Close178969342023-08-12 6:15:59490 days ago1691820959IN
0x06f12B17...5EA65369B
0 ETH0.0049789815.73302247
Close174103482023-06-04 22:59:47559 days ago1685919587IN
0x06f12B17...5EA65369B
0 ETH0.0054834319
Close168564372023-03-18 18:31:23637 days ago1679164283IN
0x06f12B17...5EA65369B
0 ETH0.0053964719.19703886
Close168360982023-03-15 21:55:47640 days ago1678917347IN
0x06f12B17...5EA65369B
0 ETH0.0072004122.9987984
Close167648072023-03-05 21:16:23650 days ago1678050983IN
0x06f12B17...5EA65369B
0 ETH0.0098547534.01873787
Close167205122023-02-27 15:46:47656 days ago1677512807IN
0x06f12B17...5EA65369B
0 ETH0.0098647433.7353273
Close166251792023-02-14 6:22:59669 days ago1676355779IN
0x06f12B17...5EA65369B
0 ETH0.0042818715.23001613
Close164756362023-01-24 9:00:23690 days ago1674550823IN
0x06f12B17...5EA65369B
0 ETH0.0055145917.71371277
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
205714992024-08-20 18:03:47116 days ago1724177027
0x06f12B17...5EA65369B
0.00913193 ETH
205714992024-08-20 18:03:47116 days ago1724177027
0x06f12B17...5EA65369B
0.00913193 ETH
202673292024-07-09 7:04:23158 days ago1720508663
0x06f12B17...5EA65369B
0.021122 ETH
202673292024-07-09 7:04:23158 days ago1720508663
0x06f12B17...5EA65369B
0.021122 ETH
197570592024-04-28 23:21:35230 days ago1714346495
0x06f12B17...5EA65369B
0.01004269 ETH
197570592024-04-28 23:21:35230 days ago1714346495
0x06f12B17...5EA65369B
0.01004269 ETH
197484932024-04-27 18:35:47231 days ago1714242947
0x06f12B17...5EA65369B
0.01165699 ETH
197484932024-04-27 18:35:47231 days ago1714242947
0x06f12B17...5EA65369B
0.01165699 ETH
197484872024-04-27 18:34:35231 days ago1714242875
0x06f12B17...5EA65369B
0.01189361 ETH
197484872024-04-27 18:34:35231 days ago1714242875
0x06f12B17...5EA65369B
0.01189361 ETH
193970862024-03-09 10:57:23280 days ago1709981843
0x06f12B17...5EA65369B
0.08720419 ETH
193970862024-03-09 10:57:23280 days ago1709981843
0x06f12B17...5EA65369B
0.08720419 ETH
186064172023-11-19 14:21:59391 days ago1700403719
0x06f12B17...5EA65369B
0.02206009 ETH
186064172023-11-19 14:21:59391 days ago1700403719
0x06f12B17...5EA65369B
0.02206009 ETH
184736902023-11-01 0:29:59410 days ago1698798599
0x06f12B17...5EA65369B
0.03057582 ETH
184736902023-11-01 0:29:59410 days ago1698798599
0x06f12B17...5EA65369B
0.03057582 ETH
174103482023-06-04 22:59:47559 days ago1685919587
0x06f12B17...5EA65369B
0.03537909 ETH
174103482023-06-04 22:59:47559 days ago1685919587
0x06f12B17...5EA65369B
0.03537909 ETH
167648072023-03-05 21:16:23650 days ago1678050983
0x06f12B17...5EA65369B
0.07979554 ETH
167648072023-03-05 21:16:23650 days ago1678050983
0x06f12B17...5EA65369B
0.07979554 ETH
167205122023-02-27 15:46:47656 days ago1677512807
0x06f12B17...5EA65369B
6.33951667 ETH
167205122023-02-27 15:46:47656 days ago1677512807
0x06f12B17...5EA65369B
6.33951667 ETH
162548472022-12-24 13:19:23721 days ago1671887963
0x06f12B17...5EA65369B
0.69125426 ETH
162548472022-12-24 13:19:23721 days ago1671887963
0x06f12B17...5EA65369B
0.69125426 ETH
158575812022-10-30 1:26:35777 days ago1667093195
0x06f12B17...5EA65369B
0.01009311 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BetaRunnerUniswapV3

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-24
*/

// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.8.6;



// Part: BetaRunnerWithCallback

contract BetaRunnerWithCallback {
  address private constant NO_CALLER = address(42); // nonzero so we don't repeatedly clear storage
  address private caller = NO_CALLER;

  modifier withCallback() {
    require(caller == NO_CALLER);
    caller = msg.sender;
    _;
    caller = NO_CALLER;
  }

  modifier isCallback() {
    require(caller == tx.origin);
    _;
  }
}

// Part: BytesLib

library BytesLib {
  function slice(
    bytes memory _bytes,
    uint _start,
    uint _length
  ) internal pure returns (bytes memory) {
    require(_length + 31 >= _length, 'slice_overflow');
    require(_start + _length >= _start, 'slice_overflow');
    require(_bytes.length >= _start + _length, 'slice_outOfBounds');

    bytes memory tempBytes;

    assembly {
      switch iszero(_length)
      case 0 {
        // Get a location of some free memory and store it in tempBytes as
        // Solidity does for memory variables.
        tempBytes := mload(0x40)

        // The first word of the slice result is potentially a partial
        // word read from the original array. To read it, we calculate
        // the length of that partial word and start copying that many
        // bytes into the array. The first word we copy will start with
        // data we don't care about, but the last `lengthmod` bytes will
        // land at the beginning of the contents of the new array. When
        // we're done copying, we overwrite the full first word with
        // the actual length of the slice.
        let lengthmod := and(_length, 31)

        // The multiplication in the next line is necessary
        // because when slicing multiples of 32 bytes (lengthmod == 0)
        // the following copy loop was copying the origin's length
        // and then ending prematurely not copying everything it should.
        let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
        let end := add(mc, _length)

        for {
          // The multiplication in the next line has the same exact purpose
          // as the one above.
          let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
        } lt(mc, end) {
          mc := add(mc, 0x20)
          cc := add(cc, 0x20)
        } {
          mstore(mc, mload(cc))
        }

        mstore(tempBytes, _length)

        //update free-memory pointer
        //allocating the array padded to 32 bytes like the compiler does now
        mstore(0x40, and(add(mc, 31), not(31)))
      }
      //if we want a zero-length slice let's just return a zero-length array
      default {
        tempBytes := mload(0x40)
        //zero out the 32 bytes slice we are about to return
        //we need to do it because Solidity does not garbage collect
        mstore(tempBytes, 0)

        mstore(0x40, add(tempBytes, 0x20))
      }
    }

    return tempBytes;
  }

  function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {
    require(_start + 20 >= _start, 'toAddress_overflow');
    require(_bytes.length >= _start + 20, 'toAddress_outOfBounds');
    address tempAddress;

    assembly {
      tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
    }

    return tempAddress;
  }

  function toUint24(bytes memory _bytes, uint _start) internal pure returns (uint24) {
    require(_start + 3 >= _start, 'toUint24_overflow');
    require(_bytes.length >= _start + 3, 'toUint24_outOfBounds');
    uint24 tempUint;

    assembly {
      tempUint := mload(add(add(_bytes, 0x3), _start))
    }

    return tempUint;
  }
}

// Part: IBetaBank

interface IBetaBank {
  /// @dev Returns the address of BToken of the given underlying token, or 0 if not exists.
  function bTokens(address _underlying) external view returns (address);

  /// @dev Returns the address of the underlying of the given BToken, or 0 if not exists.
  function underlyings(address _bToken) external view returns (address);

  /// @dev Returns the address of the oracle contract.
  function oracle() external view returns (address);

  /// @dev Returns the address of the config contract.
  function config() external view returns (address);

  /// @dev Returns the interest rate model smart contract.
  function interestModel() external view returns (address);

  /// @dev Returns the position's collateral token and AmToken.
  function getPositionTokens(address _owner, uint _pid)
    external
    view
    returns (address _collateral, address _bToken);

  /// @dev Returns the debt of the given position. Can't be view as it needs to call accrue.
  function fetchPositionDebt(address _owner, uint _pid) external returns (uint);

  /// @dev Returns the LTV of the given position. Can't be view as it needs to call accrue.
  function fetchPositionLTV(address _owner, uint _pid) external returns (uint);

  /// @dev Opens a new position in the Beta smart contract.
  function open(
    address _owner,
    address _underlying,
    address _collateral
  ) external returns (uint pid);

  /// @dev Borrows tokens on the given position.
  function borrow(
    address _owner,
    uint _pid,
    uint _amount
  ) external;

  /// @dev Repays tokens on the given position.
  function repay(
    address _owner,
    uint _pid,
    uint _amount
  ) external;

  /// @dev Puts more collateral to the given position.
  function put(
    address _owner,
    uint _pid,
    uint _amount
  ) external;

  /// @dev Takes some collateral out of the position.
  function take(
    address _owner,
    uint _pid,
    uint _amount
  ) external;

  /// @dev Liquidates the given position.
  function liquidate(
    address _owner,
    uint _pid,
    uint _amount
  ) external;
}

// Part: IUniswapV3Pool

interface IUniswapV3Pool {
  function mint(
    address recipient,
    int24 tickLower,
    int24 tickUpper,
    uint128 amount,
    bytes calldata data
  ) external returns (uint amount0, uint amount1);

  function swap(
    address recipient,
    bool zeroForOne,
    int amountSpecified,
    uint160 sqrtPriceLimitX96,
    bytes calldata data
  ) external returns (int amount0, int amount1);

  function initialize(uint160 sqrtPriceX96) external;
}

// Part: IUniswapV3SwapCallback

interface IUniswapV3SwapCallback {
  function uniswapV3SwapCallback(
    int amount0Delta,
    int amount1Delta,
    bytes calldata data
  ) external;
}

// Part: IWETH

interface IWETH {
  function deposit() external payable;

  function withdraw(uint wad) external;

  function approve(address guy, uint wad) external returns (bool);
}

// Part: OpenZeppelin/[email protected]/Address

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        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");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// Part: OpenZeppelin/[email protected]/Context

/*
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// Part: OpenZeppelin/[email protected]/IERC20

/**
 * @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);
}

// Part: OpenZeppelin/[email protected]/Math

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute.
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// Part: SafeCast

/// @title Safe casting methods
/// @notice Contains methods for safely casting between types
library SafeCast {
  /// @notice Cast a uint256 to a uint160, revert on overflow
  /// @param y The uint256 to be downcasted
  /// @return z The downcasted integer, now type uint160
  function toUint160(uint y) internal pure returns (uint160 z) {
    require((z = uint160(y)) == y);
  }

  /// @notice Cast a int256 to a int128, revert on overflow or underflow
  /// @param y The int256 to be downcasted
  /// @return z The downcasted integer, now type int128
  function toInt128(int y) internal pure returns (int128 z) {
    require((z = int128(y)) == y);
  }

  /// @notice Cast a uint256 to a int256, revert on overflow
  /// @param y The uint256 to be casted
  /// @return z The casted integer, now type int256
  function toInt256(uint y) internal pure returns (int z) {
    require(y < 2**255);
    z = int(y);
  }
}

// Part: OpenZeppelin/[email protected]/Ownable

/**
 * @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.
 */
abstract 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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// Part: OpenZeppelin/[email protected]/SafeERC20

/**
 * @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 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'
        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) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _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
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// Part: Path

/// @title Functions for manipulating path data for multihop swaps
library Path {
  using BytesLib for bytes;

  /// @dev The length of the bytes encoded address
  uint private constant ADDR_SIZE = 20;
  /// @dev The length of the bytes encoded fee
  uint private constant FEE_SIZE = 3;

  /// @dev The offset of a single token address and pool fee
  uint private constant NEXT_OFFSET = ADDR_SIZE + FEE_SIZE;
  /// @dev The offset of an encoded pool key
  uint private constant POP_OFFSET = NEXT_OFFSET + ADDR_SIZE;
  /// @dev The minimum length of an encoding that contains 2 or more pools
  uint private constant MULTIPLE_POOLS_MIN_LENGTH = POP_OFFSET + NEXT_OFFSET;

  /// @notice Returns true iff the path contains two or more pools
  /// @param path The encoded swap path
  /// @return True if path contains two or more pools, otherwise false
  function hasMultiplePools(bytes memory path) internal pure returns (bool) {
    return path.length >= MULTIPLE_POOLS_MIN_LENGTH;
  }

  /// @notice Decodes the first pool in path
  /// @param path The bytes encoded swap path
  /// @return tokenA The first token of the given pool
  /// @return tokenB The second token of the given pool
  /// @return fee The fee level of the pool
  function decodeFirstPool(bytes memory path)
    internal
    pure
    returns (
      address tokenA,
      address tokenB,
      uint24 fee
    )
  {
    tokenA = path.toAddress(0);
    fee = path.toUint24(ADDR_SIZE);
    tokenB = path.toAddress(NEXT_OFFSET);
  }

  /// @notice Decodes the last pool in path
  /// @param path The bytes encoded swap path
  /// @return tokenA The first token of the given pool
  /// @return tokenB The second token of the given pool
  /// @return fee The fee level of the pool
  function decodeLastPool(bytes memory path)
    internal
    pure
    returns (
      address tokenA,
      address tokenB,
      uint24 fee
    )
  {
    tokenB = path.toAddress(path.length - ADDR_SIZE);
    fee = path.toUint24(path.length - NEXT_OFFSET);
    tokenA = path.toAddress(path.length - POP_OFFSET);
  }

  /// @notice Skips a token + fee element from the buffer and returns the remainder
  /// @param path The swap path
  /// @return The remaining token + fee elements in the path
  function skipToken(bytes memory path) internal pure returns (bytes memory) {
    return path.slice(NEXT_OFFSET, path.length - NEXT_OFFSET);
  }
}

// Part: BetaRunnerBase

contract BetaRunnerBase is Ownable {
  using SafeERC20 for IERC20;

  address public immutable betaBank;
  address public immutable weth;

  modifier onlyEOA() {
    require(msg.sender == tx.origin, 'BetaRunnerBase/not-eoa');
    _;
  }

  constructor(address _betaBank, address _weth) {
    address bweth = IBetaBank(_betaBank).bTokens(_weth);
    require(bweth != address(0), 'BetaRunnerBase/no-bweth');
    IERC20(_weth).safeApprove(_betaBank, type(uint).max);
    IERC20(_weth).safeApprove(bweth, type(uint).max);
    betaBank = _betaBank;
    weth = _weth;
  }

  function _borrow(
    address _owner,
    uint _pid,
    address _underlying,
    address _collateral,
    uint _amountBorrow,
    uint _amountCollateral
  ) internal {
    if (_pid == type(uint).max) {
      _pid = IBetaBank(betaBank).open(_owner, _underlying, _collateral);
    } else {
      (address collateral, address bToken) = IBetaBank(betaBank).getPositionTokens(_owner, _pid);
      require(_collateral == collateral, '_borrow/collateral-not-_collateral');
      require(_underlying == IBetaBank(betaBank).underlyings(bToken), '_borrow/bad-underlying');
    }
    _approve(_collateral, betaBank, _amountCollateral);
    IBetaBank(betaBank).put(_owner, _pid, _amountCollateral);
    IBetaBank(betaBank).borrow(_owner, _pid, _amountBorrow);
  }

  function _repay(
    address _owner,
    uint _pid,
    address _underlying,
    address _collateral,
    uint _amountRepay,
    uint _amountCollateral
  ) internal {
    (address collateral, address bToken) = IBetaBank(betaBank).getPositionTokens(_owner, _pid);
    require(_collateral == collateral, '_repay/collateral-not-_collateral');
    require(_underlying == IBetaBank(betaBank).underlyings(bToken), '_repay/bad-underlying');
    _approve(_underlying, bToken, _amountRepay);
    IBetaBank(betaBank).repay(_owner, _pid, _amountRepay);
    IBetaBank(betaBank).take(_owner, _pid, _amountCollateral);
  }

  function _transferIn(
    address _token,
    address _from,
    uint _amount
  ) internal {
    if (_token == weth) {
      require(_from == msg.sender, '_transferIn/not-from-sender');
      require(_amount <= msg.value, '_transferIn/insufficient-eth-amount');
      IWETH(weth).deposit{value: _amount}();
      if (msg.value > _amount) {
        (bool success, ) = _from.call{value: msg.value - _amount}(new bytes(0));
        require(success, '_transferIn/eth-transfer-failed');
      }
    } else {
      IERC20(_token).safeTransferFrom(_from, address(this), _amount);
    }
  }

  function _transferOut(
    address _token,
    address _to,
    uint _amount
  ) internal {
    if (_token == weth) {
      IWETH(weth).withdraw(_amount);
      (bool success, ) = _to.call{value: _amount}(new bytes(0));
      require(success, '_transferOut/eth-transfer-failed');
    } else {
      IERC20(_token).safeTransfer(_to, _amount);
    }
  }

  /// @dev Approves infinite on the given token for the given spender if current approval is insufficient.
  function _approve(
    address _token,
    address _spender,
    uint _minAmount
  ) internal {
    uint current = IERC20(_token).allowance(address(this), _spender);
    if (current < _minAmount) {
      if (current != 0) {
        IERC20(_token).safeApprove(_spender, 0);
      }
      IERC20(_token).safeApprove(_spender, type(uint).max);
    }
  }

  /// @dev Caps repay amount by current position's debt.
  function _capRepay(
    address _owner,
    uint _pid,
    uint _amountRepay
  ) internal returns (uint) {
    return Math.min(_amountRepay, IBetaBank(betaBank).fetchPositionDebt(_owner, _pid));
  }

  /// @dev Recovers lost tokens for whatever reason by the owner.
  function recover(address _token, uint _amount) external onlyOwner {
    if (_amount == type(uint).max) {
      _amount = IERC20(_token).balanceOf(address(this));
    }
    IERC20(_token).safeTransfer(msg.sender, _amount);
  }

  /// @dev Recovers lost ETH for whatever reason by the owner.
  function recoverETH(uint _amount) external onlyOwner {
    if (_amount == type(uint).max) {
      _amount = address(this).balance;
    }
    (bool success, ) = msg.sender.call{value: _amount}(new bytes(0));
    require(success, 'recoverETH/eth-transfer-failed');
  }

  /// @dev Override Ownable.sol renounceOwnership to prevent accidental call
  function renounceOwnership() public override onlyOwner {
    revert('renounceOwnership/disabled');
  }

  receive() external payable {
    require(msg.sender == weth, 'receive/not-weth');
  }
}

// File: BetaRunnerUniswapV3.sol

contract BetaRunnerUniswapV3 is BetaRunnerBase, BetaRunnerWithCallback, IUniswapV3SwapCallback {
  using SafeERC20 for IERC20;
  using Path for bytes;
  using SafeCast for uint;

  /// @dev Constants from Uniswap V3 to be used for swap
  /// (https://github.com/Uniswap/uniswap-v3-core/blob/main/contracts/libraries/TickMath.sol)
  uint160 internal constant MIN_SQRT_RATIO = 4295128739;
  uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;

  address public immutable factory;
  bytes32 public immutable codeHash;

  constructor(
    address _betaBank,
    address _weth,
    address _factory,
    bytes32 _codeHash
  ) BetaRunnerBase(_betaBank, _weth) {
    factory = _factory;
    codeHash = _codeHash;
  }

  struct ShortData {
    uint pid;
    uint amountBorrow;
    uint amountPutExtra;
    bytes path;
    uint amountOutMin;
  }

  struct CloseData {
    uint pid;
    uint amountRepay;
    uint amountTake;
    bytes path;
    uint amountInMax;
  }

  struct CallbackData {
    uint pid;
    address path0;
    uint amount0;
    int memo; // positive if short (extra collateral) | negative if close (amount to take)
    bytes path;
    uint slippageControl; // amountInMax if close | amountOutMin if short
  }

  /// @dev Borrows the asset using the given collateral, and swaps it using the given path.
  function short(ShortData calldata _data) external payable onlyEOA withCallback {
    (, address collateral, ) = _data.path.decodeLastPool();
    _transferIn(collateral, msg.sender, _data.amountPutExtra);
    (address tokenIn, address tokenOut, uint24 fee) = _data.path.decodeFirstPool();
    bool zeroForOne = tokenIn < tokenOut;
    CallbackData memory cb = CallbackData({
      pid: _data.pid,
      path0: tokenIn,
      amount0: _data.amountBorrow,
      memo: _data.amountPutExtra.toInt256(),
      path: _data.path,
      slippageControl: _data.amountOutMin
    });
    IUniswapV3Pool(_poolFor(tokenIn, tokenOut, fee)).swap(
      address(this),
      zeroForOne,
      _data.amountBorrow.toInt256(),
      zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1,
      abi.encode(cb)
    );
  }

  /// @dev Swaps the collateral to the underlying asset using the given path, and repays it to the pool.
  function close(CloseData calldata _data) external payable onlyEOA withCallback {
    uint amountRepay = _capRepay(msg.sender, _data.pid, _data.amountRepay);
    (address tokenOut, address tokenIn, uint24 fee) = _data.path.decodeFirstPool();
    bool zeroForOne = tokenIn < tokenOut;
    CallbackData memory cb = CallbackData({
      pid: _data.pid,
      path0: tokenOut,
      amount0: amountRepay,
      memo: -_data.amountTake.toInt256(),
      path: _data.path,
      slippageControl: _data.amountInMax
    });
    IUniswapV3Pool(_poolFor(tokenIn, tokenOut, fee)).swap(
      address(this),
      zeroForOne,
      -amountRepay.toInt256(),
      zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1,
      abi.encode(cb)
    );
  }

  /// @dev Continues the action through uniswapv3
  function uniswapV3SwapCallback(
    int _amount0Delta,
    int _amount1Delta,
    bytes calldata _data
  ) external override isCallback {
    CallbackData memory data = abi.decode(_data, (CallbackData));
    (uint amountToPay, uint amountReceived) = _amount0Delta > 0
      ? (uint(_amount0Delta), uint(-_amount1Delta))
      : (uint(_amount1Delta), uint(-_amount0Delta));
    if (data.memo > 0) {
      _shortCallback(amountToPay, amountReceived, data);
    } else {
      _closeCallback(amountToPay, amountReceived, data);
    }
  }

  function _shortCallback(
    uint _amountToPay,
    uint _amountReceived,
    CallbackData memory data
  ) internal {
    (address tokenIn, address tokenOut, uint24 prevFee) = data.path.decodeFirstPool();
    require(msg.sender == _poolFor(tokenIn, tokenOut, prevFee), '_shortCallback/bad-caller');
    if (data.path.hasMultiplePools()) {
      data.path = data.path.skipToken();
      (, address tokenNext, uint24 fee) = data.path.decodeFirstPool();
      bool zeroForOne = tokenOut < tokenNext;
      IUniswapV3Pool(_poolFor(tokenOut, tokenNext, fee)).swap(
        address(this),
        zeroForOne,
        _amountReceived.toInt256(),
        zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1,
        abi.encode(data)
      );
    } else {
      uint amountPut = _amountReceived + uint(data.memo);
      require(_amountReceived >= data.slippageControl, '!slippage');
      _borrow(tx.origin, data.pid, data.path0, tokenOut, data.amount0, amountPut);
    }
    IERC20(tokenIn).safeTransfer(msg.sender, _amountToPay);
  }

  function _closeCallback(
    uint _amountToPay,
    uint,
    CallbackData memory data
  ) internal {
    (address tokenOut, address tokenIn, uint24 prevFee) = data.path.decodeFirstPool();
    require(msg.sender == _poolFor(tokenIn, tokenOut, prevFee), '_closeCallback/bad-caller');
    if (data.path.hasMultiplePools()) {
      data.path = data.path.skipToken();
      (, address tokenNext, uint24 fee) = data.path.decodeFirstPool();
      bool zeroForOne = tokenNext < tokenIn;
      IUniswapV3Pool(_poolFor(tokenIn, tokenNext, fee)).swap(
        msg.sender,
        zeroForOne,
        -_amountToPay.toInt256(),
        zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1,
        abi.encode(data)
      );
    } else {
      require(_amountToPay <= data.slippageControl, '!slippage');
      uint amountTake = uint(-data.memo);
      _repay(tx.origin, data.pid, data.path0, tokenIn, data.amount0, amountTake);
      IERC20(tokenIn).safeTransfer(msg.sender, _amountToPay);
      _transferOut(tokenIn, tx.origin, IERC20(tokenIn).balanceOf(address(this)));
    }
  }

  function _poolFor(
    address tokenA,
    address tokenB,
    uint24 fee
  ) internal view returns (address) {
    (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    bytes32 salt = keccak256(abi.encode(token0, token1, fee));
    return address(uint160(uint(keccak256(abi.encodePacked(hex'ff', factory, salt, codeHash)))));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_betaBank","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bytes32","name":"_codeHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"betaBank","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amountRepay","type":"uint256"},{"internalType":"uint256","name":"amountTake","type":"uint256"},{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountInMax","type":"uint256"}],"internalType":"struct BetaRunnerUniswapV3.CloseData","name":"_data","type":"tuple"}],"name":"close","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"codeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amountBorrow","type":"uint256"},{"internalType":"uint256","name":"amountPutExtra","type":"uint256"},{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"internalType":"struct BetaRunnerUniswapV3.ShortData","name":"_data","type":"tuple"}],"name":"short","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_amount0Delta","type":"int256"},{"internalType":"int256","name":"_amount1Delta","type":"int256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"uniswapV3SwapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052600180546001600160a01b031916602a1790553480156200002557600080fd5b506040516200336e3803806200336e833981016040819052620000489162000607565b83836200005533620001b3565b6040516328f528cd60e11b81526001600160a01b038281166004830152600091908416906351ea519a9060240160206040518083038186803b1580156200009b57600080fd5b505afa158015620000b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d69190620005e9565b90506001600160a01b038116620001345760405162461bcd60e51b815260206004820152601760248201527f4265746152756e6e6572426173652f6e6f2d627765746800000000000000000060448201526064015b60405180910390fd5b6200015b83600019846001600160a01b03166200020360201b62000a9c179092919060201c565b6200018281600019846001600160a01b03166200020360201b62000a9c179092919060201c565b506001600160601b0319606092831b811660805290821b811660a05292901b90911660c05260e052506200071d9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580620002915750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200025457600080fd5b505afa15801562000269573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028f91906200067d565b155b620003055760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200012b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200035d9185916200036216565b505050565b6000620003be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200044060201b62000bf8179092919060201c565b8051909150156200035d5780806020019051810190620003df919062000659565b6200035d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200012b565b60606200045184846000856200045b565b90505b9392505050565b606082471015620004be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200012b565b843b6200050e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200012b565b600080866001600160a01b031685876040516200052c919062000697565b60006040518083038185875af1925050503d80600081146200056b576040519150601f19603f3d011682016040523d82523d6000602084013e62000570565b606091505b509092509050620005838282866200058e565b979650505050505050565b606083156200059f57508162000454565b825115620005b05782518084602001fd5b8160405162461bcd60e51b81526004016200012b9190620006b5565b80516001600160a01b0381168114620005e457600080fd5b919050565b600060208284031215620005fc57600080fd5b6200045482620005cc565b600080600080608085870312156200061e57600080fd5b6200062985620005cc565b93506200063960208601620005cc565b92506200064960408601620005cc565b6060959095015193969295505050565b6000602082840312156200066c57600080fd5b815180151581146200045457600080fd5b6000602082840312156200069057600080fd5b5051919050565b60008251620006ab818460208701620006ea565b9190910192915050565b6020815260008251806020840152620006d6816040850160208701620006ea565b601f01601f19169190910160400192915050565b60005b8381101562000707578181015183820152602001620006ed565b8381111562000717576000848401525b50505050565b60805160601c60a05160601c60c05160601c60e051612b91620007dd600039600081816101390152610fcf0152600081816102790152610f9201526000818160bb015281816101a601528181610c8401528181610d720152818161219e01526121ec0152600081816101f20152818161104801528181611abc01528181611b6a01528181611c7201528181611d4e01528181611d8a01528181611e0a01528181611eaa01528181611fb1015281816120a501526121250152612b916000f3fe6080604052600436106100ab5760003560e01c8063715018a611610064578063715018a6146102345780638da5cb5b14610249578063c45a015514610267578063d33355531461029b578063f2fde38b146102bb578063fa461e33146102db57600080fd5b806318edaaf21461012757806333cbf0e81461016e5780633667bde7146101815780633fc8cef314610194578063550ba367146101e05780635705ae431461021457600080fd5b3661012257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101205760405162461bcd60e51b815260206004820152601060248201526f0e4cac6cad2ecca5edcdee85aeecae8d60831b60448201526064015b60405180910390fd5b005b600080fd5b34801561013357600080fd5b5061015b7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61012061017c3660046127ea565b6102fb565b61012061018f3660046127ea565b6105dc565b3480156101a057600080fd5b506101c87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610165565b3480156101ec57600080fd5b506101c87f000000000000000000000000000000000000000000000000000000000000000081565b34801561022057600080fd5b5061012061022f3660046125fa565b61075e565b34801561024057600080fd5b50610120610824565b34801561025557600080fd5b506000546001600160a01b03166101c8565b34801561027357600080fd5b506101c87f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a757600080fd5b506101206102b6366004612827565b610896565b3480156102c757600080fd5b506101206102d6366004612586565b610981565b3480156102e757600080fd5b506101206102f636600461266c565b610a1c565b3332146103435760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461035b57600080fd5b600180546001600160a01b0319163317905560006103b961037f60608401846129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c1192505050565b509150506103cc81338460400135610c82565b6000808061041a6103e060608701876129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ec992505050565b9250925092506000826001600160a01b0316846001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b03168152602001886020013581526020016104768960400135610efe565b815260200161048860608a018a6129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250608089013560209091015290506104d7858585610f14565b6001600160a01b031663128acb0830846104f48b60200135610efe565b8661051d57610518600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b61052d565b61052d6401000276a36001612a4f565b8660405160200161053e9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161056d9594939291906128a1565b6040805180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190612648565b5050600180546001600160a01b031916602a17905550505050505050565b3332146106245760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461063c57600080fd5b600180546001600160a01b03191633908117909155600090610664908335602085013561101a565b90506000808061067a6103e060608701876129a7565b9250925092506000836001600160a01b0316836001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b031681526020018781526020016106d28960400135610efe565b6106db90612afd565b81526020016106ed60608a018a6129a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506080890135602090910152905061073c848685610f14565b6001600160a01b031663128acb0830846107558a610efe565b6104f490612afd565b6000546001600160a01b031633146107885760405162461bcd60e51b815260040161011790612910565b60001981141561080c576040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156107d157600080fd5b505afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190612840565b90505b6108206001600160a01b03831633836110ca565b5050565b6000546001600160a01b0316331461084e5760405162461bcd60e51b815260040161011790612910565b60405162461bcd60e51b815260206004820152601a60248201527f72656e6f756e63654f776e6572736869702f64697361626c65640000000000006044820152606401610117565b6000546001600160a01b031633146108c05760405162461bcd60e51b815260040161011790612910565b6000198114156108cd5750475b60408051600080825260208201909252339083906040516108ee9190612885565b60006040518083038185875af1925050503d806000811461092b576040519150601f19603f3d011682016040523d82523d6000602084013e610930565b606091505b50509050806108205760405162461bcd60e51b815260206004820152601e60248201527f7265636f7665724554482f6574682d7472616e736665722d6661696c656400006044820152606401610117565b6000546001600160a01b031633146109ab5760405162461bcd60e51b815260040161011790612910565b6001600160a01b038116610a105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610117565b610a19816110fa565b50565b6001546001600160a01b03163214610a3357600080fd5b6000610a41828401846126ec565b905060008060008713610a5d5785610a5888612afd565b610a67565b86610a6787612afd565b91509150600083606001511315610a8857610a8382828561114a565b610a93565b610a9382828561139a565b50505050505050565b801580610b255750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612840565b155b610b905760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610117565b6040516001600160a01b038316602482015260448101829052610bf390849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261166b565b505050565b6060610c07848460008561173d565b90505b9392505050565b6000806000610c2e60148551610c279190612aba565b8590611865565b9150610c52610c3f60036014612a7a565b8551610c4b9190612aba565b8590611919565b9050610c7a6014610c64600382612a7a565b610c6e9190612a7a565b8551610c279190612aba565b949193509150565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415610eb4576001600160a01b0382163314610d145760405162461bcd60e51b815260206004820152601b60248201527f5f7472616e73666572496e2f6e6f742d66726f6d2d73656e64657200000000006044820152606401610117565b34811115610d705760405162461bcd60e51b815260206004820152602360248201527f5f7472616e73666572496e2f696e73756666696369656e742d6574682d616d6f6044820152621d5b9d60ea1b6064820152608401610117565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050505080341115610bf35760006001600160a01b038316610e028334612aba565b60408051600081526020810191829052610e1b91612885565b60006040518083038185875af1925050503d8060008114610e58576040519150601f19603f3d011682016040523d82523d6000602084013e610e5d565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e73666572496e2f6574682d7472616e736665722d6661696c6564006044820152606401610117565b50505050565b610bf36001600160a01b0384168330846119c4565b60008080610ed78482611865565b9250610ee4846014611919565b9050610ef5610c2760036014612a7a565b91509193909250565b6000600160ff1b8210610f1057600080fd5b5090565b6000806000846001600160a01b0316866001600160a01b031610610f39578486610f3c565b85855b604080516001600160a01b03938416602080830191909152929093168382015262ffffff969096166060808401919091528651808403820181526080840188528051908301206001600160f81b031960a08501527f000000000000000000000000000000000000000000000000000000000000000090911b6bffffffffffffffffffffffff191660a184015260b58301527f000000000000000000000000000000000000000000000000000000000000000060d5808401919091528651808403909101815260f5909201909552805194019390932095945050505050565b604051620c3a4160e11b81526001600160a01b03848116600483015260248201849052600091610c079184917f0000000000000000000000000000000000000000000000000000000000000000909116906218748290604401602060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c59190612840565b6119fc565b6040516001600160a01b038316602482015260448101829052610bf390849063a9059cbb60e01b90606401610bbc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600061115c8460800151610ec9565b92509250925061116d838383610f14565b6001600160a01b0316336001600160a01b0316146111cd5760405162461bcd60e51b815260206004820152601960248201527f5f73686f727443616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b6111da8460800151611a12565b1561130e576111ec8460800151611a4c565b60808501819052600090819061120190610ec9565b9093509150506001600160a01b0380831690851610611221858484610f14565b6001600160a01b031663128acb08308361123a8c610efe565b856112635761125e600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b611273565b6112736401000276a36001612a4f565b8c6040516020016112849190612945565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016112b39594939291906128a1565b6040805180830381600087803b1580156112cc57600080fd5b505af11580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190612648565b505050505061137e565b60008460600151866113209190612a7a565b90508460a001518610156113625760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b61137c328660000151876020015186896040015186611a83565b505b6113926001600160a01b03841633886110ca565b505050505050565b60008060006113ac8460800151610ec9565b9250925092506113bd828483610f14565b6001600160a01b0316336001600160a01b03161461141d5760405162461bcd60e51b815260206004820152601960248201527f5f636c6f736543616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b61142a8460800151611a12565b156115675761143c8460800151611a4c565b60808501819052600090819061145190610ec9565b9093509150506001600160a01b0380851690831610611471858484610f14565b6001600160a01b031663128acb08338361148a8d610efe565b61149390612afd565b856114bc576114b7600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b6114cc565b6114cc6401000276a36001612a4f565b8c6040516020016114dd9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161150c9594939291906128a1565b6040805180830381600087803b15801561152557600080fd5b505af1158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190612648565b5050505050611392565b8360a001518611156115a75760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b600084606001516115b790612afd565b90506115d3328660000151876020015186896040015186611e7f565b6115e76001600160a01b03841633896110ca565b6040516370a0823160e01b8152306004820152610a9390849032906001600160a01b038316906370a082319060240160206040518083038186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190612840565b61219c565b60006116c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610bf89092919063ffffffff16565b805190915015610bf357808060200190518101906116de9190612626565b610bf35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610117565b60608247101561179e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610117565b843b6117ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610117565b600080866001600160a01b031685876040516118089190612885565b60006040518083038185875af1925050503d8060008114611845576040519150601f19603f3d011682016040523d82523d6000602084013e61184a565b606091505b509150915061185a828286612320565b979650505050505050565b600081611873816014612a7a565b10156118b65760405162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b6044820152606401610117565b6118c1826014612a7a565b835110156119095760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610117565b500160200151600160601b900490565b600081611927816003612a7a565b10156119695760405162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b6044820152606401610117565b611974826003612a7a565b835110156119bb5760405162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b6044820152606401610117565b50016003015190565b6040516001600160a01b0380851660248301528316604482015260648101829052610eae9085906323b872dd60e01b90608401610bbc565b6000818310611a0b5781610c0a565b5090919050565b6000611a2060036014612a7a565b6014611a2d600382612a7a565b611a379190612a7a565b611a419190612a7a565b825110159050919050565b6060611a7d611a5d60036014612a7a565b611a6960036014612a7a565b8451611a759190612aba565b849190612359565b92915050565b600019851415611b3f57604051637b8feacb60e11b81526001600160a01b038781166004830152858116602483015284811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063f71fd59690606401602060405180830381600087803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b389190612840565b9450611d48565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063e507470990604401604080518083038186803b158015611bab57600080fd5b505afa158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be391906125c0565b91509150816001600160a01b0316856001600160a01b031614611c535760405162461bcd60e51b815260206004820152602260248201527f5f626f72726f772f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572604482015261185b60f21b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063679a8da89060240160206040518083038186803b158015611cb457600080fd5b505afa158015611cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cec91906125a3565b6001600160a01b0316866001600160a01b031614611d455760405162461bcd60e51b81526020600482015260166024820152755f626f72726f772f6261642d756e6465726c79696e6760501b6044820152606401610117565b50505b611d73837f0000000000000000000000000000000000000000000000000000000000000000836124b0565b6040516315d21c8d60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632ba4391a90611dc3908990899086906004016128dc565b600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505060405163c1bce0b760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063c1bce0b79150611e45908990899087906004016128dc565b600060405180830381600087803b158015611e5f57600080fd5b505af1158015611e73573d6000803e3d6000fd5b50505050505050505050565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063e507470990604401604080518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2391906125c0565b91509150816001600160a01b0316856001600160a01b031614611f925760405162461bcd60e51b815260206004820152602160248201527f5f72657061792f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572616044820152601b60fa1b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063679a8da89060240160206040518083038186803b158015611ff357600080fd5b505afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906125a3565b6001600160a01b0316866001600160a01b0316146120835760405162461bcd60e51b81526020600482015260156024820152745f72657061792f6261642d756e6465726c79696e6760581b6044820152606401610117565b61208e8682866124b0565b604051638cd2e0c760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638cd2e0c7906120de908b908b9089906004016128dc565b600060405180830381600087803b1580156120f857600080fd5b505af115801561210c573d6000803e3d6000fd5b505060405163c640e9bf60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063c640e9bf9150612160908b908b9088906004016128dc565b600060405180830381600087803b15801561217a57600080fd5b505af115801561218e573d6000803e3d6000fd5b505050505050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316141561230c57604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561223857600080fd5b505af115801561224c573d6000803e3d6000fd5b5050604080516000808252602082019283905293506001600160a01b038616925084916122799190612885565b60006040518083038185875af1925050503d80600081146122b6576040519150601f19603f3d011682016040523d82523d6000602084013e6122bb565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665724f75742f6574682d7472616e736665722d6661696c65646044820152606401610117565b610bf36001600160a01b03841683836110ca565b6060831561232f575081610c0a565b82511561233f5782518084602001fd5b8160405162461bcd60e51b815260040161011791906128fd565b60608161236781601f612a7a565b10156123a65760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b826123b18382612a7a565b10156123f05760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b6123fa8284612a7a565b8451101561243e5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610117565b60608215801561245d57604051915060008252602082016040526124a7565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561249657805183526020928301920161247e565b5050858452601f01601f1916604052505b50949350505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e9060440160206040518083038186803b1580156124fb57600080fd5b505afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125339190612840565b905081811015610eae578015612558576125586001600160a01b038516846000610a9c565b610eae6001600160a01b03851684600019610a9c565b600060a0828403121561258057600080fd5b50919050565b60006020828403121561259857600080fd5b8135610c0a81612b46565b6000602082840312156125b557600080fd5b8151610c0a81612b46565b600080604083850312156125d357600080fd5b82516125de81612b46565b60208401519092506125ef81612b46565b809150509250929050565b6000806040838503121561260d57600080fd5b823561261881612b46565b946020939093013593505050565b60006020828403121561263857600080fd5b81518015158114610c0a57600080fd5b6000806040838503121561265b57600080fd5b505080516020909101519092909150565b6000806000806060858703121561268257600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156126a857600080fd5b818701915087601f8301126126bc57600080fd5b8135818111156126cb57600080fd5b8860208285010111156126dd57600080fd5b95989497505060200194505050565b600060208083850312156126ff57600080fd5b823567ffffffffffffffff8082111561271757600080fd5b9084019060c0828703121561272b57600080fd5b6127336129f5565b823581528383013561274481612b46565b808583015250604083013560408201526060830135606082015260808301358281111561277057600080fd5b8301601f8101881361278157600080fd5b80358381111561279357612793612b30565b6127a5601f8201601f19168701612a1e565b935080845288868284010111156127bb57600080fd5b80868301878601376000868286010152505081608082015260a083013560a08201528094505050505092915050565b6000602082840312156127fc57600080fd5b813567ffffffffffffffff81111561281357600080fd5b61281f8482850161256e565b949350505050565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b5051919050565b60008151808452612871816020860160208601612ad1565b601f01601f19169290920160200192915050565b60008251612897818460208701612ad1565b9190910192915050565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a06080820181905260009061185a90830184612859565b6001600160a01b039390931683526020830191909152604082015260600190565b602081526000610c0a6020830184612859565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602081528151602082015260018060a01b03602083015116604082015260408201516060820152606082015160808201526000608083015160c060a084015261299160e0840182612859565b905060a084015160c08401528091505092915050565b6000808335601e198436030181126129be57600080fd5b83018035915067ffffffffffffffff8211156129d957600080fd5b6020019150368190038213156129ee57600080fd5b9250929050565b60405160c0810167ffffffffffffffff81118282101715612a1857612a18612b30565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612a4757612a47612b30565b604052919050565b60006001600160a01b03828116848216808303821115612a7157612a71612b1a565b01949350505050565b60008219821115612a8d57612a8d612b1a565b500190565b60006001600160a01b0383811690831681811015612ab257612ab2612b1a565b039392505050565b600082821015612acc57612acc612b1a565b500390565b60005b83811015612aec578181015183820152602001612ad4565b83811115610eae5750506000910152565b6000600160ff1b821415612b1357612b13612b1a565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a1957600080fdfea2646970667358221220175f1d4d40b6ad58ec5b57918929a5eefd3003a412603597f328dd56576301e564736f6c63430008060033000000000000000000000000972a785b390d05123497169a04c72de652493be1000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54

Deployed Bytecode

0x6080604052600436106100ab5760003560e01c8063715018a611610064578063715018a6146102345780638da5cb5b14610249578063c45a015514610267578063d33355531461029b578063f2fde38b146102bb578063fa461e33146102db57600080fd5b806318edaaf21461012757806333cbf0e81461016e5780633667bde7146101815780633fc8cef314610194578063550ba367146101e05780635705ae431461021457600080fd5b3661012257336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101205760405162461bcd60e51b815260206004820152601060248201526f0e4cac6cad2ecca5edcdee85aeecae8d60831b60448201526064015b60405180910390fd5b005b600080fd5b34801561013357600080fd5b5061015b7fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5481565b6040519081526020015b60405180910390f35b61012061017c3660046127ea565b6102fb565b61012061018f3660046127ea565b6105dc565b3480156101a057600080fd5b506101c87f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b039091168152602001610165565b3480156101ec57600080fd5b506101c87f000000000000000000000000972a785b390d05123497169a04c72de652493be181565b34801561022057600080fd5b5061012061022f3660046125fa565b61075e565b34801561024057600080fd5b50610120610824565b34801561025557600080fd5b506000546001600160a01b03166101c8565b34801561027357600080fd5b506101c87f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98481565b3480156102a757600080fd5b506101206102b6366004612827565b610896565b3480156102c757600080fd5b506101206102d6366004612586565b610981565b3480156102e757600080fd5b506101206102f636600461266c565b610a1c565b3332146103435760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461035b57600080fd5b600180546001600160a01b0319163317905560006103b961037f60608401846129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c1192505050565b509150506103cc81338460400135610c82565b6000808061041a6103e060608701876129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ec992505050565b9250925092506000826001600160a01b0316846001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b03168152602001886020013581526020016104768960400135610efe565b815260200161048860608a018a6129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250608089013560209091015290506104d7858585610f14565b6001600160a01b031663128acb0830846104f48b60200135610efe565b8661051d57610518600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b61052d565b61052d6401000276a36001612a4f565b8660405160200161053e9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161056d9594939291906128a1565b6040805180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190612648565b5050600180546001600160a01b031916602a17905550505050505050565b3332146106245760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461063c57600080fd5b600180546001600160a01b03191633908117909155600090610664908335602085013561101a565b90506000808061067a6103e060608701876129a7565b9250925092506000836001600160a01b0316836001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b031681526020018781526020016106d28960400135610efe565b6106db90612afd565b81526020016106ed60608a018a6129a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506080890135602090910152905061073c848685610f14565b6001600160a01b031663128acb0830846107558a610efe565b6104f490612afd565b6000546001600160a01b031633146107885760405162461bcd60e51b815260040161011790612910565b60001981141561080c576040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156107d157600080fd5b505afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190612840565b90505b6108206001600160a01b03831633836110ca565b5050565b6000546001600160a01b0316331461084e5760405162461bcd60e51b815260040161011790612910565b60405162461bcd60e51b815260206004820152601a60248201527f72656e6f756e63654f776e6572736869702f64697361626c65640000000000006044820152606401610117565b6000546001600160a01b031633146108c05760405162461bcd60e51b815260040161011790612910565b6000198114156108cd5750475b60408051600080825260208201909252339083906040516108ee9190612885565b60006040518083038185875af1925050503d806000811461092b576040519150601f19603f3d011682016040523d82523d6000602084013e610930565b606091505b50509050806108205760405162461bcd60e51b815260206004820152601e60248201527f7265636f7665724554482f6574682d7472616e736665722d6661696c656400006044820152606401610117565b6000546001600160a01b031633146109ab5760405162461bcd60e51b815260040161011790612910565b6001600160a01b038116610a105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610117565b610a19816110fa565b50565b6001546001600160a01b03163214610a3357600080fd5b6000610a41828401846126ec565b905060008060008713610a5d5785610a5888612afd565b610a67565b86610a6787612afd565b91509150600083606001511315610a8857610a8382828561114a565b610a93565b610a9382828561139a565b50505050505050565b801580610b255750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612840565b155b610b905760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610117565b6040516001600160a01b038316602482015260448101829052610bf390849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261166b565b505050565b6060610c07848460008561173d565b90505b9392505050565b6000806000610c2e60148551610c279190612aba565b8590611865565b9150610c52610c3f60036014612a7a565b8551610c4b9190612aba565b8590611919565b9050610c7a6014610c64600382612a7a565b610c6e9190612a7a565b8551610c279190612aba565b949193509150565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316836001600160a01b03161415610eb4576001600160a01b0382163314610d145760405162461bcd60e51b815260206004820152601b60248201527f5f7472616e73666572496e2f6e6f742d66726f6d2d73656e64657200000000006044820152606401610117565b34811115610d705760405162461bcd60e51b815260206004820152602360248201527f5f7472616e73666572496e2f696e73756666696369656e742d6574682d616d6f6044820152621d5b9d60ea1b6064820152608401610117565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050505080341115610bf35760006001600160a01b038316610e028334612aba565b60408051600081526020810191829052610e1b91612885565b60006040518083038185875af1925050503d8060008114610e58576040519150601f19603f3d011682016040523d82523d6000602084013e610e5d565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e73666572496e2f6574682d7472616e736665722d6661696c6564006044820152606401610117565b50505050565b610bf36001600160a01b0384168330846119c4565b60008080610ed78482611865565b9250610ee4846014611919565b9050610ef5610c2760036014612a7a565b91509193909250565b6000600160ff1b8210610f1057600080fd5b5090565b6000806000846001600160a01b0316866001600160a01b031610610f39578486610f3c565b85855b604080516001600160a01b03938416602080830191909152929093168382015262ffffff969096166060808401919091528651808403820181526080840188528051908301206001600160f81b031960a08501527f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98490911b6bffffffffffffffffffffffff191660a184015260b58301527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808401919091528651808403909101815260f5909201909552805194019390932095945050505050565b604051620c3a4160e11b81526001600160a01b03848116600483015260248201849052600091610c079184917f000000000000000000000000972a785b390d05123497169a04c72de652493be1909116906218748290604401602060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c59190612840565b6119fc565b6040516001600160a01b038316602482015260448101829052610bf390849063a9059cbb60e01b90606401610bbc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600061115c8460800151610ec9565b92509250925061116d838383610f14565b6001600160a01b0316336001600160a01b0316146111cd5760405162461bcd60e51b815260206004820152601960248201527f5f73686f727443616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b6111da8460800151611a12565b1561130e576111ec8460800151611a4c565b60808501819052600090819061120190610ec9565b9093509150506001600160a01b0380831690851610611221858484610f14565b6001600160a01b031663128acb08308361123a8c610efe565b856112635761125e600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b611273565b6112736401000276a36001612a4f565b8c6040516020016112849190612945565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016112b39594939291906128a1565b6040805180830381600087803b1580156112cc57600080fd5b505af11580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190612648565b505050505061137e565b60008460600151866113209190612a7a565b90508460a001518610156113625760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b61137c328660000151876020015186896040015186611a83565b505b6113926001600160a01b03841633886110ca565b505050505050565b60008060006113ac8460800151610ec9565b9250925092506113bd828483610f14565b6001600160a01b0316336001600160a01b03161461141d5760405162461bcd60e51b815260206004820152601960248201527f5f636c6f736543616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b61142a8460800151611a12565b156115675761143c8460800151611a4c565b60808501819052600090819061145190610ec9565b9093509150506001600160a01b0380851690831610611471858484610f14565b6001600160a01b031663128acb08338361148a8d610efe565b61149390612afd565b856114bc576114b7600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b6114cc565b6114cc6401000276a36001612a4f565b8c6040516020016114dd9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161150c9594939291906128a1565b6040805180830381600087803b15801561152557600080fd5b505af1158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190612648565b5050505050611392565b8360a001518611156115a75760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b600084606001516115b790612afd565b90506115d3328660000151876020015186896040015186611e7f565b6115e76001600160a01b03841633896110ca565b6040516370a0823160e01b8152306004820152610a9390849032906001600160a01b038316906370a082319060240160206040518083038186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190612840565b61219c565b60006116c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610bf89092919063ffffffff16565b805190915015610bf357808060200190518101906116de9190612626565b610bf35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610117565b60608247101561179e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610117565b843b6117ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610117565b600080866001600160a01b031685876040516118089190612885565b60006040518083038185875af1925050503d8060008114611845576040519150601f19603f3d011682016040523d82523d6000602084013e61184a565b606091505b509150915061185a828286612320565b979650505050505050565b600081611873816014612a7a565b10156118b65760405162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b6044820152606401610117565b6118c1826014612a7a565b835110156119095760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610117565b500160200151600160601b900490565b600081611927816003612a7a565b10156119695760405162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b6044820152606401610117565b611974826003612a7a565b835110156119bb5760405162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b6044820152606401610117565b50016003015190565b6040516001600160a01b0380851660248301528316604482015260648101829052610eae9085906323b872dd60e01b90608401610bbc565b6000818310611a0b5781610c0a565b5090919050565b6000611a2060036014612a7a565b6014611a2d600382612a7a565b611a379190612a7a565b611a419190612a7a565b825110159050919050565b6060611a7d611a5d60036014612a7a565b611a6960036014612a7a565b8451611a759190612aba565b849190612359565b92915050565b600019851415611b3f57604051637b8feacb60e11b81526001600160a01b038781166004830152858116602483015284811660448301527f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063f71fd59690606401602060405180830381600087803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b389190612840565b9450611d48565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063e507470990604401604080518083038186803b158015611bab57600080fd5b505afa158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be391906125c0565b91509150816001600160a01b0316856001600160a01b031614611c535760405162461bcd60e51b815260206004820152602260248201527f5f626f72726f772f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572604482015261185b60f21b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063679a8da89060240160206040518083038186803b158015611cb457600080fd5b505afa158015611cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cec91906125a3565b6001600160a01b0316866001600160a01b031614611d455760405162461bcd60e51b81526020600482015260166024820152755f626f72726f772f6261642d756e6465726c79696e6760501b6044820152606401610117565b50505b611d73837f000000000000000000000000972a785b390d05123497169a04c72de652493be1836124b0565b6040516315d21c8d60e11b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be11690632ba4391a90611dc3908990899086906004016128dc565b600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505060405163c1bce0b760e01b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be116925063c1bce0b79150611e45908990899087906004016128dc565b600060405180830381600087803b158015611e5f57600080fd5b505af1158015611e73573d6000803e3d6000fd5b50505050505050505050565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063e507470990604401604080518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2391906125c0565b91509150816001600160a01b0316856001600160a01b031614611f925760405162461bcd60e51b815260206004820152602160248201527f5f72657061792f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572616044820152601b60fa1b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063679a8da89060240160206040518083038186803b158015611ff357600080fd5b505afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906125a3565b6001600160a01b0316866001600160a01b0316146120835760405162461bcd60e51b81526020600482015260156024820152745f72657061792f6261642d756e6465726c79696e6760581b6044820152606401610117565b61208e8682866124b0565b604051638cd2e0c760e01b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be11690638cd2e0c7906120de908b908b9089906004016128dc565b600060405180830381600087803b1580156120f857600080fd5b505af115801561210c573d6000803e3d6000fd5b505060405163c640e9bf60e01b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be116925063c640e9bf9150612160908b908b9088906004016128dc565b600060405180830381600087803b15801561217a57600080fd5b505af115801561218e573d6000803e3d6000fd5b505050505050505050505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316836001600160a01b0316141561230c57604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561223857600080fd5b505af115801561224c573d6000803e3d6000fd5b5050604080516000808252602082019283905293506001600160a01b038616925084916122799190612885565b60006040518083038185875af1925050503d80600081146122b6576040519150601f19603f3d011682016040523d82523d6000602084013e6122bb565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665724f75742f6574682d7472616e736665722d6661696c65646044820152606401610117565b610bf36001600160a01b03841683836110ca565b6060831561232f575081610c0a565b82511561233f5782518084602001fd5b8160405162461bcd60e51b815260040161011791906128fd565b60608161236781601f612a7a565b10156123a65760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b826123b18382612a7a565b10156123f05760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b6123fa8284612a7a565b8451101561243e5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610117565b60608215801561245d57604051915060008252602082016040526124a7565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561249657805183526020928301920161247e565b5050858452601f01601f1916604052505b50949350505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e9060440160206040518083038186803b1580156124fb57600080fd5b505afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125339190612840565b905081811015610eae578015612558576125586001600160a01b038516846000610a9c565b610eae6001600160a01b03851684600019610a9c565b600060a0828403121561258057600080fd5b50919050565b60006020828403121561259857600080fd5b8135610c0a81612b46565b6000602082840312156125b557600080fd5b8151610c0a81612b46565b600080604083850312156125d357600080fd5b82516125de81612b46565b60208401519092506125ef81612b46565b809150509250929050565b6000806040838503121561260d57600080fd5b823561261881612b46565b946020939093013593505050565b60006020828403121561263857600080fd5b81518015158114610c0a57600080fd5b6000806040838503121561265b57600080fd5b505080516020909101519092909150565b6000806000806060858703121561268257600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156126a857600080fd5b818701915087601f8301126126bc57600080fd5b8135818111156126cb57600080fd5b8860208285010111156126dd57600080fd5b95989497505060200194505050565b600060208083850312156126ff57600080fd5b823567ffffffffffffffff8082111561271757600080fd5b9084019060c0828703121561272b57600080fd5b6127336129f5565b823581528383013561274481612b46565b808583015250604083013560408201526060830135606082015260808301358281111561277057600080fd5b8301601f8101881361278157600080fd5b80358381111561279357612793612b30565b6127a5601f8201601f19168701612a1e565b935080845288868284010111156127bb57600080fd5b80868301878601376000868286010152505081608082015260a083013560a08201528094505050505092915050565b6000602082840312156127fc57600080fd5b813567ffffffffffffffff81111561281357600080fd5b61281f8482850161256e565b949350505050565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b5051919050565b60008151808452612871816020860160208601612ad1565b601f01601f19169290920160200192915050565b60008251612897818460208701612ad1565b9190910192915050565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a06080820181905260009061185a90830184612859565b6001600160a01b039390931683526020830191909152604082015260600190565b602081526000610c0a6020830184612859565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602081528151602082015260018060a01b03602083015116604082015260408201516060820152606082015160808201526000608083015160c060a084015261299160e0840182612859565b905060a084015160c08401528091505092915050565b6000808335601e198436030181126129be57600080fd5b83018035915067ffffffffffffffff8211156129d957600080fd5b6020019150368190038213156129ee57600080fd5b9250929050565b60405160c0810167ffffffffffffffff81118282101715612a1857612a18612b30565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612a4757612a47612b30565b604052919050565b60006001600160a01b03828116848216808303821115612a7157612a71612b1a565b01949350505050565b60008219821115612a8d57612a8d612b1a565b500190565b60006001600160a01b0383811690831681811015612ab257612ab2612b1a565b039392505050565b600082821015612acc57612acc612b1a565b500390565b60005b83811015612aec578181015183820152602001612ad4565b83811115610eae5750506000910152565b6000600160ff1b821415612b1357612b13612b1a565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a1957600080fdfea2646970667358221220175f1d4d40b6ad58ec5b57918929a5eefd3003a412603597f328dd56576301e564736f6c63430008060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000972a785b390d05123497169a04c72de652493be1000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54

-----Decoded View---------------
Arg [0] : _betaBank (address): 0x972a785b390D05123497169a04c72dE652493BE1
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _factory (address): 0x1F98431c8aD98523631AE4a59f267346ea31F984
Arg [3] : _codeHash (bytes32): 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000972a785b390d05123497169a04c72de652493be1
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984
Arg [3] : e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54


Deployed Bytecode Sourcemap

33864:6237:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33776:10;-1:-1:-1;;;;;33790:4:0;33776:18;;33768:47;;;;-1:-1:-1;;;33768:47:0;;15971:2:1;33768:47:0;;;15953:21:1;16010:2;15990:18;;;15983:30;-1:-1:-1;;;16029:18:1;;;16022:46;16085:18;;33768:47:0;;;;;;;;;33864:6237;;;;;34397:33;;;;;;;;;;;;;;;;;;9242:25:1;;;9230:2;9215:18;34397:33:0;;;;;;;;35269:818;;;;;;:::i;:::-;;:::i;36199:754::-;;;;;;:::i;:::-;;:::i;29302:29::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6379:32:1;;;6361:51;;6349:2;6334:18;29302:29:0;6316:102:1;29264:33:0;;;;;;;;;;;;;;;32968:230;;;;;;;;;;-1:-1:-1;32968:230:0;;;;;:::i;:::-;;:::i;33624:104::-;;;;;;;;;;;;;:::i;21525:87::-;;;;;;;;;;-1:-1:-1;21571:7:0;21598:6;-1:-1:-1;;;;;21598:6:0;21525:87;;34360:32;;;;;;;;;;;;;;;33268:272;;;;;;;;;;-1:-1:-1;33268:272:0;;;;;:::i;:::-;;:::i;22425:192::-;;;;;;;;;;-1:-1:-1;22425:192:0;;;;;:::i;:::-;;:::i;37010:548::-;;;;;;;;;;-1:-1:-1;37010:548:0;;;;;:::i;:::-;;:::i;35269:818::-;29372:10;29386:9;29372:23;29364:58;;;;-1:-1:-1;;;29364:58:0;;18119:2:1;29364:58:0;;;18101:21:1;18158:2;18138:18;;;18131:30;-1:-1:-1;;;18177:18:1;;;18170:52;18239:18;;29364:58:0;18091:172:1;29364:58:0;323:6:::1;::::0;-1:-1:-1;;;;;323:6:0::1;187:2;323:19;315:28;;;::::0;::::1;;350:6;:19:::0;;-1:-1:-1;;;;;;350:19:0::1;359:10;350:19;::::0;;:6:::1;35382:27:::2;:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;35382:25:0::2;::::0;-1:-1:-1;;;35382:27:0:i:2;:::-;35355:54;;;;35416:57;35428:10;35440;35452:5;:20;;;35416:11;:57::i;:::-;35481:15;::::0;;35530:28:::2;:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;35530:26:0::2;::::0;-1:-1:-1;;;35530:28:0:i:2;:::-;35480:78;;;;;;35565:15;35593:8;-1:-1:-1::0;;;;;35583:18:0::2;:7;-1:-1:-1::0;;;;;35583:18:0::2;;35565:36;;35608:22;35633:218;;;;;;;;35660:5;:9;;;35633:218;;;;35685:7;-1:-1:-1::0;;;;;35633:218:0::2;;;;;35710:5;:18;;;35633:218;;;;35743:31;:5;:20;;;:29;:31::i;:::-;35633:218:::0;;::::2;;35789:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;35633:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;;35633:218:0;;;-1:-1:-1;35825:18:0::2;::::0;::::2;;35633:218;::::0;;::::2;::::0;35608:243;-1:-1:-1;35873:32:0::2;35882:7:::0;35891:8;35901:3;35873:8:::2;:32::i;:::-;-1:-1:-1::0;;;;;35858:53:0::2;;35928:4;35942:10;35961:29;:5;:18;;;:27;:29::i;:::-;35999:10;:52;;36033:18;36050:1;34304:49;36033:18;:::i;:::-;35999:52;;;36012:18;34246:10;36029:1;36012:18;:::i;:::-;36071:2;36060:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;35858:223;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;384:6:0::1;:18:::0;;-1:-1:-1;;;;;;384:18:0::1;187:2;384:18;::::0;;-1:-1:-1;;;;;;;35269:818:0:o;36199:754::-;29372:10;29386:9;29372:23;29364:58;;;;-1:-1:-1;;;29364:58:0;;18119:2:1;29364:58:0;;;18101:21:1;18158:2;18138:18;;;18131:30;-1:-1:-1;;;18177:18:1;;;18170:52;18239:18;;29364:58:0;18091:172:1;29364:58:0;323:6:::1;::::0;-1:-1:-1;;;;;323:6:0::1;187:2;323:19;315:28;;;::::0;::::1;;350:6;:19:::0;;-1:-1:-1;;;;;;350:19:0::1;359:10;350:19:::0;;::::1;::::0;;;:6:::1;::::0;36304:51:::2;::::0;36326:9;::::2;36337:17;::::0;::::2;;36304:9;:51::i;:::-;36285:70:::0;-1:-1:-1;36363:16:0::2;::::0;;36412:28:::2;:10;;::::0;::::2;:5:::0;:10:::2;:::i;:28::-;36362:78;;;;;;36447:15;36475:8;-1:-1:-1::0;;;;;36465:18:0::2;:7;-1:-1:-1::0;;;;;36465:18:0::2;;36447:36;;36490:22;36515:208;;;;;;;;36542:5;:9;;;36515:208;;;;36567:8;-1:-1:-1::0;;;;;36515:208:0::2;;;;;36593:11;36515:208;;;;36620:27;:5;:16;;;:25;:27::i;:::-;36619:28;;;:::i;:::-;36515:208:::0;;::::2;;36662:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;36515:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;;36515:208:0;;;-1:-1:-1;36698:17:0::2;::::0;::::2;;36515:208;::::0;;::::2;::::0;36490:233;-1:-1:-1;36745:32:0::2;36754:7:::0;36763:8;36773:3;36745:8:::2;:32::i;:::-;-1:-1:-1::0;;;;;36730:53:0::2;;36800:4;36814:10;36834:22;:11;:20;:22::i;:::-;36833:23;;;:::i;32968:230::-:0;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;-1:-1:-1;;33045:7:0::1;:25;33041:97;;;33091:39;::::0;-1:-1:-1;;;33091:39:0;;33124:4:::1;33091:39;::::0;::::1;6361:51:1::0;-1:-1:-1;;;;;33091:24:0;::::1;::::0;::::1;::::0;6334:18:1;;33091:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33081:49;;33041:97;33144:48;-1:-1:-1::0;;;;;33144:27:0;::::1;33172:10;33184:7:::0;33144:27:::1;:48::i;:::-;32968:230:::0;;:::o;33624:104::-;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;33686:36:::1;::::0;-1:-1:-1;;;33686:36:0;;12343:2:1;33686:36:0::1;::::0;::::1;12325:21:1::0;12382:2;12362:18;;;12355:30;12421:28;12401:18;;;12394:56;12467:18;;33686:36:0::1;12315:176:1::0;33268:272:0;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;-1:-1:-1;;33332:7:0::1;:25;33328:79;;;-1:-1:-1::0;33378:21:0::1;33328:79;33464:12;::::0;;33414::::1;33464::::0;;;::::1;::::0;::::1;::::0;;;33432:10:::1;::::0;33455:7;;33432:45:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33413:64;;;33492:7;33484:50;;;::::0;-1:-1:-1;;;33484:50:0;;11577:2:1;33484:50:0::1;::::0;::::1;11559:21:1::0;11616:2;11596:18;;;11589:30;11655:32;11635:18;;;11628:60;11705:18;;33484:50:0::1;11549:180:1::0;22425:192:0;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22514:22:0;::::1;22506:73;;;::::0;-1:-1:-1;;;22506:73:0;;9704:2:1;22506:73:0::1;::::0;::::1;9686:21:1::0;9743:2;9723:18;;;9716:30;9782:34;9762:18;;;9755:62;-1:-1:-1;;;9833:18:1;;;9826:36;9879:19;;22506:73:0::1;9676:228:1::0;22506:73:0::1;22590:19;22600:8;22590:9;:19::i;:::-;22425:192:::0;:::o;37010:548::-;451:6;;-1:-1:-1;;;;;451:6:0;461:9;451:19;443:28;;;;;;37157:24:::1;37184:33;::::0;;::::1;37195:5:::0;37184:33:::1;:::i;:::-;37157:60;;37225:16;37243:19:::0;37282:1:::1;37266:13;:17;:123;;37352:13:::0;37373:14:::1;37374:13:::0;37373:14:::1;:::i;:::-;37266:123;;;37299:13:::0;37320:14:::1;37321:13:::0;37320:14:::1;:::i;:::-;37224:165;;;;37412:1;37400:4;:9;;;:13;37396:157;;;37424:49;37439:11;37452:14;37468:4;37424:14;:49::i;:::-;37396:157;;;37496:49;37511:11;37524:14;37540:4;37496:14;:49::i;:::-;37150:408;;;37010:548:::0;;;;:::o;24131:616::-;24495:10;;;24494:62;;-1:-1:-1;24511:39:0;;-1:-1:-1;;;24511:39:0;;24535:4;24511:39;;;6635:34:1;-1:-1:-1;;;;;6705:15:1;;;6685:18;;;6678:43;24511:15:0;;;;;6570:18:1;;24511:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;24494:62;24472:166;;;;-1:-1:-1;;;24472:166:0;;18470:2:1;24472:166:0;;;18452:21:1;18509:2;18489:18;;;18482:30;18548:34;18528:18;;;18521:62;-1:-1:-1;;;18599:18:1;;;18592:52;18661:19;;24472:166:0;18442:244:1;24472:166:0;24676:62;;-1:-1:-1;;;;;8659:32:1;;24676:62:0;;;8641:51:1;8708:18;;;8701:34;;;24649:90:0;;24669:5;;-1:-1:-1;;;24699:22:0;8614:18:1;;24676:62:0;;;;-1:-1:-1;;24676:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;24676:62:0;-1:-1:-1;;;;;;24676:62:0;;;;;;;;;;24649:19;:90::i;:::-;24131:616;;;:::o;10418:229::-;10555:12;10587:52;10609:6;10617:4;10623:1;10626:12;10587:21;:52::i;:::-;10580:59;;10418:229;;;;;;:::o;28500:326::-;28589:14;28612;28635:10;28672:39;26911:2;28687:4;:11;:23;;;;:::i;:::-;28672:4;;:14;:39::i;:::-;28663:48;-1:-1:-1;28724:40:0;27105:20;26999:1;26911:2;27105:20;:::i;:::-;28738:4;:11;:25;;;;:::i;:::-;28724:4;;:13;:40::i;:::-;28718:46;-1:-1:-1;28780:40:0;26911:2;27105:20;26999:1;26911:2;27105:20;:::i;:::-;27211:23;;;;:::i;:::-;28795:4;:11;:24;;;;:::i;28780:40::-;28771:49;28500:326;;-1:-1:-1;28500:326:0;-1:-1:-1;28500:326:0:o;31184:598::-;31300:4;-1:-1:-1;;;;;31290:14:0;:6;-1:-1:-1;;;;;31290:14:0;;31286:491;;;-1:-1:-1;;;;;31323:19:0;;31332:10;31323:19;31315:59;;;;-1:-1:-1;;;31315:59:0;;10111:2:1;31315:59:0;;;10093:21:1;10150:2;10130:18;;;10123:30;10189:29;10169:18;;;10162:57;10236:18;;31315:59:0;10083:177:1;31315:59:0;31402:9;31391:7;:20;;31383:68;;;;-1:-1:-1;;;31383:68:0;;13793:2:1;31383:68:0;;;13775:21:1;13832:2;13812:18;;;13805:30;13871:34;13851:18;;;13844:62;-1:-1:-1;;;13922:18:1;;;13915:33;13965:19;;31383:68:0;13765:225:1;31383:68:0;31466:4;-1:-1:-1;;;;;31460:19:0;;31487:7;31460:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31522:7;31510:9;:19;31506:179;;;31543:12;-1:-1:-1;;;;;31561:10:0;;31579:19;31591:7;31579:9;:19;:::i;:::-;31600:12;;;31610:1;31600:12;;;;;;;;;31561:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31542:71;;;31632:7;31624:51;;;;-1:-1:-1;;;31624:51:0;;14197:2:1;31624:51:0;;;14179:21:1;14236:2;14216:18;;;14209:30;14275:33;14255:18;;;14248:61;14326:18;;31624:51:0;14169:181:1;31624:51:0;31531:154;24131:616;;;:::o;31286:491::-;31707:62;-1:-1:-1;;;;;31707:31:0;;31739:5;31754:4;31761:7;31707:31;:62::i;27968:276::-;28058:14;;;28141:17;:4;28058:14;28141;:17::i;:::-;28132:26;-1:-1:-1;28171:24:0;:4;26911:2;28171:13;:24::i;:::-;28165:30;-1:-1:-1;28211:27:0;27105:20;26999:1;26911:2;27105:20;:::i;28211:27::-;28202:36;;27968:276;;;;;:::o;20441:105::-;20490:5;-1:-1:-1;;;20512:1:0;:10;20504:19;;;;;;-1:-1:-1;20538:1:0;20441:105::o;39720:378::-;39825:7;39842:14;39858;39885:6;-1:-1:-1;;;;;39876:15:0;:6;-1:-1:-1;;;;;39876:15:0;;:53;;39914:6;39922;39876:53;;;39895:6;39903;39876:53;39961:31;;;-1:-1:-1;;;;;7377:15:1;;;39961:31:0;;;;7359:34:1;;;;7429:15;;;;7409:18;;;7402:43;7493:8;7481:21;;;;7461:18;;;;7454:49;;;;39961:31:0;;;;;;;;;7294:18:1;;;39961:31:0;;39951:42;;;;;;-1:-1:-1;;;;;;40038:50:0;;;5993:26:1;40064:7:0;6052:15:1;;;-1:-1:-1;;6048:53:1;6035:11;;;6028:74;6118:12;;;6111:28;40079:8:0;6155:12:1;;;;6148:28;;;;40038:50:0;;;;;;;;;;6192:12:1;;;;40038:50:0;;;40028:61;;;;;;;;;;-1:-1:-1;;;;;39720:378:0:o;32691:204::-;32837:51;;-1:-1:-1;;;32837:51:0;;-1:-1:-1;;;;;8659:32:1;;;32837:51:0;;;8641::1;8708:18;;;8701:34;;;-1:-1:-1;;32814:75:0;;32823:12;;32847:8;32837:37;;;;;;8614:18:1;;32837:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32814:8;:75::i;23395:211::-;23539:58;;-1:-1:-1;;;;;8659:32:1;;23539:58:0;;;8641:51:1;8708:18;;;8701:34;;;23512:86:0;;23532:5;;-1:-1:-1;;;23562:23:0;8614:18:1;;23539:58:0;8596:145:1;22625:173:0;22681:16;22700:6;;-1:-1:-1;;;;;22717:17:0;;;-1:-1:-1;;;;;;22717:17:0;;;;;;22750:40;;22700:6;;;;;;;22750:40;;22681:16;22750:40;22670:128;22625:173;:::o;37564:1051::-;37692:15;37709:16;37727:14;37745:27;:4;:9;;;:25;:27::i;:::-;37691:81;;;;;;37801:36;37810:7;37819:8;37829:7;37801:8;:36::i;:::-;-1:-1:-1;;;;;37787:50:0;:10;-1:-1:-1;;;;;37787:50:0;;37779:88;;;;-1:-1:-1;;;37779:88:0;;15617:2:1;37779:88:0;;;15599:21:1;15656:2;15636:18;;;15629:30;15695:27;15675:18;;;15668:55;15740:18;;37779:88:0;15589:175:1;37779:88:0;37878:28;:4;:9;;;:26;:28::i;:::-;37874:675;;;37929:21;:4;:9;;;:19;:21::i;:::-;37917:9;;;:33;;;37962:17;;;;37995:27;;:25;:27::i;:::-;37959:63;;-1:-1:-1;37959:63:0;-1:-1:-1;;;;;;;38049:20:0;;;;;;;38093:34;38049:8;37959:63;;38093:8;:34::i;:::-;-1:-1:-1;;;;;38078:55:0;;38152:4;38168:10;38189:26;:15;:24;:26::i;:::-;38226:10;:52;;38260:18;38277:1;34304:49;38260:18;:::i;:::-;38226:52;;;38239:18;34246:10;38256:1;38239:18;:::i;:::-;38300:4;38289:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;38078:236;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37908:414;;;37874:675;;;38337:14;38377:4;:9;;;38354:15;:33;;;;:::i;:::-;38337:50;;38423:4;:20;;;38404:15;:39;;38396:61;;;;-1:-1:-1;;;38396:61:0;;17020:2:1;38396:61:0;;;17002:21:1;17059:1;17039:18;;;17032:29;-1:-1:-1;;;17077:18:1;;;17070:39;17126:18;;38396:61:0;16992:158:1;38396:61:0;38466:75;38474:9;38485:4;:8;;;38495:4;:10;;;38507:8;38517:4;:12;;;38531:9;38466:7;:75::i;:::-;38328:221;37874:675;38555:54;-1:-1:-1;;;;;38555:28:0;;38584:10;38596:12;38555:28;:54::i;:::-;37684:931;;;37564:1051;;;:::o;38621:1093::-;38733:16;38751:15;38768:14;38786:27;:4;:9;;;:25;:27::i;:::-;38732:81;;;;;;38842:36;38851:7;38860:8;38870:7;38842:8;:36::i;:::-;-1:-1:-1;;;;;38828:50:0;:10;-1:-1:-1;;;;;38828:50:0;;38820:88;;;;-1:-1:-1;;;38820:88:0;;18893:2:1;38820:88:0;;;18875:21:1;18932:2;18912:18;;;18905:30;18971:27;18951:18;;;18944:55;19016:18;;38820:88:0;18865:175:1;38820:88:0;38919:28;:4;:9;;;:26;:28::i;:::-;38915:794;;;38970:21;:4;:9;;;:19;:21::i;:::-;38958:9;;;:33;;;39003:17;;;;39036:27;;:25;:27::i;:::-;39000:63;;-1:-1:-1;39000:63:0;-1:-1:-1;;;;;;;39090:19:0;;;;;;;39133:33;39102:7;39000:63;;39133:8;:33::i;:::-;-1:-1:-1;;;;;39118:54:0;;39183:10;39204;39226:23;:12;:21;:23::i;:::-;39225:24;;;:::i;:::-;39260:10;:52;;39294:18;39311:1;34304:49;39294:18;:::i;:::-;39260:52;;;39273:18;34246:10;39290:1;39273:18;:::i;:::-;39334:4;39323:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;39118:230;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38949:407;;;38915:794;;;39395:4;:20;;;39379:12;:36;;39371:58;;;;-1:-1:-1;;;39371:58:0;;17020:2:1;39371:58:0;;;17002:21:1;17059:1;17039:18;;;17032:29;-1:-1:-1;;;17077:18:1;;;17070:39;17126:18;;39371:58:0;16992:158:1;39371:58:0;39438:15;39462:4;:9;;;39461:10;;;:::i;:::-;39438:34;;39481:74;39488:9;39499:4;:8;;;39509:4;:10;;;39521:7;39530:4;:12;;;39544:10;39481:6;:74::i;:::-;39564:54;-1:-1:-1;;;;;39564:28:0;;39593:10;39605:12;39564:28;:54::i;:::-;39660:40;;-1:-1:-1;;;39660:40:0;;39694:4;39660:40;;;6361:51:1;39627:74:0;;39640:7;;39649:9;;-1:-1:-1;;;;;39660:25:0;;;;;6334:18:1;;39660:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39627:12;:74::i;25968:716::-;26392:23;26418:69;26446:4;26418:69;;;;;;;;;;;;;;;;;26426:5;-1:-1:-1;;;;;26418:27:0;;;:69;;;;;:::i;:::-;26502:17;;26392:95;;-1:-1:-1;26502:21:0;26498:179;;26599:10;26588:30;;;;;;;;;;;;:::i;:::-;26580:85;;;;-1:-1:-1;;;26580:85:0;;17357:2:1;26580:85:0;;;17339:21:1;17396:2;17376:18;;;17369:30;17435:34;17415:18;;;17408:62;-1:-1:-1;;;17486:18:1;;;17479:40;17536:19;;26580:85:0;17329:232:1;11538:511:0;11708:12;11766:5;11741:21;:30;;11733:81;;;;-1:-1:-1;;;11733:81:0;;11936:2:1;11733:81:0;;;11918:21:1;11975:2;11955:18;;;11948:30;12014:34;11994:18;;;11987:62;-1:-1:-1;;;12065:18:1;;;12058:36;12111:19;;11733:81:0;11908:228:1;11733:81:0;7935:20;;11825:60;;;;-1:-1:-1;;;11825:60:0;;16316:2:1;11825:60:0;;;16298:21:1;16355:2;16335:18;;;16328:30;16394:31;16374:18;;;16367:59;16443:18;;11825:60:0;16288:179:1;11825:60:0;11899:12;11913:23;11940:6;-1:-1:-1;;;;;11940:11:0;11959:5;11966:4;11940:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11898:73;;;;11989:52;12007:7;12016:10;12028:12;11989:17;:52::i;:::-;11982:59;11538:511;-1:-1:-1;;;;;;;11538:511:0:o;3050:391::-;3126:7;3165:6;3150:11;3165:6;3159:2;3150:11;:::i;:::-;:21;;3142:52;;;;-1:-1:-1;;;3142:52:0;;19247:2:1;3142:52:0;;;19229:21:1;19286:2;19266:18;;;19259:30;-1:-1:-1;;;19305:18:1;;;19298:48;19363:18;;3142:52:0;19219:168:1;3142:52:0;3226:11;:6;3235:2;3226:11;:::i;:::-;3209:6;:13;:28;;3201:62;;;;-1:-1:-1;;;3201:62:0;;15267:2:1;3201:62:0;;;15249:21:1;15306:2;15286:18;;;15279:30;-1:-1:-1;;;15325:18:1;;;15318:51;15386:18;;3201:62:0;15239:171:1;3201:62:0;-1:-1:-1;3341:30:0;3357:4;3341:30;3335:37;-1:-1:-1;;;3331:71:0;;;3050:391::o;3447:340::-;3522:6;3559;3545:10;3559:6;3554:1;3545:10;:::i;:::-;:20;;3537:50;;;;-1:-1:-1;;;3537:50:0;;11231:2:1;3537:50:0;;;11213:21:1;11270:2;11250:18;;;11243:30;-1:-1:-1;;;11289:18:1;;;11282:47;11346:18;;3537:50:0;11203:167:1;3537:50:0;3619:10;:6;3628:1;3619:10;:::i;:::-;3602:6;:13;:27;;3594:60;;;;-1:-1:-1;;;3594:60:0;;14557:2:1;3594:60:0;;;14539:21:1;14596:2;14576:18;;;14569:30;-1:-1:-1;;;14615:18:1;;;14608:50;14675:18;;3594:60:0;14529:170:1;3594:60:0;-1:-1:-1;3721:29:0;3737:3;3721:29;3715:36;;3447:340::o;23614:248::-;23785:68;;-1:-1:-1;;;;;7772:15:1;;;23785:68:0;;;7754:34:1;7824:15;;7804:18;;;7797:43;7856:18;;;7849:34;;;23758:96:0;;23778:5;;-1:-1:-1;;;23808:27:0;7689:18:1;;23785:68:0;7671:218:1;18755:106:0;18813:7;18844:1;18840;:5;:13;;18852:1;18840:13;;;-1:-1:-1;18848:1:0;;18833:20;-1:-1:-1;18755:106:0:o;27577:134::-;27645:4;27105:20;26999:1;26911:2;27105:20;:::i;:::-;26911:2;27105:20;26999:1;26911:2;27105:20;:::i;:::-;27211:23;;;;:::i;:::-;27365:24;;;;:::i;:::-;27665:4;:11;:40;;27658:47;;27577:134;;;:::o;29012:145::-;29073:12;29101:50;27105:20;26999:1;26911:2;27105:20;:::i;:::-;;26999:1;26911:2;27105:20;:::i;:::-;29125:4;:11;:25;;;;:::i;:::-;29101:4;;:50;:10;:50::i;:::-;29094:57;29012:145;-1:-1:-1;;29012:145:0:o;29780:770::-;-1:-1:-1;;29965:4:0;:22;29961:402;;;30005:58;;-1:-1:-1;;;30005:58:0;;-1:-1:-1;;;;;6990:15:1;;;30005:58:0;;;6972:34:1;7042:15;;;7022:18;;;7015:43;7094:15;;;7074:18;;;7067:43;30015:8:0;30005:24;;;;6907:18:1;;30005:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29998:65;;29961:402;;;30125:51;;-1:-1:-1;;;30125:51:0;;-1:-1:-1;;;;;8659:32:1;;;30125:51:0;;;8641::1;8708:18;;;8701:34;;;30087:18:0;;;;30135:8;30125:37;;;;8614:18:1;;30125:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30086:90;;;;30208:10;-1:-1:-1;;;;;30193:25:0;:11;-1:-1:-1;;;;;30193:25:0;;30185:72;;;;-1:-1:-1;;;30185:72:0;;10467:2:1;30185:72:0;;;10449:21:1;10506:2;10486:18;;;10479:30;10545:34;10525:18;;;10518:62;-1:-1:-1;;;10596:18:1;;;10589:32;10638:19;;30185:72:0;10439:224:1;30185:72:0;30289:39;;-1:-1:-1;;;30289:39:0;;-1:-1:-1;;;;;6379:32:1;;;30289:39:0;;;6361:51:1;30299:8:0;30289:31;;;;6334:18:1;;30289:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30274:54:0;:11;-1:-1:-1;;;;;30274:54:0;;30266:89;;;;-1:-1:-1;;;30266:89:0;;17768:2:1;30266:89:0;;;17750:21:1;17807:2;17787:18;;;17780:30;-1:-1:-1;;;17826:18:1;;;17819:52;17888:18;;30266:89:0;17740:172:1;30266:89:0;30077:286;;29961:402;30369:50;30378:11;30391:8;30401:17;30369:8;:50::i;:::-;30426:56;;-1:-1:-1;;;30426:56:0;;-1:-1:-1;;;;;30436:8:0;30426:23;;;;:56;;30450:6;;30458:4;;30464:17;;30426:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30489:55:0;;-1:-1:-1;;;30489:55:0;;-1:-1:-1;;;;;30499:8:0;30489:26;;-1:-1:-1;30489:26:0;;-1:-1:-1;30489:55:0;;30516:6;;30524:4;;30530:13;;30489:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29780:770;;;;;;:::o;30556:622::-;30774:51;;-1:-1:-1;;;30774:51:0;;-1:-1:-1;;;;;8659:32:1;;;30774:51:0;;;8641::1;8708:18;;;8701:34;;;30736:18:0;;;;30784:8;30774:37;;;;8614:18:1;;30774:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30735:90;;;;30855:10;-1:-1:-1;;;;;30840:25:0;:11;-1:-1:-1;;;;;30840:25:0;;30832:71;;;;-1:-1:-1;;;30832:71:0;;13391:2:1;30832:71:0;;;13373:21:1;13430:2;13410:18;;;13403:30;13469:34;13449:18;;;13442:62;-1:-1:-1;;;13520:18:1;;;13513:31;13561:19;;30832:71:0;13363:223:1;30832:71:0;30933:39;;-1:-1:-1;;;30933:39:0;;-1:-1:-1;;;;;6379:32:1;;;30933:39:0;;;6361:51:1;30943:8:0;30933:31;;;;6334:18:1;;30933:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30918:54:0;:11;-1:-1:-1;;;;;30918:54:0;;30910:88;;;;-1:-1:-1;;;30910:88:0;;13041:2:1;30910:88:0;;;13023:21:1;13080:2;13060:18;;;13053:30;-1:-1:-1;;;13099:18:1;;;13092:51;13160:18;;30910:88:0;13013:171:1;30910:88:0;31005:43;31014:11;31027:6;31035:12;31005:8;:43::i;:::-;31055:53;;-1:-1:-1;;;31055:53:0;;-1:-1:-1;;;;;31065:8:0;31055:25;;;;:53;;31081:6;;31089:4;;31095:12;;31055:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31115:57:0;;-1:-1:-1;;;31115:57:0;;-1:-1:-1;;;;;31125:8:0;31115:24;;-1:-1:-1;31115:24:0;;-1:-1:-1;31115:57:0;;31140:6;;31148:4;;31154:17;;31115:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30728:450;;30556:622;;;;;;:::o;31788:363::-;31903:4;-1:-1:-1;;;;;31893:14:0;:6;-1:-1:-1;;;;;31893:14:0;;31889:257;;;31918:29;;-1:-1:-1;;;31918:29:0;;;;;9242:25:1;;;31924:4:0;-1:-1:-1;;;;;31918:20:0;;;;9215:18:1;;31918:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32000:12:0;;;31957;32000;;;;;;;;;;31957;-1:-1:-1;;;;;;31975:8:0;;;-1:-1:-1;31991:7:0;;31975:38;;32000:12;31975:38;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31956:57;;;32030:7;32022:52;;;;-1:-1:-1;;;32022:52:0;;10870:2:1;32022:52:0;;;10852:21:1;;;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;11000:18;;32022:52:0;10842:182:1;31889:257:0;32097:41;-1:-1:-1;;;;;32097:27:0;;32125:3;32130:7;32097:27;:41::i;14007:712::-;14157:12;14186:7;14182:530;;;-1:-1:-1;14217:10:0;14210:17;;14182:530;14331:17;;:21;14327:374;;14529:10;14523:17;14590:15;14577:10;14573:2;14569:19;14562:44;14327:374;14672:12;14665:20;;-1:-1:-1;;;14665:20:0;;;;;;;;:::i;535:2509::-;641:12;686:7;670:12;686:7;680:2;670:12;:::i;:::-;:23;;662:50;;;;-1:-1:-1;;;662:50:0;;12698:2:1;662:50:0;;;12680:21:1;12737:2;12717:18;;;12710:30;-1:-1:-1;;;12756:18:1;;;12749:44;12810:18;;662:50:0;12670:164:1;662:50:0;747:6;727:16;736:7;747:6;727:16;:::i;:::-;:26;;719:53;;;;-1:-1:-1;;;719:53:0;;12698:2:1;719:53:0;;;12680:21:1;12737:2;12717:18;;;12710:30;-1:-1:-1;;;12756:18:1;;;12749:44;12810:18;;719:53:0;12670:164:1;719:53:0;804:16;813:7;804:6;:16;:::i;:::-;787:6;:13;:33;;779:63;;;;-1:-1:-1;;;779:63:0;;16674:2:1;779:63:0;;;16656:21:1;16713:2;16693:18;;;16686:30;-1:-1:-1;;;16732:18:1;;;16725:47;16789:18;;779:63:0;16646:167:1;779:63:0;851:22;907:15;;930:1731;;;;2785:4;2779:11;2766:24;;2950:1;2939:9;2932:20;2992:4;2981:9;2977:20;2971:4;2964:34;900:2107;;930:1731;1091:4;1085:11;1072:24;;1688:2;1679:7;1675:16;2036:9;2029:17;2023:4;2019:28;2007:9;1996;1992:25;1988:60;2077:7;2073:2;2069:16;2296:6;2282:9;2275:17;2269:4;2265:28;2253:9;2245:6;2241:22;2237:57;2233:70;2097:350;2322:3;2318:2;2315:11;2097:350;;;2426:9;;2415:21;;2354:4;2346:13;;;;2377;2097:350;;;-1:-1:-1;;2459:26:0;;;2647:2;2630:11;-1:-1:-1;;2626:25:0;2620:4;2613:39;-1:-1:-1;900:2107:0;-1:-1:-1;3029:9:0;535:2509;-1:-1:-1;;;;535:2509:0:o;32265:362::-;32385:49;;-1:-1:-1;;;32385:49:0;;32418:4;32385:49;;;6635:34:1;-1:-1:-1;;;;;6705:15:1;;;6685:18;;;6678:43;32370:12:0;;32385:24;;;;;;6570:18:1;;32385:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32370:64;;32455:10;32445:7;:20;32441:181;;;32480:12;;32476:78;;32505:39;-1:-1:-1;;;;;32505:26:0;;32532:8;32542:1;32505:26;:39::i;:::-;32562:52;-1:-1:-1;;;;;32562:26:0;;32589:8;-1:-1:-1;;32562:26:0;:52::i;14:158:1:-;76:5;121:3;112:6;107:3;103:16;99:26;96:2;;;138:1;135;128:12;96:2;-1:-1:-1;160:6:1;86:86;-1:-1:-1;86:86:1:o;177:247::-;236:6;289:2;277:9;268:7;264:23;260:32;257:2;;;305:1;302;295:12;257:2;344:9;331:23;363:31;388:5;363:31;:::i;429:251::-;499:6;552:2;540:9;531:7;527:23;523:32;520:2;;;568:1;565;558:12;520:2;600:9;594:16;619:31;644:5;619:31;:::i;685:385::-;764:6;772;825:2;813:9;804:7;800:23;796:32;793:2;;;841:1;838;831:12;793:2;873:9;867:16;892:31;917:5;892:31;:::i;:::-;992:2;977:18;;971:25;942:5;;-1:-1:-1;1005:33:1;971:25;1005:33;:::i;:::-;1057:7;1047:17;;;783:287;;;;;:::o;1075:315::-;1143:6;1151;1204:2;1192:9;1183:7;1179:23;1175:32;1172:2;;;1220:1;1217;1210:12;1172:2;1259:9;1246:23;1278:31;1303:5;1278:31;:::i;:::-;1328:5;1380:2;1365:18;;;;1352:32;;-1:-1:-1;;;1162:228:1:o;1395:277::-;1462:6;1515:2;1503:9;1494:7;1490:23;1486:32;1483:2;;;1531:1;1528;1521:12;1483:2;1563:9;1557:16;1616:5;1609:13;1602:21;1595:5;1592:32;1582:2;;1638:1;1635;1628:12;1677:243;1754:6;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:2;;;1831:1;1828;1821:12;1783:2;-1:-1:-1;;1854:16:1;;1910:2;1895:18;;;1889:25;1854:16;;1889:25;;-1:-1:-1;1773:147:1:o;1925:725::-;2011:6;2019;2027;2035;2088:2;2076:9;2067:7;2063:23;2059:32;2056:2;;;2104:1;2101;2094:12;2056:2;2140:9;2127:23;2117:33;;2197:2;2186:9;2182:18;2169:32;2159:42;;2252:2;2241:9;2237:18;2224:32;2275:18;2316:2;2308:6;2305:14;2302:2;;;2332:1;2329;2322:12;2302:2;2370:6;2359:9;2355:22;2345:32;;2415:7;2408:4;2404:2;2400:13;2396:27;2386:2;;2437:1;2434;2427:12;2386:2;2477;2464:16;2503:2;2495:6;2492:14;2489:2;;;2519:1;2516;2509:12;2489:2;2564:7;2559:2;2550:6;2546:2;2542:15;2538:24;2535:37;2532:2;;;2585:1;2582;2575:12;2532:2;2046:604;;;;-1:-1:-1;;2616:2:1;2608:11;;-1:-1:-1;;;2046:604:1:o;2655:1402::-;2744:6;2775:2;2818;2806:9;2797:7;2793:23;2789:32;2786:2;;;2834:1;2831;2824:12;2786:2;2874:9;2861:23;2903:18;2944:2;2936:6;2933:14;2930:2;;;2960:1;2957;2950:12;2930:2;2983:22;;;;3039:4;3021:16;;;3017:27;3014:2;;;3057:1;3054;3047:12;3014:2;3083:22;;:::i;:::-;3141:2;3128:16;3121:5;3114:31;3190:2;3186;3182:11;3169:25;3203:33;3228:7;3203:33;:::i;:::-;3268:7;3263:2;3256:5;3252:14;3245:31;;3329:2;3325;3321:11;3308:25;3303:2;3296:5;3292:14;3285:49;3387:2;3383;3379:11;3366:25;3361:2;3354:5;3350:14;3343:49;3438:3;3434:2;3430:12;3417:26;3468:2;3458:8;3455:16;3452:2;;;3484:1;3481;3474:12;3452:2;3507:17;;3555:4;3547:13;;3543:27;-1:-1:-1;3533:2:1;;3584:1;3581;3574:12;3533:2;3620;3607:16;3642:2;3638;3635:10;3632:2;;;3648:18;;:::i;:::-;3690:53;3733:2;3714:13;;-1:-1:-1;;3710:27:1;3706:36;;3690:53;:::i;:::-;3677:66;;3766:2;3759:5;3752:17;3806:7;3801:2;3796;3792;3788:11;3784:20;3781:33;3778:2;;;3827:1;3824;3817:12;3778:2;3882;3877;3873;3869:11;3864:2;3857:5;3853:14;3840:45;3926:1;3921:2;3916;3909:5;3905:14;3901:23;3894:34;;;3961:5;3955:3;3948:5;3944:15;3937:30;4021:3;4017:2;4013:12;4000:26;3994:3;3987:5;3983:15;3976:51;4046:5;4036:15;;;;;;2755:1302;;;;:::o;4062:360::-;4150:6;4203:2;4191:9;4182:7;4178:23;4174:32;4171:2;;;4219:1;4216;4209:12;4171:2;4259:9;4246:23;4292:18;4284:6;4281:30;4278:2;;;4324:1;4321;4314:12;4278:2;4347:69;4408:7;4399:6;4388:9;4384:22;4347:69;:::i;:::-;4337:79;4161:261;-1:-1:-1;;;;4161:261:1:o;4792:180::-;4851:6;4904:2;4892:9;4883:7;4879:23;4875:32;4872:2;;;4920:1;4917;4910:12;4872:2;-1:-1:-1;4943:23:1;;4862:110;-1:-1:-1;4862:110:1:o;4977:184::-;5047:6;5100:2;5088:9;5079:7;5075:23;5071:32;5068:2;;;5116:1;5113;5106:12;5068:2;-1:-1:-1;5139:16:1;;5058:103;-1:-1:-1;5058:103:1:o;5166:257::-;5207:3;5245:5;5239:12;5272:6;5267:3;5260:19;5288:63;5344:6;5337:4;5332:3;5328:14;5321:4;5314:5;5310:16;5288:63;:::i;:::-;5405:2;5384:15;-1:-1:-1;;5380:29:1;5371:39;;;;5412:4;5367:50;;5215:208;-1:-1:-1;;5215:208:1:o;5428:274::-;5557:3;5595:6;5589:13;5611:53;5657:6;5652:3;5645:4;5637:6;5633:17;5611:53;:::i;:::-;5680:16;;;;;5565:137;-1:-1:-1;;5565:137:1:o;7894:568::-;-1:-1:-1;;;;;8183:15:1;;;8165:34;;8242:14;;8235:22;8230:2;8215:18;;8208:50;8289:2;8274:18;;8267:34;;;8337:15;;8332:2;8317:18;;8310:43;8145:3;8384;8369:19;;8362:32;;;8108:4;;8411:45;;8436:19;;8428:6;8411:45;:::i;8746:345::-;-1:-1:-1;;;;;8966:32:1;;;;8948:51;;9030:2;9015:18;;9008:34;;;;9073:2;9058:18;;9051:34;8936:2;8921:18;;8903:188::o;9278:219::-;9427:2;9416:9;9409:21;9390:4;9447:44;9487:2;9476:9;9472:18;9464:6;9447:44;:::i;14704:356::-;14906:2;14888:21;;;14925:18;;;14918:30;14984:34;14979:2;14964:18;;14957:62;15051:2;15036:18;;14878:182::o;19392:705::-;19581:2;19570:9;19563:21;19626:6;19620:13;19615:2;19604:9;19600:18;19593:41;19715:1;19711;19706:3;19702:11;19698:19;19692:2;19684:6;19680:15;19674:22;19670:48;19665:2;19654:9;19650:18;19643:76;19773:2;19765:6;19761:15;19755:22;19750:2;19739:9;19735:18;19728:50;19833:2;19825:6;19821:15;19815:22;19809:3;19798:9;19794:19;19787:51;19544:4;19885:3;19877:6;19873:16;19867:23;19927:4;19921:3;19910:9;19906:19;19899:33;19955:51;20001:3;19990:9;19986:19;19972:12;19955:51;:::i;:::-;19941:65;;20062:3;20054:6;20050:16;20044:23;20037:4;20026:9;20022:20;20015:53;20085:6;20077:14;;;19553:544;;;;:::o;20284:521::-;20361:4;20367:6;20427:11;20414:25;20521:2;20517:7;20506:8;20490:14;20486:29;20482:43;20462:18;20458:68;20448:2;;20540:1;20537;20530:12;20448:2;20567:33;;20619:20;;;-1:-1:-1;20662:18:1;20651:30;;20648:2;;;20694:1;20691;20684:12;20648:2;20727:4;20715:17;;-1:-1:-1;20758:14:1;20754:27;;;20744:38;;20741:2;;;20795:1;20792;20785:12;20741:2;20378:427;;;;;:::o;20810:253::-;20882:2;20876:9;20924:4;20912:17;;20959:18;20944:34;;20980:22;;;20941:62;20938:2;;;21006:18;;:::i;:::-;21042:2;21035:22;20856:207;:::o;21068:275::-;21139:2;21133:9;21204:2;21185:13;;-1:-1:-1;;21181:27:1;21169:40;;21239:18;21224:34;;21260:22;;;21221:62;21218:2;;;21286:18;;:::i;:::-;21322:2;21315:22;21113:230;;-1:-1:-1;21113:230:1:o;21348:238::-;21388:3;-1:-1:-1;;;;;21455:10:1;;;21485;;;21515:12;;;21507:21;;21504:2;;;21531:18;;:::i;:::-;21567:13;;21396:190;-1:-1:-1;;;;21396:190:1:o;21591:128::-;21631:3;21662:1;21658:6;21655:1;21652:13;21649:2;;;21668:18;;:::i;:::-;-1:-1:-1;21704:9:1;;21639:80::o;21724:231::-;21764:4;-1:-1:-1;;;;;21862:10:1;;;;21832;;21884:12;;;21881:2;;;21899:18;;:::i;:::-;21936:13;;21773:182;-1:-1:-1;;;21773:182:1:o;21960:125::-;22000:4;22028:1;22025;22022:8;22019:2;;;22033:18;;:::i;:::-;-1:-1:-1;22070:9:1;;22009:76::o;22090:258::-;22162:1;22172:113;22186:6;22183:1;22180:13;22172:113;;;22262:11;;;22256:18;22243:11;;;22236:39;22208:2;22201:10;22172:113;;;22303:6;22300:1;22297:13;22294:2;;;-1:-1:-1;;22338:1:1;22320:16;;22313:27;22143:205::o;22353:136::-;22388:3;-1:-1:-1;;;22409:22:1;;22406:2;;;22434:18;;:::i;:::-;-1:-1:-1;22474:1:1;22470:13;;22396:93::o;22494:127::-;22555:10;22550:3;22546:20;22543:1;22536:31;22586:4;22583:1;22576:15;22610:4;22607:1;22600:15;22626:127;22687:10;22682:3;22678:20;22675:1;22668:31;22718:4;22715:1;22708:15;22742:4;22739:1;22732:15;22758:131;-1:-1:-1;;;;;22833:31:1;;22823:42;;22813:2;;22879:1;22876;22869:12

Swarm Source

ipfs://175f1d4d40b6ad58ec5b57918929a5eefd3003a412603597f328dd56576301e5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.