Contract 0xc6183a902FD287CC47b525a75C8d3381C6eae42f 1

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x4ef6913bff48fefc4be7752640a1f7356c333b0f172e36eb830d5a29d20fe7edClaim355529752022-11-13 11:35:59202 days 6 hrs ago0x12b3da3e8af0ffd987a88c6c5b9b0739dc0fb968 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.00422695648 46.086444106
0x3597859424637cd526ad2ef927268736ebd08eeb062ac16036066860c5792c92Approve347630832022-10-25 1:25:00221 days 16 hrs ago0x12b3da3e8af0ffd987a88c6c5b9b0739dc0fb968 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.002377610821 97.95290328
0xd73df890c2be69415551936b17145a361352b3f7164f57f3b0518a61183cc0ddClaim308169582022-07-17 8:43:08321 days 9 hrs ago0xd623710993aa12b00c4cf2e2b73682f7f22ea629 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003108633864 31.049700001
0x40216cd19f6ec0dd1dba611c48751d318094f316254d65ef50cd4ac9ca8ec431Claim306184932022-07-11 22:14:20326 days 19 hrs ago0x5c0eb2aa36f17b51a288f58d1bb147fdef091f52 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.005012285171 37.182296917
0x7810c59113ac748f996cc1dace46835a706de6fc4eed642647c365bc01939917Claim305225232022-07-09 12:08:56329 days 6 hrs ago0x9033c3677e6c63fc252e9546ad5b5e7d66fc0926 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.005919070953 43.650000025
0x120209d4c08f27f29c121943dddb6db74bf5ce7fc286828380bed3472af1d00aClaim302208922022-07-01 17:12:29337 days 1 hr ago0xc34359fab3d2df508e4f994af5a6418c2dbb132d IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003516540006 30.000000055
0xd84297d6c7ef594826f01865578be01b93f96e570373386ab485ac296e870907Claim302191562022-07-01 16:08:32337 days 2 hrs ago0xb0d50f40569e7665c7f862f2f38e1044e03af13c IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.0090106290
0x79b04018f99a2648fc9ecdd59d26f7d14613c0c57d8ad0f4ca60acef6afe86fcClaim301820172022-06-30 16:35:54338 days 1 hr ago0xdc7c5b169e17aef7dbc51e0a19eb9223a96b0193 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.006232050051 62.247048993
0x92313bf3500c5cfbe6bcc7aac0f634c900c58d86c04fcec29118ebfc0505aee4Claim301711262022-06-30 9:59:51338 days 8 hrs ago0x258458b0a18c2e4be4f8bec91046b7e12ff695d2 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.006736415419 67.28475818
0xa947b08b6de159ae38956a39130c1873dedd3abc9a45e26f86d1d581f95349feClaim301709762022-06-30 9:54:43338 days 8 hrs ago0x1d075f1f543bb09df4530f44ed21ca50303a65b2 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.008041198417 68.317701479
0x4bbf36db2e24bf1ba4507452ca19643969b667b399bf4c4dfa9ea24f5471c3fbClose301709412022-06-30 9:53:29338 days 8 hrs ago0x1d075f1f543bb09df4530f44ed21ca50303a65b2 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.005502183847 55.375689133
0xd29d66400b868602e242fe63ffd613b6c73996476442eef18f7e98d07fd4f1dcMint A300807482022-06-28 2:16:00340 days 15 hrs ago0xc34359fab3d2df508e4f994af5a6418c2dbb132d IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003313290005 30.000000052
0x6568af095e155bf9c284932d3ca753a8dee4d1e93a9dc6a6d4f8eef445d9cc53Approve298975752022-06-23 6:59:10345 days 11 hrs ago0x5c0eb2aa36f17b51a288f58d1bb147fdef091f52 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.001449689047 31.137939452
0x7c84b01ccc33b062183e78ca982d405d0871e483d843eb54eb573dde717487a0Burn LP290467652022-06-01 20:44:01366 days 21 hrs ago0x7d3d2b9897ec739ec22dbb4cd3739d16d566d1d8 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003408700387 30.003260142
0x0fe0fe1a040af9eb22c98e0fec4bc26c0dc012ecde64683df7add20331fe689aMint LP285784642022-05-21 6:34:14378 days 11 hrs ago0x5c0eb2aa36f17b51a288f58d1bb147fdef091f52 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003671038721 31.040000009
0x6d45d07ae622ea3e8df23e2a9fde621894f08b770c4326b20f02f953539f11b3Burn A283970632022-05-16 17:24:50383 days 48 mins ago0x8dfd4718be80f78f14d99ef0067f331df87c53f8 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.007307789801 59.18628505
0xa4cb55f66355b060c741b276f3f2e89fc86b0ba037c87a2a389cade7604edae3Mint A283970382022-05-16 17:23:56383 days 48 mins ago0x8dfd4718be80f78f14d99ef0067f331df87c53f8 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.005336514925 57.185727726
0xe9b00f37d3ee7f08ae6fce8a8b16de189d9760d5f7a4c0814c91a5423a0b6643Burn A283789432022-05-16 6:44:13383 days 11 hrs ago0x258458b0a18c2e4be4f8bec91046b7e12ff695d2 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.007516196578 67.602030695
0x2cd35abf6b0412459628759e218d6cfcbe37a52fa0c7341b86b5762477e74b45Burn A283788692022-05-16 6:41:41383 days 11 hrs ago0x258458b0a18c2e4be4f8bec91046b7e12ff695d2 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.006702241321 61.112247736
0x3707da77d124eb6caf5ab8b27c22f7b2ee11723ed4bb09b77357e1339d57db20Mint B283504062022-05-15 14:09:46384 days 4 hrs ago0xdc7c5b169e17aef7dbc51e0a19eb9223a96b0193 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003474863898 30.144124035
0x4b6e67772a60a76a880b7dffaba4c1f3462306b7616d9f63b1c63eb75a023abbBurn LP282856662022-05-13 23:25:19385 days 18 hrs ago0x27ab705016d60a0ec5b83ed6a986322c4152cd44 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.003165350033 32.789662124
0xa5a50ad231a2c6266c626736c36111c0511581f5828d522d59318254522d8e75Burn LP282856332022-05-13 23:24:13385 days 18 hrs ago0x27ab705016d60a0ec5b83ed6a986322c4152cd44 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.00308420112 32.34
0x20c0b8d13d4004cc35632d339d157f9e844de1acddd13457ea02ed839b2eebfaBurn A281862372022-05-11 9:58:10388 days 8 hrs ago robdeguzman.crypto  IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.013651966387 127.469340683
0xee8a778f4a84698c19e97d2656318619a4d4549a784347e40f57fc2b09ff1accBurn A281862162022-05-11 9:57:28388 days 8 hrs ago robdeguzman.crypto  IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.01077006828 96.247258984
0xf40be27d565f9a13d2a354fe3d93cb6051f4711a775d148bedcb586e491bb946Burn LP277335682022-04-29 23:06:52399 days 19 hrs ago0x27ab705016d60a0ec5b83ed6a986322c4152cd44 IN  0xc6183a902fd287cc47b525a75c8d3381c6eae42f0 MATIC0.004290230722 42.139994723
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x11bafFebd829B490Cf077Ce7eF7700dd3cB1e534

Contract Name:
IGainAAVEIRS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 54088 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: IGainAAVEIRS.sol
pragma solidity 0.8.7;

// SPDX-License-Identifier: MIT

import "./IGainBase.sol";

interface ILendingPool {
    function getReserveNormalizedIncome(address asset) external view returns (uint256);
    function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);
}

contract IGainAAVEIRS is IGainBase {

    ILendingPool public AAVE; // AAVE LendingPool
    address public asset; // underlying asset's address

    uint256 public initialRate;
    uint256 public endRate;
    uint256 public leverage; // in 1e18

    function init(address _baseToken, address _lendingPool, address _asset, address _treasury, string calldata _batchName, uint256 _leverage, uint256 _duration, uint256 _a, uint256 _b) public {
        _init(_baseToken, _treasury, _batchName, _duration, _a, _b);
        AAVE = ILendingPool(_lendingPool);
        asset = _asset;
        leverage = _leverage;
        initialRate = AAVE.getReserveNormalizedVariableDebt(asset);
        require(initialRate > 0, "initialRate = 0");
    }

    // 1 - swap fee (numerator, in 1e18 format)
    function fee() public override view returns (uint256) {
        uint256 time = _blockTimestamp();
        uint256 _fee;
        if(time < closeTime) {
            _fee = maxFee - (
                (time - openTime) * (maxFee - minFee) / (closeTime - openTime)
            );
        }
        else {
            _fee = minFee;
        }
        return 1e18 - _fee;
    }

    function close() external override {
        require(_blockTimestamp() >= closeTime, "Not yet");
        require(canBuy, "Closed");
        canBuy = false;
        endRate = AAVE.getReserveNormalizedVariableDebt(asset);

        if (endRate < initialRate) endRate = initialRate; // wierd cases prevention?

        uint256 ratio = (endRate - initialRate) * 1e18 / initialRate;
        uint256 _bPrice = ratio * leverage / 1e18; // leverage
        bPrice = _bPrice > 1e18 ? 1e18 : _bPrice;
    }

}

File 2 of 2: IGainBase.sol
pragma solidity 0.8.7;

// SPDX-License-Identifier: MIT

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is Context, IERC20 {
    mapping(address => uint256) internal _balances;

    mapping(address => mapping(address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    string public name;
    string public symbol;
    uint8 public decimals;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

interface ERC20Mintable is IERC20 {
    function mint(address to, uint256 amount) external;
    function burn(address from, uint256 amount) external;
}

interface TokenFactory {
    function newToken(address _owner, string calldata _name, string calldata _symbol, uint8 _decimals) external returns (address token);
}

abstract contract Timestamp {
    function _blockTimestamp() internal view virtual returns (uint256) {
        return block.timestamp;
    }
}

abstract contract IGainBase is ERC20, Timestamp {
    using SafeERC20 for IERC20;

    bool public canBuy;

    address public treasury;
    address public baseToken;

    TokenFactory public constant Factory = TokenFactory(0x47Ca2166A5b837e891E6E64E780d1B43FC0a4E95);

    ERC20Mintable public a;
    ERC20Mintable public b;

    uint256 public openTime;
    uint256 public closeTime;

    uint256 public constant protocolFee = 0.01e18;
    uint256 public constant minFee = 0.003e18;
    uint256 public constant maxFee = 0.03e18;


    // a + b = $1
    // b = the synth
    // a = 1 - b
    uint256 public bPrice;

    uint256 public poolA;
    uint256 public poolB;

    event Mint(address indexed minter, uint256 amount);
    event Burn(address indexed burner, uint256 amount);
    event Swap(address indexed user, bool indexed a2b, uint256 input, uint256 output);
    event AddLP(address indexed provider, uint256 a, uint256 b, uint256 lp);
    event RemoveLP(address indexed provider, uint256 a, uint256 b, uint256 lp);

    function sqrt(uint256 x) internal pure returns (uint256) {
        uint256 z = x >> 1 + 1;
        uint256 y = x;
        while (z < y)
        {
            y = z;
            z = (x / z + z) / 2;
        }
        return y;
    }

    // initializer, derived contracts must call this in its public init() function
    function _init(address _baseToken, address _treasury, string memory _batchName, uint256 _duration, uint256 _a, uint256 _b) internal {
        require(openTime == 0, "Initialized");
        require(_a > 0 && _b > 0, "No initial liquidity");
        baseToken = _baseToken;

        treasury = _treasury;
        openTime = _blockTimestamp();
        closeTime = _blockTimestamp() + _duration;

        canBuy = true;

        name = string(abi.encodePacked("iGain LP token ", _batchName));
        symbol = string(abi.encodePacked("iGLP ", _batchName));
        decimals = ERC20(baseToken).decimals();

        a = ERC20Mintable(Factory.newToken(address(this), string(abi.encodePacked("iGain A token ", _batchName)), string(abi.encodePacked("iG-A ", _batchName)), decimals));
        b = ERC20Mintable(Factory.newToken(address(this), string(abi.encodePacked("iGain B token ", _batchName)), string(abi.encodePacked("iG-B ", _batchName)), decimals));

        uint256 _lp = sqrt(_a * _b);
        poolA = _a;
        poolB = _b;
        _mint(_msgSender(), _lp);
        _mint(address(0), 1000); //lock liquidity 
        if(_b > _a) {
            a.mint(_msgSender(), _b - _a);
            doTransferIn(baseToken, _msgSender(), _b);
        }
        else {
            b.mint(_msgSender(), _a - _b);
            doTransferIn(baseToken, _msgSender(), _a);
        }
        emit AddLP(_msgSender(), _a, _b, _lp);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint256 f) internal pure returns (uint amountOut) {
        uint256 amountInWithFee = amountIn * f;
        uint256 numerator = amountInWithFee * reserveOut;
        uint256 denominator = reserveIn * 1e18 + amountInWithFee;
        amountOut = numerator / denominator;
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint256 f) internal pure returns (uint amountIn) {
        uint numerator = reserveIn * amountOut * 1e18;
        uint denominator = (reserveOut - amountOut) * f;
        amountIn = numerator / denominator + 1;
    }

    // calculate how many token needs to be swapped when minting/burning
    function swapPartialHelper(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, uint256 f) internal pure returns (uint256 x) {
        uint256 r = amountIn * 4 * reserveIn * f / 1e18; //prevent stack too deep
        x = (reserveOut - amountIn) * f / 1e18 + reserveIn; // (reserveOut - a) * fee + reserveIn
        x = sqrt(x * x + r) - x;
        x = x * 1e18 / f / 2;
    }

    // 1 - swap fee (numerator, in 1e18 format)
    function fee() public virtual view returns (uint256) {
        uint256 time = _blockTimestamp();
        uint256 _fee;
        if(time < closeTime) {
            _fee = minFee + (
                (time - openTime) * (maxFee - minFee) / (closeTime - openTime)
            );
        }
        else {
            _fee = maxFee;
        }
        return 1e18 - _fee;
    }

    /***********************************|
    |          mint/burn token          |
    |__________________________________*/

    // pay `amount` baseToken, get the same amount of a and b
    function mint(uint256 amount) external {
        require(canBuy, "cannot buy");
        a.mint(_msgSender(), amount);
        b.mint(_msgSender(), amount);
        doTransferIn(baseToken, _msgSender(), amount);
    }

    // burn `amount` of a and b, get `amount` baseToken 
    function burn(uint256 amount) external {
        require(canBuy, "cannot buy");
        a.burn(_msgSender(), amount);
        b.burn(_msgSender(), amount);
        doTransferOut(baseToken, _msgSender(), amount);
    }

    // pay `amount` baseToken, get more than `min_a` of a
    function mintA(uint256 amount, uint256 min_a) external returns (uint256 _a) {
        require(canBuy, "cannot buy");
        _a = getAmountOut(amount, poolB, poolA, fee());
        poolB = poolB + amount;
        poolA = poolA - _a;
        emit Swap(_msgSender(), false, amount, _a);
        _a = _a + amount;
        require(_a >= min_a, "SLIPPAGE_DETECTED");
        a.mint(_msgSender(), _a);
        doTransferIn(baseToken, _msgSender(), amount);
    }

    // mint `_a` of a, pay no more than `max_amount` of baseToken
    function mintExactA(uint256 _a, uint256 max_amount) external returns (uint256 amount) {
        require(canBuy, "cannot buy");
        amount = swapPartialHelper(_a, poolB, poolA, fee());
        require(amount <= max_amount, "SLIPPAGE_DETECTED");
        // y = _a - amount
        uint256 y = _a - amount;
        // A = A - y
        // B = B + amount
        poolA = poolA - y;
        poolB = poolB + amount;
        a.mint(_msgSender(), _a);
        emit Swap(_msgSender(), false, amount, y);
        doTransferIn(baseToken, _msgSender(), amount);
    }

    // burn `_a` of a, receive more than `min_amount` of baseToken
    function burnA(uint256 _a, uint256 min_amount) external returns (uint256 amount) {
        require(canBuy, "cannot buy");
        // amount = _a - x
        uint256 x = swapPartialHelper(_a, poolA, poolB, fee());
        amount = _a - x;
        require(amount >= min_amount, "SLIPPAGE_DETECTED");
        
        // A = A + x
        // B = B - amount
        poolA = poolA + x;
        poolB = poolB - amount;
        a.burn(_msgSender(), _a);
        emit Swap(_msgSender(), true, x, amount);
        doTransferOut(baseToken, _msgSender(), amount);
    }

    // pay `amount` baseToken, get more than `min_b` of b
    function mintB(uint256 amount, uint256 min_b) external returns (uint256 _b) {
        require(canBuy, "cannot buy");
        _b = getAmountOut(amount, poolA, poolB, fee());
        poolA = poolA + amount;
        poolB = poolB - _b;
        emit Swap(_msgSender(), true, amount, _b);
        _b = _b + amount;
        require(_b >= min_b, "SLIPPAGE_DETECTED");
        b.mint(_msgSender(), _b);
        doTransferIn(baseToken, _msgSender(), amount);
    }

    // mint `_b` of b, pay no more than `max_amount` of baseToken
    function mintExactB(uint256 _b, uint256 max_amount) external returns (uint256 amount) {
        require(canBuy, "cannot buy");
        amount = swapPartialHelper(_b, poolA, poolB, fee());
        require(amount <= max_amount, "SLIPPAGE_DETECTED");
        // y = _b - amount
        uint256 y = _b - amount;
        // B = B - y
        // A = A + amount
        poolB = poolB - y;
        poolA = poolA + amount;
        b.mint(_msgSender(), _b);
        emit Swap(_msgSender(), true, amount, y);
        doTransferIn(baseToken, _msgSender(), amount);
    }

    // burn `b` of b, receive more than `min_amount` of baseToken
    function burnB(uint256 _b, uint256 min_amount) external returns (uint256 amount) {
        require(canBuy, "cannot buy");
        // amount = _b - x
        uint256 x = swapPartialHelper(_b, poolB, poolA, fee());
        amount = _b - x;
        require(amount >= min_amount, "SLIPPAGE_DETECTED");
        
        // B = B + x
        // A = A - amount
        poolB = poolB + x;
        poolA = poolA - amount;
        b.burn(_msgSender(), _b);
        emit Swap(_msgSender(), false, x, amount);
        doTransferOut(baseToken, _msgSender(), amount);
    }

    // pay `amount` baseToken, get more than `min_lp` liquidity provider share
    function mintLP(uint256 amount, uint256 min_lp) external returns (uint256 _lp) {
        require(canBuy, "cannot buy");
        // k = poolA * poolB
        // _lp = ( sqrt(_k)/sqrt(k) - 1 ) * LP
        uint256 k = sqrt(poolA * poolB);
        uint256 _k = sqrt((poolA + amount) * (poolB + amount));
        _lp = (_k * 1e18 / k - 1e18) * _totalSupply / 1e18;
        _lp = _lp * fee() / 1e18; //fee

        require(_lp >= min_lp, "SLIPPAGE_DETECTED");
        poolA = poolA + amount;
        poolB = poolB + amount;
        _mint(_msgSender(), _lp);
        doTransferIn(baseToken, _msgSender(), amount);
        emit AddLP(_msgSender(), amount, amount, _lp);
    }

    // burn `lp` of liquidity provider share, recieve more than `min_amount` of baseToken
    function burnLP(uint256 lp, uint256 min_amount) external returns (uint256 amount) {
        require(canBuy, "cannot buy");
        uint256 s = poolA + poolB;

        uint256 f = fee() * lp / _totalSupply;
        amount = poolA * poolB * 4 * f / 1e18;
        amount = amount * (2e18 - f) / 1e18;
        amount = sqrt(s * s - amount);
        amount = (s - amount) / 2;
        require(amount >= min_amount, "SLIPPAGE_DETECTED");
        poolA = poolA - amount;
        poolB = poolB - amount;
        _burn(_msgSender(), lp);
        doTransferOut(baseToken, _msgSender(), amount);
        emit RemoveLP(_msgSender(), amount, amount, lp);
    }

    /***********************************|
    |               swap                |
    |__________________________________*/

    function swapAtoB(uint256 _a, uint256 min_b) external returns (uint256 _b) {
        require(canBuy, "cannot buy");
        _b = getAmountOut(_a, poolA, poolB, fee());
        require(_b >= min_b, "SLIPPAGE_DETECTED");
        poolA = poolA + _a;
        poolB = poolB - _b;
        a.burn(_msgSender(), _a);
        b.mint(_msgSender(), _b);
        emit Swap(_msgSender(), true, _a, _b);
    }

    function swapBtoA(uint256 _b, uint256 min_a) external returns (uint256 _a) {
        require(canBuy, "cannot buy");
        _a = getAmountOut(_b, poolB, poolA, fee());
        require(_a >= min_a, "SLIPPAGE_DETECTED");
        poolB = poolB + _b;
        poolA = poolA - _a;
        b.burn(_msgSender(), _b);
        a.mint(_msgSender(), _a);
        emit Swap(_msgSender(), false, _b, _a);
    }


    /***********************************|
    |       add/remove liquidity        |
    |__________________________________*/

    // deposit `_a` of a and `_b` of b, get more than `min_lp` of liquidity provider share
    function depositLP(uint256 _a, uint256 _b, uint256 min_lp) external returns (uint256 _lp) {
        require(canBuy, "cannot buy");
        // k = poolA * poolB
        // _lp = ( sqrt(_k)/sqrt(k) - 1 ) * LP
        uint256 k = sqrt(poolA * poolB);
        uint256 _k = sqrt((poolA + _a) * (poolB + _b));
        _lp = (_k * 1e18 / k - 1e18) * _totalSupply / 1e18;
        _lp = _lp * fee() / 1e18; //fee

        require(_lp >= min_lp, "SLIPPAGE_DETECTED");
        poolA = poolA + _a;
        poolB = poolB + _b;
        a.burn(_msgSender(), _a);
        b.burn(_msgSender(), _b);
        _mint(_msgSender(), _lp);
        emit AddLP(_msgSender(), _a, _b, _lp);
    }

    // burn no more than `max_lp` of liquidity provider share, withdraw `_a` of a and `_b` of b
    function withdrawLP(uint256 _a, uint256 _b, uint256 max_lp) external returns (uint256 _lp) {
        require(canBuy, "cannot buy");
        // k = poolA * poolB
        // _lp = ( 1 - sqrt(_k)/sqrt(k) ) * LP
        uint256 k = sqrt(poolA * poolB);
        uint256 _k = sqrt((poolA - _a) * (poolB - _b));
        _lp = (1e18 - _k * 1e18 / k) * _totalSupply / 1e18;
        _lp = _lp * 1e18 / fee(); //fee

        require(_lp <= max_lp, "SLIPPAGE_DETECTED");
        poolA = poolA - _a;
        poolB = poolB - _b;
        a.mint(_msgSender(), _a);
        b.mint(_msgSender(), _b);
        _burn(_msgSender(), _lp);
        emit RemoveLP(_msgSender(), _a, _b, _lp);
    }


    /***********************************|
    |             settlement            |
    |__________________________________*/

    // can only call once after closeTime
    // settle bPrice
    function close() external virtual;

    // burn a, b, and lp and receive baseToken
    function claim() external returns (uint256 amount) {
        require(!canBuy, "Not yet");

        uint256 _lp = _balances[_msgSender()];
        uint256 _a = a.balanceOf(_msgSender());
        uint256 _b = b.balanceOf(_msgSender());

        a.burn(_msgSender(), _a);
        b.burn(_msgSender(), _b);

        if(_lp > 0) {
            uint256 __a = poolA * _lp / _totalSupply;
            uint256 __b = poolB * _lp / _totalSupply;

            poolA = poolA - __a;
            poolB = poolB - __b;
            _a = _a + __a;
            _b = _b + __b;
            _burn(_msgSender(), _lp);
            emit RemoveLP(_msgSender(), _a, _b, _lp);
        }

        amount = (_a * (1e18 - bPrice) + _b * bPrice) / 1e18;
        doTransferOut(baseToken, _msgSender(), amount);
    }


    /***********************************|
    |          helper function          |
    |__________________________________*/

    function doTransferIn(address tokenAddr, address from, uint amount) internal {
        IERC20 token = IERC20(tokenAddr);
        token.safeTransferFrom(from, address(this), amount);

        emit Mint(from, amount);
    }

    function doTransferOut(address tokenAddr, address to, uint amount) internal {
        uint256 _fee = amount * protocolFee / 1e18;

        IERC20 token = IERC20(tokenAddr);
        token.safeTransfer(to, amount - _fee);
        token.safeTransfer(treasury, _fee);

        emit Burn(to, amount);
    }

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"a","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"b","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lp","type":"uint256"}],"name":"AddLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"a","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"b","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lp","type":"uint256"}],"name":"RemoveLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bool","name":"a2b","type":"bool"},{"indexed":false,"internalType":"uint256","name":"input","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"output","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AAVE","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Factory","outputs":[{"internalType":"contract TokenFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a","outputs":[{"internalType":"contract ERC20Mintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"b","outputs":[{"internalType":"contract ERC20Mintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"min_amount","type":"uint256"}],"name":"burnA","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_b","type":"uint256"},{"internalType":"uint256","name":"min_amount","type":"uint256"}],"name":"burnB","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lp","type":"uint256"},{"internalType":"uint256","name":"min_amount","type":"uint256"}],"name":"burnLP","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"_b","type":"uint256"},{"internalType":"uint256","name":"min_lp","type":"uint256"}],"name":"depositLP","outputs":[{"internalType":"uint256","name":"_lp","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_lendingPool","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"string","name":"_batchName","type":"string"},{"internalType":"uint256","name":"_leverage","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"_b","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"min_a","type":"uint256"}],"name":"mintA","outputs":[{"internalType":"uint256","name":"_a","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"min_b","type":"uint256"}],"name":"mintB","outputs":[{"internalType":"uint256","name":"_b","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"max_amount","type":"uint256"}],"name":"mintExactA","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_b","type":"uint256"},{"internalType":"uint256","name":"max_amount","type":"uint256"}],"name":"mintExactB","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"min_lp","type":"uint256"}],"name":"mintLP","outputs":[{"internalType":"uint256","name":"_lp","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"min_b","type":"uint256"}],"name":"swapAtoB","outputs":[{"internalType":"uint256","name":"_b","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_b","type":"uint256"},{"internalType":"uint256","name":"min_a","type":"uint256"}],"name":"swapBtoA","outputs":[{"internalType":"uint256","name":"_a","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"_b","type":"uint256"},{"internalType":"uint256","name":"max_lp","type":"uint256"}],"name":"withdrawLP","outputs":[{"internalType":"uint256","name":"_lp","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50614c3f806100206000396000f3fe608060405234801561001057600080fd5b506004361061030a5760003560e01c80636dc5e6f31161019c578063b4256888116100ee578063d4aaa76811610097578063f0b456e911610071578063f0b456e9146106b4578063faf786e9146106c7578063ff65226c146106da57600080fd5b8063d4aaa76814610653578063dd62ed3e14610666578063ddca3f43146106ac57600080fd5b8063c83dd231116100c8578063c83dd23114610626578063cbbf425f14610641578063d4a2aa331461064a57600080fd5b8063b4256888146105f4578063c505ebce146105fd578063c55dae631461060657600080fd5b806395d89b4111610150578063a0712d681161012a578063a0712d68146105c0578063a9059cbb146105d3578063b0e21e8a146105e657600080fd5b806395d89b411461059c5780639843b4e9146105a45780639e51051f146105b757600080fd5b80637a432893116101815780637a432893146105635780637a828150146105765780638494869a1461058957600080fd5b80636dc5e6f31461051a57806370a082311461052d57600080fd5b80634242ec52116102605780634fd491ad11610209578063627749e6116101e3578063627749e6146104eb57806362850572146104f4578063674f067e1461050757600080fd5b80634fd491ad1461049f5780635d34d98e146104b257806361d027b3146104c557600080fd5b806348ccda3c1161023a57806348ccda3c146104575780634df7e3d0146104775780634e71d92d1461049757600080fd5b80634242ec521461042757806342966c681461043a57806343d726d61461044f57600080fd5b80631b42df33116102c25780632c86d98e1161029c5780632c86d98e146103df578063313ce567146103e857806338d52e0f1461040757600080fd5b80631b42df33146103b557806323b872dd146103be57806324ec7590146103d157600080fd5b8063095ea7b3116102f3578063095ea7b3146103455780630dbe671f1461036857806318160ddd146103ad57600080fd5b806301f59d161461030f57806306fdde0314610330575b600080fd5b61031d666a94d74f43000081565b6040519081526020015b60405180910390f35b6103386106ec565b6040516103279190614a7e565b61035861035336600461475a565b61077a565b6040519015158152602001610327565b6007546103889073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610327565b60025461031d565b61031d600b5481565b6103586103cc366004614719565b610791565b61031d660aa87bee53800081565b61031d60125481565b6005546103f59060ff1681565b60405160ff9091168152602001610327565b600f546103889073ffffffffffffffffffffffffffffffffffffffff1681565b61031d6104353660046147da565b61087e565b61044d6104483660046147a8565b610b4a565b005b61044d610d2d565b600e546103889073ffffffffffffffffffffffffffffffffffffffff1681565b6008546103889073ffffffffffffffffffffffffffffffffffffffff1681565b61031d610f6a565b61031d6104ad3660046147fc565b6113ed565b61031d6104c03660046147da565b611756565b6005546103889062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b61031d600a5481565b61044d610502366004614638565b6119af565b61031d6105153660046147da565b611b4d565b61031d6105283660046147da565b611d9b565b61031d61053b3660046145c5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61031d6105713660046147da565b611f6c565b61031d6105843660046147da565b6121bb565b61031d6105973660046147fc565b6123df565b610338612728565b61031d6105b23660046147da565b612735565b61031d60105481565b61044d6105ce3660046147a8565b612906565b6103586105e136600461475a565b612ae6565b61031d662386f26fc1000081565b61031d60095481565b61031d60115481565b6006546103889073ffffffffffffffffffffffffffffffffffffffff1681565b6103887347ca2166a5b837e891e6e64e780d1b43fc0a4e9581565b61031d600c5481565b61031d600d5481565b61031d6106613660046147da565b612af3565b61031d6106743660046145ff565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61031d612d1c565b61031d6106c23660046147da565b612db2565b61031d6106d53660046147da565b61301b565b60055461035890610100900460ff1681565b600380546106f990614b64565b80601f016020809104026020016040519081016040528092919081815260200182805461072590614b64565b80156107725780601f1061074757610100808354040283529160200191610772565b820191906000526020600020905b81548152906001019060200180831161075557829003601f168201915b505050505081565b600061078733848461319d565b5060015b92915050565b600061079e848484613351565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832033845290915290205482811015610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610871853385840361319d565b60019150505b9392505050565b600554600090610100900460ff166108f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b61090983600d54600c54610904612d1c565b6134bf565b905081811015610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b82600d546109839190614a91565b600d55600c54610994908290614b21565b600c5560085473ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101869052604401600060405180830381600087803b158015610a2357600080fd5b505af1158015610a37573d6000803e3d6000fd5b505060075473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015610ac957600080fd5b505af1158015610add573d6000803e3d6000fd5b5050505060001515610aec3390565b73ffffffffffffffffffffffffffffffffffffffff167fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd8584604051610b3c929190918252602082015260400190565b60405180910390a392915050565b600554610100900460ff16610bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b60075473ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015610c4757600080fd5b505af1158015610c5b573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff169150639dc29fac9050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015610ced57600080fd5b505af1158015610d01573d6000803e3d6000fd5b5050600654610d2a925073ffffffffffffffffffffffffffffffffffffffff1690503383613513565b50565b600a54421015610d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4e6f742079657400000000000000000000000000000000000000000000000000604482015260640161085b565b600554610100900460ff16610e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f436c6f7365640000000000000000000000000000000000000000000000000000604482015260640161085b565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055600e54600f546040517f386497fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291169063386497fd9060240160206040518083038186803b158015610e9f57600080fd5b505afa158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed791906147c1565b60118190556010541115610eec576010546011555b6000601054601054601154610f019190614b21565b610f1390670de0b6b3a7640000614ae4565b610f1d9190614aa9565b90506000670de0b6b3a764000060125483610f389190614ae4565b610f429190614aa9565b9050670de0b6b3a76400008111610f595780610f63565b670de0b6b3a76400005b600b555050565b600554600090610100900460ff1615610fdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f4e6f742079657400000000000000000000000000000000000000000000000000604482015260640161085b565b336000818152602081815260408083205460075482517f70a0823100000000000000000000000000000000000000000000000000000000815260048101969096529151909473ffffffffffffffffffffffffffffffffffffffff909216926370a082319260248082019391829003018186803b15801561105e57600080fd5b505afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906147c1565b60085490915060009073ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160206040518083038186803b15801561111f57600080fd5b505afa158015611133573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115791906147c1565b60075490915073ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101859052604401600060405180830381600087803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff169150639dc29fac9050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b50505050600083111561137657600060025484600c546112c09190614ae4565b6112ca9190614aa9565b9050600060025485600d546112df9190614ae4565b6112e99190614aa9565b905081600c546112f99190614b21565b600c55600d5461130a908290614b21565b600d556113178285614a91565b93506113238184614a91565b9250611330335b866135ec565b6040805185815260208101859052808201879052905133917f64e9ad70b8b5b9b741cb44e0d8704dabd07a6ac969de1ecabb3b2c7b3cb27792919081900360600190a250505b670de0b6b3a7640000600b548261138d9190614ae4565b600b546113a290670de0b6b3a7640000614b21565b6113ac9085614ae4565b6113b69190614a91565b6113c09190614aa9565b6006549094506113e79073ffffffffffffffffffffffffffffffffffffffff163386613513565b50505090565b600554600090610100900460ff16611461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b600061147b600d54600c546114769190614ae4565b61372e565b905060006114a885600d546114909190614b21565b87600c5461149e9190614b21565b6114769190614ae4565b9050670de0b6b3a76400006002548383670de0b6b3a76400006114cb9190614ae4565b6114d59190614aa9565b6114e790670de0b6b3a7640000614b21565b6114f19190614ae4565b6114fb9190614aa9565b9250611505612d1c565b61151784670de0b6b3a7640000614ae4565b6115219190614aa9565b92508383111561158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b85600c5461159b9190614b21565b600c55600d546115ac908690614b21565b600d5560075473ffffffffffffffffffffffffffffffffffffffff166340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101899052604401600060405180830381600087803b15801561163b57600080fd5b505af115801561164f573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101889052604401600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505050506117096117033390565b846135ec565b604080518781526020810187905290810184905233907f64e9ad70b8b5b9b741cb44e0d8704dabd07a6ac969de1ecabb3b2c7b3cb27792906060015b60405180910390a250509392505050565b600554600090610100900460ff166117ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b60006117e384600c54600d546117de612d1c565b613769565b90506117ef8185614b21565b91508282101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b80600c546118699190614a91565b600c55600d5461187a908390614b21565b600d5560075473ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101879052604401600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b505050506001151561192c3390565b73ffffffffffffffffffffffffffffffffffffffff167fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd838560405161197c929190918252602082015260400190565b60405180910390a36006546119a89073ffffffffffffffffffffffffffffffffffffffff163384613513565b5092915050565b6119f58a8888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925088915087905061382f565b600e805473ffffffffffffffffffffffffffffffffffffffff8b81167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600f8054918c1691909216811790915560128690556040517f386497fd000000000000000000000000000000000000000000000000000000008152600481019190915263386497fd9060240160206040518083038186803b158015611a9e57600080fd5b505afa158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad691906147c1565b6010819055611b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e697469616c52617465203d20300000000000000000000000000000000000604482015260640161085b565b50505050505050505050565b600554600090610100900460ff16611bc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b611bd383600c54600d546117de612d1c565b905081811115611c3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b6000611c4b8285614b21565b905080600d54611c5b9190614b21565b600d55600c54611c6c908390614a91565b600c5560085473ffffffffffffffffffffffffffffffffffffffff166340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101879052604401600060405180830381600087803b158015611cfb57600080fd5b505af1158015611d0f573d6000803e3d6000fd5b5050505060011515611d1e3390565b73ffffffffffffffffffffffffffffffffffffffff167fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd8484604051611d6e929190918252602082015260400190565b60405180910390a36006546119a89073ffffffffffffffffffffffffffffffffffffffff16335b84613fdd565b600554600090610100900460ff16611e0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b611e2183600d54600c546117de612d1c565b905081811115611e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b6000611e998285614b21565b905080600c54611ea99190614b21565b600c55600d54611eba908390614a91565b600d5560075473ffffffffffffffffffffffffffffffffffffffff166340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101879052604401600060405180830381600087803b158015611f4957600080fd5b505af1158015611f5d573d6000803e3d6000fd5b5050505060001515611d1e3390565b600554600090610100900460ff16611fe0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b6000600d54600c54611ff29190614a91565b9050600060025485612002612d1c565b61200c9190614ae4565b6120169190614aa9565b9050670de0b6b3a764000081600d54600c546120329190614ae4565b61203d906004614ae4565b6120479190614ae4565b6120519190614aa9565b9250670de0b6b3a764000061206e82671bc16d674ec80000614b21565b6120789085614ae4565b6120829190614aa9565b925061209c836120928480614ae4565b6114769190614b21565b925060026120aa8484614b21565b6120b49190614aa9565b925083831015612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b82600c5461212e9190614b21565b600c55600d5461213f908490614b21565b600d5561214b3361132a565b60065461216f9073ffffffffffffffffffffffffffffffffffffffff163385613513565b604080518481526020810185905290810186905233907f64e9ad70b8b5b9b741cb44e0d8704dabd07a6ac969de1ecabb3b2c7b3cb27792906060015b60405180910390a2505092915050565b600554600090610100900460ff1661222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b6000612244600d54600c546114769190614ae4565b9050600061226785600d546122599190614a91565b86600c5461149e9190614a91565b9050670de0b6b3a7640000600254670de0b6b3a76400008484670de0b6b3a76400006122939190614ae4565b61229d9190614aa9565b6122a79190614b21565b6122b19190614ae4565b6122bb9190614aa9565b9250670de0b6b3a76400006122ce612d1c565b6122d89085614ae4565b6122e29190614aa9565b92508383101561234e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b84600c5461235c9190614a91565b600c55600d5461236d908690614a91565b600d5561237b335b84614056565b60065461239f9073ffffffffffffffffffffffffffffffffffffffff163387613fdd565b604080518681526020810187905290810184905233907fcd72d8b11499cadb9f50d840339edde25153c6c4dc970fc7942cbba89ec58e96906060016121ab565b600554600090610100900460ff16612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b6000612468600d54600c546114769190614ae4565b9050600061248b85600d5461247d9190614a91565b87600c5461149e9190614a91565b9050670de0b6b3a7640000600254670de0b6b3a76400008484670de0b6b3a76400006124b79190614ae4565b6124c19190614aa9565b6124cb9190614b21565b6124d59190614ae4565b6124df9190614aa9565b9250670de0b6b3a76400006124f2612d1c565b6124fc9085614ae4565b6125069190614aa9565b925083831015612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b85600c546125809190614a91565b600c55600d54612591908690614a91565b600d5560075473ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101899052604401600060405180830381600087803b15801561262057600080fd5b505af1158015612634573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff169150639dc29fac9050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101889052604401600060405180830381600087803b1580156126c657600080fd5b505af11580156126da573d6000803e3d6000fd5b505050506126e86123753390565b604080518781526020810187905290810184905233907fcd72d8b11499cadb9f50d840339edde25153c6c4dc970fc7942cbba89ec58e9690606001611745565b600480546106f990614b64565b600554600090610100900460ff166127a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b60006127bd84600d54600c546117de612d1c565b90506127c98185614b21565b915082821015612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b80600d546128439190614a91565b600d55600c54612854908390614b21565b600c5560085473ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101879052604401600060405180830381600087803b1580156128e357600080fd5b505af11580156128f7573d6000803e3d6000fd5b505050506000151561192c3390565b600554610100900460ff16612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b60075473ffffffffffffffffffffffffffffffffffffffff166340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612a0357600080fd5b505af1158015612a17573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612aa957600080fd5b505af1158015612abd573d6000803e3d6000fd5b5050600654610d2a925073ffffffffffffffffffffffffffffffffffffffff1690503383613fdd565b6000610787338484613351565b600554600090610100900460ff16612b67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b612b7983600d54600c54610904612d1c565b905082600d54612b899190614a91565b600d55600c54612b9a908290614b21565b600c55604080518481526020810183905260009133917fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd910160405180910390a3612be58382614a91565b905081811015612c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b60075473ffffffffffffffffffffffffffffffffffffffff166340c10f19335b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612cde57600080fd5b505af1158015612cf2573d6000803e3d6000fd5b505060065461078b925073ffffffffffffffffffffffffffffffffffffffff169050335b85613fdd565b6000804290506000600a54821015612d8f57600954600a54612d3e9190614b21565b612d56660aa87bee538000666a94d74f430000614b21565b600954612d639085614b21565b612d6d9190614ae4565b612d779190614aa9565b612d8890666a94d74f430000614b21565b9050612d99565b50660aa87bee5380005b612dab81670de0b6b3a7640000614b21565b9250505090565b600554600090610100900460ff16612e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b612e3883600c54600d54610904612d1c565b905081811015612ea4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b82600c54612eb29190614a91565b600c55600d54612ec3908290614b21565b600d5560075473ffffffffffffffffffffffffffffffffffffffff16639dc29fac336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101869052604401600060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612ff857600080fd5b505af115801561300c573d6000803e3d6000fd5b5050505060011515610aec3390565b600554600090610100900460ff1661308f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f63616e6e6f742062757900000000000000000000000000000000000000000000604482015260640161085b565b6130a183600c54600d54610904612d1c565b905082600c546130b19190614a91565b600c55600d546130c2908290614b21565b600d55604080518481526020810183905260019133917fbfd50a04f1e6e4aee344f5d0e7f15d74d0dbb58cd1f711daa6463094ca9508cd910160405180910390a361310d8382614a91565b905081811015613179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f534c4950504147455f4445544543544544000000000000000000000000000000604482015260640161085b565b60085473ffffffffffffffffffffffffffffffffffffffff166340c10f1933612c71565b73ffffffffffffffffffffffffffffffffffffffff831661323f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161085b565b73ffffffffffffffffffffffffffffffffffffffff82166132e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161085b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015613407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161085b565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822085850390559185168152908120805484929061344b908490614a91565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134b191815260200190565b60405180910390a350505050565b6000806134cc8387614ae4565b905060006134da8583614ae4565b90506000826134f188670de0b6b3a7640000614ae4565b6134fb9190614a91565b90506135078183614aa9565b98975050505050505050565b6000670de0b6b3a764000061352f662386f26fc1000084614ae4565b6135399190614aa9565b9050836135688461354a8486614b21565b73ffffffffffffffffffffffffffffffffffffffff841691906140f9565b6005546135959073ffffffffffffffffffffffffffffffffffffffff8381169162010000900416846140f9565b8373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5846040516135dd91815260200190565b60405180910390a25050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161085b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906136de908490614b21565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613344565b6000600282901c825b8082101561087757508060028161374e8187614aa9565b6137589190614a91565b6137629190614aa9565b9150613737565b600080670de0b6b3a76400008386613782896004614ae4565b61378c9190614ae4565b6137969190614ae4565b6137a09190614aa9565b905084670de0b6b3a7640000846137b78988614b21565b6137c19190614ae4565b6137cb9190614aa9565b6137d59190614a91565b9150816137f0826137e68380614ae4565b6114769190614a91565b6137fa9190614b21565b915060028361381184670de0b6b3a7640000614ae4565b61381b9190614aa9565b6138259190614aa9565b9695505050505050565b60095415613899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f496e697469616c697a6564000000000000000000000000000000000000000000604482015260640161085b565b6000821180156138a95750600081115b61390f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f20696e697469616c206c6971756964697479000000000000000000000000604482015260640161085b565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155600580547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100009288169290920291909117905542600955824261399b9190614a91565b600a55600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556040516139db9085906020016149e3565b604051602081830303815290604052600390805190602001906139ff92919061452c565b5083604051602001613a1191906148b1565b60405160208183030381529060405260049080519060200190613a3592919061452c565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613a9e57600080fd5b505afa158015613ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad69190614828565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790556040517347ca2166a5b837e891e6e64e780d1b43fc0a4e959063a68c79a1903090613b37908890602001614973565b60405160208183030381529060405287604051602001613b5791906149ab565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526005547fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168352613bc694939260ff90911690600401614a28565b602060405180830381600087803b158015613be057600080fd5b505af1158015613bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1891906145e2565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556040517347ca2166a5b837e891e6e64e780d1b43fc0a4e959063a68c79a1903090613c8c90889060200161492e565b60405160208183030381529060405287604051602001613cac91906148f6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526005547fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168352613d1b94939260ff90911690600401614a28565b602060405180830381600087803b158015613d3557600080fd5b505af1158015613d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6d91906145e2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556000613dc16114768385614ae4565b600c849055600d8390559050613dd73382614056565b613de460006103e8614056565b82821115613ec15760075473ffffffffffffffffffffffffffffffffffffffff166340c10f1933613e158686614b21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613e8057600080fd5b505af1158015613e94573d6000803e3d6000fd5b5050600654613ebc925073ffffffffffffffffffffffffffffffffffffffff16905033611d95565b613f91565b60085473ffffffffffffffffffffffffffffffffffffffff166340c10f1933613eea8587614b21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613f5557600080fd5b505af1158015613f69573d6000803e3d6000fd5b5050600654613f91925073ffffffffffffffffffffffffffffffffffffffff16905033612d16565b6040805184815260208101849052808201839052905133917fcd72d8b11499cadb9f50d840339edde25153c6c4dc970fc7942cbba89ec58e96919081900360600190a250505050505050565b8261400073ffffffffffffffffffffffffffffffffffffffff82168430856141d2565b8273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858360405161404891815260200190565b60405180910390a250505050565b80600260008282546140689190614a91565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040812080548392906140a2908490614a91565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526141cd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614236565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526142309085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161414b565b50505050565b6000614298826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143429092919063ffffffff16565b8051909150156141cd57808060200190518101906142b69190614786565b6141cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161085b565b60606143518484600085614359565b949350505050565b6060824710156143eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161085b565b843b614453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161085b565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161447c9190614895565b60006040518083038185875af1925050503d80600081146144b9576040519150601f19603f3d011682016040523d82523d6000602084013e6144be565b606091505b50915091506144ce8282866144d9565b979650505050505050565b606083156144e8575081610877565b8251156144f85782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b9190614a7e565b82805461453890614b64565b90600052602060002090601f01602090048101928261455a57600085556145a0565b82601f1061457357805160ff19168380011785556145a0565b828001600101855582156145a0579182015b828111156145a0578251825591602001919060010190614585565b506145ac9291506145b0565b5090565b5b808211156145ac57600081556001016145b1565b6000602082840312156145d757600080fd5b813561087781614be7565b6000602082840312156145f457600080fd5b815161087781614be7565b6000806040838503121561461257600080fd5b823561461d81614be7565b9150602083013561462d81614be7565b809150509250929050565b6000806000806000806000806000806101208b8d03121561465857600080fd5b8a3561466381614be7565b995060208b013561467381614be7565b985060408b013561468381614be7565b975060608b013561469381614be7565b965060808b013567ffffffffffffffff808211156146b057600080fd5b818d0191508d601f8301126146c457600080fd5b8135818111156146d357600080fd5b8e60208285010111156146e557600080fd5b9b9e9a9d50989b979a6020919091019990985060a08801359760c0810135975060e081013596506101000135945092505050565b60008060006060848603121561472e57600080fd5b833561473981614be7565b9250602084013561474981614be7565b929592945050506040919091013590565b6000806040838503121561476d57600080fd5b823561477881614be7565b946020939093013593505050565b60006020828403121561479857600080fd5b8151801515811461087757600080fd5b6000602082840312156147ba57600080fd5b5035919050565b6000602082840312156147d357600080fd5b5051919050565b600080604083850312156147ed57600080fd5b50508035926020909101359150565b60008060006060848603121561481157600080fd5b505081359360208301359350604090920135919050565b60006020828403121561483a57600080fd5b815160ff8116811461087757600080fd5b60008151808452614863816020860160208601614b38565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516148a7818460208701614b38565b9190910192915050565b7f69474c50200000000000000000000000000000000000000000000000000000008152600082516148e9816005850160208701614b38565b9190910160050192915050565b7f69472d42200000000000000000000000000000000000000000000000000000008152600082516148e9816005850160208701614b38565b7f694761696e204220746f6b656e2000000000000000000000000000000000000081526000825161496681600e850160208701614b38565b91909101600e0192915050565b7f694761696e204120746f6b656e2000000000000000000000000000000000000081526000825161496681600e850160208701614b38565b7f69472d41200000000000000000000000000000000000000000000000000000008152600082516148e9816005850160208701614b38565b7f694761696e204c5020746f6b656e200000000000000000000000000000000000815260008251614a1b81600f850160208701614b38565b91909101600f0192915050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000614a57608083018661484b565b8281036040840152614a69818661484b565b91505060ff8316606083015295945050505050565b602081526000610877602083018461484b565b60008219821115614aa457614aa4614bb8565b500190565b600082614adf577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b1c57614b1c614bb8565b500290565b600082821015614b3357614b33614bb8565b500390565b60005b83811015614b53578181015183820152602001614b3b565b838111156142305750506000910152565b600181811c90821680614b7857607f821691505b60208210811415614bb2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610d2a57600080fdfea2646970667358221220c12babf8e98e76b8e589bc44270e30ae8a73b53a311225783d60019b29ec13db64736f6c63430008070033

Deployed ByteCode Sourcemap

294:1660:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21330:40:1;;21363:7;21330:40;;;;;16266:25:2;;;16254:2;16239:18;21330:40:1;;;;;;;;15251:18;;;:::i;:::-;;;;;;;:::i;16392:166::-;;;;;;:::i;:::-;;:::i;:::-;;;9523:14:2;;9516:22;9498:41;;9486:2;9471:18;16392:166:1;9358:187:2;21115:22:1;;;;;;;;;;;;8010:42:2;7998:55;;;7980:74;;7968:2;7953:18;21115:22:1;7834:226:2;15383:106:1;15470:12;;15383:106;;21434:21;;;;;;17025:478;;;;;;:::i;:::-;;:::i;21283:41::-;;21316:8;21283:41;;503:23:0;;;;;;15301:21:1;;;;;;;;;;;;17051:4:2;17039:17;;;17021:36;;17009:2;16994:18;15301:21:1;16879:184:2;386:20:0;;;;;;;;;31414:396:1;;;;;;:::i;:::-;;:::i;25605:217::-;;;;;;:::i;:::-;;:::i;:::-;;1456:495:0;;;:::i;336:24::-;;;;;;;;;21143:22:1;;;;;;;;;33761:781;;;:::i;32805:672::-;;;;;;:::i;:::-;;:::i;27046:558::-;;;;;;:::i;:::-;;:::i;20953:23::-;;;;;;;;;;;;21201:24;;;;;;544:482:0;;;;;;:::i;:::-;;:::i;28195:558:1:-;;;;;;:::i;:::-;;:::i;26414:559::-;;;;;;:::i;:::-;;:::i;15547:125::-;;;;;;:::i;:::-;15647:18;;15621:7;15647:18;;;;;;;;;;;;15547:125;30233:647;;;;;;:::i;:::-;;:::i;29469:668::-;;;;;;:::i;:::-;;:::i;32035:::-;;;;;;:::i;:::-;;:::i;15275:20::-;;;:::i;28825:559::-;;;;;;:::i;:::-;;:::i;443:26:0:-;;;;;;25326:216:1;;;;;;:::i;:::-;;:::i;15875:172::-;;;;;;:::i;:::-;;:::i;21232:45::-;;21270:7;21232:45;;21172:23;;;;;;475:22:0;;;;;;20982:24:1;;;;;;;;;21013:95;;21065:42;21013:95;;21462:20;;;;;;21488;;;;;;25886:456;;;;;;:::i;:::-;;:::i;16105:149::-;;;;;;:::i;:::-;16220:18;;;;16194:7;16220:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16105:149;1080:370:0;;;:::i;31013:395:1:-;;;;;;:::i;:::-;;:::i;27668:455::-;;;;;;:::i;:::-;;:::i;20928:18::-;;;;;;;;;;;;15251;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16392:166::-;16475:4;16491:39;665:10;16514:7;16523:6;16491:8;:39::i;:::-;-1:-1:-1;16547:4:1;16392:166;;;;;:::o;17025:478::-;17161:4;17177:36;17187:6;17195:9;17206:6;17177:9;:36::i;:::-;17251:19;;;17224:24;17251:19;;;:11;:19;;;;;;;;665:10;17251:33;;;;;;;;17302:26;;;;17294:79;;;;;;;13367:2:2;17294:79:1;;;13349:21:2;13406:2;13386:18;;;13379:30;13445:34;13425:18;;;13418:62;13516:10;13496:18;;;13489:38;13544:19;;17294:79:1;;;;;;;;;17407:57;17416:6;665:10;17457:6;17438:16;:25;17407:8;:57::i;:::-;17492:4;17485:11;;;17025:478;;;;;;:::o;31414:396::-;31507:6;;31477:10;;31507:6;;;;;31499:29;;;;;;;13776:2:2;31499:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;31499:29:1;13574:334:2;31499:29:1;31543:37;31556:2;31560:5;;31567;;31574;:3;:5::i;:::-;31543:12;:37::i;:::-;31538:42;;31604:5;31598:2;:11;;31590:41;;;;;;;13021:2:2;31590:41:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;31590:41:1;12819:341:2;31590:41:1;31657:2;31649:5;;:10;;;;:::i;:::-;31641:5;:18;31677:5;;:10;;31685:2;;31677:10;:::i;:::-;31669:5;:18;31697:1;;;;:6;665:10;31697:24;;;;;;;;;;9260:42:2;9248:55;;;31697:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;31697:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31731:1:1;;;;;-1:-1:-1;31731:6:1;;-1:-1:-1;665:10:1;31731:24;;;;;;;;;;9260:42:2;9248:55;;;31731:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;31731:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:5;31770:33;;31775:12;665:10;;586:96;31775:12;31770:33;;;31796:2;31800;31770:33;;;;;;16476:25:2;;;16532:2;16517:18;;16510:34;16464:2;16449:18;;16302:248;31770:33:1;;;;;;;;31414:396;;;;:::o;25605:217::-;25662:6;;;;;;;25654:29;;;;;;;13776:2:2;25654:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;25654:29:1;13574:334:2;25654:29:1;25693:1;;;;:6;665:10;25693:28;;;;;;;;;;9260:42:2;9248:55;;;25693:28:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;25693:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25731:1:1;;;;;-1:-1:-1;25731:6:1;;-1:-1:-1;665:10:1;25731:28;;;;;;;;;;9260:42:2;9248:55;;;25731:28:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;25731:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25783:9:1;;25769:46;;-1:-1:-1;25783:9:1;;;-1:-1:-1;665:10:1;25808:6;25769:13;:46::i;:::-;25605:217;:::o;1456:495:0:-;1530:9;;20815:15:1;1509:30:0;;1501:50;;;;;;;11872:2:2;1501:50:0;;;11854:21:2;11911:1;11891:18;;;11884:29;11949:9;11929:18;;;11922:37;11976:18;;1501:50:0;11670:330:2;1501:50:0;1569:6;;;;;;;1561:25;;;;;;;11135:2:2;1561:25:0;;;11117:21:2;11174:1;11154:18;;;11147:29;11212:8;11192:18;;;11185:36;11238:18;;1561:25:0;10933:329:2;1561:25:0;1596:6;:14;;;;;;1630:4;;1668:5;;1630:44;;;;;:4;1668:5;;;1630:44;;;7980:74:2;1630:4:0;;;:37;;7953:18:2;;1630:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1620:7;:54;;;1699:11;;-1:-1:-1;1685:48:0;;;1722:11;;1712:7;:21;1685:48;1771:13;1820:11;;1798;;1788:7;;:21;;;;:::i;:::-;1787:30;;1813:4;1787:30;:::i;:::-;:44;;;;:::i;:::-;1771:60;;1841:15;1878:4;1867:8;;1859:5;:16;;;;:::i;:::-;:23;;;;:::i;:::-;1841:41;;1923:4;1913:7;:14;:31;;1937:7;1913:31;;;1930:4;1913:31;1904:6;:40;-1:-1:-1;;1456:495:0:o;33761:781:1:-;33831:6;;33796:14;;33831:6;;;;;33830:7;33822:27;;;;;;;11872:2:2;33822:27:1;;;11854:21:2;11911:1;11891:18;;;11884:29;11949:9;11929:18;;;11922:37;11976:18;;33822:27:1;11670:330:2;33822:27:1;665:10;33860:11;33874:23;;;;;;;;;;;;33920:1;;:25;;;;;;;;7980:74:2;;;;33920:25:1;;33874:23;;;33920:1;;;;:11;;7953:18:2;;;;;33920:25:1;;;;;;:1;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33968:1;;33907:38;;-1:-1:-1;33955:10:1;;33968:1;;:11;665:10;33968:25;;;;;;;;;;8010:42:2;7998:55;;;33968:25:1;;;7980:74:2;7953:18;;33968:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34004:1;;33955:38;;-1:-1:-1;34004:1:1;;:6;665:10;34004:24;;;;;;;;;;9260:42:2;9248:55;;;34004:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;34004:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34038:1:1;;;;;-1:-1:-1;34038:6:1;;-1:-1:-1;665:10:1;34038:24;;;;;;;;;;9260:42:2;9248:55;;;34038:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;34038:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34082:1;34076:3;:7;34073:344;;;34099:11;34127:12;;34121:3;34113:5;;:11;;;;:::i;:::-;:26;;;;:::i;:::-;34099:40;;34153:11;34181:12;;34175:3;34167:5;;:11;;;;:::i;:::-;:26;;;;:::i;:::-;34153:40;;34224:3;34216:5;;:11;;;;:::i;:::-;34208:5;:19;34249:5;;:11;;34257:3;;34249:11;:::i;:::-;34241:5;:19;34279:8;34284:3;34279:2;:8;:::i;:::-;34274:13;-1:-1:-1;34306:8:1;34311:3;34306:2;:8;:::i;:::-;34301:13;-1:-1:-1;34328:24:1;665:10;34334:12;34348:3;34328:5;:24::i;:::-;34371:35;;;16757:25:2;;;16813:2;16798:18;;16791:34;;;16841:18;;;16834:34;;;34371:35:1;;665:10;;34371:35;;;;;;16745:2:2;34371:35:1;;;34085:332;;34073:344;34475:4;34465:6;;34460:2;:11;;;;:::i;:::-;34450:6;;34443:13;;:4;:13;:::i;:::-;34437:20;;:2;:20;:::i;:::-;:34;;;;:::i;:::-;34436:43;;;;:::i;:::-;34503:9;;34427:52;;-1:-1:-1;34489:46:1;;34503:9;;665:10;34528:6;34489:13;:46::i;:::-;33812:730;;;33761:781;:::o;32805:672::-;32914:6;;32883:11;;32914:6;;;;;32906:29;;;;;;;13776:2:2;32906:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;32906:29:1;13574:334:2;32906:29:1;33021:9;33033:19;33046:5;;33038;;:13;;;;:::i;:::-;33033:4;:19::i;:::-;33021:31;;33062:10;33075:33;33104:2;33096:5;;:10;;;;:::i;:::-;33089:2;33081:5;;:10;;;;:::i;:::-;33080:27;;;;:::i;33075:33::-;33062:46;;33164:4;33149:12;;33144:1;33132:2;33137:4;33132:9;;;;:::i;:::-;:13;;;;:::i;:::-;33125:20;;:4;:20;:::i;:::-;33124:37;;;;:::i;:::-;:44;;;;:::i;:::-;33118:50;;33197:5;:3;:5::i;:::-;33184:10;:3;33190:4;33184:10;:::i;:::-;:18;;;;:::i;:::-;33178:24;;33234:6;33227:3;:13;;33219:43;;;;;;;13021:2:2;33219:43:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;33219:43:1;12819:341:2;33219:43:1;33288:2;33280:5;;:10;;;;:::i;:::-;33272:5;:18;33308:5;;:10;;33316:2;;33308:10;:::i;:::-;33300:5;:18;33328:1;;;;:6;665:10;33328:24;;;;;;;;;;9260:42:2;9248:55;;;33328:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;33328:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33362:1:1;;;;;-1:-1:-1;33362:6:1;;-1:-1:-1;665:10:1;33362:24;;;;;;;;;;9260:42:2;9248:55;;;33362:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;33362:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33396;33402:12;665:10;;586:96;33402:12;33416:3;33396:5;:24::i;:::-;33435:35;;;16757:25:2;;;16813:2;16798:18;;16791:34;;;16841:18;;;16834:34;;;665:10:1;;33435:35;;16745:2:2;16730:18;33435:35:1;;;;;;;;32896:581;;32805:672;;;;;:::o;27046:558::-;27145:6;;27111:14;;27145:6;;;;;27137:29;;;;;;;13776:2:2;27137:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;27137:29:1;13574:334:2;27137:29:1;27203:9;27215:42;27233:2;27237:5;;27244;;27251;:3;:5::i;:::-;27215:17;:42::i;:::-;27203:54;-1:-1:-1;27276:6:1;27203:54;27276:2;:6;:::i;:::-;27267:15;;27310:10;27300:6;:20;;27292:50;;;;;;;13021:2:2;27292:50:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;27292:50:1;12819:341:2;27292:50:1;27424:1;27416:5;;:9;;;;:::i;:::-;27408:5;:17;27443:5;;:14;;27451:6;;27443:14;:::i;:::-;27435:5;:22;27467:1;;;;:6;665:10;27467:24;;;;;;;;;;9260:42:2;9248:55;;;27467:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;27467:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27525:4;27506:35;;27511:12;665:10;;586:96;27511:12;27506:35;;;27531:1;27534:6;27506:35;;;;;;16476:25:2;;;16532:2;16517:18;;16510:34;16464:2;16449:18;;16302:248;27506:35:1;;;;;;;;27565:9;;27551:46;;27565:9;;665:10;27590:6;27551:13;:46::i;:::-;27127:477;27046:558;;;;:::o;544:482:0:-;742:59;748:10;760:9;771:10;;742:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;783:9:0;;-1:-1:-1;794:2:0;;-1:-1:-1;798:2:0;;-1:-1:-1;742:5:0;:59::i;:::-;811:4;:33;;;;;;;;;;;;;;;854:5;:14;;;;;;;;;;;;;;878:8;:20;;;922:44;;;;;;;;7980:74:2;;;;922:37:0;;7953:18:2;;922:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;908:11;:58;;;976:43;;;;;;;15567:2:2;976:43:0;;;15549:21:2;15606:2;15586:18;;;15579:30;15645:17;15625:18;;;15618:45;15680:18;;976:43:0;15365:339:2;976:43:0;544:482;;;;;;;;;;:::o;28195:558:1:-;28299:6;;28265:14;;28299:6;;;;;28291:29;;;;;;;13776:2:2;28291:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;28291:29:1;13574:334:2;28291:29:1;28339:42;28357:2;28361:5;;28368;;28375;:3;:5::i;28339:42::-;28330:51;;28409:10;28399:6;:20;;28391:50;;;;;;;13021:2:2;28391:50:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;28391:50:1;12819:341:2;28391:50:1;28478:9;28490:11;28495:6;28490:2;:11;:::i;:::-;28478:23;;28574:1;28566:5;;:9;;;;:::i;:::-;28558:5;:17;28593:5;;:14;;28601:6;;28593:14;:::i;:::-;28585:5;:22;28617:1;;;;:6;665:10;28617:24;;;;;;;;;;9260:42:2;9248:55;;;28617:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;28617:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28675:4;28656:35;;28661:12;665:10;;586:96;28661:12;28656:35;;;28681:6;28689:1;28656:35;;;;;;16476:25:2;;;16532:2;16517:18;;16510:34;16464:2;16449:18;;16302:248;28656:35:1;;;;;;;;28714:9;;28701:45;;28714:9;;665:10;28725:12;28739:6;28701:12;:45::i;26414:559::-;26518:6;;26484:14;;26518:6;;;;;26510:29;;;;;;;13776:2:2;26510:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;26510:29:1;13574:334:2;26510:29:1;26558:42;26576:2;26580:5;;26587;;26594;:3;:5::i;26558:42::-;26549:51;;26628:10;26618:6;:20;;26610:50;;;;;;;13021:2:2;26610:50:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;26610:50:1;12819:341:2;26610:50:1;26697:9;26709:11;26714:6;26709:2;:11;:::i;:::-;26697:23;;26793:1;26785:5;;:9;;;;:::i;:::-;26777:5;:17;26812:5;;:14;;26820:6;;26812:14;:::i;:::-;26804:5;:22;26836:1;;;;:6;665:10;26836:24;;;;;;;;;;9260:42:2;9248:55;;;26836:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;26836:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26894:5;26875:36;;26880:12;665:10;;586:96;30233:647;30333:6;;30299:14;;30333:6;;;;;30325:29;;;;;;;13776:2:2;30325:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;30325:29:1;13574:334:2;30325:29:1;30364:9;30384:5;;30376;;:13;;;;:::i;:::-;30364:25;;30400:9;30425:12;;30420:2;30412:5;:3;:5::i;:::-;:10;;;;:::i;:::-;:25;;;;:::i;:::-;30400:37;;30480:4;30476:1;30464:5;;30456;;:13;;;;:::i;:::-;:17;;30472:1;30456:17;:::i;:::-;:21;;;;:::i;:::-;:28;;;;:::i;:::-;30447:37;-1:-1:-1;30525:4:1;30513:8;30520:1;30513:4;:8;:::i;:::-;30503:19;;:6;:19;:::i;:::-;:26;;;;:::i;:::-;30494:35;-1:-1:-1;30548:20:1;30494:35;30553:5;30557:1;;30553:5;:::i;:::-;:14;;;;:::i;30548:20::-;30539:29;-1:-1:-1;30602:1:1;30588:10;30539:29;30588:1;:10;:::i;:::-;30587:16;;;;:::i;:::-;30578:25;;30631:10;30621:6;:20;;30613:50;;;;;;;13021:2:2;30613:50:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;30613:50:1;12819:341:2;30613:50:1;30689:6;30681:5;;:14;;;;:::i;:::-;30673:5;:22;30713:5;;:14;;30721:6;;30713:14;:::i;:::-;30705:5;:22;30737:23;665:10;30743:12;586:96;30737:23;30784:9;;30770:46;;30784:9;;665:10;30809:6;30770:13;:46::i;:::-;30831:42;;;16757:25:2;;;16813:2;16798:18;;16791:34;;;16841:18;;;16834:34;;;665:10:1;;30831:42;;16745:2:2;16730:18;30831:42:1;;;;;;;;30315:565;;30233:647;;;;:::o;29469:668::-;29566:6;;29535:11;;29566:6;;;;;29558:29;;;;;;;13776:2:2;29558:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;29558:29:1;13574:334:2;29558:29:1;29673:9;29685:19;29698:5;;29690;;:13;;;;:::i;29685:19::-;29673:31;;29714:10;29727:41;29760:6;29752:5;;:14;;;;:::i;:::-;29741:6;29733:5;;:14;;;;:::i;29727:41::-;29714:54;;29824:4;29809:12;;29801:4;29797:1;29785:2;29790:4;29785:9;;;;:::i;:::-;:13;;;;:::i;:::-;:20;;;;:::i;:::-;29784:37;;;;:::i;:::-;:44;;;;:::i;:::-;29778:50;;29858:4;29850:5;:3;:5::i;:::-;29844:11;;:3;:11;:::i;:::-;:18;;;;:::i;:::-;29838:24;;29894:6;29887:3;:13;;29879:43;;;;;;;13021:2:2;29879:43:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;29879:43:1;12819:341:2;29879:43:1;29948:6;29940:5;;:14;;;;:::i;:::-;29932:5;:22;29972:5;;:14;;29980:6;;29972:14;:::i;:::-;29964:5;:22;29996:24;665:10;30002:12;30016:3;29996:5;:24::i;:::-;30043:9;;30030:45;;30043:9;;665:10;30068:6;30030:12;:45::i;:::-;30090:40;;;16757:25:2;;;16813:2;16798:18;;16791:34;;;16841:18;;;16834:34;;;665:10:1;;30090:40;;16745:2:2;16730:18;30090:40:1;16555:319:2;32035:668:1;32143:6;;32112:11;;32143:6;;;;;32135:29;;;;;;;13776:2:2;32135:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;32135:29:1;13574:334:2;32135:29:1;32250:9;32262:19;32275:5;;32267;;:13;;;;:::i;32262:19::-;32250:31;;32291:10;32304:33;32333:2;32325:5;;:10;;;;:::i;:::-;32318:2;32310:5;;:10;;;;:::i;32304:33::-;32291:46;;32393:4;32378:12;;32370:4;32366:1;32354:2;32359:4;32354:9;;;;:::i;:::-;:13;;;;:::i;:::-;:20;;;;:::i;:::-;32353:37;;;;:::i;:::-;:44;;;;:::i;:::-;32347:50;;32427:4;32419:5;:3;:5::i;:::-;32413:11;;:3;:11;:::i;:::-;:18;;;;:::i;:::-;32407:24;;32463:6;32456:3;:13;;32448:43;;;;;;;13021:2:2;32448:43:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;32448:43:1;12819:341:2;32448:43:1;32517:2;32509:5;;:10;;;;:::i;:::-;32501:5;:18;32537:5;;:10;;32545:2;;32537:10;:::i;:::-;32529:5;:18;32557:1;;;;:6;665:10;32557:24;;;;;;;;;;9260:42:2;9248:55;;;32557:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;32557:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32591:1:1;;;;;-1:-1:-1;32591:6:1;;-1:-1:-1;665:10:1;32591:24;;;;;;;;;;9260:42:2;9248:55;;;32591:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;32591:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32625;32631:12;665:10;;586:96;32625:24;32664:32;;;16757:25:2;;;16813:2;16798:18;;16791:34;;;16841:18;;;16834:34;;;665:10:1;;32664:32;;16745:2:2;16730:18;32664:32:1;16555:319:2;15275:20:1;;;;;;;:::i;28825:559::-;28924:6;;28890:14;;28924:6;;;;;28916:29;;;;;;;13776:2:2;28916:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;28916:29:1;13574:334:2;28916:29:1;28982:9;28994:42;29012:2;29016:5;;29023;;29030;:3;:5::i;28994:42::-;28982:54;-1:-1:-1;29055:6:1;28982:54;29055:2;:6;:::i;:::-;29046:15;;29089:10;29079:6;:20;;29071:50;;;;;;;13021:2:2;29071:50:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;29071:50:1;12819:341:2;29071:50:1;29203:1;29195:5;;:9;;;;:::i;:::-;29187:5;:17;29222:5;;:14;;29230:6;;29222:14;:::i;:::-;29214:5;:22;29246:1;;;;:6;665:10;29246:24;;;;;;;;;;9260:42:2;9248:55;;;29246:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;29246:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29304:5;29285:36;;29290:12;665:10;;586:96;25326:216;25383:6;;;;;;;25375:29;;;;;;;13776:2:2;25375:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;25375:29:1;13574:334:2;25375:29:1;25414:1;;;;:6;665:10;25414:28;;;;;;;;;;9260:42:2;9248:55;;;25414:28:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;25414:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25452:1:1;;;;;-1:-1:-1;25452:6:1;;-1:-1:-1;665:10:1;25452:28;;;;;;;;;;9260:42:2;9248:55;;;25452:28:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;25452:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25503:9:1;;25490:45;;-1:-1:-1;25503:9:1;;;-1:-1:-1;665:10:1;25528:6;25490:12;:45::i;15875:172::-;15961:4;15977:42;665:10;16001:9;16012:6;15977:9;:42::i;25886:456::-;25980:6;;25950:10;;25980:6;;;;;25972:29;;;;;;;13776:2:2;25972:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;25972:29:1;13574:334:2;25972:29:1;26016:41;26029:6;26037:5;;26044;;26051;:3;:5::i;26016:41::-;26011:46;;26083:6;26075:5;;:14;;;;:::i;:::-;26067:5;:22;26107:5;;:10;;26115:2;;26107:10;:::i;:::-;26099:5;:18;26132:37;;;16476:25:2;;;16532:2;16517:18;;16510:34;;;26151:5:1;;665:10;;26132:37;;16449:18:2;26132:37:1;;;;;;;26184:11;26189:6;26184:2;:11;:::i;:::-;26179:16;;26219:5;26213:2;:11;;26205:41;;;;;;;13021:2:2;26205:41:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;26205:41:1;12819:341:2;26205:41:1;26256:1;;;;:6;665:10;26263:12;26256:24;;;;;;;;;;9260:42:2;9248:55;;;26256:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;26256:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26303:9:1;;26290:45;;-1:-1:-1;26303:9:1;;;-1:-1:-1;665:10:1;26314:12;26328:6;26290:12;:45::i;1080:370:0:-;1125:7;;20815:15:1;1144:32:0;;1186:12;1218:9;;1211:4;:16;1208:208;;;1330:8;;1318:9;;:20;;;;:::i;:::-;1298:15;21316:8:1;21363:7;1298:15:0;:::i;:::-;1285:8;;1278:15;;:4;:15;:::i;:::-;1277:37;;;;:::i;:::-;:62;;;;:::i;:::-;1250:103;;21363:7:1;1250:103:0;:::i;:::-;1243:110;;1208:208;;;-1:-1:-1;21316:8:1;1208:208:0;1432:11;1439:4;1432;:11;:::i;:::-;1425:18;;;;1080:370;:::o;31013:395:1:-;31106:6;;31076:10;;31106:6;;;;;31098:29;;;;;;;13776:2:2;31098:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;31098:29:1;13574:334:2;31098:29:1;31142:37;31155:2;31159:5;;31166;;31173;:3;:5::i;31142:37::-;31137:42;;31203:5;31197:2;:11;;31189:41;;;;;;;13021:2:2;31189:41:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;31189:41:1;12819:341:2;31189:41:1;31256:2;31248:5;;:10;;;;:::i;:::-;31240:5;:18;31276:5;;:10;;31284:2;;31276:10;:::i;:::-;31268:5;:18;31296:1;;;;:6;665:10;31296:24;;;;;;;;;;9260:42:2;9248:55;;;31296:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;31296:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31330:1:1;;;;;-1:-1:-1;31330:6:1;;-1:-1:-1;665:10:1;31330:24;;;;;;;;;;9260:42:2;9248:55;;;31330:24:1;;;9230:74:2;9320:18;;;9313:34;;;9203:18;;31330:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31388:4;31369:32;;31374:12;665:10;;586:96;27668:455;27762:6;;27732:10;;27762:6;;;;;27754:29;;;;;;;13776:2:2;27754:29:1;;;13758:21:2;13815:2;13795:18;;;13788:30;13854:12;13834:18;;;13827:40;13884:18;;27754:29:1;13574:334:2;27754:29:1;27798:41;27811:6;27819:5;;27826;;27833;:3;:5::i;27798:41::-;27793:46;;27865:6;27857:5;;:14;;;;:::i;:::-;27849:5;:22;27889:5;;:10;;27897:2;;27889:10;:::i;:::-;27881:5;:18;27914:36;;;16476:25:2;;;16532:2;16517:18;;16510:34;;;27933:4:1;;665:10;;27914:36;;16449:18:2;27914:36:1;;;;;;;27965:11;27970:6;27965:2;:11;:::i;:::-;27960:16;;28000:5;27994:2;:11;;27986:41;;;;;;;13021:2:2;27986:41:1;;;13003:21:2;13060:2;13040:18;;;13033:30;13099:19;13079:18;;;13072:47;13136:18;;27986:41:1;12819:341:2;27986:41:1;28037:1;;;;:6;665:10;28044:12;586:96;20005:370;20136:19;;;20128:68;;;;;;;14115:2:2;20128:68:1;;;14097:21:2;14154:2;14134:18;;;14127:30;14193:34;14173:18;;;14166:62;14264:6;14244:18;;;14237:34;14288:19;;20128:68:1;13913:400:2;20128:68:1;20214:21;;;20206:68;;;;;;;11469:2:2;20206:68:1;;;11451:21:2;11508:2;11488:18;;;11481:30;11547:34;11527:18;;;11520:62;11618:4;11598:18;;;11591:32;11640:19;;20206:68:1;11267:398:2;20206:68:1;20285:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20336:32;;16266:25:2;;;20336:32:1;;16239:18:2;20336:32:1;;;;;;;;20005:370;;;:::o;17977:437::-;18129:17;;;18105:21;18129:17;;;;;;;;;;;18164:23;;;;18156:74;;;;;;;12207:2:2;18156:74:1;;;12189:21:2;12246:2;12226:18;;;12219:30;12285:34;12265:18;;;12258:62;12356:8;12336:18;;;12329:36;12382:19;;18156:74:1;12005:402:2;18156:74:1;18264:17;;;;:9;:17;;;;;;;;;;;18284:22;;;18264:42;;18326:20;;;;;;;;:30;;18300:6;;18264:9;18326:30;;18300:6;;18326:30;:::i;:::-;;;;;;;;18389:9;18372:35;;18381:6;18372:35;;;18400:6;18372:35;;;;16266:25:2;;16254:2;16239:18;;16120:177;18372:35:1;;;;;;;;18094:320;17977:437;;;:::o;23614:344::-;23718:14;;23770:12;23781:1;23770:8;:12;:::i;:::-;23744:38;-1:-1:-1;23792:17:1;23812:28;23830:10;23744:38;23812:28;:::i;:::-;23792:48;-1:-1:-1;23850:19:1;23891:15;23872:16;:9;23884:4;23872:16;:::i;:::-;:34;;;;:::i;:::-;23850:56;-1:-1:-1;23928:23:1;23850:56;23928:9;:23;:::i;:::-;23916:35;23614:344;-1:-1:-1;;;;;;;;23614:344:1:o;34903:301::-;34989:12;35027:4;35004:20;21270:7;35004:6;:20;:::i;:::-;:27;;;;:::i;:::-;34989:42;-1:-1:-1;35064:9:1;35084:37;35103:2;35107:13;34989:42;35107:6;:13;:::i;:::-;35084:18;;;;:37;:18;:37::i;:::-;35150:8;;35131:34;;35150:8;35131:18;;;;35150:8;;;;35160:4;35131:18;:34::i;:::-;35186:2;35181:16;;;35190:6;35181:16;;;;16266:25:2;;16254:2;16239:18;;16120:177;35181:16:1;;;;;;;;34979:225;;34903:301;;;:::o;19204:378::-;19304:18;;;19279:22;19304:18;;;;;;;;;;;19340:24;;;;19332:71;;;;;;;10732:2:2;19332:71:1;;;10714:21:2;10771:2;10751:18;;;10744:30;10810:34;10790:18;;;10783:62;10881:4;10861:18;;;10854:32;10903:19;;19332:71:1;10530:398:2;19332:71:1;19437:18;;;:9;:18;;;;;;;;;;19458:23;;;19437:44;;19501:12;:22;;19475:6;;19437:9;19501:22;;19475:6;;19501:22;:::i;:::-;;;;-1:-1:-1;;19538:37:1;;16266:25:2;;;19564:1:1;;19538:37;;;;;;16254:2:2;16239:18;19538:37:1;16120:177:2;21872:231:1;21920:7;21956:5;21951:10;;;:1;21994:85;22005:1;22001;:5;21994:85;;;-1:-1:-1;22034:1:1;22067;22034;22054:5;22034:1;22054;:5;:::i;:::-;:9;;;;:::i;:::-;22053:15;;;;:::i;:::-;22049:19;;21994:85;;24329:379;24447:9;;24511:4;24507:1;24495:9;24480:12;:8;24491:1;24480:12;:::i;:::-;:24;;;;:::i;:::-;:28;;;;:::i;:::-;:35;;;;:::i;:::-;24468:47;-1:-1:-1;24591:9:1;24584:4;24580:1;24555:21;24568:8;24555:10;:21;:::i;:::-;24554:27;;;;:::i;:::-;:34;;;;:::i;:::-;:46;;;;:::i;:::-;24550:50;-1:-1:-1;24550:50:1;24652:15;24665:1;24657:5;24550:50;;24657:5;:::i;:::-;:9;;;;:::i;24652:15::-;:19;;;;:::i;:::-;24648:23;-1:-1:-1;24700:1:1;24696;24685:8;24648:23;24689:4;24685:8;:::i;:::-;:12;;;;:::i;:::-;:16;;;;:::i;:::-;24681:20;24329:379;-1:-1:-1;;;;;;24329:379:1:o;22192:1416::-;22342:8;;:13;22334:37;;;;;;;14878:2:2;22334:37:1;;;14860:21:2;14917:2;14897:18;;;14890:30;14956:13;14936:18;;;14929:41;14987:18;;22334:37:1;14676:335:2;22334:37:1;22394:1;22389:2;:6;:16;;;;;22404:1;22399:2;:6;22389:16;22381:49;;;;;;;15218:2:2;22381:49:1;;;15200:21:2;15257:2;15237:18;;;15230:30;15296:22;15276:18;;;15269:50;15336:18;;22381:49:1;15016:344:2;22381:49:1;22440:9;:22;;;;;;;;;;;;;;;22473:8;:20;;;;;;;;;;;;;;;;;;20815:15;22503:8;:28;22573:9;20815:15;22553:29;;;;:::i;:::-;22541:9;:41;22593:6;:13;;;;;;;;22631:47;;;;22667:10;;22631:47;;;:::i;:::-;;;;;;;;;;;;;22617:4;:62;;;;;;;;;;;;:::i;:::-;;22731:10;22705:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;22689:6;:54;;;;;;;;;;;;:::i;:::-;;22770:9;;;;;;;;;;;22764:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22753:8;:38;;;;;;;;;;;;;;;22859:46;;21065:42;;22820:16;;22845:4;;22859:46;;22894:10;;22859:46;;;:::i;:::-;;;;;;;;;;;;;22941:10;22915:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;22955:8;;22820:144;;;;;;;;;;;;22955:8;;;;;22820:144;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22802:1;:163;;;;;;;;;;;;;;;23032:46;;21065:42;;22993:16;;23018:4;;23032:46;;23067:10;;23032:46;;;:::i;:::-;;;;;;;;;;;;;23114:10;23088:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;23128:8;;22993:144;;;;;;;;;;;;23128:8;;;;;22993:144;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22975:1;:163;;;;;;;;;;;;;;;-1:-1:-1;23163:13:1;23168:7;23173:2;23168;:7;:::i;23163:13::-;23186:5;:10;;;23206:5;:10;;;23149:27;-1:-1:-1;23226:24:1;665:10;23246:3;23226:5;:24::i;:::-;23260:23;23274:1;23278:4;23260:5;:23::i;:::-;23319:2;23314;:7;23311:244;;;23337:1;;;;:6;665:10;23358:7;23363:2;23358;:7;:::i;:::-;23337:29;;;;;;;;;;9260:42:2;9248:55;;;23337:29:1;;;9230:74:2;9320:18;;;9313:34;9203:18;;23337:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23393:9:1;;23380:41;;-1:-1:-1;23393:9:1;;;-1:-1:-1;665:10:1;23404:12;586:96;23380:41;23311:244;;;23460:1;;;;:6;665:10;23481:7;23486:2;23481;:7;:::i;:::-;23460:29;;;;;;;;;;9260:42:2;9248:55;;;23460:29:1;;;9230:74:2;9320:18;;;9313:34;9203:18;;23460:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23516:9:1;;23503:41;;-1:-1:-1;23516:9:1;;;-1:-1:-1;665:10:1;23527:12;586:96;23503:41;23569:32;;;16757:25:2;;;16813:2;16798:18;;16791:34;;;16841:18;;;16834:34;;;23569:32:1;;665:10;;23569:32;;;;;;16745:2:2;23569:32:1;;;22324:1284;22192:1416;;;;;;:::o;34676:221::-;34785:9;34805:51;:22;;;34828:4;34842;34849:6;34805:22;:51::i;:::-;34877:4;34872:18;;;34883:6;34872:18;;;;16266:25:2;;16254:2;16239:18;;16120:177;34872:18:1;;;;;;;;34753:144;34676:221;;;:::o;18690:194::-;18781:6;18765:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;18797:18:1;;;:9;:18;;;;;;;;;;:28;;18819:6;;18797:9;:28;;18819:6;;18797:28;:::i;:::-;;;;-1:-1:-1;;18840:37:1;;16266:25:2;;;18840:37:1;;;;18857:1;;18840:37;;16254:2:2;16239:18;18840:37:1;;;;;;;18690:194;;:::o;11773:205::-;11912:58;;9260:42:2;9248:55;;11912:58:1;;;9230:74:2;9320:18;;;9313:34;;;11885:86:1;;11905:5;;11935:23;;9203:18:2;;11912:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11885:19;:86::i;:::-;11773:205;;;:::o;11984:241::-;12149:68;;8277:42:2;8346:15;;;12149:68:1;;;8328:34:2;8398:15;;8378:18;;;8371:43;8430:18;;;8423:34;;;12122:96:1;;12142:5;;12172:27;;8240:18:2;;12149:68:1;8065:398:2;12122:96:1;11984:241;;;;:::o;14279:706::-;14698:23;14724:69;14752:4;14724:69;;;;;;;;;;;;;;;;;14732:5;14724:27;;;;:69;;;;;:::i;:::-;14807:17;;14698:95;;-1:-1:-1;14807:21:1;14803:176;;14902:10;14891:30;;;;;;;;;;;;:::i;:::-;14883:85;;;;;;;15911:2:2;14883:85:1;;;15893:21:2;15950:2;15930:18;;;15923:30;15989:34;15969:18;;;15962:62;16060:12;16040:18;;;16033:40;16090:19;;14883:85:1;15709:406:2;6863:223:1;6996:12;7027:52;7049:6;7057:4;7063:1;7066:12;7027:21;:52::i;:::-;7020:59;6863:223;-1:-1:-1;;;;6863:223:1:o;7950:499::-;8115:12;8172:5;8147:21;:30;;8139:81;;;;;;;12614:2:2;8139:81:1;;;12596:21:2;12653:2;12633:18;;;12626:30;12692:34;12672:18;;;12665:62;12763:8;12743:18;;;12736:36;12789:19;;8139:81:1;12412:402:2;8139:81:1;4436:20;;8230:60;;;;;;;14520:2:2;8230:60:1;;;14502:21:2;14559:2;14539:18;;;14532:30;14598:31;14578:18;;;14571:59;14647:18;;8230:60:1;14318:353:2;8230:60:1;8302:12;8316:23;8343:6;:11;;8362:5;8369:4;8343:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8301:73;;;;8391:51;8408:7;8417:10;8429:12;8391:16;:51::i;:::-;8384:58;7950:499;-1:-1:-1;;;;;;;7950:499:1:o;10563:692::-;10709:12;10737:7;10733:516;;;-1:-1:-1;10767:10:1;10760:17;;10733:516;10878:17;;:21;10874:365;;11072:10;11066:17;11132:15;11119:10;11115:2;11111:19;11104:44;10874:365;11211:12;11204:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:2;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:2;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:1428::-;1058:6;1066;1074;1082;1090;1098;1106;1114;1122;1130;1183:3;1171:9;1162:7;1158:23;1154:33;1151:53;;;1200:1;1197;1190:12;1151:53;1239:9;1226:23;1258:31;1283:5;1258:31;:::i;:::-;1308:5;-1:-1:-1;1365:2:2;1350:18;;1337:32;1378:33;1337:32;1378:33;:::i;:::-;1430:7;-1:-1:-1;1489:2:2;1474:18;;1461:32;1502:33;1461:32;1502:33;:::i;:::-;1554:7;-1:-1:-1;1613:2:2;1598:18;;1585:32;1626:33;1585:32;1626:33;:::i;:::-;1678:7;-1:-1:-1;1736:3:2;1721:19;;1708:33;1760:18;1790:14;;;1787:34;;;1817:1;1814;1807:12;1787:34;1855:6;1844:9;1840:22;1830:32;;1900:7;1893:4;1889:2;1885:13;1881:27;1871:55;;1922:1;1919;1912:12;1871:55;1962:2;1949:16;1988:2;1980:6;1977:14;1974:34;;;2004:1;2001;1994:12;1974:34;2049:7;2044:2;2035:6;2031:2;2027:15;2023:24;2020:37;2017:57;;;2070:1;2067;2060:12;2017:57;915:1428;;;;-1:-1:-1;915:1428:2;;;;2101:2;2093:11;;;;;2123:6;;-1:-1:-1;2176:3:2;2161:19;;2148:33;;2228:3;2213:19;;2200:33;;-1:-1:-1;2280:3:2;2265:19;;2252:33;;-1:-1:-1;2332:3:2;2317:19;2304:33;;-1:-1:-1;915:1428:2;-1:-1:-1;;;915:1428:2:o;2348:456::-;2425:6;2433;2441;2494:2;2482:9;2473:7;2469:23;2465:32;2462:52;;;2510:1;2507;2500:12;2462:52;2549:9;2536:23;2568:31;2593:5;2568:31;:::i;:::-;2618:5;-1:-1:-1;2675:2:2;2660:18;;2647:32;2688:33;2647:32;2688:33;:::i;:::-;2348:456;;2740:7;;-1:-1:-1;;;2794:2:2;2779:18;;;;2766:32;;2348:456::o;2809:315::-;2877:6;2885;2938:2;2926:9;2917:7;2913:23;2909:32;2906:52;;;2954:1;2951;2944:12;2906:52;2993:9;2980:23;3012:31;3037:5;3012:31;:::i;:::-;3062:5;3114:2;3099:18;;;;3086:32;;-1:-1:-1;;;2809:315:2:o;3129:277::-;3196:6;3249:2;3237:9;3228:7;3224:23;3220:32;3217:52;;;3265:1;3262;3255:12;3217:52;3297:9;3291:16;3350:5;3343:13;3336:21;3329:5;3326:32;3316:60;;3372:1;3369;3362:12;3411:180;3470:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;-1:-1:-1;3562:23:2;;3411:180;-1:-1:-1;3411:180:2:o;3596:184::-;3666:6;3719:2;3707:9;3698:7;3694:23;3690:32;3687:52;;;3735:1;3732;3725:12;3687:52;-1:-1:-1;3758:16:2;;3596:184;-1:-1:-1;3596:184:2:o;3785:248::-;3853:6;3861;3914:2;3902:9;3893:7;3889:23;3885:32;3882:52;;;3930:1;3927;3920:12;3882:52;-1:-1:-1;;3953:23:2;;;4023:2;4008:18;;;3995:32;;-1:-1:-1;3785:248:2:o;4038:316::-;4115:6;4123;4131;4184:2;4172:9;4163:7;4159:23;4155:32;4152:52;;;4200:1;4197;4190:12;4152:52;-1:-1:-1;;4223:23:2;;;4293:2;4278:18;;4265:32;;-1:-1:-1;4344:2:2;4329:18;;;4316:32;;4038:316;-1:-1:-1;4038:316:2:o;4359:273::-;4427:6;4480:2;4468:9;4459:7;4455:23;4451:32;4448:52;;;4496:1;4493;4486:12;4448:52;4528:9;4522:16;4578:4;4571:5;4567:16;4560:5;4557:27;4547:55;;4598:1;4595;4588:12;4637:317;4679:3;4717:5;4711:12;4744:6;4739:3;4732:19;4760:63;4816:6;4809:4;4804:3;4800:14;4793:4;4786:5;4782:16;4760:63;:::i;:::-;4868:2;4856:15;4873:66;4852:88;4843:98;;;;4943:4;4839:109;;4637:317;-1:-1:-1;;4637:317:2:o;4959:274::-;5088:3;5126:6;5120:13;5142:53;5188:6;5183:3;5176:4;5168:6;5164:17;5142:53;:::i;:::-;5211:16;;;;;4959:274;-1:-1:-1;;4959:274:2:o;5238:422::-;5500:7;5495:3;5488:20;5470:3;5537:6;5531:13;5553:61;5607:6;5603:1;5598:3;5594:11;5587:4;5579:6;5575:17;5553:61;:::i;:::-;5634:16;;;;5652:1;5630:24;;5238:422;-1:-1:-1;;5238:422:2:o;5665:::-;5927:7;5922:3;5915:20;5897:3;5964:6;5958:13;5980:61;6034:6;6030:1;6025:3;6021:11;6014:4;6006:6;6002:17;5980:61;:::i;6092:433::-;6354:16;6349:3;6342:29;6324:3;6400:6;6394:13;6416:62;6471:6;6466:2;6461:3;6457:12;6450:4;6442:6;6438:17;6416:62;:::i;:::-;6498:16;;;;6516:2;6494:25;;6092:433;-1:-1:-1;;6092:433:2:o;6530:::-;6792:16;6787:3;6780:29;6762:3;6838:6;6832:13;6854:62;6909:6;6904:2;6899:3;6895:12;6888:4;6880:6;6876:17;6854:62;:::i;6968:422::-;7230:7;7225:3;7218:20;7200:3;7267:6;7261:13;7283:61;7337:6;7333:1;7328:3;7324:11;7317:4;7309:6;7305:17;7283:61;:::i;7395:434::-;7657:17;7652:3;7645:30;7627:3;7704:6;7698:13;7720:62;7775:6;7770:2;7765:3;7761:12;7754:4;7746:6;7742:17;7720:62;:::i;:::-;7802:16;;;;7820:2;7798:25;;7395:434;-1:-1:-1;;7395:434:2:o;8468:583::-;8729:42;8721:6;8717:55;8706:9;8699:74;8809:3;8804:2;8793:9;8789:18;8782:31;8680:4;8836:46;8877:3;8866:9;8862:19;8854:6;8836:46;:::i;:::-;8930:9;8922:6;8918:22;8913:2;8902:9;8898:18;8891:50;8958:33;8984:6;8976;8958:33;:::i;:::-;8950:41;;;9039:4;9031:6;9027:17;9022:2;9011:9;9007:18;9000:45;8468:583;;;;;;;:::o;10305:220::-;10454:2;10443:9;10436:21;10417:4;10474:45;10515:2;10504:9;10500:18;10492:6;10474:45;:::i;17068:128::-;17108:3;17139:1;17135:6;17132:1;17129:13;17126:39;;;17145:18;;:::i;:::-;-1:-1:-1;17181:9:2;;17068:128::o;17201:274::-;17241:1;17267;17257:189;;17302:77;17299:1;17292:88;17403:4;17400:1;17393:15;17431:4;17428:1;17421:15;17257:189;-1:-1:-1;17460:9:2;;17201:274::o;17480:228::-;17520:7;17646:1;17578:66;17574:74;17571:1;17568:81;17563:1;17556:9;17549:17;17545:105;17542:131;;;17653:18;;:::i;:::-;-1:-1:-1;17693:9:2;;17480:228::o;17713:125::-;17753:4;17781:1;17778;17775:8;17772:34;;;17786:18;;:::i;:::-;-1:-1:-1;17823:9:2;;17713:125::o;17843:258::-;17915:1;17925:113;17939:6;17936:1;17933:13;17925:113;;;18015:11;;;18009:18;17996:11;;;17989:39;17961:2;17954:10;17925:113;;;18056:6;18053:1;18050:13;18047:48;;;-1:-1:-1;;18091:1:2;18073:16;;18066:27;17843:258::o;18106:437::-;18185:1;18181:12;;;;18228;;;18249:61;;18303:4;18295:6;18291:17;18281:27;;18249:61;18356:2;18348:6;18345:14;18325:18;18322:38;18319:218;;;18393:77;18390:1;18383:88;18494:4;18491:1;18484:15;18522:4;18519:1;18512:15;18319:218;;18106:437;;;:::o;18548:184::-;18600:77;18597:1;18590:88;18697:4;18694:1;18687:15;18721:4;18718:1;18711:15;18737:154;18823:42;18816:5;18812:54;18805:5;18802:65;18792:93;;18881:1;18878;18871:12

Swarm Source

ipfs://c12babf8e98e76b8e589bc44270e30ae8a73b53a311225783d60019b29ec13db
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.