ETH Price: $2,521.17 (-0.13%)

Contract

0xb938D8cBF7fc6455d1f2ebeDE5FF9A8e887493B2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Vest Earning205591792024-08-19 0:44:4711 days ago1724028287IN
0xb938D8cB...e887493B2
0 ETH0.000142980.82962043
Vest Earning204795422024-08-07 21:59:4723 days ago1723067987IN
0xb938D8cB...e887493B2
0 ETH0.000580913.06624209
Vest Earning204233042024-07-31 1:39:1130 days ago1722389951IN
0xb938D8cB...e887493B2
0 ETH0.000561373.25706042
Vest Earning202022512024-06-30 4:56:1161 days ago1719723371IN
0xb938D8cB...e887493B2
0 ETH0.000325051.59151687
Vest Earning201969332024-06-29 11:05:4762 days ago1719659147IN
0xb938D8cB...e887493B2
0 ETH0.00028921.67797853
Add Amount195888692024-04-05 10:13:11147 days ago1712311991IN
0xb938D8cB...e887493B2
0 ETH0.0026138515.69240438
Vest Earning195888682024-04-05 10:12:59147 days ago1712311979IN
0xb938D8cB...e887493B2
0 ETH0.0019993515.32534557
Add Amount189167892024-01-02 2:39:35241 days ago1704163175IN
0xb938D8cB...e887493B2
0 ETH0.0029733313.18120949
Create Lock189046202023-12-31 9:38:47243 days ago1704015527IN
0xb938D8cB...e887493B2
0 ETH0.0033782515.99354741
Vest Earning188448342023-12-23 0:05:23251 days ago1703289923IN
0xb938D8cB...e887493B2
0 ETH0.0040995923.78573943
Vest Earning184734082023-10-31 23:32:59303 days ago1698795179IN
0xb938D8cB...e887493B2
0 ETH0.0034929820.26620469
Add Amount176393112023-07-07 3:39:11420 days ago1688701151IN
0xb938D8cB...e887493B2
0 ETH0.0035524421.3303647
Vest Earning174870452023-06-15 18:25:47442 days ago1686853547IN
0xb938D8cB...e887493B2
0 ETH0.0039574619.37646346
Vest Earning170835472023-04-19 22:18:11499 days ago1681942691IN
0xb938D8cB...e887493B2
0 ETH0.0136669872.13841097
Add Amount163823882023-01-11 8:30:47597 days ago1673425847IN
0xb938D8cB...e887493B2
0 ETH0.0033178515.91769593
Vest Earning163529452023-01-07 5:53:47601 days ago1673070827IN
0xb938D8cB...e887493B2
0 ETH0.0018826514.43077832
Vest Earning163524642023-01-07 4:17:11601 days ago1673065031IN
0xb938D8cB...e887493B2
0 ETH0.001695212.9939526
Vest Earning163453622023-01-06 4:29:11602 days ago1672979351IN
0xb938D8cB...e887493B2
0 ETH0.0030696216.20240293
Vest Earning163195772023-01-02 14:06:35606 days ago1672668395IN
0xb938D8cB...e887493B2
0 ETH0.0052845440.50670272
Vest Earning162937162022-12-29 23:31:47609 days ago1672356707IN
0xb938D8cB...e887493B2
0 ETH0.0025406714.74095309
Vest Earning162599312022-12-25 6:20:23614 days ago1671949223IN
0xb938D8cB...e887493B2
0 ETH0.0022386512.98864278
Vest Earning162599122022-12-25 6:16:23614 days ago1671948983IN
0xb938D8cB...e887493B2
0 ETH0.0003841912.04064289
Vest Earning162082042022-12-18 1:09:59621 days ago1671325799IN
0xb938D8cB...e887493B2
0 ETH0.0020296111.77580662
Add Amount160674972022-11-28 9:09:59641 days ago1669626599IN
0xb938D8cB...e887493B2
0 ETH0.001546799.28763059
Vest Earning160409712022-11-24 16:15:59645 days ago1669306559IN
0xb938D8cB...e887493B2
0 ETH0.0023347813.54635586
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VotingEscrow

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.1.1 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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


// File @openzeppelin/contracts/math/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.2 <0.8.0;

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity >=0.6.0 <0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/interfaces/IDetailedERC20.sol

pragma solidity ^0.6.12;

interface IDetailedERC20 is IERC20 {
  function name() external returns (string memory);
  function symbol() external returns (string memory);
  function decimals() external returns (uint8);
}


// File contracts/interfaces/IMintableERC20.sol

pragma solidity ^0.6.12;

interface IMintableERC20 is IDetailedERC20{
  function mint(address _recipient, uint256 _amount) external;
  function burnFrom(address account, uint256 amount) external;
  function lowerHasMinted(uint256 amount)external;
}


// File contracts/interfaces/IRewardVesting.sol

pragma solidity ^0.6.12;

interface IRewardVesting  {
    function addEarning(address user, uint256 amount) external;
    function userBalances(address user) external view returns (uint256 bal);
}


// File hardhat/[email protected]

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File contracts/VotingEscrow.sol

pragma solidity 0.6.12;







contract VotingEscrow is IERC20 {

    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IMintableERC20 public wasabi;

    address[] public rewardTokens;
    /// @dev A mapping of all added reward tokens.
    mapping(address => bool) public rewardTokensList;
    /// @dev A mapping of the need vesting boolean mapped by reward token.
    mapping(address => bool) public rewardsNeedVesting;
    /// @dev A mapping of the vesting contract mapped by reward token.
    mapping(address => address) public rewardVestingsList;

    address public collector;

    /// @dev The address of the account which currently has administrative capabilities over this contract.
    address public governance;
    address public pendingGovernance;
    /// @dev A flag indicating if the contract has been initialized yet.
    bool public initialized;

    uint256 private _totalSupply;
    mapping (address => uint256) private _balances;
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    uint256 public constant MAX_TIME = 1440 days;

    enum LockDays { ONEWEEK,ONEMONTH,THREEMONTH,SIXMONTH,ONEYEAR,FOURYEAR}
    enum ExtendDays { ONEWEEK,ONEMONTH,THREEMONTH,SIXMONTH,ONEYEAR,FOURYEAR }
    mapping (LockDays => uint256) private _lockDays;
    mapping (ExtendDays => uint256) private _extendDays;

    struct LockData {
        uint256 amount;
        uint256 start;
        uint256 end;
    }
    mapping (address => LockData) private _locks;
    uint256 public totalLockedWASABI;

    uint256 public wasabiRewardRate;
    bool public wasabiNeedVesting;
    address public wasabiVestingAddress;
    uint256 lastRewardBlock; //Last block number that Wasabi distribution occurs.
    uint256 private _accWasabiRewardPerBalance;
    mapping (address => uint256) private _wasabiRewardDebts;


    mapping (address => uint256) private _accRewardPerBalance;
    /// @dev A mapping of all of the user reward debt mapped first by reward token and then by address.
    mapping(address => mapping(address => uint256)) private _rewardDebt;

    event LockCreate(address indexed user, uint256 amount, uint256 veAmount, uint256 lockStart, uint256 lockEnd);
    event LockExtend(address indexed user, uint256 amount, uint256 veAmount, uint256 lockStart, uint256 lockEnd);
    event LockIncreaseAmount(address indexed user, uint256 amount, uint256 veAmount, uint256 lockStart, uint256 lockEnd);
    event Withdraw(address indexed user, uint256 amount);
    event PendingGovernanceUpdated(address pendingGovernance);
    event GovernanceUpdated(address governance);
    event RewardTokenAdded(address rewardToken, address rewardVesting, bool needVesting);
    event RewardTokenUpdated(address rewardToken, address rewardVesting, bool needVesting);
    event CollectorUpdated(address collector);
    event WasabiRewardRateUpdated(uint256 wasabiRewardRate);
    event WasabiVestingUpdated(bool needVesting, address vestingAddress);

    // solium-disable-next-line
    constructor(address _governance) public {
        require(_governance != address(0), "VotingEscrow: governance address cannot be 0x0");
        governance = _governance;
    }

    /*
     * Owner methods
     */
    function initialize(IMintableERC20 _wasabi,
                        uint256 _wasabiRewardRate, bool _wasabiNeedVesting, address _wasabiVestingAddress,
                        address[] memory _rewardTokens, address[] memory _rewardVestings, bool[] memory _needVestings,
                        address _collector) external onlyGovernance {
        require(!initialized, "VotingEscrow: already initialized");
        require(_rewardTokens.length == _rewardVestings.length, "VotingEscrow: reward token and reward vesting length mismatch");
        require(_rewardTokens.length == _needVestings.length, "VotingEscrow: reward token and need vesting length mismatch");
        require(_collector != address(0), "VotingEscrow: collector address cannot be 0x0");

        if (_wasabiNeedVesting) {
            require(_wasabiVestingAddress != address(0), "VotingEscrow: wasabi vesting contract address cannot be 0x0 if wasabi requires vesting");
        }

        _name = "Voting Escrow Wasabi Token";
        _symbol = "veWasabi";
        _decimals = 18;
        wasabi = _wasabi;
        wasabiRewardRate = _wasabiRewardRate;
        wasabiNeedVesting = _wasabiNeedVesting;
        wasabiVestingAddress = _wasabiVestingAddress;

        for (uint i=0; i<_rewardTokens.length; i++) {
            address rewardToken = _rewardTokens[i];
            bool needVesting = _needVestings[i];
            address rewardVesting = _rewardVestings[i];
            if (!rewardTokensList[rewardToken]) {
                rewardTokensList[rewardToken] = true;
                rewardTokens.push(rewardToken);
                rewardsNeedVesting[rewardToken] = needVesting;
                if (needVesting) {
                    require(rewardVesting != address(0), "VotingEscrow: reward vesting contract address cannot be 0x0");
                }
                rewardVestingsList[rewardToken] = rewardVesting;
            }
        }

        collector = _collector;
        initialized = true;
        lastRewardBlock = block.number;

        _lockDays[LockDays.ONEWEEK] = 7 days;
        _lockDays[LockDays.ONEMONTH] = 30 days;
        _lockDays[LockDays.THREEMONTH] = 90 days;
        _lockDays[LockDays.SIXMONTH] = 180 days;
        _lockDays[LockDays.ONEYEAR] = 360 days;
        _lockDays[LockDays.FOURYEAR] = 1440 days;

        _extendDays[ExtendDays.ONEWEEK] = 7 days;
        _extendDays[ExtendDays.ONEMONTH] = 30 days;
        _extendDays[ExtendDays.THREEMONTH] = 90 days;
        _extendDays[ExtendDays.SIXMONTH] = 180 days;
        _extendDays[ExtendDays.ONEYEAR] = 360 days;
        _extendDays[ExtendDays.FOURYEAR] = 1440 days;
    }

    /// @dev Checks that the contract is in an initialized state.
    ///
    /// This is used over a modifier to reduce the size of the contract
    modifier expectInitialized() {
        require(initialized, "VotingEscrow: not initialized.");
        _;
    }

    modifier onlyGovernance() {
        require(msg.sender == governance, "VotingEscrow: only governance");
        _;
    }

    /// @dev Sets the governance.
    ///
    /// This function can only called by the current governance.
    ///
    /// @param _pendingGovernance the new pending governance.
    function setPendingGovernance(address _pendingGovernance) external onlyGovernance {
        require(_pendingGovernance != address(0), "VotingEscrow: pending governance address cannot be 0x0");
        pendingGovernance = _pendingGovernance;

        emit PendingGovernanceUpdated(_pendingGovernance);
    }

    function acceptGovernance() external {
        require(msg.sender == pendingGovernance, "VotingEscrow: only pending governance");

        address _pendingGovernance = pendingGovernance;
        governance = _pendingGovernance;

        emit GovernanceUpdated(_pendingGovernance);
    }

    /// @dev Sets the address of the collector
    ///
    /// @param _collector address of the new collector
    function setCollector(address _collector) external onlyGovernance {
        require(_collector != address(0), "VotingEscrow: collector address cannot be 0x0.");
        collector = _collector;
        emit CollectorUpdated(_collector);
    }

    function setRewardToken(address _rewardToken, address _rewardVesting, bool _needVesting) external onlyGovernance expectInitialized {
        require(_rewardToken != address(0), "VotingEscrow: new reward token address cannot be 0x0");

        if (_needVesting) {
            require(_rewardVesting != address(0), "VotingEscrow: new reward vesting address cannot be 0x0");
        }

        if (!rewardTokensList[_rewardToken]) {
            rewardTokens.push(_rewardToken);
            rewardTokensList[_rewardToken] = true;
            rewardsNeedVesting[_rewardToken] = _needVesting;
            rewardVestingsList[_rewardToken] = _rewardVesting;
            emit RewardTokenAdded(_rewardToken, _rewardVesting, _needVesting);
        } else {
            rewardsNeedVesting[_rewardToken] = _needVesting;
            rewardVestingsList[_rewardToken] = _rewardVesting;
            emit RewardTokenUpdated(_rewardToken, _rewardVesting, _needVesting);
        }
    }

    function setWasabiRewardRate(uint256 _wasabiRewardRate) external onlyGovernance {
        collectReward();
        wasabiRewardRate = _wasabiRewardRate;
        emit WasabiRewardRateUpdated(_wasabiRewardRate);
    }

    function setWasabiVesting(bool _needVesting, address _vestingAddress) external onlyGovernance {
        if (_needVesting) {
            require(_vestingAddress != address(0), "VotingEscrow: new wasabi reward vesting address cannot be 0x0");
        }

        wasabiNeedVesting = _needVesting;
        wasabiVestingAddress = _vestingAddress;
        emit WasabiVestingUpdated(_needVesting, _vestingAddress);
    }

    // veWasabi ERC20 interface
    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        return false;
    }

    function allowance(
        address owner,
        address spender
    )
        public view virtual override returns (uint256)
    {
        return 0;
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        return false;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        public virtual override returns (bool)
    {
        return false;
    }

    function amountOf(address account) public view returns (uint256) {
        return _locks[account].amount;
    }

    function endOf(address account) public view returns (uint256) {
        return _locks[account].end;
    }

    function startOf(address account) public view returns (uint256) {
        return _locks[account].start;
    }

    function maxEnd() public view returns (uint256) {
        return block.timestamp + MAX_TIME;
    }

    function rewardTokensLength() public view returns (uint256) {
        return rewardTokens.length;
    }

    function balanceAt(address account, uint256 timestamp) public view returns (uint256) {
        uint256 veBal = _balances[account];
        uint256 timeElapse = timestamp - startOf(account);
        uint256 lockPeriod = endOf(account) - startOf(account);

        uint256 veBalAt = veBal - veBal.mul(timeElapse).div(lockPeriod);
        return veBalAt;
    }

    function createLock(uint256 amount, LockDays lockDays) external expectInitialized {
        _createLock(amount, lockDays, block.timestamp);
    }

    function _createLock(uint256 amount, LockDays lockDays, uint256 timestamp) internal claimReward {
        LockData storage lock = _locks[msg.sender];

        require(lock.amount == 0, "must no locked");
        require(amount != 0, "amount must be non-zero");

        wasabi.transferFrom(msg.sender, address(this), amount);
        totalLockedWASABI = totalLockedWASABI + amount;

        uint256 end = timestamp + _lockDays[lockDays];
        lock.amount = amount;
        lock.end = end;
        lock.start = timestamp;

        _updateBalance(msg.sender, (end - timestamp).mul(amount).div(MAX_TIME));

        emit LockCreate(msg.sender, lock.amount, _balances[msg.sender], lock.start, lock.end);
    }

    function addAmount(uint256 amount) external expectInitialized {
        _addAmount(amount, block.timestamp);
    }

    function _addAmount(uint256 amount, uint256 timestamp) internal claimReward {
        LockData storage lock = _locks[msg.sender];

        require(lock.amount != 0, "must locked");
        require(lock.end > timestamp, "must not expired");
        require(amount != 0, "amount must be nonzero");

        wasabi.transferFrom(msg.sender, address(this), amount);
        totalLockedWASABI = totalLockedWASABI + amount;

        lock.amount = lock.amount.add(amount);
        _updateBalance(
            msg.sender,
            _balances[msg.sender].add((lock.end - timestamp).mul(amount).div(MAX_TIME))
        );

        emit LockIncreaseAmount(msg.sender, lock.amount, _balances[msg.sender], lock.start, lock.end);
    }

    function extendLock(ExtendDays extendDays) external expectInitialized {
        _extendLock(extendDays, block.timestamp);
    }

    function _extendLock(ExtendDays extendDays, uint256 timestamp) internal claimReward {
        LockData storage lock = _locks[msg.sender];
        require(lock.amount != 0, "must locked");

        uint256 end = lock.end + _extendDays[extendDays];
        // calculate equivalent lock duration
        uint256 duration = _balances[msg.sender].mul(MAX_TIME).div(lock.amount);
        duration += (end - lock.end);
        require(duration <= MAX_TIME, "end too long");

        lock.end = end;
        _updateBalance(msg.sender, duration.mul(lock.amount).div(MAX_TIME));

        emit LockExtend(msg.sender, lock.amount, _balances[msg.sender], lock.start, lock.end);
    }

    function withdraw() external expectInitialized {
        _withdraw(block.timestamp);
    }

    function _withdraw(uint256 timestamp) internal claimReward {
        LockData storage lock = _locks[msg.sender];

        require(lock.amount != 0, "must locked");
        require(lock.end <= timestamp, "must expired");

        uint256 amount = lock.amount;
        wasabi.transfer(msg.sender, amount);
        totalLockedWASABI = totalLockedWASABI - amount;

        lock.amount = 0;
        _updateBalance(msg.sender, 0);

        emit Withdraw(msg.sender, amount);
    }

    // solium-disable-next-line no-empty-blocks
    function vestEarning() external expectInitialized claimReward {
    }

    function _updateBalance(address account, uint256 newBalance) internal {
        _totalSupply = _totalSupply.sub(_balances[account]).add(newBalance);
        _balances[account] = newBalance;
    }

     // Return block rewards over the given _from (inclusive) to _to (inclusive) block.
    function getBlockReward(uint256 _from, uint256 _to) public view returns (uint256) {
        uint256 to = _to;
        uint256 from = _from;

        if (from > to) {
            return 0;
        }

        uint256 rewardPerBlock = wasabiRewardRate;
        uint256 totalRewards = (to.sub(from)).mul(rewardPerBlock);

        return totalRewards;
    }

    function collectReward() public expectInitialized {
        if (block.number <= lastRewardBlock) {
            return;
        }

        if (_totalSupply == 0) {
            lastRewardBlock = block.number;
            return;
        }

        uint256 wasabiReward = getBlockReward(lastRewardBlock, block.number);
        wasabi.mint(address(this), wasabiReward);
        _accWasabiRewardPerBalance = _accWasabiRewardPerBalance.add(wasabiReward.mul(1e18).div(_totalSupply));
        lastRewardBlock = block.number;

        for (uint i=0; i<rewardTokens.length; i++) {
            address tokenAddress = rewardTokens[i];
            if (tokenAddress != address(0)) {
                IERC20 token = IERC20(tokenAddress);
                uint256 newReward = token.balanceOf(collector);
                if (newReward == 0) {
                    return;
                }
                token.transferFrom(collector, address(this), newReward);
                _accRewardPerBalance[tokenAddress] = _accRewardPerBalance[tokenAddress].add(newReward.mul(1e18).div(_totalSupply));
           }
        }
    }

    function pendingReward(address account, address tokenAddress) public view returns (uint256) {
        require(tokenAddress != address(0), "VotingEscrow: reward token address cannot be 0x0.");
        IERC20 token = IERC20(tokenAddress);
        uint256 pending;

        if (_balances[account] > 0) {
            uint256 newReward = token.balanceOf(collector);
            uint256 newAccRewardPerBalance = _accRewardPerBalance[tokenAddress].add(newReward.mul(1e18).div(_totalSupply));
            pending = _balances[account].mul(newAccRewardPerBalance).div(1e18).sub(_rewardDebt[account][tokenAddress]);
        }
        return pending;
    }

    function pendingWasabi(address account) public view returns (uint256) {
        uint256 pending;

        if (_balances[account] > 0) {
            uint256 accRewardPerBalance = _accWasabiRewardPerBalance;
            if (block.number > lastRewardBlock) {
                uint256 wasabiReward = getBlockReward(lastRewardBlock, block.number);
                accRewardPerBalance = _accWasabiRewardPerBalance.add(wasabiReward.mul(1e18).div(_totalSupply));
            }
            pending = _balances[account].mul(accRewardPerBalance).div(1e18).sub(_wasabiRewardDebts[account]);
        }
        return pending;
    }

    modifier claimReward() {
        collectReward();
        uint256 veBal = _balances[msg.sender];
        if (veBal > 0) {
            uint256 wasabiPending = veBal.mul(_accWasabiRewardPerBalance).div(1e18).sub(_wasabiRewardDebts[msg.sender]);
            if (wasabiPending > 0) {
                if (wasabiNeedVesting) {
                    IRewardVesting wasabiVesting = IRewardVesting(wasabiVestingAddress);
                    wasabi.approve(address(wasabiVesting), wasabiPending);
                    wasabiVesting.addEarning(msg.sender, wasabiPending);
                } else {
                    _safeWasabiTransfer(msg.sender, wasabiPending);
                }
            }
            for (uint i=0; i<rewardTokens.length; i++) {
                address tokenAddress = rewardTokens[i];
                if (tokenAddress != address(0)) {
                    IERC20 token = IERC20(tokenAddress);
                    uint256 pending = veBal.mul(_accRewardPerBalance[tokenAddress]).div(1e18).sub(_rewardDebt[msg.sender][tokenAddress]);
                    if (pending > 0) {
                        bool needVesting = rewardsNeedVesting[tokenAddress];
                        if (needVesting) {
                            address rewardVestingAddress = rewardVestingsList[tokenAddress];
                            if (rewardVestingAddress != address(0)) {
                                IRewardVesting rewardVesting = IRewardVesting(rewardVestingAddress);
                                token.approve(address(rewardVesting),pending);
                                rewardVesting.addEarning(msg.sender,pending);
                            }
                        } else {
                            token.transfer(msg.sender, pending);
                        }
                    }
                }
            }
        }
        _; // _balances[msg.sender] may changed.
        veBal = _balances[msg.sender];
        for (uint i=0; i<rewardTokens.length; i++) {
            address tokenAddress = rewardTokens[i];
            if (tokenAddress != address(0)) {
                _rewardDebt[msg.sender][tokenAddress] = veBal.mul(_accRewardPerBalance[tokenAddress]).div(1e18);
            }
        }
        _wasabiRewardDebts[msg.sender] = veBal.mul(_accWasabiRewardPerBalance).div(1e18);
    }

    function _safeWasabiTransfer(address _to, uint256 _amount) internal {
        if (_amount > 0) {
            uint256 wasabiBal = wasabi.balanceOf(address(this));
            if (_amount > wasabiBal) {
                wasabi.transfer(_to, wasabiBal);
            } else {
                wasabi.transfer(_to, _amount);
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collector","type":"address"}],"name":"CollectorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockEnd","type":"uint256"}],"name":"LockCreate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockEnd","type":"uint256"}],"name":"LockExtend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockEnd","type":"uint256"}],"name":"LockIncreaseAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernance","type":"address"}],"name":"PendingGovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"address","name":"rewardVesting","type":"address"},{"indexed":false,"internalType":"bool","name":"needVesting","type":"bool"}],"name":"RewardTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"address","name":"rewardVesting","type":"address"},{"indexed":false,"internalType":"bool","name":"needVesting","type":"bool"}],"name":"RewardTokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"wasabiRewardRate","type":"uint256"}],"name":"WasabiRewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"needVesting","type":"bool"},{"indexed":false,"internalType":"address","name":"vestingAddress","type":"address"}],"name":"WasabiVestingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"amountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"balanceAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum VotingEscrow.LockDays","name":"lockDays","type":"uint8"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"endOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum VotingEscrow.ExtendDays","name":"extendDays","type":"uint8"}],"name":"extendLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getBlockReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMintableERC20","name":"_wasabi","type":"address"},{"internalType":"uint256","name":"_wasabiRewardRate","type":"uint256"},{"internalType":"bool","name":"_wasabiNeedVesting","type":"bool"},{"internalType":"address","name":"_wasabiVestingAddress","type":"address"},{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"address[]","name":"_rewardVestings","type":"address[]"},{"internalType":"bool[]","name":"_needVestings","type":"bool[]"},{"internalType":"address","name":"_collector","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingWasabi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokensList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardVestingsList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsNeedVesting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collector","type":"address"}],"name":"setCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGovernance","type":"address"}],"name":"setPendingGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_rewardVesting","type":"address"},{"internalType":"bool","name":"_needVesting","type":"bool"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wasabiRewardRate","type":"uint256"}],"name":"setWasabiRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_needVesting","type":"bool"},{"internalType":"address","name":"_vestingAddress","type":"address"}],"name":"setWasabiVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"startOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedWASABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wasabi","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wasabiNeedVesting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wasabiRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wasabiVestingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200459b3803806200459b833981810160405260208110156200003757600080fd5b50516001600160a01b038116620000805760405162461bcd60e51b815260040180806020018281038252602e8152602001806200456d602e913960400191505060405180910390fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556144bd80620000b06000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c806369d83fd51161015c578063a9059cbb116100ce578063dd62ed3e11610087578063dd62ed3e146108e8578063e229ecf514610916578063f16245b61461091e578063f39c38a014610926578063f8800b451461092e578063fb5b82d0146109365761027f565b8063a9059cbb14610358578063b65d937014610869578063b9b922881461088c578063baf6ce96146108b2578063bf199e62146108ba578063d7810221146108c25761027f565b806395d89b411161012057806395d89b41146107c85780639a0cc818146107d05780639a2c04ea146107d85780639ced7e76146107f5578063a1fa930314610823578063a4035b1c146108435761027f565b806369d83fd51461057a57806370a08231146107575780637bb7bed11461077d5780637e29b7ef1461079a578063913e77ad146107c05761027f565b8063238efcbc116101f55780633b8e6f2e116101b95780633b8e6f2e146104ce5780633ccfd60b146104fa57806354c5aee114610502578063579dde801461050a5780635aa6e67514610530578063616b1e78146105545761027f565b8063238efcbc1461046257806323b872dd1461046a57806326949984146104a0578063313ce567146104a857806336ba980a146104c65761027f565b8063101feb7f11610247578063101feb7f146103be57806310efff07146103e4578063158ef93e146103ec57806318160ddd146103f45780631ac0f5f3146103fc57806322aa75d8146104345761027f565b806301608f5f1461028457806306fdde03146102bc5780630912f23214610339578063095ea7b3146103585780630abb603514610398575b600080fd5b6102aa6004803603602081101561029a57600080fd5b50356001600160a01b031661095c565b60408051918252519081900360200190f35b6102c4610977565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fe5781810151838201526020016102e6565b50505050905090810190601f16801561032b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103566004803603602081101561034f57600080fd5b5035610a0d565b005b6103846004803603604081101561036e57600080fd5b506001600160a01b038135169060200135610a66565b604080519115158252519081900360200190f35b610356600480360360208110156103ae57600080fd5b50356001600160a01b0316610a6f565b6102aa600480360360208110156103d457600080fd5b50356001600160a01b0316610b55565b6102aa610c19565b610384610c23565b6102aa610c33565b6103566004803603606081101561041257600080fd5b506001600160a01b038135811691602081013590911690604001351515610c39565b6103566004803603604081101561044a57600080fd5b508035151590602001356001600160a01b0316610edc565b610356610fe1565b6103846004803603606081101561048057600080fd5b506001600160a01b03813581169160208101359091169060400135611081565b6102aa61108a565b6104b0611092565b6040805160ff9092168252519081900360200190f35b6102aa61109b565b6102aa600480360360408110156104e457600080fd5b506001600160a01b0381351690602001356110a1565b6103566110fc565b610356611153565b6102aa6004803603602081101561052057600080fd5b50356001600160a01b0316611410565b61053861142e565b604080516001600160a01b039092168252519081900360200190f35b6103566004803603604081101561056a57600080fd5b508035906020013560ff1661143d565b610356600480360361010081101561059157600080fd5b6001600160a01b0382358116926020810135926040820135151592606083013516919081019060a0810160808201356401000000008111156105d257600080fd5b8201836020820111156105e457600080fd5b8035906020019184602083028401116401000000008311171561060657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561065657600080fd5b82018360208201111561066857600080fd5b8035906020019184602083028401116401000000008311171561068a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106da57600080fd5b8201836020820111156106ec57600080fd5b8035906020019184602083028401116401000000008311171561070e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b031691506114949050565b6102aa6004803603602081101561076d57600080fd5b50356001600160a01b0316611a97565b6105386004803603602081101561079357600080fd5b5035611ab2565b610384600480360360208110156107b057600080fd5b50356001600160a01b0316611ad9565b610538611aee565b6102c4611afd565b610384611b5e565b610356600480360360208110156107ee57600080fd5b5035611b67565b6102aa6004803603604081101561080b57600080fd5b506001600160a01b0381358116916020013516611bf7565b6103566004803603602081101561083957600080fd5b503560ff16611d79565b6103846004803603602081101561085957600080fd5b50356001600160a01b0316611dcf565b6102aa6004803603604081101561087f57600080fd5b5080359060200135611de4565b6102aa600480360360208110156108a257600080fd5b50356001600160a01b0316611e14565b6102aa611e32565b6102aa611e38565b610538600480360360208110156108d857600080fd5b50356001600160a01b0316611e3e565b6102aa600480360360408110156108fe57600080fd5b506001600160a01b0381358116916020013516610a66565b610538611e59565b610538611e68565b610538611e7c565b610356611e8b565b6103566004803603602081101561094c57600080fd5b50356001600160a01b0316612367565b6001600160a01b03166000908152600f602052604090205490565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b600754600160a01b900460ff16610a59576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a63814261244d565b50565b60005b92915050565b6006546001600160a01b03163314610abc576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b6001600160a01b038116610b015760405162461bcd60e51b81526004018080602001828103825260368152602001806143f96036913960400191505060405180910390fd5b600780546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399181900360200190a150565b6001600160a01b038116600090815260096020526040812054819015610a6957601454601354431115610bc9576000610b9060135443611de4565b9050610bc5610bbc600854610bb6670de0b6b3a764000085612b0790919063ffffffff16565b90612b67565b60145490612bce565b9150505b6001600160a01b038416600090815260156020908152604080832054600990925290912054610c119190610c0b90670de0b6b3a764000090610bb69086612b07565b90612c28565b949350505050565b4263076a70000190565b600754600160a01b900460ff1681565b60085490565b6006546001600160a01b03163314610c86576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b600754600160a01b900460ff16610cd2576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b6001600160a01b038316610d175760405162461bcd60e51b815260040180806020018281038252603481526020018061442f6034913960400191505060405180910390fd5b8015610d62576001600160a01b038216610d625760405162461bcd60e51b81526004018080602001828103825260368152602001806143836036913960400191505060405180910390fd5b6001600160a01b03831660009081526002602052604090205460ff16610e52576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b038087166001600160a01b031992831681179093556000838152600260209081526040808320805460ff199081169098179055600382528083208054891515981688179055600482529182902080549389169390941683179093558051938452918301528181019290925290517f815a81dfc5bf0813cb1398d81b17594798d9e502723ec0a6aee6149114932a229181900360600190a1610ed7565b6001600160a01b038381166000818152600360209081526040808320805460ff1916871515908117909155600483529281902080546001600160a01b03191695881695861790558051938452908301939093528183015290517f53938d4a3abe4a78c3a6629c9f56179d5dbd3ca70f4c39a59e0be068d5636898916060908290030190a15b505050565b6006546001600160a01b03163314610f29576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b8115610f74576001600160a01b038116610f745760405162461bcd60e51b815260040180806020018281038252603d815260200180614265603d913960400191505060405180910390fd5b601280546001600160a01b0383166101008102610100600160a81b031986151560ff199094168417161790925560408051918252602082019290925281517f0445c5afaa4bfb72d5db3bfc823abb192ff90cb45115838678479ca410957385929181900390910190a15050565b6007546001600160a01b0316331461102a5760405162461bcd60e51b81526004018080602001828103825260258152602001806144636025913960400191505060405180910390fd5b600754600680546001600160a01b0319166001600160a01b0390921691821790556040805182815290517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9181900360200190a150565b60009392505050565b63076a700081565b600c5460ff1690565b60115481565b6001600160a01b038216600090815260096020526040812054816110c485611e14565b8403905060006110d386611e14565b6110dc87611410565b03905060006110ef82610bb68686612b07565b9093039695505050505050565b600754600160a01b900460ff16611148576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b61115142612c85565b565b600754600160a01b900460ff1661119f576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b60135443116111ad57611151565b6008546111bd5743601355611151565b60006111cb60135443611de4565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b50506008546112549250610bbc9150610bb684670de0b6b3a7640000612b07565b6014554360135560005b60015481101561140c5760006001828154811061127757fe5b6000918252602090912001546001600160a01b03169050801561140357600554604080516370a0823160e01b81526001600160a01b03928316600482015290518392600092908416916370a0823191602480820192602092909190829003018186803b1580156112e657600080fd5b505afa1580156112fa573d6000803e3d6000fd5b505050506040513d602081101561131057600080fd5b5051905080611323575050505050611151565b600554604080516323b872dd60e01b81526001600160a01b039283166004820152306024820152604481018490529051918416916323b872dd916064808201926020929091908290030181600087803b15801561137f57600080fd5b505af1158015611393573d6000803e3d6000fd5b505050506040513d60208110156113a957600080fd5b50506008546113e7906113c890610bb684670de0b6b3a7640000612b07565b6001600160a01b03851660009081526016602052604090205490612bce565b6001600160a01b03841660009081526016602052604090205550505b5060010161125e565b5050565b6001600160a01b03166000908152600f602052604090206002015490565b6006546001600160a01b031681565b600754600160a01b900460ff16611489576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b61140c828242613282565b6006546001600160a01b031633146114e1576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b600754600160a01b900460ff161561152a5760405162461bcd60e51b81526004018080602001828103825260218152602001806142166021913960400191505060405180910390fd5b825184511461156a5760405162461bcd60e51b815260040180806020018281038252603d8152602001806142a2603d913960400191505060405180910390fd5b81518451146115aa5760405162461bcd60e51b815260040180806020018281038252603b8152602001806141db603b913960400191505060405180910390fd5b6001600160a01b0381166115ef5760405162461bcd60e51b815260040180806020018281038252602d8152602001806142df602d913960400191505060405180910390fd5b851561163a576001600160a01b03851661163a5760405162461bcd60e51b815260040180806020018281038252605681526020018061430c6056913960600191505060405180910390fd5b60408051808201909152601a8082527f566f74696e6720457363726f772057617361626920546f6b656e000000000000602090920191825261167e91600a916140db565b5060408051808201909152600880825267766557617361626960c01b60209092019182526116ae91600b916140db565b50600c8054601260ff199182168117909255600080546001600160a01b0319166001600160a01b038c811691909117825560118b9055835490921689151517610100600160a81b03191661010092891692909202919091179091555b845181101561188257600085828151811061172157fe5b60200260200101519050600084838151811061173957fe5b60200260200101519050600086848151811061175157fe5b6020908102919091018101516001600160a01b0385166000908152600290925260409091205490915060ff16611877576001600160a01b0383166000818152600260209081526040808320805460ff19908116600190811790925581548083019092557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690910180546001600160a01b031916861790559383526003909152902080548415801591909316179055611848576001600160a01b0381166118485760405162461bcd60e51b815260040180806020018281038252603b81526020018061416f603b913960400191505060405180910390fd5b6001600160a01b03838116600090815260046020526040902080546001600160a01b0319169183169190911790555b50505060010161170a565b50600580546001600160a01b03929092166001600160a01b03199092169190911781556007805460ff60a01b1916600160a01b1790554360135562093a807f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee81905562278d007ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c58190556276a7007f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc24981905562ed4e007f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e28190556301da9c007fafafe8948a4ed9d478b1e9a5780b119b5edd00ea7d07bc35bef7c814824eb94b81905563076a70007fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149819055600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c959095557fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be958207939093557f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f0481919091557fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c908144557fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a556000919091527fb9bec7e2561f624fe753ff070f1599b306cbf59fafd4e8d5a8184a1ea1841bce5550505050505050565b6001600160a01b031660009081526009602052604090205490565b60018181548110611abf57fe5b6000918252602090912001546001600160a01b0316905081565b60026020526000908152604090205460ff1681565b6005546001600160a01b031681565b600b8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b60125460ff1681565b6006546001600160a01b03163314611bb4576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b611bbc611153565b60118190556040805182815290517f8aece442800cd62a3d722756b3f993f7791b4ff6d4163dfe07d35dc3d6a4087c9181900360200190a150565b60006001600160a01b038216611c3e5760405162461bcd60e51b81526004018080602001828103825260318152602001806141aa6031913960400191505060405180910390fd5b6001600160a01b03831660009081526009602052604081205483919015610c1157600554604080516370a0823160e01b81526001600160a01b03928316600482015290516000928516916370a08231916024808301926020929190829003018186803b158015611cad57600080fd5b505afa158015611cc1573d6000803e3d6000fd5b505050506040513d6020811015611cd757600080fd5b5051600854909150600090611d1b90611cfc90610bb685670de0b6b3a7640000612b07565b6001600160a01b03881660009081526016602052604090205490612bce565b6001600160a01b038089166000818152601760209081526040808320948c16835293815283822054928252600990529190912054919250611d6e91610c0b90670de0b6b3a764000090610bb69086612b07565b979650505050505050565b600754600160a01b900460ff16611dc5576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a638142613909565b60036020526000908152604090205460ff1681565b6000818381811115611dfb57600092505050610a69565b6011546000611d6e82611e0e8686612c28565b90612b07565b6001600160a01b03166000908152600f602052604090206001015490565b60105481565b60015490565b6004602052600090815260409020546001600160a01b031681565b6000546001600160a01b031681565b60125461010090046001600160a01b031681565b6007546001600160a01b031681565b600754600160a01b900460ff16611ed7576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b611edf611153565b3360009081526009602052604090205480156122895733600090815260156020526040812054601454611f269190610c0b90670de0b6b3a764000090610bb6908790612b07565b9050801561203f5760125460ff161561203557601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b158015611f9d57600080fd5b505af1158015611fb1573d6000803e3d6000fd5b505050506040513d6020811015611fc757600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561201757600080fd5b505af115801561202b573d6000803e3d6000fd5b505050505061203f565b61203f3382613eee565b60005b6001548110156122865760006001828154811061205b57fe5b6000918252602090912001546001600160a01b03169050801561227d573360009081526017602090815260408083206001600160a01b038516845282528083205460169092528220548392916120c491610c0b90670de0b6b3a764000090610bb6908b90612b07565b9050801561227a576001600160a01b03831660009081526003602052604090205460ff1680156121fc576001600160a01b038085166000908152600460205260409020541680156121f6576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b15801561216257600080fd5b505af1158015612176573d6000803e3d6000fd5b505050506040513d602081101561218c57600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b50505050505b50612278565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b505050506040513d602081101561227557600080fd5b50505b505b50505b50600101612042565b50505b5033600090815260096020526040812054905b600154811015612332576000600182815481106122b557fe5b6000918252602090912001546001600160a01b031690508015612329576001600160a01b03811660009081526016602052604090205461230490670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b5060010161229c565b50612354670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b3360009081526015602052604090205550565b6006546001600160a01b031633146123b4576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b6001600160a01b0381166123f95760405162461bcd60e51b815260040180806020018281038252602e815260200180614237602e913960400191505060405180910390fd5b600580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f14308adaec1375a4db1882d93c05b25b2a86d3d0dd683f8f94a3a55190d1d35b9181900360200190a150565b612455611153565b3360009081526009602052604090205480156127ff573360009081526015602052604081205460145461249c9190610c0b90670de0b6b3a764000090610bb6908790612b07565b905080156125b55760125460ff16156125ab57601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b15801561251357600080fd5b505af1158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561258d57600080fd5b505af11580156125a1573d6000803e3d6000fd5b50505050506125b5565b6125b53382613eee565b60005b6001548110156127fc576000600182815481106125d157fe5b6000918252602090912001546001600160a01b0316905080156127f3573360009081526017602090815260408083206001600160a01b0385168452825280832054601690925282205483929161263a91610c0b90670de0b6b3a764000090610bb6908b90612b07565b905080156127f0576001600160a01b03831660009081526003602052604090205460ff168015612772576001600160a01b0380851660009081526004602052604090205416801561276c576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b1580156126d857600080fd5b505af11580156126ec573d6000803e3d6000fd5b505050506040513d602081101561270257600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b50505050505b506127ee565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b1580156127c157600080fd5b505af11580156127d5573d6000803e3d6000fd5b505050506040513d60208110156127eb57600080fd5b50505b505b50505b506001016125b8565b50505b336000908152600f60205260409020805461284f576040805162461bcd60e51b815260206004820152600b60248201526a1b5d5cdd081b1bd8dad95960aa1b604482015290519081900360640190fd5b8281600201541161289a576040805162461bcd60e51b815260206004820152601060248201526f1b5d5cdd081b9bdd08195e1c1a5c995960821b604482015290519081900360640190fd5b836128e5576040805162461bcd60e51b8152602060048201526016602482015275616d6f756e74206d757374206265206e6f6e7a65726f60501b604482015290519081900360640190fd5b60008054604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b505050506040513d602081101561296a57600080fd5b5050601080548501905580546129809085612bce565b815560028101546129c39033906129be906129a89063076a700090610bb6908990038a612b07565b3360009081526009602052604090205490612bce565b61408b565b80543360008181526009602090815260409182902054600186015460028701548451968752928601919091528483015260608401525190917fb8c3dfc3d7a287b423901a471b9c2f8994f22cefd331f81b99febb3b94d77fc3919081900360800190a2505033600090815260096020526040812054905b600154811015612ad057600060018281548110612a5357fe5b6000918252602090912001546001600160a01b031690508015612ac7576001600160a01b038116600090815260166020526040902054612aa290670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b50600101612a3a565b50612af2670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b33600090815260156020526040902055505050565b600082612b1657506000610a69565b82820282848281612b2357fe5b0414612b605760405162461bcd60e51b81526004018080602001828103825260218152602001806143626021913960400191505060405180910390fd5b9392505050565b6000808211612bbd576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612bc657fe5b049392505050565b600082820183811015612b60576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115612c7f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612c8d611153565b3360009081526009602052604090205480156130375733600090815260156020526040812054601454612cd49190610c0b90670de0b6b3a764000090610bb6908790612b07565b90508015612ded5760125460ff1615612de357601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b158015612d4b57600080fd5b505af1158015612d5f573d6000803e3d6000fd5b505050506040513d6020811015612d7557600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015612dc557600080fd5b505af1158015612dd9573d6000803e3d6000fd5b5050505050612ded565b612ded3382613eee565b60005b60015481101561303457600060018281548110612e0957fe5b6000918252602090912001546001600160a01b03169050801561302b573360009081526017602090815260408083206001600160a01b03851684528252808320546016909252822054839291612e7291610c0b90670de0b6b3a764000090610bb6908b90612b07565b90508015613028576001600160a01b03831660009081526003602052604090205460ff168015612faa576001600160a01b03808516600090815260046020526040902054168015612fa4576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b158015612f1057600080fd5b505af1158015612f24573d6000803e3d6000fd5b505050506040513d6020811015612f3a57600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015612f8a57600080fd5b505af1158015612f9e573d6000803e3d6000fd5b50505050505b50613026565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b158015612ff957600080fd5b505af115801561300d573d6000803e3d6000fd5b505050506040513d602081101561302357600080fd5b50505b505b50505b50600101612df0565b50505b336000908152600f602052604090208054613087576040805162461bcd60e51b815260206004820152600b60248201526a1b5d5cdd081b1bd8dad95960aa1b604482015290519081900360640190fd5b82816002015411156130cf576040805162461bcd60e51b815260206004820152600c60248201526b1b5d5cdd08195e1c1a5c995960a21b604482015290519081900360640190fd5b8054600080546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169263a9059cbb926044808401936020939083900390910190829087803b15801561312657600080fd5b505af115801561313a573d6000803e3d6000fd5b505050506040513d602081101561315057600080fd5b5050601080548290039055600080835561316b90339061408b565b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a250503360009081526009602052604081205491505b60015481101561324c576000600182815481106131cf57fe5b6000918252602090912001546001600160a01b031690508015613243576001600160a01b03811660009081526016602052604090205461321e90670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b506001016131b6565b5061326e670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b336000908152601560205260409020555050565b61328a611153565b33600090815260096020526040902054801561363457336000908152601560205260408120546014546132d19190610c0b90670de0b6b3a764000090610bb6908790612b07565b905080156133ea5760125460ff16156133e057601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b505050506040513d602081101561337257600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b1580156133c257600080fd5b505af11580156133d6573d6000803e3d6000fd5b50505050506133ea565b6133ea3382613eee565b60005b6001548110156136315760006001828154811061340657fe5b6000918252602090912001546001600160a01b031690508015613628573360009081526017602090815260408083206001600160a01b0385168452825280832054601690925282205483929161346f91610c0b90670de0b6b3a764000090610bb6908b90612b07565b90508015613625576001600160a01b03831660009081526003602052604090205460ff1680156135a7576001600160a01b038085166000908152600460205260409020541680156135a1576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b15801561350d57600080fd5b505af1158015613521573d6000803e3d6000fd5b505050506040513d602081101561353757600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b50505050505b50613623565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b1580156135f657600080fd5b505af115801561360a573d6000803e3d6000fd5b505050506040513d602081101561362057600080fd5b50505b505b50505b506001016133ed565b50505b336000908152600f60205260409020805415613688576040805162461bcd60e51b815260206004820152600e60248201526d1b5d5cdd081b9bc81b1bd8dad95960921b604482015290519081900360640190fd5b846136da576040805162461bcd60e51b815260206004820152601760248201527f616d6f756e74206d757374206265206e6f6e2d7a65726f000000000000000000604482015290519081900360640190fd5b60008054604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561373557600080fd5b505af1158015613749573d6000803e3d6000fd5b505050506040513d602081101561375f57600080fd5b505060108054860190556000600d8186600581111561377a57fe5b600581111561378557fe5b81526020810191909152604001600020548683558401600283018190556001830185905590506137c3336129be63076a7000610bb68886038b612b07565b81543360008181526009602090815260409182902054600187015460028801548451968752928601919091528483015260608401525190917f1c1719c12e50d5cd446a621c68bd23aaf09e024de79d2df1baae28942b575480919081900360800190a250503360009081526009602052604081205491505b6001548110156138d15760006001828154811061385457fe5b6000918252602090912001546001600160a01b0316905080156138c8576001600160a01b0381166000908152601660205260409020546138a390670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b5060010161383b565b506138f3670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b3360009081526015602052604090205550505050565b613911611153565b336000908152600960205260409020548015613cbb57336000908152601560205260408120546014546139589190610c0b90670de0b6b3a764000090610bb6908790612b07565b90508015613a715760125460ff1615613a6757601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b1580156139cf57600080fd5b505af11580156139e3573d6000803e3d6000fd5b505050506040513d60208110156139f957600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015613a4957600080fd5b505af1158015613a5d573d6000803e3d6000fd5b5050505050613a71565b613a713382613eee565b60005b600154811015613cb857600060018281548110613a8d57fe5b6000918252602090912001546001600160a01b031690508015613caf573360009081526017602090815260408083206001600160a01b03851684528252808320546016909252822054839291613af691610c0b90670de0b6b3a764000090610bb6908b90612b07565b90508015613cac576001600160a01b03831660009081526003602052604090205460ff168015613c2e576001600160a01b03808516600090815260046020526040902054168015613c28576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b158015613b9457600080fd5b505af1158015613ba8573d6000803e3d6000fd5b505050506040513d6020811015613bbe57600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015613c0e57600080fd5b505af1158015613c22573d6000803e3d6000fd5b50505050505b50613caa565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b158015613c7d57600080fd5b505af1158015613c91573d6000803e3d6000fd5b505050506040513d6020811015613ca757600080fd5b50505b505b50505b50600101613a74565b50505b336000908152600f602052604090208054613d0b576040805162461bcd60e51b815260206004820152600b60248201526a1b5d5cdd081b1bd8dad95960aa1b604482015290519081900360640190fd5b6000600e6000866005811115613d1d57fe5b6005811115613d2857fe5b81526020808201929092526040908101600090812054600286015486543384526009909552928220549201935091613d6891610bb69063076a7000612b07565b6002840154830301905063076a7000811115613dba576040805162461bcd60e51b815260206004820152600c60248201526b656e6420746f6f206c6f6e6760a01b604482015290519081900360640190fd5b600283018290558254613dde9033906129be9063076a700090610bb6908690612b07565b82543360008181526009602090815260409182902054600188015460028901548451968752928601919091528483015260608401525190917fe291f232a74c9176119385794e21d0fcec16acdf047d0a48401db461158d3e95919081900360800190a2505033600090815260096020526040812054925090505b600154811015612ad057600060018281548110613e7157fe5b6000918252602090912001546001600160a01b031690508015613ee5576001600160a01b038116600090815260166020526040902054613ec090670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b50600101613e58565b801561140c5760008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613f4057600080fd5b505afa158015613f54573d6000803e3d6000fd5b505050506040513d6020811015613f6a57600080fd5b505190508082111561400157600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015613fcf57600080fd5b505af1158015613fe3573d6000803e3d6000fd5b505050506040513d6020811015613ff957600080fd5b50610ed79050565b600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b15801561405a57600080fd5b505af115801561406e573d6000803e3d6000fd5b505050506040513d602081101561408457600080fd5b5050505050565b6001600160a01b0382166000908152600960205260409020546008546140bc9183916140b691612c28565b90612bce565b6008556001600160a01b03909116600090815260096020526040902055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061411c57805160ff1916838001178555614149565b82800160010185558215614149579182015b8281111561414957825182559160200191906001019061412e565b50614155929150614159565b5090565b5b80821115614155576000815560010161415a56fe566f74696e67457363726f773a207265776172642076657374696e6720636f6e747261637420616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a2072657761726420746f6b656e20616464726573732063616e6e6f74206265203078302e566f74696e67457363726f773a2072657761726420746f6b656e20616e64206e6565642076657374696e67206c656e677468206d69736d61746368566f74696e67457363726f773a20616c726561647920696e697469616c697a6564566f74696e67457363726f773a20636f6c6c6563746f7220616464726573732063616e6e6f74206265203078302e566f74696e67457363726f773a206e657720776173616269207265776172642076657374696e6720616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a2072657761726420746f6b656e20616e64207265776172642076657374696e67206c656e677468206d69736d61746368566f74696e67457363726f773a20636f6c6c6563746f7220616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a207761736162692076657374696e6720636f6e747261637420616464726573732063616e6e6f7420626520307830206966207761736162692072657175697265732076657374696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77566f74696e67457363726f773a206e6577207265776172642076657374696e6720616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a206e6f7420696e697469616c697a65642e0000566f74696e67457363726f773a206f6e6c7920676f7665726e616e6365000000566f74696e67457363726f773a2070656e64696e6720676f7665726e616e636520616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a206e65772072657761726420746f6b656e20616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a206f6e6c792070656e64696e6720676f7665726e616e6365a2646970667358221220bb54c156e1124a8898a2713a0afe03cb22ac1aa2a082d215a10528362596475264736f6c634300060c0033566f74696e67457363726f773a20676f7665726e616e636520616464726573732063616e6e6f742062652030783000000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c806369d83fd51161015c578063a9059cbb116100ce578063dd62ed3e11610087578063dd62ed3e146108e8578063e229ecf514610916578063f16245b61461091e578063f39c38a014610926578063f8800b451461092e578063fb5b82d0146109365761027f565b8063a9059cbb14610358578063b65d937014610869578063b9b922881461088c578063baf6ce96146108b2578063bf199e62146108ba578063d7810221146108c25761027f565b806395d89b411161012057806395d89b41146107c85780639a0cc818146107d05780639a2c04ea146107d85780639ced7e76146107f5578063a1fa930314610823578063a4035b1c146108435761027f565b806369d83fd51461057a57806370a08231146107575780637bb7bed11461077d5780637e29b7ef1461079a578063913e77ad146107c05761027f565b8063238efcbc116101f55780633b8e6f2e116101b95780633b8e6f2e146104ce5780633ccfd60b146104fa57806354c5aee114610502578063579dde801461050a5780635aa6e67514610530578063616b1e78146105545761027f565b8063238efcbc1461046257806323b872dd1461046a57806326949984146104a0578063313ce567146104a857806336ba980a146104c65761027f565b8063101feb7f11610247578063101feb7f146103be57806310efff07146103e4578063158ef93e146103ec57806318160ddd146103f45780631ac0f5f3146103fc57806322aa75d8146104345761027f565b806301608f5f1461028457806306fdde03146102bc5780630912f23214610339578063095ea7b3146103585780630abb603514610398575b600080fd5b6102aa6004803603602081101561029a57600080fd5b50356001600160a01b031661095c565b60408051918252519081900360200190f35b6102c4610977565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fe5781810151838201526020016102e6565b50505050905090810190601f16801561032b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103566004803603602081101561034f57600080fd5b5035610a0d565b005b6103846004803603604081101561036e57600080fd5b506001600160a01b038135169060200135610a66565b604080519115158252519081900360200190f35b610356600480360360208110156103ae57600080fd5b50356001600160a01b0316610a6f565b6102aa600480360360208110156103d457600080fd5b50356001600160a01b0316610b55565b6102aa610c19565b610384610c23565b6102aa610c33565b6103566004803603606081101561041257600080fd5b506001600160a01b038135811691602081013590911690604001351515610c39565b6103566004803603604081101561044a57600080fd5b508035151590602001356001600160a01b0316610edc565b610356610fe1565b6103846004803603606081101561048057600080fd5b506001600160a01b03813581169160208101359091169060400135611081565b6102aa61108a565b6104b0611092565b6040805160ff9092168252519081900360200190f35b6102aa61109b565b6102aa600480360360408110156104e457600080fd5b506001600160a01b0381351690602001356110a1565b6103566110fc565b610356611153565b6102aa6004803603602081101561052057600080fd5b50356001600160a01b0316611410565b61053861142e565b604080516001600160a01b039092168252519081900360200190f35b6103566004803603604081101561056a57600080fd5b508035906020013560ff1661143d565b610356600480360361010081101561059157600080fd5b6001600160a01b0382358116926020810135926040820135151592606083013516919081019060a0810160808201356401000000008111156105d257600080fd5b8201836020820111156105e457600080fd5b8035906020019184602083028401116401000000008311171561060657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561065657600080fd5b82018360208201111561066857600080fd5b8035906020019184602083028401116401000000008311171561068a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156106da57600080fd5b8201836020820111156106ec57600080fd5b8035906020019184602083028401116401000000008311171561070e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b031691506114949050565b6102aa6004803603602081101561076d57600080fd5b50356001600160a01b0316611a97565b6105386004803603602081101561079357600080fd5b5035611ab2565b610384600480360360208110156107b057600080fd5b50356001600160a01b0316611ad9565b610538611aee565b6102c4611afd565b610384611b5e565b610356600480360360208110156107ee57600080fd5b5035611b67565b6102aa6004803603604081101561080b57600080fd5b506001600160a01b0381358116916020013516611bf7565b6103566004803603602081101561083957600080fd5b503560ff16611d79565b6103846004803603602081101561085957600080fd5b50356001600160a01b0316611dcf565b6102aa6004803603604081101561087f57600080fd5b5080359060200135611de4565b6102aa600480360360208110156108a257600080fd5b50356001600160a01b0316611e14565b6102aa611e32565b6102aa611e38565b610538600480360360208110156108d857600080fd5b50356001600160a01b0316611e3e565b6102aa600480360360408110156108fe57600080fd5b506001600160a01b0381358116916020013516610a66565b610538611e59565b610538611e68565b610538611e7c565b610356611e8b565b6103566004803603602081101561094c57600080fd5b50356001600160a01b0316612367565b6001600160a01b03166000908152600f602052604090205490565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b600754600160a01b900460ff16610a59576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a63814261244d565b50565b60005b92915050565b6006546001600160a01b03163314610abc576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b6001600160a01b038116610b015760405162461bcd60e51b81526004018080602001828103825260368152602001806143f96036913960400191505060405180910390fd5b600780546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fc9e2377236eab4280090ce8f2317332649736d92f00dcf20a8dd6684ec5e78399181900360200190a150565b6001600160a01b038116600090815260096020526040812054819015610a6957601454601354431115610bc9576000610b9060135443611de4565b9050610bc5610bbc600854610bb6670de0b6b3a764000085612b0790919063ffffffff16565b90612b67565b60145490612bce565b9150505b6001600160a01b038416600090815260156020908152604080832054600990925290912054610c119190610c0b90670de0b6b3a764000090610bb69086612b07565b90612c28565b949350505050565b4263076a70000190565b600754600160a01b900460ff1681565b60085490565b6006546001600160a01b03163314610c86576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b600754600160a01b900460ff16610cd2576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b6001600160a01b038316610d175760405162461bcd60e51b815260040180806020018281038252603481526020018061442f6034913960400191505060405180910390fd5b8015610d62576001600160a01b038216610d625760405162461bcd60e51b81526004018080602001828103825260368152602001806143836036913960400191505060405180910390fd5b6001600160a01b03831660009081526002602052604090205460ff16610e52576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b038087166001600160a01b031992831681179093556000838152600260209081526040808320805460ff199081169098179055600382528083208054891515981688179055600482529182902080549389169390941683179093558051938452918301528181019290925290517f815a81dfc5bf0813cb1398d81b17594798d9e502723ec0a6aee6149114932a229181900360600190a1610ed7565b6001600160a01b038381166000818152600360209081526040808320805460ff1916871515908117909155600483529281902080546001600160a01b03191695881695861790558051938452908301939093528183015290517f53938d4a3abe4a78c3a6629c9f56179d5dbd3ca70f4c39a59e0be068d5636898916060908290030190a15b505050565b6006546001600160a01b03163314610f29576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b8115610f74576001600160a01b038116610f745760405162461bcd60e51b815260040180806020018281038252603d815260200180614265603d913960400191505060405180910390fd5b601280546001600160a01b0383166101008102610100600160a81b031986151560ff199094168417161790925560408051918252602082019290925281517f0445c5afaa4bfb72d5db3bfc823abb192ff90cb45115838678479ca410957385929181900390910190a15050565b6007546001600160a01b0316331461102a5760405162461bcd60e51b81526004018080602001828103825260258152602001806144636025913960400191505060405180910390fd5b600754600680546001600160a01b0319166001600160a01b0390921691821790556040805182815290517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab9181900360200190a150565b60009392505050565b63076a700081565b600c5460ff1690565b60115481565b6001600160a01b038216600090815260096020526040812054816110c485611e14565b8403905060006110d386611e14565b6110dc87611410565b03905060006110ef82610bb68686612b07565b9093039695505050505050565b600754600160a01b900460ff16611148576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b61115142612c85565b565b600754600160a01b900460ff1661119f576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b60135443116111ad57611151565b6008546111bd5743601355611151565b60006111cb60135443611de4565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b50506008546112549250610bbc9150610bb684670de0b6b3a7640000612b07565b6014554360135560005b60015481101561140c5760006001828154811061127757fe5b6000918252602090912001546001600160a01b03169050801561140357600554604080516370a0823160e01b81526001600160a01b03928316600482015290518392600092908416916370a0823191602480820192602092909190829003018186803b1580156112e657600080fd5b505afa1580156112fa573d6000803e3d6000fd5b505050506040513d602081101561131057600080fd5b5051905080611323575050505050611151565b600554604080516323b872dd60e01b81526001600160a01b039283166004820152306024820152604481018490529051918416916323b872dd916064808201926020929091908290030181600087803b15801561137f57600080fd5b505af1158015611393573d6000803e3d6000fd5b505050506040513d60208110156113a957600080fd5b50506008546113e7906113c890610bb684670de0b6b3a7640000612b07565b6001600160a01b03851660009081526016602052604090205490612bce565b6001600160a01b03841660009081526016602052604090205550505b5060010161125e565b5050565b6001600160a01b03166000908152600f602052604090206002015490565b6006546001600160a01b031681565b600754600160a01b900460ff16611489576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b61140c828242613282565b6006546001600160a01b031633146114e1576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b600754600160a01b900460ff161561152a5760405162461bcd60e51b81526004018080602001828103825260218152602001806142166021913960400191505060405180910390fd5b825184511461156a5760405162461bcd60e51b815260040180806020018281038252603d8152602001806142a2603d913960400191505060405180910390fd5b81518451146115aa5760405162461bcd60e51b815260040180806020018281038252603b8152602001806141db603b913960400191505060405180910390fd5b6001600160a01b0381166115ef5760405162461bcd60e51b815260040180806020018281038252602d8152602001806142df602d913960400191505060405180910390fd5b851561163a576001600160a01b03851661163a5760405162461bcd60e51b815260040180806020018281038252605681526020018061430c6056913960600191505060405180910390fd5b60408051808201909152601a8082527f566f74696e6720457363726f772057617361626920546f6b656e000000000000602090920191825261167e91600a916140db565b5060408051808201909152600880825267766557617361626960c01b60209092019182526116ae91600b916140db565b50600c8054601260ff199182168117909255600080546001600160a01b0319166001600160a01b038c811691909117825560118b9055835490921689151517610100600160a81b03191661010092891692909202919091179091555b845181101561188257600085828151811061172157fe5b60200260200101519050600084838151811061173957fe5b60200260200101519050600086848151811061175157fe5b6020908102919091018101516001600160a01b0385166000908152600290925260409091205490915060ff16611877576001600160a01b0383166000818152600260209081526040808320805460ff19908116600190811790925581548083019092557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690910180546001600160a01b031916861790559383526003909152902080548415801591909316179055611848576001600160a01b0381166118485760405162461bcd60e51b815260040180806020018281038252603b81526020018061416f603b913960400191505060405180910390fd5b6001600160a01b03838116600090815260046020526040902080546001600160a01b0319169183169190911790555b50505060010161170a565b50600580546001600160a01b03929092166001600160a01b03199092169190911781556007805460ff60a01b1916600160a01b1790554360135562093a807f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee81905562278d007ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c58190556276a7007f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc24981905562ed4e007f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e28190556301da9c007fafafe8948a4ed9d478b1e9a5780b119b5edd00ea7d07bc35bef7c814824eb94b81905563076a70007fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149819055600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c959095557fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be958207939093557f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f0481919091557fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c908144557fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a556000919091527fb9bec7e2561f624fe753ff070f1599b306cbf59fafd4e8d5a8184a1ea1841bce5550505050505050565b6001600160a01b031660009081526009602052604090205490565b60018181548110611abf57fe5b6000918252602090912001546001600160a01b0316905081565b60026020526000908152604090205460ff1681565b6005546001600160a01b031681565b600b8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a035780601f106109d857610100808354040283529160200191610a03565b60125460ff1681565b6006546001600160a01b03163314611bb4576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b611bbc611153565b60118190556040805182815290517f8aece442800cd62a3d722756b3f993f7791b4ff6d4163dfe07d35dc3d6a4087c9181900360200190a150565b60006001600160a01b038216611c3e5760405162461bcd60e51b81526004018080602001828103825260318152602001806141aa6031913960400191505060405180910390fd5b6001600160a01b03831660009081526009602052604081205483919015610c1157600554604080516370a0823160e01b81526001600160a01b03928316600482015290516000928516916370a08231916024808301926020929190829003018186803b158015611cad57600080fd5b505afa158015611cc1573d6000803e3d6000fd5b505050506040513d6020811015611cd757600080fd5b5051600854909150600090611d1b90611cfc90610bb685670de0b6b3a7640000612b07565b6001600160a01b03881660009081526016602052604090205490612bce565b6001600160a01b038089166000818152601760209081526040808320948c16835293815283822054928252600990529190912054919250611d6e91610c0b90670de0b6b3a764000090610bb69086612b07565b979650505050505050565b600754600160a01b900460ff16611dc5576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a638142613909565b60036020526000908152604090205460ff1681565b6000818381811115611dfb57600092505050610a69565b6011546000611d6e82611e0e8686612c28565b90612b07565b6001600160a01b03166000908152600f602052604090206001015490565b60105481565b60015490565b6004602052600090815260409020546001600160a01b031681565b6000546001600160a01b031681565b60125461010090046001600160a01b031681565b6007546001600160a01b031681565b600754600160a01b900460ff16611ed7576040805162461bcd60e51b815260206004820152601e60248201526000805160206143b9833981519152604482015290519081900360640190fd5b611edf611153565b3360009081526009602052604090205480156122895733600090815260156020526040812054601454611f269190610c0b90670de0b6b3a764000090610bb6908790612b07565b9050801561203f5760125460ff161561203557601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b158015611f9d57600080fd5b505af1158015611fb1573d6000803e3d6000fd5b505050506040513d6020811015611fc757600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561201757600080fd5b505af115801561202b573d6000803e3d6000fd5b505050505061203f565b61203f3382613eee565b60005b6001548110156122865760006001828154811061205b57fe5b6000918252602090912001546001600160a01b03169050801561227d573360009081526017602090815260408083206001600160a01b038516845282528083205460169092528220548392916120c491610c0b90670de0b6b3a764000090610bb6908b90612b07565b9050801561227a576001600160a01b03831660009081526003602052604090205460ff1680156121fc576001600160a01b038085166000908152600460205260409020541680156121f6576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b15801561216257600080fd5b505af1158015612176573d6000803e3d6000fd5b505050506040513d602081101561218c57600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b50505050505b50612278565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b505050506040513d602081101561227557600080fd5b50505b505b50505b50600101612042565b50505b5033600090815260096020526040812054905b600154811015612332576000600182815481106122b557fe5b6000918252602090912001546001600160a01b031690508015612329576001600160a01b03811660009081526016602052604090205461230490670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b5060010161229c565b50612354670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b3360009081526015602052604090205550565b6006546001600160a01b031633146123b4576040805162461bcd60e51b815260206004820152601d60248201526000805160206143d9833981519152604482015290519081900360640190fd5b6001600160a01b0381166123f95760405162461bcd60e51b815260040180806020018281038252602e815260200180614237602e913960400191505060405180910390fd5b600580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f14308adaec1375a4db1882d93c05b25b2a86d3d0dd683f8f94a3a55190d1d35b9181900360200190a150565b612455611153565b3360009081526009602052604090205480156127ff573360009081526015602052604081205460145461249c9190610c0b90670de0b6b3a764000090610bb6908790612b07565b905080156125b55760125460ff16156125ab57601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b15801561251357600080fd5b505af1158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561258d57600080fd5b505af11580156125a1573d6000803e3d6000fd5b50505050506125b5565b6125b53382613eee565b60005b6001548110156127fc576000600182815481106125d157fe5b6000918252602090912001546001600160a01b0316905080156127f3573360009081526017602090815260408083206001600160a01b0385168452825280832054601690925282205483929161263a91610c0b90670de0b6b3a764000090610bb6908b90612b07565b905080156127f0576001600160a01b03831660009081526003602052604090205460ff168015612772576001600160a01b0380851660009081526004602052604090205416801561276c576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b1580156126d857600080fd5b505af11580156126ec573d6000803e3d6000fd5b505050506040513d602081101561270257600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b50505050505b506127ee565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b1580156127c157600080fd5b505af11580156127d5573d6000803e3d6000fd5b505050506040513d60208110156127eb57600080fd5b50505b505b50505b506001016125b8565b50505b336000908152600f60205260409020805461284f576040805162461bcd60e51b815260206004820152600b60248201526a1b5d5cdd081b1bd8dad95960aa1b604482015290519081900360640190fd5b8281600201541161289a576040805162461bcd60e51b815260206004820152601060248201526f1b5d5cdd081b9bdd08195e1c1a5c995960821b604482015290519081900360640190fd5b836128e5576040805162461bcd60e51b8152602060048201526016602482015275616d6f756e74206d757374206265206e6f6e7a65726f60501b604482015290519081900360640190fd5b60008054604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b505050506040513d602081101561296a57600080fd5b5050601080548501905580546129809085612bce565b815560028101546129c39033906129be906129a89063076a700090610bb6908990038a612b07565b3360009081526009602052604090205490612bce565b61408b565b80543360008181526009602090815260409182902054600186015460028701548451968752928601919091528483015260608401525190917fb8c3dfc3d7a287b423901a471b9c2f8994f22cefd331f81b99febb3b94d77fc3919081900360800190a2505033600090815260096020526040812054905b600154811015612ad057600060018281548110612a5357fe5b6000918252602090912001546001600160a01b031690508015612ac7576001600160a01b038116600090815260166020526040902054612aa290670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b50600101612a3a565b50612af2670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b33600090815260156020526040902055505050565b600082612b1657506000610a69565b82820282848281612b2357fe5b0414612b605760405162461bcd60e51b81526004018080602001828103825260218152602001806143626021913960400191505060405180910390fd5b9392505050565b6000808211612bbd576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612bc657fe5b049392505050565b600082820183811015612b60576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115612c7f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612c8d611153565b3360009081526009602052604090205480156130375733600090815260156020526040812054601454612cd49190610c0b90670de0b6b3a764000090610bb6908790612b07565b90508015612ded5760125460ff1615612de357601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b158015612d4b57600080fd5b505af1158015612d5f573d6000803e3d6000fd5b505050506040513d6020811015612d7557600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015612dc557600080fd5b505af1158015612dd9573d6000803e3d6000fd5b5050505050612ded565b612ded3382613eee565b60005b60015481101561303457600060018281548110612e0957fe5b6000918252602090912001546001600160a01b03169050801561302b573360009081526017602090815260408083206001600160a01b03851684528252808320546016909252822054839291612e7291610c0b90670de0b6b3a764000090610bb6908b90612b07565b90508015613028576001600160a01b03831660009081526003602052604090205460ff168015612faa576001600160a01b03808516600090815260046020526040902054168015612fa4576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b158015612f1057600080fd5b505af1158015612f24573d6000803e3d6000fd5b505050506040513d6020811015612f3a57600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015612f8a57600080fd5b505af1158015612f9e573d6000803e3d6000fd5b50505050505b50613026565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b158015612ff957600080fd5b505af115801561300d573d6000803e3d6000fd5b505050506040513d602081101561302357600080fd5b50505b505b50505b50600101612df0565b50505b336000908152600f602052604090208054613087576040805162461bcd60e51b815260206004820152600b60248201526a1b5d5cdd081b1bd8dad95960aa1b604482015290519081900360640190fd5b82816002015411156130cf576040805162461bcd60e51b815260206004820152600c60248201526b1b5d5cdd08195e1c1a5c995960a21b604482015290519081900360640190fd5b8054600080546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169263a9059cbb926044808401936020939083900390910190829087803b15801561312657600080fd5b505af115801561313a573d6000803e3d6000fd5b505050506040513d602081101561315057600080fd5b5050601080548290039055600080835561316b90339061408b565b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a250503360009081526009602052604081205491505b60015481101561324c576000600182815481106131cf57fe5b6000918252602090912001546001600160a01b031690508015613243576001600160a01b03811660009081526016602052604090205461321e90670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b506001016131b6565b5061326e670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b336000908152601560205260409020555050565b61328a611153565b33600090815260096020526040902054801561363457336000908152601560205260408120546014546132d19190610c0b90670de0b6b3a764000090610bb6908790612b07565b905080156133ea5760125460ff16156133e057601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b505050506040513d602081101561337257600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b1580156133c257600080fd5b505af11580156133d6573d6000803e3d6000fd5b50505050506133ea565b6133ea3382613eee565b60005b6001548110156136315760006001828154811061340657fe5b6000918252602090912001546001600160a01b031690508015613628573360009081526017602090815260408083206001600160a01b0385168452825280832054601690925282205483929161346f91610c0b90670de0b6b3a764000090610bb6908b90612b07565b90508015613625576001600160a01b03831660009081526003602052604090205460ff1680156135a7576001600160a01b038085166000908152600460205260409020541680156135a1576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b15801561350d57600080fd5b505af1158015613521573d6000803e3d6000fd5b505050506040513d602081101561353757600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b50505050505b50613623565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b1580156135f657600080fd5b505af115801561360a573d6000803e3d6000fd5b505050506040513d602081101561362057600080fd5b50505b505b50505b506001016133ed565b50505b336000908152600f60205260409020805415613688576040805162461bcd60e51b815260206004820152600e60248201526d1b5d5cdd081b9bc81b1bd8dad95960921b604482015290519081900360640190fd5b846136da576040805162461bcd60e51b815260206004820152601760248201527f616d6f756e74206d757374206265206e6f6e2d7a65726f000000000000000000604482015290519081900360640190fd5b60008054604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b15801561373557600080fd5b505af1158015613749573d6000803e3d6000fd5b505050506040513d602081101561375f57600080fd5b505060108054860190556000600d8186600581111561377a57fe5b600581111561378557fe5b81526020810191909152604001600020548683558401600283018190556001830185905590506137c3336129be63076a7000610bb68886038b612b07565b81543360008181526009602090815260409182902054600187015460028801548451968752928601919091528483015260608401525190917f1c1719c12e50d5cd446a621c68bd23aaf09e024de79d2df1baae28942b575480919081900360800190a250503360009081526009602052604081205491505b6001548110156138d15760006001828154811061385457fe5b6000918252602090912001546001600160a01b0316905080156138c8576001600160a01b0381166000908152601660205260409020546138a390670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b5060010161383b565b506138f3670de0b6b3a7640000610bb660145484612b0790919063ffffffff16565b3360009081526015602052604090205550505050565b613911611153565b336000908152600960205260409020548015613cbb57336000908152601560205260408120546014546139589190610c0b90670de0b6b3a764000090610bb6908790612b07565b90508015613a715760125460ff1615613a6757601254600080546040805163095ea7b360e01b81526101009094046001600160a01b0390811660048601819052602486018790529151919492169263095ea7b392604480820193602093909283900390910190829087803b1580156139cf57600080fd5b505af11580156139e3573d6000803e3d6000fd5b505050506040513d60208110156139f957600080fd5b50506040805163733cb55560e11b81523360048201526024810184905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015613a4957600080fd5b505af1158015613a5d573d6000803e3d6000fd5b5050505050613a71565b613a713382613eee565b60005b600154811015613cb857600060018281548110613a8d57fe5b6000918252602090912001546001600160a01b031690508015613caf573360009081526017602090815260408083206001600160a01b03851684528252808320546016909252822054839291613af691610c0b90670de0b6b3a764000090610bb6908b90612b07565b90508015613cac576001600160a01b03831660009081526003602052604090205460ff168015613c2e576001600160a01b03808516600090815260046020526040902054168015613c28576040805163095ea7b360e01b81526001600160a01b038084166004830152602482018690529151839287169163095ea7b39160448083019260209291908290030181600087803b158015613b9457600080fd5b505af1158015613ba8573d6000803e3d6000fd5b505050506040513d6020811015613bbe57600080fd5b50506040805163733cb55560e11b81523360048201526024810186905290516001600160a01b0383169163e6796aaa91604480830192600092919082900301818387803b158015613c0e57600080fd5b505af1158015613c22573d6000803e3d6000fd5b50505050505b50613caa565b6040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b158015613c7d57600080fd5b505af1158015613c91573d6000803e3d6000fd5b505050506040513d6020811015613ca757600080fd5b50505b505b50505b50600101613a74565b50505b336000908152600f602052604090208054613d0b576040805162461bcd60e51b815260206004820152600b60248201526a1b5d5cdd081b1bd8dad95960aa1b604482015290519081900360640190fd5b6000600e6000866005811115613d1d57fe5b6005811115613d2857fe5b81526020808201929092526040908101600090812054600286015486543384526009909552928220549201935091613d6891610bb69063076a7000612b07565b6002840154830301905063076a7000811115613dba576040805162461bcd60e51b815260206004820152600c60248201526b656e6420746f6f206c6f6e6760a01b604482015290519081900360640190fd5b600283018290558254613dde9033906129be9063076a700090610bb6908690612b07565b82543360008181526009602090815260409182902054600188015460028901548451968752928601919091528483015260608401525190917fe291f232a74c9176119385794e21d0fcec16acdf047d0a48401db461158d3e95919081900360800190a2505033600090815260096020526040812054925090505b600154811015612ad057600060018281548110613e7157fe5b6000918252602090912001546001600160a01b031690508015613ee5576001600160a01b038116600090815260166020526040902054613ec090670de0b6b3a764000090610bb6908690612b07565b3360009081526017602090815260408083206001600160a01b03861684529091529020555b50600101613e58565b801561140c5760008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613f4057600080fd5b505afa158015613f54573d6000803e3d6000fd5b505050506040513d6020811015613f6a57600080fd5b505190508082111561400157600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015613fcf57600080fd5b505af1158015613fe3573d6000803e3d6000fd5b505050506040513d6020811015613ff957600080fd5b50610ed79050565b600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b15801561405a57600080fd5b505af115801561406e573d6000803e3d6000fd5b505050506040513d602081101561408457600080fd5b5050505050565b6001600160a01b0382166000908152600960205260409020546008546140bc9183916140b691612c28565b90612bce565b6008556001600160a01b03909116600090815260096020526040902055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061411c57805160ff1916838001178555614149565b82800160010185558215614149579182015b8281111561414957825182559160200191906001019061412e565b50614155929150614159565b5090565b5b80821115614155576000815560010161415a56fe566f74696e67457363726f773a207265776172642076657374696e6720636f6e747261637420616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a2072657761726420746f6b656e20616464726573732063616e6e6f74206265203078302e566f74696e67457363726f773a2072657761726420746f6b656e20616e64206e6565642076657374696e67206c656e677468206d69736d61746368566f74696e67457363726f773a20616c726561647920696e697469616c697a6564566f74696e67457363726f773a20636f6c6c6563746f7220616464726573732063616e6e6f74206265203078302e566f74696e67457363726f773a206e657720776173616269207265776172642076657374696e6720616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a2072657761726420746f6b656e20616e64207265776172642076657374696e67206c656e677468206d69736d61746368566f74696e67457363726f773a20636f6c6c6563746f7220616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a207761736162692076657374696e6720636f6e747261637420616464726573732063616e6e6f7420626520307830206966207761736162692072657175697265732076657374696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77566f74696e67457363726f773a206e6577207265776172642076657374696e6720616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a206e6f7420696e697469616c697a65642e0000566f74696e67457363726f773a206f6e6c7920676f7665726e616e6365000000566f74696e67457363726f773a2070656e64696e6720676f7665726e616e636520616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a206e65772072657761726420746f6b656e20616464726573732063616e6e6f7420626520307830566f74696e67457363726f773a206f6e6c792070656e64696e6720676f7665726e616e6365a2646970667358221220bb54c156e1124a8898a2713a0afe03cb22ac1aa2a082d215a10528362596475264736f6c634300060c0033

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

00000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e

-----Decoded View---------------
Arg [0] : _governance (address): 0x23Ae8682437004044C0eddC7cee3bF632349062e

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000023ae8682437004044c0eddc7cee3bf632349062e


Deployed Bytecode Sourcemap

86676:20485:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97078:113;;;;;;;;;;;;;;;;-1:-1:-1;97078:113:0;-1:-1:-1;;;;;97078:113:0;;:::i;:::-;;;;;;;;;;;;;;;;95896:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98913:116;;;;;;;;;;;;;;;;-1:-1:-1;98913:116:0;;:::i;:::-;;96751:120;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;96751:120:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;93229:311;;;;;;;;;;;;;;;;-1:-1:-1;93229:311:0;-1:-1:-1;;;;;93229:311:0;;:::i;103803:629::-;;;;;;;;;;;;;;;;-1:-1:-1;103803:629:0;-1:-1:-1;;;;;103803:629:0;;:::i;97433:100::-;;;:::i;87519:23::-;;;:::i;96197:108::-;;;:::i;94215:984::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;94215:984:0;;;;;;;;;;;;;;;;;;;:::i;95434:421::-;;;;;;;;;;;;;;;;-1:-1:-1;95434:421:0;;;;;;;;-1:-1:-1;;;;;95434:421:0;;:::i;93548:293::-;;;:::i;96879:191::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;96879:191:0;;;;;;;;;;;;;;;;;:::i;87727:44::-;;;:::i;96098:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;88242:31;;;:::i;97654:364::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;97654:364:0;;;;;;;;:::i;100612:92::-;;;:::i;102002:1130::-;;;:::i;97199:107::-;;;;;;;;;;;;;;;;-1:-1:-1;97199:107:0;-1:-1:-1;;;;;97199:107:0;;:::i;87374:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;87374:25:0;;;;;;;;;;;;;;98026:147;;;;;;;;;;;;;;;;-1:-1:-1;98026:147:0;;;;;;;;;:::i;89956:2681::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;89956:2681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89956:2681:0;;;;;;;;-1:-1:-1;89956:2681:0;;-1:-1:-1;;89956:2681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89956:2681:0;;;;;;;;-1:-1:-1;89956:2681:0;;-1:-1:-1;;89956:2681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89956:2681:0;;-1:-1:-1;;;89956:2681:0;;-1:-1:-1;;;;;89956:2681:0;;-1:-1:-1;89956:2681:0;;-1:-1:-1;89956:2681:0:i;96313:127::-;;;;;;;;;;;;;;;;-1:-1:-1;96313:127:0;-1:-1:-1;;;;;96313:127:0;;:::i;86822:29::-;;;;;;;;;;;;;;;;-1:-1:-1;86822:29:0;;:::i;86910:48::-;;;;;;;;;;;;;;;;-1:-1:-1;86910:48:0;-1:-1:-1;;;;;86910:48:0;;:::i;87232:24::-;;;:::i;95995:95::-;;;:::i;88280:29::-;;;:::i;95207:219::-;;;;;;;;;;;;;;;;-1:-1:-1;95207:219:0;;:::i;103140:655::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;103140:655:0;;;;;;;;;;:::i;99783:129::-;;;;;;;;;;;;;;;;-1:-1:-1;99783:129:0;;;;:::i;87041:50::-;;;;;;;;;;;;;;;;-1:-1:-1;87041:50:0;-1:-1:-1;;;;;87041:50:0;;:::i;101630:364::-;;;;;;;;;;;;;;;;-1:-1:-1;101630:364:0;;;;;;;:::i;97314:111::-;;;;;;;;;;;;;;;;-1:-1:-1;97314:111:0;-1:-1:-1;;;;;97314:111:0;;:::i;88201:32::-;;;:::i;97541:105::-;;;:::i;87170:53::-;;;;;;;;;;;;;;;;-1:-1:-1;87170:53:0;-1:-1:-1;;;;;87170:53:0;;:::i;96579:164::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;96579:164:0;;;;;;;;;;:::i;86785:28::-;;;:::i;88316:35::-;;;:::i;87406:32::-;;;:::i;101257:70::-;;;:::i;93962:245::-;;;;;;;;;;;;;;;;-1:-1:-1;93962:245:0;-1:-1:-1;;;;;93962:245:0;;:::i;97078:113::-;-1:-1:-1;;;;;97161:15:0;97134:7;97161:15;;;:6;:15;;;;;:22;;97078:113::o;95896:91::-;95974:5;95967:12;;;;;;;;-1:-1:-1;;95967:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95941:13;;95967:12;;95974:5;;95967:12;;95974:5;95967:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95896:91;:::o;98913:116::-;92842:11;;-1:-1:-1;;;92842:11:0;;;;92834:54;;;;;-1:-1:-1;;;92834:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;;;98986:35:::1;98997:6;99005:15;98986:10;:35::i;:::-;98913:116:::0;:::o;96751:120::-;96834:4;96751:120;;;;;:::o;93229:311::-;92975:10;;-1:-1:-1;;;;;92975:10:0;92961;:24;92953:66;;;;;-1:-1:-1;;;92953:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92953:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;93330:32:0;::::1;93322:99;;;;-1:-1:-1::0;;;93322:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93432:17;:38:::0;;-1:-1:-1;;;;;93432:38:0;::::1;-1:-1:-1::0;;;;;;93432:38:0;;::::1;::::0;::::1;::::0;;;93488:44:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;93229:311:::0;:::o;103803:629::-;-1:-1:-1;;;;;103916:18:0;;103864:7;103916:18;;;:9;:18;;;;;;103864:7;;103916:22;103912:488;;103985:26;;104045:15;;104030:12;:30;104026:252;;;104081:20;104104:45;104119:15;;104136:12;104104:14;:45::i;:::-;104081:68;;104190:72;104221:40;104248:12;;104221:22;104238:4;104221:12;:16;;:22;;;;:::i;:::-;:26;;:40::i;:::-;104190:26;;;:30;:72::i;:::-;104168:94;;104026:252;;-1:-1:-1;;;;;104360:27:0;;;;;;:18;:27;;;;;;;;;104302:9;:18;;;;;;;:86;;104360:27;104302:53;;104350:4;;104302:43;;104325:19;104302:22;:43::i;:53::-;:57;;:86::i;:::-;104292:96;104417:7;-1:-1:-1;;;;103803:629:0:o;97433:100::-;97499:15;87762:9;97499:26;97433:100;:::o;87519:23::-;;;-1:-1:-1;;;87519:23:0;;;;;:::o;96197:108::-;96285:12;;96197:108;:::o;94215:984::-;92975:10;;-1:-1:-1;;;;;92975:10:0;92961;:24;92953:66;;;;;-1:-1:-1;;;92953:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92953:66:0;;;;;;;;;;;;;;;92842:11:::1;::::0;-1:-1:-1;;;92842:11:0;::::1;;;92834:54;;;::::0;;-1:-1:-1;;;92834:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;94365:26:0;::::2;94357:91;;;;-1:-1:-1::0;;;94357:91:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94465:12;94461:140;;;-1:-1:-1::0;;;;;94502:28:0;::::2;94494:95;;;;-1:-1:-1::0;;;94494:95:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;94618:30:0;::::2;;::::0;;;:16:::2;:30;::::0;;;;;::::2;;94613:579;;94665:12;:31:::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;;;94665:31:0;;::::2;-1:-1:-1::0;;;;;;94665:31:0;;::::2;::::0;::::2;::::0;;;-1:-1:-1;94711:30:0;;;:16:::2;94665:31;94711:30:::0;;;;;;;:37;;-1:-1:-1;;94711:37:0;;::::2;::::0;;::::2;::::0;;94763:18:::2;:32:::0;;;;;:47;;;::::2;;::::0;::::2;::::0;::::2;::::0;;94825:18:::2;:32:::0;;;;;;:49;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;94894:60;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;::::2;94613:579;;;-1:-1:-1::0;;;;;94987:32:0;;::::2;;::::0;;;:18:::2;:32;::::0;;;;;;;:47;;-1:-1:-1;;94987:47:0::2;::::0;::::2;;::::0;;::::2;::::0;;;95049:18:::2;:32:::0;;;;;;:49;;-1:-1:-1;;;;;;95049:49:0::2;::::0;;::::2;::::0;;::::2;::::0;;95118:62;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;94613:579;94215:984:::0;;;:::o;95434:421::-;92975:10;;-1:-1:-1;;;;;92975:10:0;92961;:24;92953:66;;;;;-1:-1:-1;;;92953:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92953:66:0;;;;;;;;;;;;;;;95543:12:::1;95539:148;;;-1:-1:-1::0;;;;;95580:29:0;::::1;95572:103;;;;-1:-1:-1::0;;;95572:103:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95699:17;:32:::0;;-1:-1:-1;;;;;95742:38:0;::::1;95699:32;95742:38:::0;::::1;-1:-1:-1::0;;;;;;95699:32:0;::::1;;-1:-1:-1::0;;95699:32:0;;::::1;::::0;::::1;95742:38;;::::0;;;95796:51:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;95434:421:::0;;:::o;93548:293::-;93618:17;;-1:-1:-1;;;;;93618:17:0;93604:10;:31;93596:81;;;;-1:-1:-1;;;93596:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93719:17;;93747:10;:31;;-1:-1:-1;;;;;;93747:31:0;-1:-1:-1;;;;;93719:17:0;;;93747:31;;;;;93796:37;;;;;;;;;;;;;;;;;93548:293;:::o;96879:191::-;97028:4;96879:191;;;;;:::o;87727:44::-;87762:9;87727:44;:::o;96098:91::-;96172:9;;;;96098:91;:::o;88242:31::-;;;;:::o;97654:364::-;-1:-1:-1;;;;;97766:18:0;;97730:7;97766:18;;;:9;:18;;;;;;97730:7;97828:16;97776:7;97828;:16::i;:::-;97816:9;:28;97795:49;;97855:18;97893:16;97901:7;97893;:16::i;:::-;97876:14;97882:7;97876:5;:14::i;:::-;:33;;-1:-1:-1;97922:15:0;97948:37;97876:33;97948:21;:5;97958:10;97948:9;:21::i;:37::-;97940:45;;;;97654:364;-1:-1:-1;;;;;;97654:364:0:o;100612:92::-;92842:11;;-1:-1:-1;;;92842:11:0;;;;92834:54;;;;;-1:-1:-1;;;92834:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;;;100670:26:::1;100680:15;100670:9;:26::i;:::-;100612:92::o:0;102002:1130::-;92842:11;;-1:-1:-1;;;92842:11:0;;;;92834:54;;;;;-1:-1:-1;;;92834:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;;;102083:15:::1;;102067:12;:31;102063:70;;102115:7;;102063:70;102149:12;::::0;102145:101:::1;;102201:12;102183:15;:30:::0;102228:7:::1;;102145:101;102258:20;102281:45;102296:15;;102313:12;102281:14;:45::i;:::-;102337:6;::::0;;:40:::1;::::0;;-1:-1:-1;;;102337:40:0;;102357:4:::1;102337:40;::::0;::::1;::::0;;;;;;;;;102258:68;;-1:-1:-1;;;;;;102337:6:0;;::::1;::::0;:11:::1;::::0;:40;;;;;:6;;:40;;;;;;:6;;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;102475:12:0::1;::::0;102417:72:::1;::::0;-1:-1:-1;102448:40:0::1;::::0;-1:-1:-1;102448:22:0::1;:12:::0;102465:4:::1;102448:16;:22::i;102417:72::-;102388:26;:101:::0;102518:12:::1;102500:15;:30:::0;-1:-1:-1;102543:582:0::1;102560:12;:19:::0;102558:21;::::1;102543:582;;;102601:20;102624:12;102637:1;102624:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;102624:15:0::1;::::0;-1:-1:-1;102658:26:0;;102654:460:::1;;102795:9;::::0;102779:26:::1;::::0;;-1:-1:-1;;;102779:26:0;;-1:-1:-1;;;;;102795:9:0;;::::1;102779:26;::::0;::::1;::::0;;;102727:12;;102705::::1;::::0;102779:15;;::::1;::::0;::::1;::::0;:26;;;;;::::1;::::0;;;;;;;;;:15;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;102779:26:0;;-1:-1:-1;102828:14:0;102824:69:::1;;102867:7;;;;;;;102824:69;102930:9;::::0;102911:55:::1;::::0;;-1:-1:-1;;;102911:55:0;;-1:-1:-1;;;;;102930:9:0;;::::1;102911:55;::::0;::::1;::::0;102949:4:::1;102911:55:::0;;;;;;;;;;;;:18;;::::1;::::0;::::1;::::0;:55;;;;;::::1;::::0;;;;;;;;;102930:9:::1;102911:18:::0;:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;103085:12:0::1;::::0;103022:77:::1;::::0;103061:37:::1;::::0;:19:::1;:9:::0;103075:4:::1;103061:13;:19::i;:37::-;-1:-1:-1::0;;;;;103022:34:0;::::1;;::::0;;;:20:::1;:34;::::0;;;;;;:38:::1;:77::i;:::-;-1:-1:-1::0;;;;;102985:34:0;::::1;;::::0;;;:20:::1;:34;::::0;;;;:114;-1:-1:-1;;102654:460:0::1;-1:-1:-1::0;102581:3:0::1;;102543:582;;;;92899:1;102002:1130::o:0;97199:107::-;-1:-1:-1;;;;;97279:15:0;97252:7;97279:15;;;:6;:15;;;;;:19;;;;97199:107::o;87374:25::-;;;-1:-1:-1;;;;;87374:25:0;;:::o;98026:147::-;92842:11;;-1:-1:-1;;;92842:11:0;;;;92834:54;;;;;-1:-1:-1;;;92834:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;;;98119:46:::1;98131:6;98139:8;98149:15;98119:11;:46::i;89956:2681::-:0;92975:10;;-1:-1:-1;;;;;92975:10:0;92961;:24;92953:66;;;;;-1:-1:-1;;;92953:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92953:66:0;;;;;;;;;;;;;;;90317:11:::1;::::0;-1:-1:-1;;;90317:11:0;::::1;;;90316:12;90308:58;;;;-1:-1:-1::0;;;90308:58:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90409:15;:22;90385:13;:20;:46;90377:120;;;;-1:-1:-1::0;;;90377:120:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90540:13;:20;90516:13;:20;:44;90508:116;;;;-1:-1:-1::0;;;90508:116:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;90643:24:0;::::1;90635:82;;;;-1:-1:-1::0;;;90635:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90734:18;90730:185;;;-1:-1:-1::0;;;;;90777:35:0;::::1;90769:134;;;;-1:-1:-1::0;;;90769:134:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90927:36;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:36:::1;:::i;:::-;-1:-1:-1::0;90974:20:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;90974:20:0::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:20:::1;:::i;:::-;-1:-1:-1::0;91005:9:0::1;:14:::0;;91017:2:::1;-1:-1:-1::0;;91005:14:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;91030:16:0;;-1:-1:-1;;;;;;91030:16:0::1;-1:-1:-1::0;;;;;91030:16:0;;::::1;::::0;;;::::1;::::0;;91057::::1;:36:::0;;;91104:38;;;;::::1;::::0;::::1;;;-1:-1:-1::0;;;;;;91153:44:0::1;91005:14;91153:44:::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;91210:693:::1;91227:13;:20;91225:1;:22;91210:693;;;91269:19;91291:13;91305:1;91291:16;;;;;;;;;;;;;;91269:38;;91322:16;91341:13;91355:1;91341:16;;;;;;;;;;;;;;91322:35;;91372:21;91396:15;91412:1;91396:18;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;91434:29:0;::::1;;::::0;;;:16:::1;:29:::0;;;;;;;;91396:18;;-1:-1:-1;91434:29:0::1;;91429:463;;-1:-1:-1::0;;;;;91484:29:0;::::1;;::::0;;;:16:::1;:29;::::0;;;;;;;:36;;-1:-1:-1;;91484:36:0;;::::1;91516:4;91484:36:::0;;::::1;::::0;;;91539:30;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;91539:30:0::1;::::0;::::1;::::0;;91588:31;;;:18:::1;:31:::0;;;;;:45;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;91652:159:::1;;-1:-1:-1::0;;;;;91700:27:0;::::1;91692:99;;;;-1:-1:-1::0;;;91692:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;91829:31:0;;::::1;;::::0;;;:18:::1;:31;::::0;;;;:47;;-1:-1:-1;;;;;;91829:47:0::1;::::0;;::::1;::::0;;;::::1;::::0;;91429:463:::1;-1:-1:-1::0;;;91249:3:0::1;;91210:693;;;-1:-1:-1::0;91915:9:0::1;:22:::0;;-1:-1:-1;;;;;91915:22:0;;;::::1;-1:-1:-1::0;;;;;;91915:22:0;;::::1;::::0;;;::::1;::::0;;91948:11:::1;:18:::0;;-1:-1:-1;;;;91948:18:0::1;-1:-1:-1::0;;;91948:18:0::1;::::0;;91995:12:::1;91977:15;:30:::0;92050:6:::1;92020:27:::0;:36;;;92098:7:::1;92067:28:::0;:38;;;92149:7:::1;92116:30:::0;:40;;;92198:8:::1;92167:28:::0;:39;;;92247:8:::1;92217:27:::0;:38;;;92297:9:::1;92266:28:::0;:40;;;92319:11:::1;92020:27;92319:31:::0;;:40;;;;92370:32;:42;;;;92423:34;:44;;;;92478:32;:43;92532:31;:42;-1:-1:-1;92585:32:0;;;;;:44;-1:-1:-1;;;;;;;89956:2681:0:o;96313:127::-;-1:-1:-1;;;;;96414:18:0;96387:7;96414:18;;;:9;:18;;;;;;;96313:127::o;86822:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;86822:29:0;;-1:-1:-1;86822:29:0;:::o;86910:48::-;;;;;;;;;;;;;;;:::o;87232:24::-;;;-1:-1:-1;;;;;87232:24:0;;:::o;95995:95::-;96075:7;96068:14;;;;;;;;-1:-1:-1;;96068:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96042:13;;96068:14;;96075:7;;96068:14;;96075:7;96068:14;;;;;;;;;;;;;;;;;;;;;;;;88280:29;;;;;;:::o;95207:219::-;92975:10;;-1:-1:-1;;;;;92975:10:0;92961;:24;92953:66;;;;;-1:-1:-1;;;92953:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92953:66:0;;;;;;;;;;;;;;;95298:15:::1;:13;:15::i;:::-;95324:16;:36:::0;;;95376:42:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;95207:219:::0;:::o;103140:655::-;103223:7;-1:-1:-1;;;;;103251:26:0;;103243:88;;;;-1:-1:-1;;;103243:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;103420:18:0;;103342:12;103420:18;;;:9;:18;;;;;;103364:12;;103342;103420:22;103416:347;;103495:9;;103479:26;;;-1:-1:-1;;;103479:26:0;;-1:-1:-1;;;;;103495:9:0;;;103479:26;;;;;;103459:17;;103479:15;;;;;:26;;;;;;;;;;;;;;:15;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;103479:26:0;103616:12;;103479:26;;-1:-1:-1;103520:30:0;;103553:77;;103592:37;;:19;103479:26;103606:4;103592:13;:19::i;:37::-;-1:-1:-1;;;;;103553:34:0;;;;;;:20;:34;;;;;;;:38;:77::i;:::-;-1:-1:-1;;;;;103716:20:0;;;;;;;:11;:20;;;;;;;;:34;;;;;;;;;;;;103655:18;;;:9;:18;;;;;;;103520:110;;-1:-1:-1;103655:96:0;;:56;;103706:4;;103655:46;;103520:110;103655:22;:46::i;:96::-;103645:106;103780:7;-1:-1:-1;;;;;;;103140:655:0:o;99783:129::-;92842:11;;-1:-1:-1;;;92842:11:0;;;;92834:54;;;;;-1:-1:-1;;;92834:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;;;99864:40:::1;99876:10;99888:15;99864:11;:40::i;87041:50::-:0;;;;;;;;;;;;;;;:::o;101630:364::-;101703:7;101736:3;101765:5;101787:9;;;101783:50;;;101820:1;101813:8;;;;;;101783:50;101870:16;;101845:22;101920:34;101870:16;101921:12;:2;101928:4;101921:6;:12::i;:::-;101920:18;;:34::i;97314:111::-;-1:-1:-1;;;;;97396:15:0;97369:7;97396:15;;;:6;:15;;;;;:21;;;;97314:111::o;88201:32::-;;;;:::o;97541:105::-;97619:12;:19;97541:105;:::o;87170:53::-;;;;;;;;;;;;-1:-1:-1;;;;;87170:53:0;;:::o;86785:28::-;;;-1:-1:-1;;;;;86785:28:0;;:::o;88316:35::-;;;;;;-1:-1:-1;;;;;88316:35:0;;:::o;87406:32::-;;;-1:-1:-1;;;;;87406:32:0;;:::o;101257:70::-;92842:11;;-1:-1:-1;;;92842:11:0;;;;92834:54;;;;;-1:-1:-1;;;92834:54:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92834:54:0;;;;;;;;;;;;;;;104474:15:::1;:13;:15::i;:::-;104526:10;104500:13;104516:21:::0;;;:9:::1;:21;::::0;;;;;104552:9;;104548:1764:::1;;104673:10;104578:21;104654:30:::0;;;:18:::1;:30;::::0;;;;;104612:26:::1;::::0;104602:83:::1;::::0;104654:30;104602:47:::1;::::0;104644:4:::1;::::0;104602:37:::1;::::0;:5;;:9:::1;:37::i;:83::-;104578:107:::0;-1:-1:-1;104704:17:0;;104700:435:::1;;104746:17;::::0;::::1;;104742:378;;;104834:20;::::0;104788:28:::1;104878:6:::0;;:53:::1;::::0;;-1:-1:-1;;;104878:53:0;;104834:20:::1;::::0;;::::1;-1:-1:-1::0;;;;;104834:20:0;;::::1;104878:53;::::0;::::1;::::0;;;;;;;;;;;104834:20;;104878:6;::::1;::::0;:14:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;;;;:6;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;104954:51:0::1;::::0;;-1:-1:-1;;;104954:51:0;;104979:10:::1;104954:51;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;104954:24:0;::::1;::::0;::::1;::::0;:51;;;;;-1:-1:-1;;104954:51:0;;;;;;;-1:-1:-1;104954:24:0;:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;104742:378;;;;105054:46;105074:10;105086:13;105054:19;:46::i;:::-;105154:6;105149:1152;105166:12;:19:::0;105164:21;::::1;105149:1152;;;105211:20;105234:12;105247:1;105234:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;105234:15:0::1;::::0;-1:-1:-1;105272:26:0;;105268:1018:::1;;105471:10;105323:12;105459:23:::0;;;:11:::1;:23;::::0;;;;;;;-1:-1:-1;;;;;105459:37:0;::::1;::::0;;;;;;;;105409:20:::1;:34:::0;;;;;;105345:12;;105323;105399:98:::1;::::0;:55:::1;::::0;105449:4:::1;::::0;105399:45:::1;::::0;:5;;:9:::1;:45::i;:98::-;105381:116:::0;-1:-1:-1;105524:11:0;;105520:747:::1;;-1:-1:-1::0;;;;;105583:32:0;::::1;105564:16;105583:32:::0;;;:18:::1;:32;::::0;;;;;::::1;;105642:602:::0;::::1;;;-1:-1:-1::0;;;;;105721:32:0;;::::1;105690:28;105721:32:::0;;;:18:::1;:32;::::0;;;;;::::1;105788:34:::0;;105784:333:::1;;105961:45;::::0;;-1:-1:-1;;;105961:45:0;;-1:-1:-1;;;;;105961:45:0;;::::1;;::::0;::::1;::::0;;;;;;;;;105905:20;;105961:13;::::1;::::0;::::1;::::0;:45;;;;;::::1;::::0;;;;;;;;105859:28:::1;105961:13:::0;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;106041:44:0::1;::::0;;-1:-1:-1;;;106041:44:0;;106066:10:::1;106041:44;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;106041:24:0;::::1;::::0;::::1;::::0;:44;;;;;-1:-1:-1;;106041:44:0;;;;;;;-1:-1:-1;106041:24:0;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;105784:333;;105642:602;;;;106181:35;::::0;;-1:-1:-1;;;106181:35:0;;106196:10:::1;106181:35;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;106181:14:0;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;-1:-1:-1;106181:14:0;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;105642:602:0::1;105520:747;;105268:1018;;;-1:-1:-1::0;105187:3:0::1;;105149:1152;;;;104548:1764;;-1:-1:-1::0;106390:10:0::1;106380:21;::::0;;;:9:::1;:21;::::0;;;;;;106412:284:::1;106429:12;:19:::0;106427:21;::::1;106412:284;;;106470:20;106493:12;106506:1;106493:15;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;106493:15:0::1;::::0;-1:-1:-1;106527:26:0;;106523:162:::1;;-1:-1:-1::0;;;;;106624:34:0;::::1;;::::0;;;:20:::1;:34;::::0;;;;;106614:55:::1;::::0;106664:4:::1;::::0;106614:45:::1;::::0;:5;;:9:::1;:45::i;:55::-;106586:10;106574:23;::::0;;;:11:::1;:23;::::0;;;;;;;-1:-1:-1;;;;;106574:37:0;::::1;::::0;;;;;;;:95;106523:162:::1;-1:-1:-1::0;106450:3:0::1;;106412:284;;;;106739:47;106781:4;106739:37;106749:26;;106739:5;:9;;:37;;;;:::i;:47::-;106725:10;106706:30;::::0;;;:18:::1;:30;::::0;;;;:80;-1:-1:-1;101257:70:0:o;93962:245::-;92975:10;;-1:-1:-1;;;;;92975:10:0;92961;:24;92953:66;;;;;-1:-1:-1;;;92953:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;92953:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;94047:24:0;::::1;94039:83;;;;-1:-1:-1::0;;;94039:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94133:9;:22:::0;;-1:-1:-1;;;;;94133:22:0;::::1;-1:-1:-1::0;;;;;;94133:22:0;;::::1;::::0;::::1;::::0;;;94171:28:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;93962:245:::0;:::o;99037:738::-;104474:15;:13;:15::i;:::-;104526:10;104500:13;104516:21;;;:9;:21;;;;;;104552:9;;104548:1764;;104673:10;104578:21;104654:30;;;:18;:30;;;;;;104612:26;;104602:83;;104654:30;104602:47;;104644:4;;104602:37;;:5;;:9;:37::i;:83::-;104578:107;-1:-1:-1;104704:17:0;;104700:435;;104746:17;;;;104742:378;;;104834:20;;104788:28;104878:6;;:53;;;-1:-1:-1;;;104878:53:0;;104834:20;;;;-1:-1:-1;;;;;104834:20:0;;;104878:53;;;;;;;;;;;;;;104834:20;;104878:6;;;:14;;:53;;;;;;;;;;;;;;;;;;:6;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;104954:51:0;;;-1:-1:-1;;;104954:51:0;;104979:10;104954:51;;;;;;;;;;;;-1:-1:-1;;;;;104954:24:0;;;;;:51;;;;;-1:-1:-1;;104954:51:0;;;;;;;-1:-1:-1;104954:24:0;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104742:378;;;;105054:46;105074:10;105086:13;105054:19;:46::i;:::-;105154:6;105149:1152;105166:12;:19;105164:21;;105149:1152;;;105211:20;105234:12;105247:1;105234:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;105234:15:0;;-1:-1:-1;105272:26:0;;105268:1018;;105471:10;105323:12;105459:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;105459:37:0;;;;;;;;;;105409:20;:34;;;;;;105345:12;;105323;105399:98;;:55;;105449:4;;105399:45;;:5;;:9;:45::i;:98::-;105381:116;-1:-1:-1;105524:11:0;;105520:747;;-1:-1:-1;;;;;105583:32:0;;105564:16;105583:32;;;:18;:32;;;;;;;;105642:602;;;;-1:-1:-1;;;;;105721:32:0;;;105690:28;105721:32;;;:18;:32;;;;;;;105788:34;;105784:333;;105961:45;;;-1:-1:-1;;;105961:45:0;;-1:-1:-1;;;;;105961:45:0;;;;;;;;;;;;;;;105905:20;;105961:13;;;;;:45;;;;;;;;;;;;;;105859:28;105961:13;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;106041:44:0;;;-1:-1:-1;;;106041:44:0;;106066:10;106041:44;;;;;;;;;;;;-1:-1:-1;;;;;106041:24:0;;;;;:44;;;;;-1:-1:-1;;106041:44:0;;;;;;;-1:-1:-1;106041:24:0;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105784:333;;105642:602;;;;106181:35;;;-1:-1:-1;;;106181:35:0;;106196:10;106181:35;;;;;;;;;;;;-1:-1:-1;;;;;106181:14:0;;;;;:35;;;;;;;;;;;;;;-1:-1:-1;106181:14:0;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;105642:602:0;105520:747;;105268:1018;;;-1:-1:-1;105187:3:0;;105149:1152;;;;104548:1764;;99155:10:::1;99124:21;99148:18:::0;;;:6:::1;:18;::::0;;;;99187:11;;99179:40:::1;;;::::0;;-1:-1:-1;;;99179:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;99179:40:0;;;;;;;;;;;;;::::1;;99249:9;99238:4;:8;;;:20;99230:49;;;::::0;;-1:-1:-1;;;99230:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;99230:49:0;;;;;;;;;;;;;::::1;;99298:11:::0;99290:46:::1;;;::::0;;-1:-1:-1;;;99290:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;99290:46:0;;;;;;;;;;;;;::::1;;99349:6;::::0;;:54:::1;::::0;;-1:-1:-1;;;99349:54:0;;99369:10:::1;99349:54;::::0;::::1;::::0;99389:4:::1;99349:54:::0;;;;;;;;;;;;-1:-1:-1;;;;;99349:6:0;;::::1;::::0;:19:::1;::::0;:54;;;;;::::1;::::0;;;;;;;;;;;:6;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;99434:17:0::1;::::0;;:26;::::1;99414:46:::0;;99487:11;;:23:::1;::::0;99454:6;99487:15:::1;:23::i;:::-;99473:37:::0;;99602:8:::1;::::0;::::1;::::0;99521:140:::1;::::0;99550:10:::1;::::0;99575:75:::1;::::0;99601:48:::1;::::0;87762:9:::1;::::0;99601:34:::1;::::0;99602:20;;::::1;99628:6:::0;99601:26:::1;:34::i;:48::-;99585:10;99575:21;::::0;;;:9:::1;:21;::::0;;;;;;:25:::1;:75::i;:::-;99521:14;:140::i;:::-;99710:11:::0;;99698:10:::1;99710:11;99723:21:::0;;;:9:::1;:21;::::0;;;;;;;;;99746:10:::1;::::0;::::1;::::0;99758:8:::1;::::0;::::1;::::0;99679:88;;;;;;;::::1;::::0;;;;;;;;;;;;;99698:10;;99679:88:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;106390:10:0;106380:21;;;;:9;:21;;;;;;;106412:284;106429:12;:19;106427:21;;106412:284;;;106470:20;106493:12;106506:1;106493:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;106493:15:0;;-1:-1:-1;106527:26:0;;106523:162;;-1:-1:-1;;;;;106624:34:0;;;;;;:20;:34;;;;;;106614:55;;106664:4;;106614:45;;:5;;:9;:45::i;:55::-;106586:10;106574:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;106574:37:0;;;;;;;;;:95;106523:162;-1:-1:-1;106450:3:0;;106412:284;;;;106739:47;106781:4;106739:37;106749:26;;106739:5;:9;;:37;;;;:::i;:47::-;106725:10;106706:30;;;;:18;:30;;;;;:80;-1:-1:-1;;;99037:738:0:o;6592:220::-;6650:7;6674:6;6670:20;;-1:-1:-1;6689:1:0;6682:8;;6670:20;6713:5;;;6717:1;6713;:5;:1;6737:5;;;;;:10;6729:56;;;;-1:-1:-1;;;6729:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6803:1;6592:220;-1:-1:-1;;;6592:220:0:o;7290:153::-;7348:7;7380:1;7376;:5;7368:44;;;;;-1:-1:-1;;;7368:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7434:1;7430;:5;;;;;;;7290:153;-1:-1:-1;;;7290:153:0:o;5713:179::-;5771:7;5803:5;;;5827:6;;;;5819:46;;;;;-1:-1:-1;;;5819:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6175:158;6233:7;6266:1;6261;:6;;6253:49;;;;;-1:-1:-1;;;6253:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6320:5:0;;;6175:158::o;100712:488::-;104474:15;:13;:15::i;:::-;104526:10;104500:13;104516:21;;;:9;:21;;;;;;104552:9;;104548:1764;;104673:10;104578:21;104654:30;;;:18;:30;;;;;;104612:26;;104602:83;;104654:30;104602:47;;104644:4;;104602:37;;:5;;:9;:37::i;:83::-;104578:107;-1:-1:-1;104704:17:0;;104700:435;;104746:17;;;;104742:378;;;104834:20;;104788:28;104878:6;;:53;;;-1:-1:-1;;;104878:53:0;;104834:20;;;;-1:-1:-1;;;;;104834:20:0;;;104878:53;;;;;;;;;;;;;;104834:20;;104878:6;;;:14;;:53;;;;;;;;;;;;;;;;;;:6;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;104954:51:0;;;-1:-1:-1;;;104954:51:0;;104979:10;104954:51;;;;;;;;;;;;-1:-1:-1;;;;;104954:24:0;;;;;:51;;;;;-1:-1:-1;;104954:51:0;;;;;;;-1:-1:-1;104954:24:0;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104742:378;;;;105054:46;105074:10;105086:13;105054:19;:46::i;:::-;105154:6;105149:1152;105166:12;:19;105164:21;;105149:1152;;;105211:20;105234:12;105247:1;105234:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;105234:15:0;;-1:-1:-1;105272:26:0;;105268:1018;;105471:10;105323:12;105459:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;105459:37:0;;;;;;;;;;105409:20;:34;;;;;;105345:12;;105323;105399:98;;:55;;105449:4;;105399:45;;:5;;:9;:45::i;:98::-;105381:116;-1:-1:-1;105524:11:0;;105520:747;;-1:-1:-1;;;;;105583:32:0;;105564:16;105583:32;;;:18;:32;;;;;;;;105642:602;;;;-1:-1:-1;;;;;105721:32:0;;;105690:28;105721:32;;;:18;:32;;;;;;;105788:34;;105784:333;;105961:45;;;-1:-1:-1;;;105961:45:0;;-1:-1:-1;;;;;105961:45:0;;;;;;;;;;;;;;;105905:20;;105961:13;;;;;:45;;;;;;;;;;;;;;105859:28;105961:13;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;106041:44:0;;;-1:-1:-1;;;106041:44:0;;106066:10;106041:44;;;;;;;;;;;;-1:-1:-1;;;;;106041:24:0;;;;;:44;;;;;-1:-1:-1;;106041:44:0;;;;;;;-1:-1:-1;106041:24:0;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105784:333;;105642:602;;;;106181:35;;;-1:-1:-1;;;106181:35:0;;106196:10;106181:35;;;;;;;;;;;;-1:-1:-1;;;;;106181:14:0;;;;;:35;;;;;;;;;;;;;;-1:-1:-1;106181:14:0;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;105642:602:0;105520:747;;105268:1018;;;-1:-1:-1;105187:3:0;;105149:1152;;;;104548:1764;;100813:10:::1;100782:21;100806:18:::0;;;:6:::1;:18;::::0;;;;100845:11;;100837:40:::1;;;::::0;;-1:-1:-1;;;100837:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;100837:40:0;;;;;;;;;;;;;::::1;;100908:9;100896:4;:8;;;:21;;100888:46;;;::::0;;-1:-1:-1;;;100888:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;100888:46:0;;;;;;;;;;;;;::::1;;100964:11:::0;;100947:14:::1;100986:6:::0;;:35:::1;::::0;;-1:-1:-1;;;100986:35:0;;101002:10:::1;100986:35;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;100986:6:0;;::::1;::::0;:15:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;;;:6;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;101052:17:0::1;::::0;;:26;;::::1;101032:46:::0;;-1:-1:-1;101091:15:0;;;101117:29:::1;::::0;101132:10:::1;::::0;101117:14:::1;:29::i;:::-;101164:28;::::0;;;;;;;101173:10:::1;::::0;101164:28:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;;106390:10:0;106380:21;;;;:9;:21;;;;;;;-1:-1:-1;106412:284:0;106429:12;:19;106427:21;;106412:284;;;106470:20;106493:12;106506:1;106493:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;106493:15:0;;-1:-1:-1;106527:26:0;;106523:162;;-1:-1:-1;;;;;106624:34:0;;;;;;:20;:34;;;;;;106614:55;;106664:4;;106614:45;;:5;;:9;:45::i;:55::-;106586:10;106574:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;106574:37:0;;;;;;;;;:95;106523:162;-1:-1:-1;106450:3:0;;106412:284;;;;106739:47;106781:4;106739:37;106749:26;;106739:5;:9;;:37;;;;:::i;:47::-;106725:10;106706:30;;;;:18;:30;;;;;:80;-1:-1:-1;;100712:488:0:o;98181:724::-;104474:15;:13;:15::i;:::-;104526:10;104500:13;104516:21;;;:9;:21;;;;;;104552:9;;104548:1764;;104673:10;104578:21;104654:30;;;:18;:30;;;;;;104612:26;;104602:83;;104654:30;104602:47;;104644:4;;104602:37;;:5;;:9;:37::i;:83::-;104578:107;-1:-1:-1;104704:17:0;;104700:435;;104746:17;;;;104742:378;;;104834:20;;104788:28;104878:6;;:53;;;-1:-1:-1;;;104878:53:0;;104834:20;;;;-1:-1:-1;;;;;104834:20:0;;;104878:53;;;;;;;;;;;;;;104834:20;;104878:6;;;:14;;:53;;;;;;;;;;;;;;;;;;:6;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;104954:51:0;;;-1:-1:-1;;;104954:51:0;;104979:10;104954:51;;;;;;;;;;;;-1:-1:-1;;;;;104954:24:0;;;;;:51;;;;;-1:-1:-1;;104954:51:0;;;;;;;-1:-1:-1;104954:24:0;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104742:378;;;;105054:46;105074:10;105086:13;105054:19;:46::i;:::-;105154:6;105149:1152;105166:12;:19;105164:21;;105149:1152;;;105211:20;105234:12;105247:1;105234:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;105234:15:0;;-1:-1:-1;105272:26:0;;105268:1018;;105471:10;105323:12;105459:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;105459:37:0;;;;;;;;;;105409:20;:34;;;;;;105345:12;;105323;105399:98;;:55;;105449:4;;105399:45;;:5;;:9;:45::i;:98::-;105381:116;-1:-1:-1;105524:11:0;;105520:747;;-1:-1:-1;;;;;105583:32:0;;105564:16;105583:32;;;:18;:32;;;;;;;;105642:602;;;;-1:-1:-1;;;;;105721:32:0;;;105690:28;105721:32;;;:18;:32;;;;;;;105788:34;;105784:333;;105961:45;;;-1:-1:-1;;;105961:45:0;;-1:-1:-1;;;;;105961:45:0;;;;;;;;;;;;;;;105905:20;;105961:13;;;;;:45;;;;;;;;;;;;;;105859:28;105961:13;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;106041:44:0;;;-1:-1:-1;;;106041:44:0;;106066:10;106041:44;;;;;;;;;;;;-1:-1:-1;;;;;106041:24:0;;;;;:44;;;;;-1:-1:-1;;106041:44:0;;;;;;;-1:-1:-1;106041:24:0;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105784:333;;105642:602;;;;106181:35;;;-1:-1:-1;;;106181:35:0;;106196:10;106181:35;;;;;;;;;;;;-1:-1:-1;;;;;106181:14:0;;;;;:35;;;;;;;;;;;;;;-1:-1:-1;106181:14:0;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;105642:602:0;105520:747;;105268:1018;;;-1:-1:-1;105187:3:0;;105149:1152;;;;104548:1764;;98319:10:::1;98288:21;98312:18:::0;;;:6:::1;:18;::::0;;;;98351:11;;:16;98343:43:::1;;;::::0;;-1:-1:-1;;;98343:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;98343:43:0;;;;;;;;;;;;;::::1;;98405:11:::0;98397:47:::1;;;::::0;;-1:-1:-1;;;98397:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;98457:6;::::0;;:54:::1;::::0;;-1:-1:-1;;;98457:54:0;;98477:10:::1;98457:54;::::0;::::1;::::0;98497:4:::1;98457:54:::0;;;;;;;;;;;;-1:-1:-1;;;;;98457:6:0;;::::1;::::0;:19:::1;::::0;:54;;;;;::::1;::::0;;;;;;;;;;;:6;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;98542:17:0::1;::::0;;:26;::::1;98522:46:::0;;-1:-1:-1;98607:9:0::1;-1:-1:-1::0;98617:8:0;98607:19:::1;::::0;::::1;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;98607:19:0;;98637:20;;;98595:31;::::1;98668:8;::::0;::::1;:14:::0;;;98693:10:::1;::::0;::::1;:22:::0;;;98595:31;-1:-1:-1;98728:71:0::1;98743:10;98755:43;87762:9;98755:29;98756:15:::0;;::::1;98651:6:::0;98755:21:::1;:29::i;98728:71::-;98840:11:::0;;98828:10:::1;98840:11;98853:21:::0;;;:9:::1;:21;::::0;;;;;;;;;98876:10:::1;::::0;::::1;::::0;98888:8:::1;::::0;::::1;::::0;98817:80;;;;;;;::::1;::::0;;;;;;;;;;;;;98828:10;;98817:80:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;106390:10:0;106380:21;;;;:9;:21;;;;;;;-1:-1:-1;106412:284:0;106429:12;:19;106427:21;;106412:284;;;106470:20;106493:12;106506:1;106493:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;106493:15:0;;-1:-1:-1;106527:26:0;;106523:162;;-1:-1:-1;;;;;106624:34:0;;;;;;:20;:34;;;;;;106614:55;;106664:4;;106614:45;;:5;;:9;:45::i;:55::-;106586:10;106574:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;106574:37:0;;;;;;;;;:95;106523:162;-1:-1:-1;106450:3:0;;106412:284;;;;106739:47;106781:4;106739:37;106749:26;;106739:5;:9;;:37;;;;:::i;:47::-;106725:10;106706:30;;;;:18;:30;;;;;:80;-1:-1:-1;;;;98181:724:0:o;99920:684::-;104474:15;:13;:15::i;:::-;104526:10;104500:13;104516:21;;;:9;:21;;;;;;104552:9;;104548:1764;;104673:10;104578:21;104654:30;;;:18;:30;;;;;;104612:26;;104602:83;;104654:30;104602:47;;104644:4;;104602:37;;:5;;:9;:37::i;:83::-;104578:107;-1:-1:-1;104704:17:0;;104700:435;;104746:17;;;;104742:378;;;104834:20;;104788:28;104878:6;;:53;;;-1:-1:-1;;;104878:53:0;;104834:20;;;;-1:-1:-1;;;;;104834:20:0;;;104878:53;;;;;;;;;;;;;;104834:20;;104878:6;;;:14;;:53;;;;;;;;;;;;;;;;;;:6;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;104954:51:0;;;-1:-1:-1;;;104954:51:0;;104979:10;104954:51;;;;;;;;;;;;-1:-1:-1;;;;;104954:24:0;;;;;:51;;;;;-1:-1:-1;;104954:51:0;;;;;;;-1:-1:-1;104954:24:0;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104742:378;;;;105054:46;105074:10;105086:13;105054:19;:46::i;:::-;105154:6;105149:1152;105166:12;:19;105164:21;;105149:1152;;;105211:20;105234:12;105247:1;105234:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;105234:15:0;;-1:-1:-1;105272:26:0;;105268:1018;;105471:10;105323:12;105459:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;105459:37:0;;;;;;;;;;105409:20;:34;;;;;;105345:12;;105323;105399:98;;:55;;105449:4;;105399:45;;:5;;:9;:45::i;:98::-;105381:116;-1:-1:-1;105524:11:0;;105520:747;;-1:-1:-1;;;;;105583:32:0;;105564:16;105583:32;;;:18;:32;;;;;;;;105642:602;;;;-1:-1:-1;;;;;105721:32:0;;;105690:28;105721:32;;;:18;:32;;;;;;;105788:34;;105784:333;;105961:45;;;-1:-1:-1;;;105961:45:0;;-1:-1:-1;;;;;105961:45:0;;;;;;;;;;;;;;;105905:20;;105961:13;;;;;:45;;;;;;;;;;;;;;105859:28;105961:13;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;106041:44:0;;;-1:-1:-1;;;106041:44:0;;106066:10;106041:44;;;;;;;;;;;;-1:-1:-1;;;;;106041:24:0;;;;;:44;;;;;-1:-1:-1;;106041:44:0;;;;;;;-1:-1:-1;106041:24:0;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105784:333;;105642:602;;;;106181:35;;;-1:-1:-1;;;106181:35:0;;106196:10;106181:35;;;;;;;;;;;;-1:-1:-1;;;;;106181:14:0;;;;;:35;;;;;;;;;;;;;;-1:-1:-1;106181:14:0;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;105642:602:0;105520:747;;105268:1018;;;-1:-1:-1;105187:3:0;;105149:1152;;;;104548:1764;;100046:10:::1;100015:21;100039:18:::0;;;:6:::1;:18;::::0;;;;100076:11;;100068:40:::1;;;::::0;;-1:-1:-1;;;100068:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;100068:40:0;;;;;;;;;;;;;::::1;;100121:11;100146;:23;100158:10;100146:23;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;100146:23:0;;;;100135:8:::1;::::0;::::1;::::0;100286:11;;100256:10:::1;100246:21:::0;;:9:::1;:21:::0;;;;;;;100135:34;::::1;::::0;-1:-1:-1;;100246:52:0::1;::::0;:35:::1;::::0;87762:9:::1;100246:25;:35::i;:52::-;100328:8;::::0;::::1;::::0;100322:14;::::1;100309:28;::::0;-1:-1:-1;87762:9:0::1;100356:20:::0;::::1;;100348:45;;;::::0;;-1:-1:-1;;;100348:45:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;100348:45:0;;;;;;;;;;;;;::::1;;100406:8;::::0;::::1;:14:::0;;;100471:11;;100431:67:::1;::::0;100446:10:::1;::::0;100458:39:::1;::::0;87762:9:::1;::::0;100458:25:::1;::::0;:8;;:12:::1;:25::i;100431:67::-;100539:11:::0;;100527:10:::1;100539:11;100552:21:::0;;;:9:::1;:21;::::0;;;;;;;;;100575:10:::1;::::0;::::1;::::0;100587:8:::1;::::0;::::1;::::0;100516:80;;;;;;;::::1;::::0;;;;;;;;;;;;;100527:10;;100516:80:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;106390:10:0;106380:21;;;;:9;:21;;;;;;;-1:-1:-1;106380:21:0;-1:-1:-1;106412:284:0;106429:12;:19;106427:21;;106412:284;;;106470:20;106493:12;106506:1;106493:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;106493:15:0;;-1:-1:-1;106527:26:0;;106523:162;;-1:-1:-1;;;;;106624:34:0;;;;;;:20;:34;;;;;;106614:55;;106664:4;;106614:45;;:5;;:9;:45::i;:55::-;106586:10;106574:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;106574:37:0;;;;;;;;;:95;106523:162;-1:-1:-1;106450:3:0;;106412:284;;106802:356;106885:11;;106881:270;;106913:17;106933:6;;:31;;;-1:-1:-1;;;106933:31:0;;106958:4;106933:31;;;;;;-1:-1:-1;;;;;106933:6:0;;;;:16;;:31;;;;;;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106933:31:0;;-1:-1:-1;106983:19:0;;;106979:161;;;107023:6;;;:31;;;-1:-1:-1;;;107023:31:0;;-1:-1:-1;;;;;107023:31:0;;;;;;;;;;;;;;;:6;;;;;:15;;:31;;;;;;;;;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106979:161:0;;-1:-1:-1;106979:161:0;;107095:6;;;:29;;;-1:-1:-1;;;107095:29:0;;-1:-1:-1;;;;;107095:29:0;;;;;;;;;;;;;;;:6;;;;;:15;;:29;;;;;;;;;;;;;;;;;;:6;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;106881:270:0;106802:356;;:::o;101335:198::-;-1:-1:-1;;;;;101448:18:0;;;;;;:9;:18;;;;;;101431:12;;:52;;101472:10;;101431:36;;:16;:36::i;:::-;:40;;:52::i;:::-;101416:12;:67;-1:-1:-1;;;;;101494:18:0;;;;;;;:9;:18;;;;;:31;101335:198::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://bb54c156e1124a8898a2713a0afe03cb22ac1aa2a082d215a105283625964752

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  ]

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.