Contract 0xe61f147c17dc6e5afe9ac2295c5571aac002df8a 2

Txn Hash
Block
From
To
Value [Txn Fee]
0x326c1acd79236289785c888db92aa88124e0c4b78bd694aafc7737e7c481c11870193132021-08-03 0:48:252 mins ago0x19ba1a6b295e0078d38ef8ee805341fb4f7c1993 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.0004398255
0x67a42d8a8bf54c6ae8323e74e036186d786aa02af761256025aa77e1c2407fc170192932021-08-03 0:47:253 mins ago0xfbd9eaef96c8318fc6d388b19bee86a64a0c6d02 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0xec9b6266fba21478310a3072291b684fe70206632449e15f070d802ad94675e470192362021-08-03 0:44:345 mins ago0x34a27981cf421b5444952660605779eee1674ceb IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00049789125
0x146f6c7910105dbd839c13cd84b4248b5ecee71ba87c6f4f103a1115669b026c70192132021-08-03 0:43:257 mins ago0x2cabf4e43362e4d07e767da148075fd7aebe621e IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00049791825
0x34e0d7e73539b2bcfb960f338190bf7d74bf848178cdd7fa33811a546880987970191622021-08-03 0:40:529 mins ago0x2cabf4e43362e4d07e767da148075fd7aebe621e IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00049789125
0xbe4035bd485e51c0bd50f2b8ef51133f5230d5ca141efdc265eb00e7a7d5ebef70191612021-08-03 0:40:499 mins ago0xb91297cda1728f32443581502b5fe5920b137f92 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00053161425
0xc3e26f0526c55b8b9dd5cd97de0b2c47f4c46632bde3ed2d9ef8562c92e2f61b70191522021-08-03 0:40:2210 mins ago0x25f8ae30f652046460d28dc090f38bf42d3e654a IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0x80f7c1b84c92d2737096d75070558b460557a35b50ffb1e720f0e06ab0b925b270191262021-08-03 0:39:0411 mins ago0x455787e8550e7d8bf2a0588ed210e8d98d9c5c44 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00066664125
0xc4783291c3f1c88cf36f534ff5581f0ef1bf8b6d7f62550a0734380a294c6fdf70190682021-08-03 0:36:1014 mins ago0x25f8ae30f652046460d28dc090f38bf42d3e654a IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0x4eae7687f264ce187e93a0df4c66ca48ab3990412a25c8e8fd20d367ec18e66370190452021-08-03 0:35:0115 mins ago0x2cabf4e43362e4d07e767da148075fd7aebe621e IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00053164125
0x54b5f074c6e8761e30382709131b6f1450a46a26f43ec95a82ee6691de061d1370189772021-08-03 0:31:3718 mins ago0x149e99f5d2dfb20daea76d3560d99f65c32795a4 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.0004041945
0xdd7e7147bd0ae645d9bc80a99eab1868754d076d2795f6c1810b3197122a08ed70189472021-08-03 0:30:0720 mins ago0x9dcc301262097abae12ba79599a0678619651118 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00053166825
0x716b8e56da1572b93d714e4e59c270c061f6a5b4bb6c4010b4748129ef0f2f3970189462021-08-03 0:30:0420 mins ago0x149e99f5d2dfb20daea76d3560d99f65c32795a4 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00053357625
0x076be7e47f2edf3678c1a07bb66920ad1d19442c174d22aad626bca4064d079a70189202021-08-03 0:28:4621 mins ago0x23bf0edb3db0b12ad5a3f112babc78b737f9a78e IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0xb4bed0f4bc2222bd48f1e540a11dd4b15035a68569cfab461045db17101c331070188692021-08-03 0:26:1324 mins ago0xd81bc0f76124dfeb6f1383b32df53b61eff60d63 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00053166825
0x8035003ba0d7ca19b0be5140bb51f51c06764af88b89d7474aeb3f560a1bfd1c70187472021-08-03 0:20:0730 mins ago0x2704114b195bef3f8d07d25dc17f52dc1d8cf2d6 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0x2db0c11351c95a032e7934c0e1fe3dd9a203c3efd1c4a0f8493f0745c1400b2f70187262021-08-03 0:19:0431 mins ago0x0902b1d4e2ebc4ace56d2e61e3dbc2e522636fd2 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00053166825
0xb4e4bfb906e3ad220615f7c5026ec46e65ba1d4fde33352ad870c7462a7523e870186202021-08-03 0:13:4636 mins ago0x8ef86d6b504b5dfaf1cb74007f765016bbc630a0 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.000235872
0xf5013feef026b111f1ceefa5679e9d548d197a161c08dfc3b6e421a4ec81d19e70186202021-08-03 0:13:4636 mins ago0x491e94a652b59e952923956f8f6328ad0e2cf74d IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0x599f1a22a0c616ab2f1ada59d6b789888323670d5f61e968aab443b92417956b70186152021-08-03 0:13:3136 mins ago0x31a3672dfa6c69b4e4b6afc020f9b8db8e73cd37 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.0004397985
0x3960822e3ca09e036d6fa3d7189ed13a0d35b2b464fce462ed146a2f7e01e38b70186042021-08-03 0:12:5837 mins ago0x148a5c2f28cb7e6a21d7795ade1d1bc5e0ab936a IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00024066225
0x75d3062b174674c8ce0cabf6d0075fb98cc9040ec0d6a1c6ab792d951e805ddd70185982021-08-03 0:12:4037 mins ago0x31a3672dfa6c69b4e4b6afc020f9b8db8e73cd37 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.0000527175
0x342b430c7fa28243ab82f236c312cbeafb5572b96661a381e04240b39d51673470185982021-08-03 0:12:4037 mins ago0x456054d5e0d5185aea45259db051f7352a617112 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00050927625
0x2d7608da4a20539bea23ef781f40a502e44c905b1ec8d5b007af1b4d88bd115470185152021-08-03 0:08:3141 mins ago0x2991c1d6d2ca73e8bf424c939dbf6a8d04a26849 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00056541825
0x04fa4003cd276d5f9e934dc83c0af2b1f8cbd0b13bc6b87095a708451d85298d70184902021-08-03 0:07:1643 mins ago0x8b07cc10f0435919b521f300b5e55b0eb5e39581 IN  0xe61f147c17dc6e5afe9ac2295c5571aac002df8a0 HT0.00049789125
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ButterVault

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-07-15
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}



interface IHRC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the hrc token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address _owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}



/**
 * @dev 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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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

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

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

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), 'Address: call to non-contract');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


/**
 * @title SafeHRC20
 * @dev Wrappers around HRC20 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 SafeHRC20 for IHRC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeHRC20 {
    using SafeMath for uint256;
    using Address for address;

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

    function safeTransferFrom(
        IHRC20 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
     * {IHRC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IHRC20 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),
            'SafeHRC20: approve from non-zero to non-zero allowance'
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IHRC20 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(
        IHRC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value,
            'SafeHRC20: 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(IHRC20 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, 'SafeHRC20: low-level call failed');
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), 'SafeHRC20: HRC20 operation did not succeed');
        }
    }
}


/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), 'Ownable: caller is not the owner');
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), 'Ownable: new owner is the zero address');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}



interface IMasterChef {
    function deposit(uint256 _pid, uint256 _amount) external;

    function withdraw(uint256 _pid, uint256 _amount) external;

    function enterStaking(uint256 _amount) external;

    function leaveStaking(uint256 _amount) external;

    function pendingButter(uint256 _pid, address _user) external view returns (uint256);

    function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256);

    function emergencyWithdraw(uint256 _pid) external;
}




/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


interface IButterDao {
    function daoMembers(address user) external returns (bool);
}


contract ButterVault is Ownable, Pausable {
    using SafeHRC20 for IHRC20;
    using SafeMath for uint256;

    struct UserInfo {
        uint256 shares; // number of shares for a user
        uint256 lastDepositedTime; // keeps track of deposited time for potential penalty
        uint256 butterAtLastUserAction; // keeps track of Butter deposited at the last user action
        uint256 lastUserActionTime; // keeps track of the last user action time
    }

    IHRC20 public immutable token; // Butter token
    IHRC20 public immutable receiptToken; // Cream token

    IMasterChef public immutable masterchef;
    IButterDao public immutable butterDao;

    mapping(address => UserInfo) public userInfo;

    uint256 public totalShares;
    uint256 public lastHarvestedTime;
    address public admin;
    address public treasury;

    uint256 public constant MAX_PERFORMANCE_FEE = 500; // 5%
    uint256 public constant MAX_CALL_FEE = 100; // 1%
    uint256 public constant MAX_WITHDRAW_FEE = 100; // 1%
    uint256 public constant MAX_WITHDRAW_FEE_PERIOD = 168 hours; // 7 days

    uint256 public performanceFee = 400; // 4%
    uint256 public withdrawFee = 20; // 0.2%
    uint256 public withdrawFeePeriod = 168 hours; // 7 days
    uint256 public withdrawFeeBoard = 10; // 0.1%
    uint256 public callFee = 25; // 0.25%
    uint256 public burnThreshold = 2;  //1/2 to burn


    event Deposit(address indexed sender, uint256 amount, uint256 shares, uint256 lastDepositedTime);
    event Withdraw(address indexed sender, uint256 amount, uint256 shares);
    event Harvest(address indexed sender, uint256 performanceFee, uint256 callFee);
    event Pause();
    event Unpause();

    /**
     * @notice Constructor
     * @param _token: Butter token contract
     * @param _receiptToken: Cream token contract
     * @param _masterchef: MasterChef contract
     * @param _admin: address of the admin
     * @param _treasury: address of the treasury (collects fees)
     */
    constructor(
        IHRC20 _token,
        IHRC20 _receiptToken,
        IMasterChef _masterchef,
        IButterDao _butterDao,
        address _admin,
        address _treasury
    ) public {
        require(address(_token) != address(0), "_token address cannot be 0");
        require(address(_receiptToken) != address(0), "_receiptToken address cannot be 0");
        require(address(_masterchef) != address(0), "_masterchef address cannot be 0");
        require(address(_butterDao) != address(0), "_butterDao address cannot be 0");
        require(_admin != address(0), "_admin address cannot be 0");
        require(_treasury != address(0), "_treasury address cannot be 0");
        token = _token;
        receiptToken = _receiptToken;
        masterchef = _masterchef;
        butterDao = _butterDao;
        admin = _admin;
        treasury = _treasury;

        // Infinite approve
        IHRC20(_token).safeApprove(address(_masterchef), uint256(-1));
    }

    /**
     * @notice Checks if the msg.sender is the admin address
     */
    modifier onlyAdmin() {
        require(msg.sender == admin, "admin: wut?");
        _;
    }

    /**
     * @notice Checks if the msg.sender is a contract or a proxy
     */
    modifier notContract() {
        require(!_isContract(msg.sender), "contract not allowed");
        require(msg.sender == tx.origin, "proxy contract not allowed");
        _;
    }

    /**
     * @notice Sets admin address
     * @dev Only callable by the contract owner.
     */
    function setAdmin(address _admin) external onlyOwner {
        require(_admin != address(0), "Cannot be zero address");
        admin = _admin;
    }

    /**
     * @notice Sets treasury address
     * @dev Only callable by the contract owner.
     */
    function setTreasury(address _treasury) external onlyOwner {
        require(_treasury != address(0), "Cannot be zero address");
        treasury = _treasury;
    }

    /**
     * @notice Sets call fee
     * @dev Only callable by the contract admin.
     */
    function setCallFee(uint256 _callFee) external onlyAdmin {
        require(_callFee <= MAX_CALL_FEE, "callFee cannot be more than MAX_CALL_FEE");
        callFee = _callFee;
    }

    /**
     * @notice Sets withdraw fee period
     * @dev Only callable by the contract admin.
     */
    function setWithdrawFeePeriod(uint256 _withdrawFeePeriod) external onlyAdmin {
        require(
            _withdrawFeePeriod <= MAX_WITHDRAW_FEE_PERIOD,
            "withdrawFeePeriod cannot be more than MAX_WITHDRAW_FEE_PERIOD"
        );
        withdrawFeePeriod = _withdrawFeePeriod;
    }

    /**
     * @notice Sets performance fee
     * @dev Only callable by the contract admin.
     */
    function setPerformanceFee(uint256 _performanceFee) external onlyAdmin {
        require(_performanceFee <= MAX_PERFORMANCE_FEE, "performanceFee cannot be more than MAX_PERFORMANCE_FEE");
        performanceFee = _performanceFee;
    }

    /**
     * @notice Sets withdraw fee
     * @dev Only callable by the contract admin.
     */
    function setWithdrawFee(uint256 _withdrawFee) external onlyAdmin {
        require(_withdrawFee <= MAX_WITHDRAW_FEE, "withdrawFee cannot be more than MAX_WITHDRAW_FEE");
        withdrawFee = _withdrawFee;
    }

    /**
     * @notice Sets withdraw fee
     * @dev Only callable by the contract admin.
     */
    function setWithdrawFeeBoard(uint256 _withdrawFeeBoard) external onlyAdmin {
        require(_withdrawFeeBoard <= MAX_WITHDRAW_FEE, "withdrawFeeBoard cannot be more than MAX_WITHDRAW_FEE");
        withdrawFeeBoard = _withdrawFeeBoard;
    }

    /**
     * @notice Sets treasury address
     * @dev Only callable by the contract owner.
     */
    function setBurnThreshold(uint256 _burnThreshold) external onlyOwner {
        require(_burnThreshold > 0, "Cannot be zero address");
        burnThreshold = _burnThreshold;
    }

    /**
     * @notice Deposits funds into the Butter Vault
     * @dev Only possible when contract not paused.
     * @param _amount: number of tokens to deposit (in Butter)
     */
    function deposit(uint256 _amount) external whenNotPaused notContract {
        require(_amount > 0, "Nothing to deposit");

        uint256 pool = balanceOf();
        token.safeTransferFrom(msg.sender, address(this), _amount);
        uint256 currentShares = 0;
        if (totalShares != 0) {
            currentShares = (_amount.mul(totalShares)).div(pool);
        } else {
            currentShares = _amount;
        }
        UserInfo storage user = userInfo[msg.sender];

        user.shares = user.shares.add(currentShares);
        user.lastDepositedTime = block.timestamp;

        totalShares = totalShares.add(currentShares);

        user.butterAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares);
        user.lastUserActionTime = block.timestamp;

        _earn();

        emit Deposit(msg.sender, _amount, currentShares, block.timestamp);
    }

    /**
     * @notice Withdraws all funds for a user
     */
    function withdrawAll() external notContract {
        withdraw(userInfo[msg.sender].shares);
    }

    /**
     * @notice Reinvests Butter tokens into MasterChef
     * @dev Only possible when contract not paused.
     */
    function harvest() external notContract whenNotPaused {
        IMasterChef(masterchef).leaveStaking(0);

        uint256 bal = available();
        uint256 currentPerformanceFee = bal.mul(performanceFee).div(10000);
        uint256 burnFee = currentPerformanceFee.div(burnThreshold);
        uint256 treasuryFee = currentPerformanceFee - burnFee;
        if (burnFee > 0){
            token.safeTransfer(address(0x000000000000000000000000000000000000dEaD), burnFee);
        }
        if (treasuryFee > 0){
            token.safeTransfer(treasury, treasuryFee);
        }

        uint256 currentCallFee = bal.mul(callFee).div(10000);
        token.safeTransfer(msg.sender, currentCallFee);

        _earn();

        lastHarvestedTime = block.timestamp;

        emit Harvest(msg.sender, currentPerformanceFee, currentCallFee);
    }

    /**
     * @notice Withdraws from MasterChef to Vault without caring about rewards.
     * @dev EMERGENCY ONLY. Only callable by the contract admin.
     */
    function emergencyWithdraw() external onlyAdmin {
        IMasterChef(masterchef).emergencyWithdraw(0);
    }

    /**
     * @notice Withdraws from funds from the Butter Vault
     * @param _shares: Number of shares to withdraw
     */
    function withdraw(uint256 _shares) public notContract {
        UserInfo storage user = userInfo[msg.sender];
        require(_shares > 0, "Nothing to withdraw");
        require(_shares <= user.shares, "Withdraw amount exceeds balance");

        uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares);
        user.shares = user.shares.sub(_shares);
        totalShares = totalShares.sub(_shares);

        uint256 bal = available();
        if (bal < currentAmount) {
            uint256 balWithdraw = currentAmount.sub(bal);
            IMasterChef(masterchef).leaveStaking(balWithdraw);
            uint256 balAfter = available();
            uint256 diff = balAfter.sub(bal);
            if (diff < balWithdraw) {
                currentAmount = bal.add(diff);
            }
        }

        if (block.timestamp < user.lastDepositedTime.add(withdrawFeePeriod)) {
            uint256 withdrawFee_ = IButterDao(butterDao).daoMembers(msg.sender) ? withdrawFeeBoard : withdrawFee;
            uint256 currentWithdrawFee = currentAmount.mul(withdrawFee_).div(10000);
            uint256 burnFee = currentWithdrawFee.div(burnThreshold);
            uint256 treasuryFee = currentWithdrawFee - burnFee;
            if (burnFee > 0){
                token.safeTransfer(address(0x000000000000000000000000000000000000dEaD), burnFee);
            }
            if (treasuryFee > 0){
                token.safeTransfer(treasury, treasuryFee);
            }
            currentAmount = currentAmount.sub(currentWithdrawFee);
        }

        if (user.shares > 0) {
            user.butterAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares);
        } else {
            user.butterAtLastUserAction = 0;
        }

        user.lastUserActionTime = block.timestamp;

        token.safeTransfer(msg.sender, currentAmount);

        emit Withdraw(msg.sender, currentAmount, _shares);
    }

    /**
     * @notice Withdraw unexpected tokens sent to the Butter Vault
     */
    function inCaseTokensGetStuck(address _token) external onlyAdmin {
        require(_token != address(token), "Token cannot be same as deposit token");
        require(_token != address(receiptToken), "Token cannot be same as receipt token");

        uint256 amount = IHRC20(_token).balanceOf(address(this));
        IHRC20(_token).safeTransfer(msg.sender, amount);
    }

    /**
     * @notice Triggers stopped state
     * @dev Only possible when contract not paused.
     */
    function pause() external onlyAdmin whenNotPaused {
        _pause();
        emit Pause();
    }

    /**
     * @notice Returns to normal state
     * @dev Only possible when contract is paused.
     */
    function unpause() external onlyAdmin whenPaused {
        _unpause();
        emit Unpause();
    }

    /**
     * @notice Calculates the expected harvest reward from third party
     * @return Expected reward to collect in Butter
     */
    function calculateHarvestButterRewards() external view returns (uint256) {
        uint256 amount = IMasterChef(masterchef).pendingButter(0, address(this));
        amount = amount.add(available());
        uint256 currentCallFee = amount.mul(callFee).div(10000);

        return currentCallFee;
    }

    /**
     * @notice Calculates the total pending rewards that can be restaked
     * @return Returns total pending Butter rewards
     */
    function calculateTotalpendingButterRewards() external view returns (uint256) {
        uint256 amount = IMasterChef(masterchef).pendingButter(0, address(this));
        amount = amount.add(available());

        return amount;
    }

    /**
     * @notice Calculates the price per share
     */
    function getPricePerFullShare() external view returns (uint256) {
        return totalShares == 0 ? 1e18 : balanceOf().mul(1e18).div(totalShares);
    }

    /**
     * @notice Custom logic for how much the vault allows to be borrowed
     * @dev The contract puts 100% of the tokens to work.
     */
    function available() public view returns (uint256) {
        return token.balanceOf(address(this));
    }

    /**
     * @notice Calculates the total underlying tokens
     * @dev It includes tokens held by the contract and held in MasterChef
     */
    function balanceOf() public view returns (uint256) {
        (uint256 amount, ) = IMasterChef(masterchef).userInfo(0, address(this));
        return token.balanceOf(address(this)).add(amount);
    }

    /**
     * @notice Deposits tokens into MasterChef to earn staking rewards
     */
    function _earn() internal {
        uint256 bal = available();
        if (bal > 0) {
            IMasterChef(masterchef).enterStaking(bal);
        }
    }

    /**
     * @notice Checks if address is a contract
     * @dev It prevents contract from being targetted
     */
    function _isContract(address addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IHRC20","name":"_token","type":"address"},{"internalType":"contract IHRC20","name":"_receiptToken","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"contract IButterDao","name":"_butterDao","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"performanceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callFee","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_CALL_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PERFORMANCE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WITHDRAW_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WITHDRAW_FEE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"available","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"butterDao","outputs":[{"internalType":"contract IButterDao","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateHarvestButterRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalpendingButterRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastHarvestedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiptToken","outputs":[{"internalType":"contract IHRC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnThreshold","type":"uint256"}],"name":"setBurnThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFee","type":"uint256"}],"name":"setWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFeeBoard","type":"uint256"}],"name":"setWithdrawFeeBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFeePeriod","type":"uint256"}],"name":"setWithdrawFeePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IHRC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"butterAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFeeBoard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

610100604052610190600655601460075562093a80600855600a6009556019600a556002600b553480156200003357600080fd5b50604051620050e0380380620050e0833981810160405260c08110156200005957600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000ae620006de60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060008060146101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200020a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180620050bf6021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5f6d61737465726368656620616464726573732063616e6e6f7420626520300081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620003da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5f62757474657244616f20616464726573732063616e6e6f742062652030000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200047e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5f61646d696e20616464726573732063616e6e6f74206265203000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5f747265617375727920616464726573732063616e6e6f74206265203000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508373ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006d2847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8873ffffffffffffffffffffffffffffffffffffffff16620006e660201b620033df179092919060201c565b50505050505062000c38565b600033905090565b6000811480620007b8575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156200077957600080fd5b505afa1580156200078e573d6000803e3d6000fd5b505050506040513d6020811015620007a557600080fd5b8101908080519060200190929190505050145b6200080f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180620050896036913960400191505060405180910390fd5b620008b48363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620008b960201b60201c565b505050565b606062000922826040518060400160405280602081526020017f5361666548524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620009b360201b620035a4179092919060201c565b9050600081511115620009ae578080602001905160208110156200094557600080fd5b8101908080519060200190929190505050620009ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806200505f602a913960400191505060405180910390fd5b5b505050565b6060620009ca8484600085620009d360201b60201c565b90509392505050565b6060620009e68562000bec60201b60201c565b62000a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831062000aab578051825260208201915060208101905060208303925062000a86565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462000b0f576040519150601f19603f3d011682016040523d82523d6000602084013e62000b14565b606091505b5091509150811562000b2b57809250505062000be4565b60008151111562000b3f5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000ba857808201518184015260208101905062000b8b565b50505050905090810190601f16801562000bd65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801562000c2f57506000801b8214155b92505050919050565b60805160601c60a05160601c60c05160601c60e05160601c61438662000cd960003980610f935280611a77525080610ea152806112a652806116d55280611efb52806121045280612d4a52806133995280613914525080612f4652806130cc5250806110c4528061113b528061120152806117ca528061184152806118ba528061196e5280611fd65280612ac35280612ea152806133bd52506143866000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c8063853828b611610151578063db2e21bc116100c3578063ec78e83211610087578063ec78e832146107d4578063f0f4426014610808578063f2fde38b1461084c578063f851a44014610890578063fb1db278146108c4578063fc0c546a146108f857610274565b8063db2e21bc1461072c578063dd47bc2e14610736578063def68a9c14610754578063df10b4e614610798578063e941fa78146107b657610274565b8063a8b4403a11610115578063a8b4403a14610648578063b60f053114610676578063b6ac642a14610694578063b6b55f25146106c2578063bdca9165146106f0578063d4b0de2f1461070e57610274565b8063853828b6146105a057806387788782146105aa5780638da5cb5b146105c857806390321e1a146105fc5780639d6b5f211461061a57610274565b80634f6d38d0116101ea57806370897b23116101ae57806370897b2314610504578063715018a614610532578063722713f71461053c57806377c7b8fc1461055a5780637be126d9146105785780638456cb591461059657610274565b80634f6d38d01461041a5780635c975abb1461043857806361d027b3146104585780636a3c540f1461048c578063704b6c02146104c057610274565b80632e1a7d4d1161023c5780632e1a7d4d1461037e5780633183b9ec146103ac5780633a98ef39146103ca5780633f4ba83a146103e85780634641257d146103f257806348a0d754146103fc57610274565b80631959a002146102795780631efac1b8146102e657806326465826146103145780632ad5a53f146103425780632cfc5f0114610360575b600080fd5b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092c565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610312600480360360208110156102fc57600080fd5b810190808035906020019092919050505061095c565b005b6103406004803603602081101561032a57600080fd5b8101908080359060200190929190505050610a85565b005b61034a610bac565b6040518082815260200191505060405180910390f35b610368610bb1565b6040518082815260200191505060405180910390f35b6103aa6004803603602081101561039457600080fd5b8101908080359060200190929190505050610bb8565b005b6103b46112a1565b6040518082815260200191505060405180910390f35b6103d26113c2565b6040518082815260200191505060405180910390f35b6103f06113c8565b005b6103fa61153b565b005b61040461196a565b6040518082815260200191505060405180910390f35b610422611a33565b6040518082815260200191505060405180910390f35b610440611a39565b60405180821515815260200191505060405180910390f35b610460611a4f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610494611a75565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610502600480360360208110156104d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a99565b005b6105306004803603602081101561051a57600080fd5b8101908080359060200190929190505050611c48565b005b61053a611d70565b005b610544611ef6565b6040518082815260200191505060405180910390f35b6105626120aa565b6040518082815260200191505060405180910390f35b6105806120ff565b6040518082815260200191505060405180910390f35b61059e6121f2565b005b6105a8612366565b005b6105b26124d0565b6040518082815260200191505060405180910390f35b6105d06124d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106046124ff565b6040518082815260200191505060405180910390f35b6106466004803603602081101561063057600080fd5b8101908080359060200190929190505050612505565b005b6106746004803603602081101561065e57600080fd5b810190808035906020019092919050505061264d565b005b61067e612774565b6040518082815260200191505060405180910390f35b6106c0600480360360208110156106aa57600080fd5b810190808035906020019092919050505061277a565b005b6106ee600480360360208110156106d857600080fd5b81019080803590602001909291905050506128a1565b005b6106f8612c7a565b6040518082815260200191505060405180910390f35b610716612c80565b6040518082815260200191505060405180910390f35b610734612c85565b005b61073e612dd6565b6040518082815260200191505060405180910390f35b6107966004803603602081101561076a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ddc565b005b6107a06130be565b6040518082815260200191505060405180910390f35b6107be6130c4565b6040518082815260200191505060405180910390f35b6107dc6130ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61084a6004803603602081101561081e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ee565b005b61088e6004803603602081101561086257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b005b610898613371565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108cc613397565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109006133bb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b62093a80811115610a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806142ae603d913960400191505060405180910390fd5b8060088190555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b6064811115610ba2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806142056028913960400191505060405180910390fd5b80600a8190555050565b606481565b62093a8081565b610bc1336135bc565b15610c34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f636f6e7472616374206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000081525060200191505060405180910390fd5b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008211610d8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f7468696e6720746f2077697468647261770000000000000000000000000081525060200191505060405180910390fd5b8060000154821115610e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f576974686472617720616d6f756e7420657863656564732062616c616e63650081525060200191505060405180910390fd5b6000610e38600254610e2a85610e1c611ef6565b6135cf90919063ffffffff16565b61365590919063ffffffff16565b9050610e5183836000015461369f90919063ffffffff16565b8260000181905550610e6e8360025461369f90919063ffffffff16565b6002819055506000610e7e61196a565b905081811015610f6f576000610e9d828461369f90919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631058d281826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f1257600080fd5b505af1158015610f26573d6000803e3d6000fd5b505050506000610f3461196a565b90506000610f4b848361369f90919063ffffffff16565b905082811015610f6b57610f6881856136e990919063ffffffff16565b94505b5050505b610f8860085484600101546136e990919063ffffffff16565b42101561119a5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663959068ea336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561101a57600080fd5b505af115801561102e573d6000803e3d6000fd5b505050506040513d602081101561104457600080fd5b810190808051906020019092919050505061106157600754611065565b6009545b9050600061109061271061108284876135cf90919063ffffffff16565b61365590919063ffffffff16565b905060006110a9600b548361365590919063ffffffff16565b90506000818303905060008211156111095761110861dead837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b5b60008111156111805761117f600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b5b611193838761369f90919063ffffffff16565b9550505050505b6000836000015411156111e6576111d96002546111cb6111b8611ef6565b86600001546135cf90919063ffffffff16565b61365590919063ffffffff16565b83600201819055506111f1565b600083600201819055505b42836003018190555061124533837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688386604051808381526020018281526020019250505060405180910390a250505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632108f12d6000306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561133457600080fd5b505afa158015611348573d6000803e3d6000fd5b505050506040513d602081101561135e57600080fd5b8101908080519060200190929190505050905061138b61137c61196a565b826136e990919063ffffffff16565b905060006113b86127106113aa600a54856135cf90919063ffffffff16565b61365590919063ffffffff16565b9050809250505090565b60025481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b611493611a39565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b61150d613813565b7f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b611544336135bc565b156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f636f6e7472616374206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000081525060200191505060405180910390fd5b611660611a39565b156116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631058d28160006040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561174757600080fd5b505af115801561175b573d6000803e3d6000fd5b50505050600061176961196a565b90506000611796612710611788600654856135cf90919063ffffffff16565b61365590919063ffffffff16565b905060006117af600b548361365590919063ffffffff16565b905060008183039050600082111561180f5761180e61dead837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b5b600081111561188657611885600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b5b60006118b16127106118a3600a54886135cf90919063ffffffff16565b61365590919063ffffffff16565b90506118fe33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b6119066138fd565b426003819055503373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249548583604051808381526020018281526020019250505060405180910390a25050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f357600080fd5b505afa158015611a07573d6000803e3d6000fd5b505050506040513d6020811015611a1d57600080fd5b8101908080519060200190929190505050905090565b600b5481565b60008060149054906101000a900460ff16905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b611aa16139a1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f74206265207a65726f20616464726573730000000000000000000081525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b6101f4811115611d66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061422d6036913960400191505060405180910390fd5b8060068190555050565b611d786139a1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166393f1a40b6000306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050604080518083038186803b158015611f8857600080fd5b505afa158015611f9c573d6000803e3d6000fd5b505050506040513d6040811015611fb257600080fd5b8101908080519060200190929190805190602001909291905050505090506120a4817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561205b57600080fd5b505afa15801561206f573d6000803e3d6000fd5b505050506040513d602081101561208557600080fd5b81019080805190602001909291905050506136e990919063ffffffff16565b91505090565b600080600254146120f0576120eb6002546120dd670de0b6b3a76400006120cf611ef6565b6135cf90919063ffffffff16565b61365590919063ffffffff16565b6120fa565b670de0b6b3a76400005b905090565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632108f12d6000306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d60208110156121bc57600080fd5b810190808051906020019092919050505090506121e96121da61196a565b826136e990919063ffffffff16565b90508091505090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122bd611a39565b15612330576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6123386139a9565b7f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b61236f336135bc565b156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f636f6e7472616374206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000081525060200191505060405180910390fd5b6124ce600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610bb8565b565b60065481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b61250d6139a1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008111612643576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f74206265207a65726f20616464726573730000000000000000000081525060200191505060405180910390fd5b80600b8190555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b606481111561276a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806141ab6035913960400191505060405180910390fd5b8060098190555050565b60035481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461283d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b6064811115612897576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806142eb6030913960400191505060405180910390fd5b8060078190555050565b6128a9611a39565b1561291c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612925336135bc565b15612998576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f636f6e7472616374206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f70726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000081525060200191505060405180910390fd5b60008111612aaf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f7468696e6720746f206465706f736974000000000000000000000000000081525060200191505060405180910390fd5b6000612ab9611ef6565b9050612b083330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613a95909392919063ffffffff16565b60008060025414612b4157612b3a82612b2c600254866135cf90919063ffffffff16565b61365590919063ffffffff16565b9050612b45565b8290505b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612b9f8282600001546136e990919063ffffffff16565b8160000181905550428160010181905550612bc5826002546136e990919063ffffffff16565b600281905550612bfd600254612bef612bdc611ef6565b84600001546135cf90919063ffffffff16565b61365590919063ffffffff16565b8160020181905550428160030181905550612c166138fd565b3373ffffffffffffffffffffffffffffffffffffffff167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e85844260405180848152602001838152602001828152602001935050505060405180910390a250505050565b6101f481565b606481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635312ea8e60006040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b50505050565b60095481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f61646d696e3a207775743f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806141866025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fe9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806141e06025913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561305257600080fd5b505afa158015613066573d6000803e3d6000fd5b505050506040513d602081101561307c57600080fd5b810190808051906020019092919050505090506130ba33828473ffffffffffffffffffffffffffffffffffffffff166137719092919063ffffffff16565b5050565b60085481565b60075481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6130f66139a1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146131b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613259576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f74206265207a65726f20616464726573730000000000000000000081525060200191505060405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6132a56139a1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61336e81613b56565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008114806134ad575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561347057600080fd5b505afa158015613484573d6000803e3d6000fd5b505050506040513d602081101561349a57600080fd5b8101908080519060200190929190505050145b613502576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061431b6036913960400191505060405180910390fd5b61359f8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c99565b505050565b60606135b38484600085613d88565b90509392505050565b600080823b905060008111915050919050565b6000808314156135e2576000905061364f565b60008284029050828482816135f357fe5b041461364a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142636021913960400191505060405180910390fd5b809150505b92915050565b600061369783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f8e565b905092915050565b60006136e183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614054565b905092915050565b600080828401905083811015613767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61380e8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c99565b505050565b61381b611a39565b61388d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138d06139a1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061390761196a565b9050600081111561399e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166341441d3b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050505b50565b600033905090565b6139b1611a39565b15613a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613a686139a1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b613b50846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c99565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613bdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141606026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060613cfb826040518060400160405280602081526020017f5361666548524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135a49092919063ffffffff16565b9050600081511115613d8357808060200190516020811015613d1c57600080fd5b8101908080519060200190929190505050613d82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614284602a913960400191505060405180910390fd5b5b505050565b6060613d9385614114565b613e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613e555780518252602082019150602081019050602083039250613e32565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613eb7576040519150601f19603f3d011682016040523d82523d6000602084013e613ebc565b606091505b50915091508115613ed1578092505050613f86565b600081511115613ee45780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f4b578082015181840152602081019050613f30565b50505050905090810190601f168015613f785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b6000808311829061403a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613fff578082015181840152602081019050613fe4565b50505050905090810190601f16801561402c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161404657fe5b049050809150509392505050565b6000838311158290614101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140c65780820151818401526020810190506140ab565b50505050905090810190601f1680156140f35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561415657506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373546f6b656e2063616e6e6f742062652073616d65206173206465706f73697420746f6b656e7769746864726177466565426f6172642063616e6e6f74206265206d6f7265207468616e204d41585f57495448445241575f464545546f6b656e2063616e6e6f742062652073616d65206173207265636569707420746f6b656e63616c6c4665652063616e6e6f74206265206d6f7265207468616e204d41585f43414c4c5f464545706572666f726d616e63654665652063616e6e6f74206265206d6f7265207468616e204d41585f504552464f524d414e43455f464545536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666548524332303a204852433230206f7065726174696f6e20646964206e6f7420737563636565647769746864726177466565506572696f642063616e6e6f74206265206d6f7265207468616e204d41585f57495448445241575f4645455f504552494f4477697468647261774665652063616e6e6f74206265206d6f7265207468616e204d41585f57495448445241575f4645455361666548524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212209947f39f663c73ff650a5b5aabcee0ee4bc3355979d8b9e27eeffa321e695e7a64736f6c634300060c00335361666548524332303a204852433230206f7065726174696f6e20646964206e6f7420737563636565645361666548524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655f72656365697074546f6b656e20616464726573732063616e6e6f742062652030000000000000000000000000bf84214ea409a369774321727595f218889ed9430000000000000000000000009e3018f8b0e9f2743fd6dfea1380db60d864207f00000000000000000000000089a3bfa840cf4c9022789cc60500ec03df8c293500000000000000000000000038aaa41a27fa3ed2cd72bd3d3fea8d97670c439b0000000000000000000000001359b3c36ea2892943183ee97cc1cb4e96cb5e33000000000000000000000000dd053b667a1ebdf72942f39a80ef31119fb0fda6

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

000000000000000000000000bf84214ea409a369774321727595f218889ed9430000000000000000000000009e3018f8b0e9f2743fd6dfea1380db60d864207f00000000000000000000000089a3bfa840cf4c9022789cc60500ec03df8c293500000000000000000000000038aaa41a27fa3ed2cd72bd3d3fea8d97670c439b0000000000000000000000001359b3c36ea2892943183ee97cc1cb4e96cb5e33000000000000000000000000dd053b667a1ebdf72942f39a80ef31119fb0fda6

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000bf84214ea409a369774321727595f218889ed943
Arg [1] : 0000000000000000000000009e3018f8b0e9f2743fd6dfea1380db60d864207f
Arg [2] : 00000000000000000000000089a3bfa840cf4c9022789cc60500ec03df8c2935
Arg [3] : 00000000000000000000000038aaa41a27fa3ed2cd72bd3d3fea8d97670c439b
Arg [4] : 0000000000000000000000001359b3c36ea2892943183ee97cc1cb4e96cb5e33
Arg [5] : 000000000000000000000000dd053b667a1ebdf72942f39a80ef31119fb0fda6


Deployed ByteCode Sourcemap

25638:13889:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26319:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30074:301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29775:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26565:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26679:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34382:1953;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37396:307;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26372:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37142:103;;;:::i;:::-;;33103:857;;;:::i;:::-;;38480:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27006:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24355:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26471:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26273:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29236:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30488:238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22090:140;;;:::i;:::-;;38744:201;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38167:154;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37856:238;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36924:100;;;:::i;:::-;;32868;;;:::i;:::-;;26757:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21448:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26963:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31518:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31160:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26405:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30836:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31896:899;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26503:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26620:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34133:111;;;:::i;:::-;;26912:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36429:377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26851:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26805:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26167:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29502:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22385:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26444:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26227:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26115:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26319:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30074:301::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26729:9:::1;30184:18;:45;;30162:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30349:18;30329:17;:38;;;;30074:301:::0;:::o;29775:182::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26604:3:::1;29851:8;:24;;29843:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29941:8;29931:7;:18;;;;29775:182:::0;:::o;26565:42::-;26604:3;26565:42;:::o;26679:59::-;26729:9;26679:59;:::o;34382:1953::-;28984:23;28996:10;28984:11;:23::i;:::-;28983:24;28975:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29065:9;29051:23;;:10;:23;;;29043:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34447:21:::1;34471:8;:20;34480:10;34471:20;;;;;;;;;;;;;;;34447:44;;34520:1;34510:7;:11;34502:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34575:4;:11;;;34564:7;:22;;34556:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34635:21;34659:43;34690:11;;34660:24;34676:7;34660:11;:9;:11::i;:::-;:15;;:24;;;;:::i;:::-;34659:30;;:43;;;;:::i;:::-;34635:67;;34727:24;34743:7;34727:4;:11;;;:15;;:24;;;;:::i;:::-;34713:4;:11;;:38;;;;34776:24;34792:7;34776:11;;:15;;:24;;;;:::i;:::-;34762:11;:38;;;;34813:11;34827;:9;:11::i;:::-;34813:25;;34859:13;34853:3;:19;34849:354;;;34889:19;34911:22;34929:3;34911:13;:17;;:22;;;;:::i;:::-;34889:44;;34960:10;34948:36;;;34985:11;34948:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35012:16;35031:11;:9;:11::i;:::-;35012:30;;35057:12;35072:17;35085:3;35072:8;:12;;:17;;;;:::i;:::-;35057:32;;35115:11;35108:4;:18;35104:88;;;35163:13;35171:4;35163:3;:7;;:13;;;;:::i;:::-;35147:29;;35104:88;34849:354;;;;35237:45;35264:17;;35237:4;:22;;;:26;;:45;;;;:::i;:::-;35219:15;:63;35215:740;;;35299:20;35333:9;35322:32;;;35355:10;35322:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:77;;35388:11;;35322:77;;;35369:16;;35322:77;35299:100;;35414:26;35443:42;35479:5;35443:31;35461:12;35443:13;:17;;:31;;;;:::i;:::-;:35;;:42;;;;:::i;:::-;35414:71;;35500:15;35518:37;35541:13;;35518:18;:22;;:37;;;;:::i;:::-;35500:55;;35570:19;35613:7;35592:18;:28;35570:50;;35649:1;35639:7;:11;35635:131;;;35670:80;35697:42;35742:7;35670:5;:18;;;;:80;;;;;:::i;:::-;35635:131;35798:1;35784:11;:15;35780:96;;;35819:41;35838:8;;;;;;;;;;;35848:11;35819:5;:18;;;;:41;;;;;:::i;:::-;35780:96;35906:37;35924:18;35906:13;:17;;:37;;;;:::i;:::-;35890:53;;35215:740;;;;;35985:1;35971:4;:11;;;:15;35967:187;;;36033:45;36066:11;;36033:28;36049:11;:9;:11::i;:::-;36033:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:45;;;;:::i;:::-;36003:4;:27;;:75;;;;35967:187;;;36141:1;36111:4;:27;;:31;;;;35967:187;36192:15;36166:4;:23;;:41;;;;36220:45;36239:10;36251:13;36220:5;:18;;;;:45;;;;;:::i;:::-;36292:10;36283:44;;;36304:13;36319:7;36283:44;;;;;;;;;;;;;;;;;;;;;;;;29116:1;;;34382:1953:::0;:::o;37396:307::-;37460:7;37480:14;37509:10;37497:37;;;37535:1;37546:4;37497:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37480:72;;37572:23;37583:11;:9;:11::i;:::-;37572:6;:10;;:23;;;;:::i;:::-;37563:32;;37606:22;37631:30;37655:5;37631:19;37642:7;;37631:6;:10;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;37606:55;;37681:14;37674:21;;;;37396:307;:::o;26372:26::-;;;;:::o;37142:103::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24958:8:::1;:6;:8::i;:::-;24950:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;37202:10:::2;:8;:10::i;:::-;37228:9;;;;;;;;;;37142:103::o:0;33103:857::-;28984:23;28996:10;28984:11;:23::i;:::-;28983:24;28975:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29065:9;29051:23;;:10;:23;;;29043:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24681:8:::1;:6;:8::i;:::-;24680:9;24672:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33180:10:::2;33168:36;;;33205:1;33168:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;33220:11;33234;:9;:11::i;:::-;33220:25;;33256:29;33288:34;33316:5;33288:23;33296:14;;33288:3;:7;;:23;;;;:::i;:::-;:27;;:34;;;;:::i;:::-;33256:66;;33333:15;33351:40;33377:13;;33351:21;:25;;:40;;;;:::i;:::-;33333:58;;33402:19;33448:7;33424:21;:31;33402:53;;33480:1;33470:7;:11;33466:123;;;33497:80;33524:42;33569:7;33497:5;:18;;;;:80;;;;;:::i;:::-;33466:123;33617:1;33603:11;:15;33599:88;;;33634:41;33653:8;;;;;;;;;;;33663:11;33634:5;:18;;;;:41;;;;;:::i;:::-;33599:88;33699:22;33724:27;33745:5;33724:16;33732:7;;33724:3;:7;;:16;;;;:::i;:::-;:20;;:27;;;;:::i;:::-;33699:52;;33762:46;33781:10;33793:14;33762:5;:18;;;;:46;;;;;:::i;:::-;33821:7;:5;:7::i;:::-;33861:15;33841:17;:35;;;;33902:10;33894:58;;;33914:21;33937:14;33894:58;;;;;;;;;;;;;;;;;;;;;;;;24721:1;;;;;33103:857::o:0;38480:107::-;38522:7;38549:5;:15;;;38573:4;38549:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38542:37;;38480:107;:::o;27006:32::-;;;;:::o;24355:86::-;24402:4;24426:7;;;;;;;;;;;24419:14;;24355:86;:::o;26471:23::-;;;;;;;;;;;;;:::o;26273:37::-;;;:::o;29236:152::-;21670:12;:10;:12::i;:::-;21660:22;;:6;;;;;;;;;;:22;;;21652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29326:1:::1;29308:20;;:6;:20;;;;29300:55;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29374:6;29366:5;;:14;;;;;;;;;;;;;;;;;;29236:152:::0;:::o;30488:238::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26549:3:::1;30578:15;:38;;30570:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30703:15;30686:14;:32;;;;30488:238:::0;:::o;22090:140::-;21670:12;:10;:12::i;:::-;21660:22;;:6;;;;;;;;;;:22;;;21652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22189:1:::1;22152:40;;22173:6;::::0;::::1;;;;;;;;22152:40;;;;;;;;;;;;22220:1;22203:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;22090:140::o:0;38744:201::-;38786:7;38807:14;38839:10;38827:32;;;38860:1;38871:4;38827:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38806:71;;;38895:42;38930:6;38895:5;:15;;;38919:4;38895:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:34;;:42;;;;:::i;:::-;38888:49;;;38744:201;:::o;38167:154::-;38222:7;38264:1;38249:11;;:16;:64;;38275:38;38301:11;;38275:21;38291:4;38275:11;:9;:11::i;:::-;:15;;:21;;;;:::i;:::-;:25;;:38;;;;:::i;:::-;38249:64;;;38268:4;38249:64;38242:71;;38167:154;:::o;37856:238::-;37925:7;37945:14;37974:10;37962:37;;;38000:1;38011:4;37962:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37945:72;;38037:23;38048:11;:9;:11::i;:::-;38037:6;:10;;:23;;;;:::i;:::-;38028:32;;38080:6;38073:13;;;37856:238;:::o;36924:100::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24681:8:::1;:6;:8::i;:::-;24680:9;24672:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;36985:8:::2;:6;:8::i;:::-;37009:7;;;;;;;;;;36924:100::o:0;32868:::-;28984:23;28996:10;28984:11;:23::i;:::-;28983:24;28975:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29065:9;29051:23;;:10;:23;;;29043:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32923:37:::1;32932:8;:20;32941:10;32932:20;;;;;;;;;;;;;;;:27;;;32923:8;:37::i;:::-;32868:100::o:0;26757:35::-;;;;:::o;21448:79::-;21486:7;21513:6;;;;;;;;;;;21506:13;;21448:79;:::o;26963:27::-;;;;:::o;31518:182::-;21670:12;:10;:12::i;:::-;21660:22;;:6;;;;;;;;;;:22;;;21652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31623:1:::1;31606:14;:18;31598:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31678:14;31662:13;:30;;;;31518:182:::0;:::o;31160:244::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26663:3:::1;31254:17;:37;;31246:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31379:17;31360:16;:36;;;;31160:244:::0;:::o;26405:32::-;;;;:::o;30836:214::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26663:3:::1;30920:12;:32;;30912:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31030:12;31016:11;:26;;;;30836:214:::0;:::o;31896:899::-;24681:8;:6;:8::i;:::-;24680:9;24672:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28984:23:::1;28996:10;28984:11;:23::i;:::-;28983:24;28975:57;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29065:9;29051:23;;:10;:23;;;29043:62;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31994:1:::2;31984:7;:11;31976:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;32031:12;32046:11;:9;:11::i;:::-;32031:26;;32068:58;32091:10;32111:4;32118:7;32068:5;:22;;;;:58;;;;;;:::i;:::-;32137:21;32192:1:::0;32177:11:::2;;:16;32173:157;;32226:36;32257:4;32227:24;32239:11;;32227:7;:11;;:24;;;;:::i;:::-;32226:30;;:36;;;;:::i;:::-;32210:52;;32173:157;;;32311:7;32295:23;;32173:157;32340:21;32364:8;:20;32373:10;32364:20;;;;;;;;;;;;;;;32340:44;;32411:30;32427:13;32411:4;:11;;;:15;;:30;;;;:::i;:::-;32397:4;:11;;:44;;;;32477:15;32452:4;:22;;:40;;;;32519:30;32535:13;32519:11;;:15;;:30;;;;:::i;:::-;32505:11;:44;;;;32592:45;32625:11;;32592:28;32608:11;:9;:11::i;:::-;32592:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:45;;;;:::i;:::-;32562:4;:27;;:75;;;;32674:15;32648:4;:23;;:41;;;;32702:7;:5;:7::i;:::-;32735:10;32727:60;;;32747:7;32756:13;32771:15;32727:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29116:1;;;31896:899:::0;:::o;26503:49::-;26549:3;26503:49;:::o;26620:46::-;26663:3;26620:46;:::o;34133:111::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34204:10:::1;34192:41;;;34234:1;34192:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34133:111::o:0;26912:36::-;;;;:::o;36429:377::-;28808:5;;;;;;;;;;;28794:19;;:10;:19;;;28786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36531:5:::1;36513:24;;:6;:24;;;;36505:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36616:12;36598:31;;:6;:31;;;;36590:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36684:14;36708:6;36701:24;;;36734:4;36701:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;36684:56;;36751:47;36779:10;36791:6;36758;36751:27;;;;:47;;;;;:::i;:::-;28840:1;36429:377:::0;:::o;26851:44::-;;;;:::o;26805:31::-;;;;:::o;26167:36::-;;;:::o;29502:167::-;21670:12;:10;:12::i;:::-;21660:22;;:6;;;;;;;;;;:22;;;21652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29601:1:::1;29580:23;;:9;:23;;;;29572:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29652:9;29641:8;;:20;;;;;;;;;;;;;;;;;;29502:167:::0;:::o;22385:109::-;21670:12;:10;:12::i;:::-;21660:22;;:6;;;;;;;;;;:22;;;21652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22458:28:::1;22477:8;22458:18;:28::i;:::-;22385:109:::0;:::o;26444:20::-;;;;;;;;;;;;;:::o;26227:39::-;;;:::o;26115:29::-;;;:::o;16796:670::-;17223:1;17214:5;:10;17213:62;;;;17273:1;17230:5;:15;;;17254:4;17261:7;17230:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;17213:62;17191:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17368:90;17388:5;17418:22;;;17442:7;17451:5;17395:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17368:19;:90::i;:::-;16796:670;;;:::o;12984:230::-;13121:12;13153:53;13176:6;13184:4;13190:1;13193:12;13153:22;:53::i;:::-;13146:60;;12984:230;;;;;:::o;39333:191::-;39391:4;39408:12;39475:4;39463:17;39455:25;;39515:1;39508:4;:8;39501:15;;;39333:191;;;:::o;2292:471::-;2350:7;2600:1;2595;:6;2591:47;;;2625:1;2618:8;;;;2591:47;2650:9;2666:1;2662;:5;2650:17;;2695:1;2690;2686;:5;;;;;;:10;2678:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2754:1;2747:8;;;2292:471;;;;;:::o;3239:132::-;3297:7;3324:39;3328:1;3331;3324:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3317:46;;3239:132;;;;:::o;1368:136::-;1426:7;1453:43;1457:1;1460;1453:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1446:50;;1368:136;;;;:::o;904:181::-;962:7;982:9;998:1;994;:5;982:17;;1023:1;1018;:6;;1010:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1076:1;1069:8;;;904:181;;;;:::o;16060:211::-;16177:86;16197:5;16227:23;;;16252:2;16256:5;16204:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16177:19;:86::i;:::-;16060:211;;;:::o;25414:120::-;24958:8;:6;:8::i;:::-;24950:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25483:5:::1;25473:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;25504:22;25513:12;:10;:12::i;:::-;25504:22;;;;;;;;;;;;;;;;;;;;25414:120::o:0;39043:161::-;39080:11;39094;:9;:11::i;:::-;39080:25;;39126:1;39120:3;:7;39116:81;;;39156:10;39144:36;;;39181:3;39144:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39116:81;39043:161;:::o;20101:98::-;20146:15;20181:10;20174:17;;20101:98;:::o;25155:118::-;24681:8;:6;:8::i;:::-;24680:9;24672:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25225:4:::1;25215:7;;:14;;;;;;;;;;;;;;;;;;25245:20;25252:12;:10;:12::i;:::-;25245:20;;;;;;;;;;;;;;;;;;;;25155:118::o:0;16279:248::-;16423:96;16443:5;16473:27;;;16502:4;16508:2;16512:5;16450:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16423:19;:96::i;:::-;16279:248;;;;:::o;22600:229::-;22694:1;22674:22;;:8;:22;;;;22666:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22784:8;22755:38;;22776:6;;;;;;;;;;22755:38;;;;;;;;;;;;22813:8;22804:6;;:17;;;;;;;;;;;;;;;;;;22600:229;:::o;18595:774::-;19019:23;19045:69;19073:4;19045:69;;;;;;;;;;;;;;;;;19053:5;19045:27;;;;:69;;;;;:::i;:::-;19019:95;;19149:1;19129:10;:17;:21;19125:237;;;19284:10;19273:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19265:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19125:237;18595:774;;;:::o;14472:1020::-;14645:12;14678:18;14689:6;14678:10;:18::i;:::-;14670:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14804:12;14818:23;14845:6;:11;;14864:8;14874:4;14845:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14803:76;;;;14894:7;14890:595;;;14925:10;14918:17;;;;;;14890:595;15059:1;15039:10;:17;:21;15035:439;;;15302:10;15296:17;15363:15;15350:10;15346:2;15342:19;15335:44;15250:148;15445:12;15438:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14472:1020;;;;;;;:::o;3867:312::-;3987:7;4019:1;4015;:5;4022:12;4007:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4046:9;4062:1;4058;:5;;;;;;4046:17;;4170:1;4163:8;;;3867:312;;;;;:::o;1807:226::-;1927:7;1960:1;1955;:6;;1963:12;1947:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1987:9;2003:1;1999;:5;1987:17;;2024:1;2017:8;;;1807:226;;;;;:::o;9847:641::-;9907:4;10169:16;10196:19;10218:66;10196:88;;;;10400:7;10388:20;10376:32;;10449:11;10437:8;:23;;:42;;;;;10476:3;10464:15;;:8;:15;;10437:42;10429:51;;;;9847:641;;;:::o

Swarm Source

ipfs://9947f39f663c73ff650a5b5aabcee0ee4bc3355979d8b9e27eeffa321e695e7a
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading