Contract 0xbed32937d8a5d1421241f52809908f1a17d75bdb 3

 

Contract Overview

Balance:
195.697052984708 ETH

ETH Value:
$262,758.52 (@ $1,342.68/ETH)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xbfb89add27afb0c7c8cffb8ff07f257bb1e1a5604e787ba6fedf08070c428b18Submit Order275505082022-09-30 7:29:452 mins ago0xcb43fae526bce37beccd91e773dc902300858986 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.02 ETH0.02464932
0x61d2279a53a0022bc36d5377430e0a6645db19afea1896713d4e26c33f52852aSubmit Order275503682022-09-30 7:28:563 mins ago0xcb43fae526bce37beccd91e773dc902300858986 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.02 ETH0.02482691
0x0ceeba40be5f1a7a34fb7c17e2e88e16f2c469392e2e392d03a05562d0d718bcSubmit Close Ord...275500302022-09-30 7:26:465 mins ago0xcb43fae526bce37beccd91e773dc902300858986 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.01976207
0x16e69690d011e194f4fafaaa15ab90bbceaf077669b110378d80ba96a6e09da4Submit Close Ord...275489082022-09-30 7:20:1812 mins ago0x8d7bebaba8a6722ddf5c55b9c603588a94981e39 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.0000216
0x5149f52cd2bd5b51c0e296ba21f2e5b78bb32a3371f165743c264ea115fefb94Submit Order275482872022-09-30 7:16:2216 mins ago0xed089db37251a28934e60a45f6fb92b35330ba88 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.1 ETH0.00002635
0x50e605f5c05c83441e37cf8a003ed2e39b84f7ee7a0fe8bc3da79f5cdbfd9749Submit Order275472452022-09-30 7:10:1922 mins ago0x8424a95ccf4adca9e88574493efe65eaa2a2dd32 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00003289
0x741cd73b349a0016280d3dc6e0f50adc234231fef21919e885d2b87755d3dd72Submit Close Ord...275453282022-09-30 6:59:2133 mins ago0x1945372c0074fdf6f89d27e4d477b7d9ad6ed9d7 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00002092
0xa428c5004637c5e7b49ce794806edbdc21d0e6cd204e53221e2a21d5dcec97faSubmit Close Ord...275448782022-09-30 6:56:2535 mins ago0x270f7c71e6f56f481baaef9ad149feb9d6624d51 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.0000208
0x889e9fc5107e50e5b783e7979b2190f585a89679f8ec66861b528fdcc6aa9873Submit Order275398312022-09-30 6:25:241 hr 6 mins ago0x9333c471fb0abb0a189189933bfc0d1a4584c9f7 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00003532
0xfd5fcc8a9b4fd3dca94cf79ee56bbe43d549a622756949898850c0291269b0c7Submit Order275392542022-09-30 6:22:001 hr 10 mins ago0x9333c471fb0abb0a189189933bfc0d1a4584c9f7 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00003532
0xcaa79539b02e8a7d870af9fe6142eeab67c5ccdddd02d41a01e993ab5b83955eSubmit Order275371602022-09-30 6:06:061 hr 26 mins ago0xa219712cc2aaa5aa98ccf2a7ba055231f1752323 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.006 ETH0.00003119
0x2b73c4b8032f2a31cf2bd8419c3bd6e3a0e239d7b7db7f2e3113a69a4c8ee444Submit Close Ord...275360872022-09-30 5:58:531 hr 33 mins ago0x421c091c749076493664caaccbe991e9130414c6 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00002468
0x464309c2624fa28e709525bd615ece1c393438cad34a652e3af492f402049c03Submit Order275350862022-09-30 5:51:361 hr 40 mins ago0x864366fd2a9862af2db910e6909739acbe758d9b IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.3 ETH0.00003494
0x5c1c028ab38351be0e4b389d14c0d71f111e8ec92ef8d03c0a89843df7d91629Submit Close Ord...275305412022-09-30 5:15:482 hrs 16 mins ago0x87784c12b198c1683dc75482fa5ba00718b652f7 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00002906
0x3f74f5a174538531f9bf9fdf62043543071e7ef46944ad181325af1da8a8bcd3Submit Close Ord...275290042022-09-30 5:02:222 hrs 30 mins ago0x9dbced00e4eb4c787069e21c93a4ed7c28c1e97e IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00033615
0xd3403f17a2bffd2b5f16783c117d36a21873c015763c599eabd10ddc46dd1a81Submit Order275234042022-09-30 4:09:573 hrs 22 mins ago0x4ffc5f22770ab6046c8d66dabae3a9cd1e7a03e7 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.14 ETH0.00003976
0x2557940e7e0abad9eb87fd09920c11829c2206f4bbe719d276ddb1a90bd1309fSubmit Order275229472022-09-30 4:05:473 hrs 26 mins ago0xcb11673592cc6c4b9584f33bbba6c6cf07dde3f7 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.005 ETH0.00045125
0x11b7f3b04b92e23a21bf072df932bd2c3ceacb2ca939b4f3e90f345493d8929dSubmit Close Ord...275223082022-09-30 4:00:153 hrs 32 mins ago0x9dbced00e4eb4c787069e21c93a4ed7c28c1e97e IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.0003731
0xc85fe19cfeb1f780268c14cd5fa993eb364ef176b24f2ebb360725848c477837Submit Close Ord...275216082022-09-30 3:54:573 hrs 37 mins ago0x9dbced00e4eb4c787069e21c93a4ed7c28c1e97e IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00037294
0xeaddb9d7b14283bf5b99ff3b05766feb46314dffd3e05d67aba6012d38a2ed0dSubmit Order275212032022-09-30 3:51:393 hrs 40 mins ago0x9dbced00e4eb4c787069e21c93a4ed7c28c1e97e IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00047921
0xb295cbb84fca9db1786b09aad2044733a60baf0dbe94a573b62f27c952069652Submit Order275208282022-09-30 3:49:033 hrs 43 mins ago0x9dbced00e4eb4c787069e21c93a4ed7c28c1e97e IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.02 ETH0.00042451
0xafad09d5a277e20ed79030215cc8db72f4ab1b3a78e410d0df94af0f9efd8592Submit Close Ord...275167512022-09-30 3:18:044 hrs 14 mins ago0x464fd6b8e4dde4352117940a07d7cc93269a77bb IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.0000237
0xb7996f06be5ef6a023cebe213bd7984f1cc1bdd483c2c7507877fbc13e11f08bSubmit Order275166392022-09-30 3:17:134 hrs 15 mins ago0xcb43fae526bce37beccd91e773dc902300858986 IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.01 ETH0.02640237
0x7138fca6512c7f6af486abf6553cc173585cdcdb54125de9c85b413c94551d24Submit Close Ord...275165502022-09-30 3:16:274 hrs 15 mins ago0x9dbced00e4eb4c787069e21c93a4ed7c28c1e97e IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH0.00026357
0x35475d5bc0dce6b475665df004704765285f794859429c90d5a0c7cf4c1d6950Submit Order275149642022-09-30 3:04:424 hrs 27 mins ago0x464fd6b8e4dde4352117940a07d7cc93269a77bb IN 0xbed32937d8a5d1421241f52809908f1a17d75bdb0.06 ETH0.00003045
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0a4aef92654276d0c9cb61af1673c09b6e6ffd2253e03f7584fef7d3d1a76634275505292022-09-30 7:29:552 mins ago CAP Finance: Oracle0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH
0xbfb89add27afb0c7c8cffb8ff07f257bb1e1a5604e787ba6fedf08070c428b18275505082022-09-30 7:29:452 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0xbfb89add27afb0c7c8cffb8ff07f257bb1e1a5604e787ba6fedf08070c428b18275505082022-09-30 7:29:452 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0xbfb89add27afb0c7c8cffb8ff07f257bb1e1a5604e787ba6fedf08070c428b18275505082022-09-30 7:29:452 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0xbfb89add27afb0c7c8cffb8ff07f257bb1e1a5604e787ba6fedf08070c428b18275505082022-09-30 7:29:452 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x01fa41cc5128b1de20c99a3d75f600eb78a9acbe294c2718e2daf4c41e098d7f275503902022-09-30 7:29:043 mins ago CAP Finance: Oracle0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH
0x61d2279a53a0022bc36d5377430e0a6645db19afea1896713d4e26c33f52852a275503682022-09-30 7:28:563 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0x61d2279a53a0022bc36d5377430e0a6645db19afea1896713d4e26c33f52852a275503682022-09-30 7:28:563 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x61d2279a53a0022bc36d5377430e0a6645db19afea1896713d4e26c33f52852a275503682022-09-30 7:28:563 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0x61d2279a53a0022bc36d5377430e0a6645db19afea1896713d4e26c33f52852a275503682022-09-30 7:28:563 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb0xcb43fae526bce37beccd91e773dc9023008589860.03 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x210f9c5c663816cd88d1b1332bd482ba509d8f9cbab3fede43be999f4b3d3c7e275500542022-09-30 7:26:555 mins ago CAP Finance: Oracle0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH
0x5f7fce31e4d7813e6350be018f3134e6427ff7b9a4e1f6f14766267ea96a71dc275492492022-09-30 7:22:289 mins ago CAP Finance: Oracle0xbed32937d8a5d1421241f52809908f1a17d75bdb0 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb0x8d7bebaba8a6722ddf5c55b9c603588a94981e390.03456352 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: ETH Pool0.02543648 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
0x3bca480233f53993a83c723bcd9136b3ac1be24cdae82e682454805a5b798e0a275489492022-09-30 7:20:2911 mins ago 0xbed32937d8a5d1421241f52809908f1a17d75bdb CAP Finance: Router0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Trading

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2022-02-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @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");
        }
    }
}
interface IRouter {
    function trading() external view returns (address);

    function capPool() external view returns (address);

    function oracle() external view returns (address);

    function treasury() external view returns (address);

    function darkOracle() external view returns (address);

    function isSupportedCurrency(address currency) external view returns (bool);

    function currencies(uint256 index) external view returns (address);

    function currenciesLength() external view returns (uint256);

    function getDecimals(address currency) external view returns(uint8);

    function getPool(address currency) external view returns (address);

    function getPoolShare(address currency) external view returns(uint256);

    function getCapShare(address currency) external view returns(uint256);

    function getPoolRewards(address currency) external view returns (address);

    function getCapRewards(address currency) external view returns (address);
}
interface ITreasury {
    function fundOracle(address destination, uint256 amount) external;

    function notifyFeeReceived(address currency, uint256 amount) external;
}
interface IPool {
    function totalSupply() external view returns (uint256);

    function creditUserProfit(address destination, uint256 amount) external;
    
    function updateOpenInterest(uint256 amount, bool isDecrease) external;

    function getUtilization() external view returns (uint256);

    function getBalance(address account) external view returns (uint256);

}
contract Trading {

	// All amounts in 8 decimals unless otherwise indicated

	using SafeERC20 for IERC20;
    using Address for address payable;

	// Structs

	struct Product {
		uint64 maxLeverage; // set to 0 to deactivate product
		uint64 liquidationThreshold; // in bps. 8000 = 80%
		uint64 fee; // In sbps (10^6). 0.5% = 5000. 0.025% = 250
		uint64 interest; // For 360 days, in bps. 5.35% = 535
	}

	struct Position {
		uint64 size;
		uint64 margin;
		uint64 timestamp;
		uint64 price;
	}

	struct Order {
		bool isClose;
		uint64 size;
		uint64 margin;
	}

	// Contracts
	address public owner;
	address public router;
	address public treasury;
	address public oracle;

	uint256 public nextPositionId; // Incremental
	uint256 public nextCloseOrderId; // Incremental

	mapping(bytes32 => Product) private products;
	mapping(bytes32 => Position) private positions; // key = currency,user,product,direction
	mapping(bytes32 => Order) private orders; // position key => Order

	mapping(address => uint256) minMargin; // currency => amount

	mapping(address => uint256) pendingFees; // currency => amount

	uint256 public constant UNIT_DECIMALS = 8;
	uint256 public constant UNIT = 10**UNIT_DECIMALS;

	uint256 public constant PRICE_DECIMALS = 8;

	// Events
	event NewOrder(
		bytes32 indexed key,
		address indexed user,
		bytes32 indexed productId,
		address currency,
		bool isLong,
		uint256 margin,
		uint256 size,
		bool isClose
	);

	event PositionUpdated(
		bytes32 indexed key,
		address indexed user,
		bytes32 indexed productId,
		address currency,
		bool isLong,
		uint256 margin,
		uint256 size,
		uint256 price,
		uint256 fee
	);

	event ClosePosition(
		bytes32 indexed key,
		address indexed user,
		bytes32 indexed productId,
		address currency,
		bool isLong,
		uint256 price,
		uint256 margin,
		uint256 size,
		uint256 fee,
		int256 pnl,
		bool wasLiquidated
	);

	constructor() {
		owner = msg.sender;
	}

	// Governance methods

	function setOwner(address newOwner) external onlyOwner {
		owner = newOwner;
	}

	function setRouter(address _router) external onlyOwner {
		router = _router;
		treasury = IRouter(router).treasury();
		oracle = IRouter(router).oracle();
	}

	function setMinMargin(
		address currency,
		uint256 _minMargin
	) external onlyOwner {
		minMargin[currency] = _minMargin;
	}

	function addProduct(bytes32 productId, Product memory _product) external onlyOwner {
		
		Product memory product = products[productId];
		
		require(product.liquidationThreshold == 0, "!product-exists");
		require(_product.liquidationThreshold > 0, "!liqThreshold");

		products[productId] = Product({
			maxLeverage: _product.maxLeverage,
			fee: _product.fee,
			interest: _product.interest,
			liquidationThreshold: _product.liquidationThreshold
		});

	}

	function updateProduct(bytes32 productId, Product memory _product) external onlyOwner {

		Product storage product = products[productId];

		require(product.liquidationThreshold > 0, "!product-does-not-exist");

		product.maxLeverage = _product.maxLeverage;
		product.fee = _product.fee;
		product.interest = _product.interest;
		product.liquidationThreshold = _product.liquidationThreshold;

	}

	// Methods

	function distributeFees(address currency) external {
		uint256 pendingFee = pendingFees[currency];
		if (pendingFee > 0) {
			pendingFees[currency] = 0;
			_transferOut(currency, treasury, pendingFee);
			ITreasury(treasury).notifyFeeReceived(currency, pendingFee * 10**(18-UNIT_DECIMALS));
		}
	}

	function submitOrder(
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 margin,
		uint256 size
	) external payable {

		if (currency == address(0)) { // User is sending ETH
			margin = msg.value / 10**(18 - UNIT_DECIMALS);
		} else {
			require(IRouter(router).isSupportedCurrency(currency), "!currency");
		}

		// Check params
		require(margin > 0 && margin < type(uint64).max, "!margin");
		require(size > 0 && size < type(uint64).max, "!size");

		bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong);

		Order memory order = orders[key];
		require(order.size == 0, "!order"); // existing order

		Product memory product = products[productId];
		uint256 fee = size * product.fee / 10**6;

		if (currency == address(0)) {
			require(margin > fee, "!margin<fee");
			margin -= fee;
		} else {
			_transferIn(currency, margin + fee);
		}

		require(margin >= minMargin[currency], "!min-margin");

		uint256 leverage = UNIT * size / margin;
		require(leverage >= UNIT, "!leverage");
		require(leverage <= product.maxLeverage, "!max-leverage");

		// Update and check pool utlization
		_updateOpenInterest(currency, size, false);
		address pool = IRouter(router).getPool(currency);
		uint256 utilization = IPool(pool).getUtilization();
		require(utilization < 10**4, "!utilization");

		orders[key] = Order({
			isClose: false,
			size: uint64(size),
			margin: uint64(margin)
		});

		emit NewOrder(
			key,
			msg.sender,
			productId,
			currency,
			isLong,
			margin,
			size,
			false
		);

	}

	function submitCloseOrder(
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 size
	) external payable {

		require(size > 0, "!size");

		bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong);

		Order memory order = orders[key];
		require(order.size == 0, "!order"); // existing order

		// Check position
		Position storage position = positions[key];
		require(position.margin > 0, "!position");

		if (size > position.size) {
			size = position.size;
		}

		Product memory product = products[productId];
		uint256 fee = size * product.fee / 10**6;

		if (currency == address(0)) {
			uint256 fee_units = fee * 10**(18-UNIT_DECIMALS);
			require(msg.value >= fee_units && msg.value <= fee_units * (10**6 + 1)/10**6, "!fee");
		} else {
			_transferIn(currency, fee);
		}

		uint256 margin = size * uint256(position.margin) / uint256(position.size);

		orders[key] = Order({
			isClose: true,
			size: uint64(size),
			margin: uint64(margin)
		});

		emit NewOrder(
			key,
			msg.sender,
			productId,
			currency,
			isLong,
			margin,
			size,
			true
		);

	}

	function cancelOrder(
		bytes32 productId,
		address currency,
		bool isLong
	) external {

		bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong);

		Order memory order = orders[key];
		require(order.size > 0, "!exists");

		Product memory product = products[productId];
		uint256 fee = order.size * product.fee / 10**6;

		delete orders[key];

		// Refund margin + fee
		uint256 marginPlusFee = fee;
		if (!order.isClose) {
			_updateOpenInterest(currency, order.size, true);
			marginPlusFee += order.margin;
		}
		_transferOut(currency, msg.sender, marginPlusFee);

	}

	// Set price for newly submitted order (oracle)
	function settleOrder(
		address user,
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 price
	) external onlyOracle {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		Order storage order = orders[key];
		require(order.size > 0, "!exists");

		// fee
		Product memory product = products[productId];
		uint256 fee = order.size * product.fee / 10**6;
		pendingFees[currency] += fee;

		if (order.isClose) {
			
			{
				(uint256 margin, uint256 size, int256 pnl) = _settleCloseOrder(user, productId, currency, isLong, price);

				address pool = IRouter(router).getPool(currency);

				if (pnl < 0) {
					{
						uint256 positivePnl = uint256(-1 * pnl);
						_transferOut(currency, pool, positivePnl);
						if (positivePnl < margin) {
							_transferOut(currency, user, margin - positivePnl);
						}
					}
				} else {
					IPool(pool).creditUserProfit(user, uint256(pnl) * 10**(18-UNIT_DECIMALS));
					_transferOut(currency, user, margin);
				}

				_updateOpenInterest(currency, size, true);

				emit ClosePosition(
					key, 
					user,
					productId,
					currency,
					isLong,
					price,
					margin,
					size,
					fee,
					pnl,
					false
				);

			}

		} else {

			// Validate price, returns 8 decimals
			price = _validatePrice(price);

			Position storage position = positions[key];

			uint256 averagePrice = (uint256(position.size) * uint256(position.price) + uint256(order.size) * uint256(price)) / (uint256(position.size) + uint256(order.size));

			if (position.timestamp == 0) {
				position.timestamp = uint64(block.timestamp);
			}

			position.size += uint64(order.size);
			position.margin += uint64(order.margin);
			position.price = uint64(averagePrice);

			delete orders[key];

			emit PositionUpdated(
				key,
				user,
				productId,
				currency,
				isLong,
				position.margin,
				position.size,
				position.price,
				fee
			);

		}

	}

	function _settleCloseOrder(
		address user,
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 price
	) internal returns(uint256, uint256, int256) {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		// Check order and params
		Order memory order = orders[key];
		uint256 size = order.size;
		uint256 margin = order.margin;

		Position storage position = positions[key];
		require(position.margin > 0, "!position");

		Product memory product = products[productId];

		price = _validatePrice(price);

		int256 pnl = _getPnL(isLong, price, position.price, size, product.interest, position.timestamp);

		// Check if it's a liquidation
		if (pnl <= -1 * int256(uint256(position.margin) * uint256(product.liquidationThreshold) / 10**4)) {
			pnl = -1 * int256(uint256(position.margin));
			margin = position.margin;
			size = position.size;
			position.margin = 0;
		} else {
			position.margin -= uint64(margin);
			position.size -= uint64(size);
		}
		
		if (position.margin == 0) {
			delete positions[key];
		}

		delete orders[key];

		return (margin, size, pnl);

	}

	// Liquidate positionIds (oracle)
	function liquidatePosition(
		address user,
		bytes32 productId,
		address currency,
		bool isLong,
		uint256 price
	) external onlyOracle {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		Position memory position = positions[key];

		if (position.margin == 0 || position.size == 0) {
			return;
		}

		Product storage product = products[productId];

		price = _validatePrice(price);

		int256 pnl = _getPnL(isLong, price, position.price, position.size, product.interest, position.timestamp);

		uint256 threshold = position.margin * product.liquidationThreshold / 10**4;

		if (pnl <= -1 * int256(threshold)) {

			uint256 fee = position.margin - threshold;
			address pool = IRouter(router).getPool(currency);

			_transferOut(currency, pool, threshold);
			_updateOpenInterest(currency, position.size, true);
			pendingFees[currency] += fee;

			emit ClosePosition(
				key, 
				user,
				productId,
				currency,
				isLong,
				price,
				position.margin,
				position.size,
				fee,
				-1 * int256(uint256(position.margin)),
				true
			);

			delete positions[key];

		}

	}

	function releaseMargin(
		address user,
		bytes32 productId,
		address currency,
		bool isLong, 
		bool includeFee
	) external onlyOwner {

		bytes32 key = _getPositionKey(user, productId, currency, isLong);

		Position storage position = positions[key];
		require(position.margin > 0, "!position");

		uint256 margin = position.margin;

		emit ClosePosition(
			key, 
			user,
			productId,
			currency,
			isLong,
			position.price,
			margin,
			position.size,
			0,
			0,
			false
		);

		delete orders[key];

		if (includeFee) {
			Product memory product = products[productId];
			uint256 fee = position.size * product.fee / 10**6;
			margin += fee;
		}

		_updateOpenInterest(currency, position.size, true);
		
		delete positions[key];

		_transferOut(currency, user, margin);

	}

	// To receive ETH
	fallback() external payable {}
	receive() external payable {}

	// Internal methods

	function _getPositionKey(address user, bytes32 productId, address currency, bool isLong) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(user, productId, currency, isLong));
    }

	function _updateOpenInterest(address currency, uint256 amount, bool isDecrease) internal {
		address pool = IRouter(router).getPool(currency);
		IPool(pool).updateOpenInterest(amount * 10**(18 - UNIT_DECIMALS), isDecrease);
	}

	function _transferIn(address currency, uint256 amount) internal {
		if (amount == 0 || currency == address(0)) return;
		// adjust decimals
		uint256 decimals = IRouter(router).getDecimals(currency);
		amount = amount * (10**decimals) / (10**UNIT_DECIMALS);
		IERC20(currency).safeTransferFrom(msg.sender, address(this), amount);
	}

	function _transferOut(address currency, address to, uint256 amount) internal {
		if (amount == 0 || to == address(0)) return;
		// adjust decimals
		uint256 decimals = IRouter(router).getDecimals(currency);
		amount = amount * (10**decimals) / (10**UNIT_DECIMALS);
		if (currency == address(0)) {
			payable(to).sendValue(amount);
		} else {
			IERC20(currency).safeTransfer(to, amount);
		}
	}

	function _validatePrice(
		uint256 price // 8 decimals
	) internal pure returns(uint256) {
		require(price > 0, "!price");
		return price * 10**(UNIT_DECIMALS - PRICE_DECIMALS);
	}
	
	function _getPnL(
		bool isLong,
		uint256 price,
		uint256 positionPrice,
		uint256 size,
		uint256 interest,
		uint256 timestamp
	) internal view returns(int256 _pnl) {

		bool pnlIsNegative;
		uint256 pnl;

		if (isLong) {
			if (price >= positionPrice) {
				pnl = size * (price - positionPrice) / positionPrice;
			} else {
				pnl = size * (positionPrice - price) / positionPrice;
				pnlIsNegative = true;
			}
		} else {
			if (price > positionPrice) {
				pnl = size * (price - positionPrice) / positionPrice;
				pnlIsNegative = true;
			} else {
				pnl = size * (positionPrice - price) / positionPrice;
			}
		}

		// Subtract interest from P/L
		if (block.timestamp >= timestamp + 15 minutes) {

			uint256 _interest = size * interest * (block.timestamp - timestamp) / (UNIT * 10**4 * 360 days);

			if (pnlIsNegative) {
				pnl += _interest;
			} else if (pnl < _interest) {
				pnl = _interest - pnl;
				pnlIsNegative = true;
			} else {
				pnl -= _interest;
			}

		}

		if (pnlIsNegative) {
			_pnl = -1 * int256(pnl);
		} else {
			_pnl = int256(pnl);
		}

		return _pnl;

	}

	// Getters

	function getProduct(bytes32 productId) external view returns(Product memory) {
		return products[productId];
	}

	function getPosition(
		address user,
		address currency,
		bytes32 productId,
		bool isLong
	) external view returns(Position memory position) {
		bytes32 key = _getPositionKey(user, productId, currency, isLong);
		return positions[key];
	}

	function getOrder(
		address user,
		address currency,
		bytes32 productId,
		bool isLong
	) external view returns(Order memory order) {
		bytes32 key = _getPositionKey(user, productId, currency, isLong);
		return orders[key];
	}

	function getOrders(bytes32[] calldata keys) external view returns(Order[] memory _orders) {
		uint256 length = keys.length;
		_orders = new Order[](length);
		for (uint256 i = 0; i < length; i++) {
			_orders[i] = orders[keys[i]];
		}
		return _orders;
	}

	function getPositions(bytes32[] calldata keys) external view returns(Position[] memory _positions) {
		uint256 length = keys.length;
		_positions = new Position[](length);
		for (uint256 i = 0; i < length; i++) {
			_positions[i] = positions[keys[i]];
		}
		return _positions;
	}

	function getPendingFee(address currency) external view returns(uint256) {
		return pendingFees[currency] * 10**(18-UNIT_DECIMALS);
	}

	// Modifiers

	modifier onlyOracle() {
		require(msg.sender == oracle, "!oracle");
		_;
	}

	modifier onlyOwner() {
		require(msg.sender == owner, "!owner");
		_;
	}

}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnl","type":"int256"},{"indexed":false,"internalType":"bool","name":"wasLiquidated","type":"bool"}],"name":"ClosePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isClose","type":"bool"}],"name":"NewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"PositionUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"PRICE_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"_product","type":"tuple"}],"name":"addProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"getOrder","outputs":[{"components":[{"internalType":"bool","name":"isClose","type":"bool"},{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"}],"internalType":"struct Trading.Order","name":"order","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"}],"name":"getOrders","outputs":[{"components":[{"internalType":"bool","name":"isClose","type":"bool"},{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"}],"internalType":"struct Trading.Order[]","name":"_orders","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"getPendingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"getPosition","outputs":[{"components":[{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct Trading.Position","name":"position","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"}],"name":"getPositions","outputs":[{"components":[{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct Trading.Position[]","name":"_positions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"getProduct","outputs":[{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"liquidatePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextCloseOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPositionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"bool","name":"includeFee","type":"bool"}],"name":"releaseMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"_minMargin","type":"uint256"}],"name":"setMinMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"settleOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"submitCloseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"margin","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"submitOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"_product","type":"tuple"}],"name":"updateProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633179055613ad2806100326000396000f3fe60806040526004361061018b5760003560e01c80637dc0d1d0116100e0578063a36dbdd211610084578063f1a640f811610061578063f1a640f814610331578063f84382031461050d578063f887ea401461053a578063fde2832f1461055a57005b8063a36dbdd2146104b7578063c0d78655146104cd578063c972701a146104ed57005b80638da5cb5b116100bd5780638da5cb5b14610442578063904ac4b7146104625780639413f25c146104825780639d8e2177146104a257005b80637dc0d1d0146103ec57806381acdfa61461040c578063899346c71461042c57005b80633a20e9df1161014757806345a4058d1161012457806345a4058d146103545780635ce893051461037457806361d027b3146103945780636b62da40146103cc57005b80633a20e9df1461025d5780633d474866146103045780633de1b3e01461033157005b80630f1dfe871461019457806313af4035146101b457806319e77383146101d457806321465739146101f45780632a26f17f1461021457806339c6e45d1461024a57005b3661019257005b005b3480156101a057600080fd5b506101926101af366004613493565b61056d565b3480156101c057600080fd5b506101926101cf366004613191565b61069e565b3480156101e057600080fd5b506101926101ef3660046133b7565b6106ea565b34801561020057600080fd5b5061019261020f366004613286565b610867565b34801561022057600080fd5b5061023461022f36600461330d565b610bb1565b6040516102419190613608565b60405180910390f35b610192610258366004613441565b610ce0565b34801561026957600080fd5b506102f761027836600461339e565b60408051608081018252600080825260208201819052918101829052606081019190915250600090815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b90920416606082015290565b6040516102419190613721565b34801561031057600080fd5b5061032461031f36600461330d565b611368565b6040516102419190613595565b34801561033d57600080fd5b50610346600881565b604051908152602001610241565b34801561036057600080fd5b5061019261036f36600461321e565b611476565b34801561038057600080fd5b506102f761038f3660046131cb565b611662565b3480156103a057600080fd5b506002546103b4906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b3480156103d857600080fd5b506101926103e7366004613286565b6116f3565b3480156103f857600080fd5b506003546103b4906001600160a01b031681565b34801561041857600080fd5b50610192610427366004613493565b611d26565b34801561043857600080fd5b5061034660045481565b34801561044e57600080fd5b506000546103b4906001600160a01b031681565b34801561046e57600080fd5b5061019261047d3660046132e1565b611eec565b34801561048e57600080fd5b5061019261049d366004613191565b611f32565b3480156104ae57600080fd5b50610346612011565b3480156104c357600080fd5b5061034660055481565b3480156104d957600080fd5b506101926104e8366004613191565b612020565b3480156104f957600080fd5b50610346610508366004613191565b61218a565b34801561051957600080fd5b5061052d6105283660046131cb565b6121c6565b60405161024191906136ee565b34801561054657600080fd5b506001546103b4906001600160a01b031681565b6101926105683660046133f9565b612245565b6000546001600160a01b031633146105a05760405162461bcd60e51b8152600401610597906136ce565b60405180910390fd5b60008281526006602052604090208054600160401b90046001600160401b031661060c5760405162461bcd60e51b815260206004820152601760248201527f2170726f647563742d646f65732d6e6f742d65786973740000000000000000006044820152606401610597565b81518154604084015160608501516020909501516001600160401b03908116600160401b0267ffffffffffffffff60401b19968216600160c01b029690961677ffffffffffffffff0000000000000000ffffffffffffffff928216600160801b0277ffffffffffffffff0000000000000000ffffffffffffffff19909416919094161791909117161791909117905550565b6000546001600160a01b031633146106c85760405162461bcd60e51b8152600401610597906136ce565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006106f8338585856125ac565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b90910416928101929092529192509061077b5760405162461bcd60e51b81526020600482015260076024820152662165786973747360c81b6044820152606401610597565b6000858152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811683860152600160801b82048116938301849052600160c01b90910416606082015291840151919291620f4240916107e291613969565b6107ec91906137b4565b600085815260086020526040902080546001600160881b031916905583516001600160401b039190911691508190610852576108378785602001516001600160401b0316600161260a565b604084015161084f906001600160401b03168261375d565b90505b61085d87338361270f565b5050505050505050565b6003546001600160a01b031633146108ab5760405162461bcd60e51b8152602060048201526007602482015266216f7261636c6560c81b6044820152606401610597565b60006108b9868686866125ac565b600081815260076020908152604091829020825160808101845290546001600160401b038082168352600160401b82048116938301849052600160801b8204811694830194909452600160c01b90049092166060830152919250901580610928575080516001600160401b0316155b15610934575050610baa565b600086815260066020526040902061094b8461281d565b935060006109a4868685606001516001600160401b031686600001516001600160401b03168660000160189054906101000a90046001600160401b03166001600160401b031688604001516001600160401b0316612877565b905060006127108360000160089054906101000a90046001600160401b031685602001516109d29190613969565b6109dc91906137b4565b6001600160401b031690506109f3816000196138c5565b8213610ba45760008185602001516001600160401b0316610a149190613998565b60015460405163bbe4f6db60e01b81526001600160a01b038c811660048301529293506000929091169063bbe4f6db9060240160206040518083038186803b158015610a5f57600080fd5b505afa158015610a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9791906131ae565b9050610aa48a828561270f565b610abd8a87600001516001600160401b0316600161260a565b6001600160a01b038a166000908152600a602052604081208054849290610ae590849061375d565b9091555050602086015186518c916001600160a01b038f16918a917f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c918f918f918f91908a610b3f6001600160401b0384166000196138c5565b604080516001600160a01b0390981688529515156020880152948601939093526001600160401b03918216606086015216608084015260a083015260c0820152600160e08201526101000160405180910390a450506000858152600760205260408120555b50505050505b5050505050565b606081806001600160401b03811115610bcc57610bcc613a60565b604051908082528060200260200182016040528015610c1e57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610bea5790505b50915060005b81811015610cd75760076000868684818110610c4257610c42613a4a565b60209081029290920135835250818101929092526040908101600020815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b8104841692820192909252600160c01b90910490911660608201528351849083908110610cb957610cb9613a4a565b60200260200101819052508080610ccf90613a03565b915050610c24565b50505b92915050565b6001600160a01b038416610d1657610cfa60086012613998565b610d0590600a61381d565b610d0f90346137a0565b9150610dcb565b60015460405163fca8d47160e01b81526001600160a01b0386811660048301529091169063fca8d4719060240160206040518083038186803b158015610d5b57600080fd5b505afa158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d939190613381565b610dcb5760405162461bcd60e51b81526020600482015260096024820152682163757272656e637960b81b6044820152606401610597565b600082118015610de157506001600160401b0382105b610e175760405162461bcd60e51b815260206004820152600760248201526610b6b0b933b4b760c91b6044820152606401610597565b600081118015610e2d57506001600160401b0381105b610e615760405162461bcd60e51b81526020600482015260056024820152642173697a6560d81b6044820152606401610597565b6000610e6f338787876125ac565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b90910416928101929092529192509015610ef25760405162461bcd60e51b815260206004820152600660248201526510b7b93232b960d11b6044820152606401610597565b6000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b90049092166060830152909190620f424090610f5a908761394a565b610f6491906137a0565b90506001600160a01b038816610fc257808611610fb15760405162461bcd60e51b815260206004820152600b60248201526a216d617267696e3c66656560a81b6044820152606401610597565b610fbb8187613998565b9550610fd5565b610fd588610fd0838961375d565b6129de565b6001600160a01b03881660009081526009602052604090205486101561102b5760405162461bcd60e51b815260206004820152600b60248201526a10b6b4b716b6b0b933b4b760a91b6044820152606401610597565b6000868661103b6008600a61381d565b611045919061394a565b61104f91906137a0565b905061105d6008600a61381d565b8110156110985760405162461bcd60e51b8152602060048201526009602482015268216c6576657261676560b81b6044820152606401610597565b82516001600160401b03168111156110e25760405162461bcd60e51b815260206004820152600d60248201526c216d61782d6c6576657261676560981b6044820152606401610597565b6110ee8987600061260a565b60015460405163bbe4f6db60e01b81526001600160a01b038b81166004830152600092169063bbe4f6db9060240160206040518083038186803b15801561113457600080fd5b505afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c91906131ae565b90506000816001600160a01b0316637eb711316040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a957600080fd5b505afa1580156111bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e1919061353d565b905061271081106112235760405162461bcd60e51b815260206004820152600c60248201526b10baba34b634bd30ba34b7b760a11b6044820152606401610597565b6040518060600160405280600015158152602001896001600160401b031681526020018a6001600160401b03168152506008600089815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b031602179055509050508b336001600160a01b0316887fe6f0e81a24c1b1c11cfcbbce67e7c5ef361e984c1e4f3528125c93f6f906680d8e8e8e8e60006040516113529594939291906001600160a01b039590951685529215156020850152604084019190915260608301521515608082015260a00190565b60405180910390a4505050505050505050505050565b606081806001600160401b0381111561138357611383613a60565b6040519080825280602002602001820160405280156113ce57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113a15790505b50915060005b81811015610cd757600860008686848181106113f2576113f2613a4a565b602090810292909201358352508181019290925260409081016000208151606081018352905460ff8116151582526001600160401b036101008204811694830194909452600160481b900490921690820152835184908390811061145857611458613a4a565b6020026020010181905250808061146e90613a03565b9150506113d4565b6000546001600160a01b031633146114a05760405162461bcd60e51b8152600401610597906136ce565b60006114ae868686866125ac565b6000818152600760205260409020805491925090600160401b90046001600160401b03166114ee5760405162461bcd60e51b8152600401610597906136ab565b8054604080516001600160a01b0388811682528715156020830152600160c01b84046001600160401b0390811683850152600160401b850481166060840181905294166080830152600060a0830181905260c0830181905260e0830152915189928b169186917f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c918190036101000190a4600083815260086020526040902080546001600160881b03191690558315611630576000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b9004831660608201528554909392620f42409261160c92909116613969565b61161691906137b4565b6001600160401b0316905061162b818461375d565b925050505b81546116489087906001600160401b0316600161260a565b60008381526007602052604081205561085d86898361270f565b604080516080810182526000808252602082018190529181018290526060810182905290611692868587866125ac565b600090815260076020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b9092041660608201529695505050505050565b6003546001600160a01b031633146117375760405162461bcd60e51b8152602060048201526007602482015266216f7261636c6560c81b6044820152606401610597565b6000611745868686866125ac565b600081815260086020526040902080549192509061010090046001600160401b031661179d5760405162461bcd60e51b81526020600482015260076024820152662165786973747360c81b6044820152606401610597565b6000868152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b9004831660608201528454909392620f42409261180e92909161010090910416613969565b61181891906137b4565b6001600160401b0316905080600a6000896001600160a01b03166001600160a01b031681526020019081526020016000206000828254611858919061375d565b9091555050825460ff1615611a6e5760008060006118798c8c8c8c8c612ac5565b60015460405163bbe4f6db60e01b81526001600160a01b038f81166004830152949750929550909350600092169063bbe4f6db9060240160206040518083038186803b1580156118c857600080fd5b505afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190091906131ae565b90506000821215611948576000611919836000196138c5565b90506119268c838361270f565b84811015611942576119428c8f61193d8489613998565b61270f565b506119e2565b6001600160a01b03811663fbbc7d7f8e61196460086012613998565b61196f90600a61381d565b611979908661394a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050506119e28b8e8661270f565b6119ee8b84600161260a565b604080516001600160a01b038d811682528c151560208301529181018b9052606081018690526080810185905260a0810187905260c08101849052600060e08201528d918f16908a907f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c906101000160405180910390a450505050611d1b565b611a778561281d565b6000858152600760205260408120855481549398509092611aa9916001600160401b036101009091048116911661375d565b8554611ac490899061010090046001600160401b031661394a565b8354611ae2906001600160401b03600160c01b82048116911661394a565b611aec919061375d565b611af691906137a0565b8254909150600160801b90046001600160401b0316611b3357815467ffffffffffffffff60801b1916600160801b426001600160401b0316021782555b845482546001600160401b036101009092048216918491600091611b5991859116613775565b82546101009290920a6001600160401b0381810219909316918316021790915586548454600160481b909104821692508491600891611ba1918591600160401b900416613775565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550808260000160186101000a8154816001600160401b0302191690836001600160401b0316021790555060086000878152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a8154906001600160401b0302191690556000820160096101000a8154906001600160401b0302191690555050898b6001600160a01b0316877f722a60bf2980ad6565c04c8210c55454af895983660b33099a60a0af5e05037b8c8c8760000160089054906101000a90046001600160401b03168860000160009054906101000a90046001600160401b03168960000160189054906101000a90046001600160401b03168b604051611d10969594939291906001600160a01b0396909616865293151560208601526001600160401b039283166040860152908216606085015216608083015260a082015260c00190565b60405180910390a450505b505050505050505050565b6000546001600160a01b03163314611d505760405162461bcd60e51b8152600401610597906136ce565b600082815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b82048116938301849052600160801b8204811694830194909452600160c01b9004909216606083015215611de65760405162461bcd60e51b815260206004820152600f60248201526e2170726f647563742d65786973747360881b6044820152606401610597565b600082602001516001600160401b031611611e335760405162461bcd60e51b815260206004820152600d60248201526c085b1a5c551a1c995cda1bdb19609a1b6044820152606401610597565b506040805160808101825282516001600160401b039081168252602080850151821681840190815285850151831684860190815260609687015184169685019687526000978852600690925293909520915182549351955194518216600160c01b026001600160c01b03958316600160801b02959095166fffffffffffffffffffffffffffffffff968316600160401b026fffffffffffffffffffffffffffffffff199095169190921617929092179390931617179055565b6000546001600160a01b03163314611f165760405162461bcd60e51b8152600401610597906136ce565b6001600160a01b03909116600090815260096020526040902055565b6001600160a01b0381166000908152600a6020526040902054801561200d576001600160a01b038083166000908152600a6020526040812055600254611f7b918491168361270f565b6002546001600160a01b031663e0062d7983611f9960086012613998565b611fa490600a61381d565b611fae908561394a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b505050505b5050565b61201d6008600a61381d565b81565b6000546001600160a01b0316331461204a5760405162461bcd60e51b8152600401610597906136ce565b600180546001600160a01b0319166001600160a01b038316908117909155604080516361d027b360e01b815290516361d027b391600480820192602092909190829003018186803b15801561209e57600080fd5b505afa1580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d691906131ae565b600280546001600160a01b0319166001600160a01b03928316179055600154604080516307dc0d1d60e41b815290519190921691637dc0d1d0916004808301926020929190829003018186803b15801561212f57600080fd5b505afa158015612143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216791906131ae565b600380546001600160a01b0319166001600160a01b039290921691909117905550565b600061219860086012613998565b6121a390600a61381d565b6001600160a01b0383166000908152600a6020526040902054610cda919061394a565b60408051606081018252600080825260208201819052918101829052906121ef868587866125ac565b6000908152600860209081526040918290208251606081018452905460ff8116151582526001600160401b036101008204811693830193909352600160481b900490911691810191909152915050949350505050565b6000811161227d5760405162461bcd60e51b81526020600482015260056024820152642173697a6560d81b6044820152606401610597565b600061228b338686866125ac565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b9091041692810192909252919250901561230e5760405162461bcd60e51b815260206004820152600660248201526510b7b93232b960d11b6044820152606401610597565b60008281526007602052604090208054600160401b90046001600160401b031661234a5760405162461bcd60e51b8152600401610597906136ab565b80546001600160401b031684111561236a5780546001600160401b031693505b6000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b90049092166060830152909190620f4240906123d2908861394a565b6123dc91906137a0565b90506001600160a01b0388166124765760006123fa60086012613998565b61240590600a61381d565b61240f908361394a565b905080341015801561243b5750620f424061242d82620f424161394a565b61243791906137a0565b3411155b6124705760405162461bcd60e51b8152600401610597906020808252600490820152632166656560e01b604082015260600190565b50612480565b61248088826129de565b82546000906001600160401b03808216916124a491600160401b909104168961394a565b6124ae91906137a0565b604080516060808201835260018083526001600160401b038c8116602080860191825287831686880190815260008f815260088352889020965187549351915168ffffffffffffffffff1990941690151568ffffffffffffffff00191617610100918516919091021770ffffffffffffffff0000000000000000001916600160481b92909316919091029190911790935583516001600160a01b038f1681528d15159381019390935292820184905281018a905260808101919091529091508a90339088907fe6f0e81a24c1b1c11cfcbbce67e7c5ef361e984c1e4f3528125c93f6f906680d9060a00160405180910390a450505050505050505050565b6040516bffffffffffffffffffffffff19606086811b821660208401526034830186905284901b16605482015281151560f81b6068820152600090606901604051602081830303815290604052805190602001209050949350505050565b60015460405163bbe4f6db60e01b81526001600160a01b038581166004830152600092169063bbe4f6db9060240160206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268891906131ae565b90506001600160a01b03811663532f66906126a560086012613998565b6126b090600a61381d565b6126ba908661394a565b6040516001600160e01b031960e084901b16815260048101919091528415156024820152604401600060405180830381600087803b1580156126fb57600080fd5b505af115801561085d573d6000803e3d6000fd5b80158061272357506001600160a01b038216155b1561272d57505050565b60015460405163067aa55560e51b81526001600160a01b038581166004830152600092169063cf54aaa09060240160206040518083038186803b15801561277357600080fd5b505afa158015612787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ab9190613556565b60ff1690506127bc6008600a61381d565b6127c782600a61381d565b6127d1908461394a565b6127db91906137a0565b91506001600160a01b038416612803576127fe6001600160a01b03841683612d75565b612817565b6128176001600160a01b0385168484612e8e565b50505050565b60008082116128575760405162461bcd60e51b815260206004820152600660248201526521707269636560d01b6044820152606401610597565b612862600880613998565b61286d90600a61381d565b610cda908361394a565b600080600088156128d9578688106128af5786612894818a613998565b61289e908861394a565b6128a891906137a0565b905061290e565b866128ba8982613998565b6128c4908861394a565b6128ce91906137a0565b90506001915061290e565b868811156128ec57866128ba818a613998565b866128f78982613998565b612901908861394a565b61290b91906137a0565b90505b61291a8461038461375d565b42106129b557600061292e6008600a61381d565b61293a9061271061394a565b612948906301da9c0061394a565b6129528642613998565b61295c888a61394a565b612966919061394a565b61297091906137a0565b9050821561298957612982818361375d565b91506129b3565b808210156129a65761299b8282613998565b9150600192506129b3565b6129b08183613998565b91505b505b81156129ce576129c7816000196138c5565b92506129d2565b8092505b50509695505050505050565b8015806129f257506001600160a01b038216155b156129fb575050565b60015460405163067aa55560e51b81526001600160a01b038481166004830152600092169063cf54aaa09060240160206040518083038186803b158015612a4157600080fd5b505afa158015612a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a799190613556565b60ff169050612a8a6008600a61381d565b612a9582600a61381d565b612a9f908461394a565b612aa991906137a0565b9150612ac06001600160a01b038416333085612ef1565b505050565b600080600080612ad7898989896125ac565b60008181526008602090815260408083208151606081018352905460ff8116151582526001600160401b0361010082048116838601819052600160481b9092048116838501819052878752600790955292909420805495965090949091600160401b90910416612b595760405162461bcd60e51b8152600401610597906136ab565b60008c815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b909204166060820152612bb98a61281d565b82546060830151919b50600091612bf4918e918e916001600160401b03600160c01b82048116928b9290821691600160801b90910416612877565b6020830151845491925061271091612c1f916001600160401b0390811691600160401b90041661394a565b612c2991906137a0565b612c35906000196138c5565b8113612c8b578254612c5990600160401b90046001600160401b03166000196138c5565b835467ffffffffffffffff60401b19811685556001600160401b038082169750600160401b9091041694509050612d1e565b825484908490600890612caf908490600160401b90046001600160401b03166139af565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550848360000160008282829054906101000a90046001600160401b0316612cf991906139af565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b8254600160401b90046001600160401b0316612d44576000878152600760205260408120555b60009687526008602052604090962080546001600160881b031916905550909c919b50929950975050505050505050565b80471015612dc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e12576040519150601f19603f3d011682016040523d82523d6000602084013e612e17565b606091505b5050905080612ac05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b6040516001600160a01b038316602482015260448101829052612ac090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612f29565b6040516001600160a01b03808516602483015283166044820152606481018290526128179085906323b872dd60e01b90608401612eba565b6000612f7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ffb9092919063ffffffff16565b805190915015612ac05780806020019051810190612f9c9190613381565b612ac05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610597565b606061300a8484600085613014565b90505b9392505050565b6060824710156130755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610597565b843b6130c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b600080866001600160a01b031685876040516130df9190613579565b60006040518083038185875af1925050503d806000811461311c576040519150601f19603f3d011682016040523d82523d6000602084013e613121565b606091505b509150915061313182828661313c565b979650505050505050565b6060831561314b57508161300d565b82511561315b5782518084602001fd5b8160405162461bcd60e51b81526004016105979190613678565b80356001600160401b038116811461318c57600080fd5b919050565b6000602082840312156131a357600080fd5b813561300d81613a76565b6000602082840312156131c057600080fd5b815161300d81613a76565b600080600080608085870312156131e157600080fd5b84356131ec81613a76565b935060208501356131fc81613a76565b925060408501359150606085013561321381613a8e565b939692955090935050565b600080600080600060a0868803121561323657600080fd5b853561324181613a76565b945060208601359350604086013561325881613a76565b9250606086013561326881613a8e565b9150608086013561327881613a8e565b809150509295509295909350565b600080600080600060a0868803121561329e57600080fd5b85356132a981613a76565b94506020860135935060408601356132c081613a76565b925060608601356132d081613a8e565b949793965091946080013592915050565b600080604083850312156132f457600080fd5b82356132ff81613a76565b946020939093013593505050565b6000806020838503121561332057600080fd5b82356001600160401b038082111561333757600080fd5b818501915085601f83011261334b57600080fd5b81358181111561335a57600080fd5b8660208260051b850101111561336f57600080fd5b60209290920196919550909350505050565b60006020828403121561339357600080fd5b815161300d81613a8e565b6000602082840312156133b057600080fd5b5035919050565b6000806000606084860312156133cc57600080fd5b8335925060208401356133de81613a76565b915060408401356133ee81613a8e565b809150509250925092565b6000806000806080858703121561340f57600080fd5b84359350602085013561342181613a76565b9250604085013561343181613a8e565b9396929550929360600135925050565b600080600080600060a0868803121561345957600080fd5b85359450602086013561346b81613a76565b9350604086013561347b81613a8e565b94979396509394606081013594506080013592915050565b60008082840360a08112156134a757600080fd5b833592506080601f19820112156134bd57600080fd5b50604051608081018181106001600160401b03821117156134ee57634e487b7160e01b600052604160045260246000fd5b6040526134fd60208501613175565b815261350b60408501613175565b602082015261351c60608501613175565b604082015261352d60808501613175565b6060820152809150509250929050565b60006020828403121561354f57600080fd5b5051919050565b60006020828403121561356857600080fd5b815160ff8116811461300d57600080fd5b6000825161358b8184602087016139d7565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156135fc576135e98385518051151582526020808201516001600160401b039081169184019190915260409182015116910152565b92840192606092909201916001016135b1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135fc5761366583855180516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b9284019260809290920191600101613624565b60208152600082518060208401526136978160408501602087016139d7565b601f01601f19169190910160400192915050565b60208082526009908201526810b837b9b4ba34b7b760b91b604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b60608101610cda82848051151582526020808201516001600160401b039081169184019190915260409182015116910152565b60808101610cda828480516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b6000821982111561377057613770613a1e565b500190565b60006001600160401b0380831681851680830382111561379757613797613a1e565b01949350505050565b6000826137af576137af613a34565b500490565b60006001600160401b03808416806137ce576137ce613a34565b92169190910492915050565b600181815b808511156138155781600019048211156137fb576137fb613a1e565b8085161561380857918102915b93841c93908002906137df565b509250929050565b600061300d838360008261383357506001610cda565b8161384057506000610cda565b816001811461385657600281146138605761387c565b6001915050610cda565b60ff84111561387157613871613a1e565b50506001821b610cda565b5060208310610133831016604e8410600b841016171561389f575081810a610cda565b6138a983836137da565b80600019048211156138bd576138bd613a1e565b029392505050565b60006001600160ff1b03818413828413808216868404861116156138eb576138eb613a1e565b600160ff1b600087128281168783058912161561390a5761390a613a1e565b6000871292508782058712848416161561392657613926613a1e565b8785058712818416161561393c5761393c613a1e565b505050929093029392505050565b600081600019048311821515161561396457613964613a1e565b500290565b60006001600160401b038083168185168183048111821515161561398f5761398f613a1e565b02949350505050565b6000828210156139aa576139aa613a1e565b500390565b60006001600160401b03838116908316818110156139cf576139cf613a1e565b039392505050565b60005b838110156139f25781810151838201526020016139da565b838111156128175750506000910152565b6000600019821415613a1757613a17613a1e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613a8b57600080fd5b50565b8015158114613a8b57600080fdfea264697066735822122034e563bce6070ea97f58e26ad70dfc74f33012417b36d9f03b57a30d551f288464736f6c63430008070033

Deployed ByteCode Sourcemap

16334:16433:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19249:406;;;;;;;;;;-1:-1:-1;19249:406:0;;;;;:::i;:::-;;:::i;18384:81::-;;;;;;;;;;-1:-1:-1;18384:81:0;;;;;:::i;:::-;;:::i;22736:614::-;;;;;;;;;;-1:-1:-1;22736:614:0;;;;;:::i;:::-;;:::i;26609:1158::-;;;;;;;;;;-1:-1:-1;26609:1158:0;;;;;:::i;:::-;;:::i;32156:286::-;;;;;;;;;;-1:-1:-1;32156:286:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19984:1594;;;;;;:::i;:::-;;:::i;31275:113::-;;;;;;;;;;-1:-1:-1;31275:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31364:19:0;;;;:8;:19;;;;;;;;;31357:26;;;;;;;;;-1:-1:-1;;;;;31357:26:0;;;;;-1:-1:-1;;;31357:26:0;;;;;;;;;;;-1:-1:-1;;;31357:26:0;;;;;;;;;;;-1:-1:-1;;;31357:26:0;;;;;;;;;31275:113;;;;;;;;:::i;31889:262::-;;;;;;;;;;-1:-1:-1;31889:262:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17489:41::-;;;;;;;;;;;;17529:1;17489:41;;;;;23710:25:1;;;23698:2;23683:18;17489:41:0;23564:177:1;27772:829:0;;;;;;;;;;-1:-1:-1;27772:829:0;;;;;:::i;:::-;;:::i;31393:249::-;;;;;;;;;;-1:-1:-1;31393:249:0;;;;;:::i;:::-;;:::i;16993:23::-;;;;;;;;;;-1:-1:-1;16993:23:0;;;;-1:-1:-1;;;;;16993:23:0;;;;;;-1:-1:-1;;;;;8814:32:1;;;8796:51;;8784:2;8769:18;16993:23:0;8650:203:1;23405:2011:0;;;;;;;;;;-1:-1:-1;23405:2011:0;;;;;:::i;:::-;;:::i;17020:21::-;;;;;;;;;;-1:-1:-1;17020:21:0;;;;-1:-1:-1;;;;;17020:21:0;;;18772:472;;;;;;;;;;-1:-1:-1;18772:472:0;;;;;:::i;:::-;;:::i;17047:29::-;;;;;;;;;;;;;;;;16944:20;;;;;;;;;;-1:-1:-1;16944:20:0;;;;-1:-1:-1;;;;;16944:20:0;;;18636:131;;;;;;;;;;-1:-1:-1;18636:131:0;;;;;:::i;:::-;;:::i;19675:304::-;;;;;;;;;;-1:-1:-1;19675:304:0;;;;;:::i;:::-;;:::i;17534:48::-;;;;;;;;;;;;;:::i;17095:31::-;;;;;;;;;;;;;;;;18470:161;;;;;;;;;;-1:-1:-1;18470:161:0;;;;;:::i;:::-;;:::i;32447:135::-;;;;;;;;;;-1:-1:-1;32447:135:0;;;;;:::i;:::-;;:::i;31647:237::-;;;;;;;;;;-1:-1:-1;31647:237:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16968:21::-;;;;;;;;;;-1:-1:-1;16968:21:0;;;;-1:-1:-1;;;;;16968:21:0;;;21583:1148;;;;;;:::i;:::-;;:::i;19249:406::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;;;;;;;;;19342:23:::1;19368:19:::0;;;:8:::1;:19;::::0;;;;19402:28;;-1:-1:-1;;;19402:28:0;::::1;-1:-1:-1::0;;;;;19402:28:0::1;19394:68;;;::::0;-1:-1:-1;;;19394:68:0;;18861:2:1;19394:68:0::1;::::0;::::1;18843:21:1::0;18900:2;18880:18;;;18873:30;18939:25;18919:18;;;18912:53;18982:18;;19394:68:0::1;18659:347:1::0;19394:68:0::1;19491:20:::0;;19469:42;;19530:12:::1;::::0;::::1;::::0;19566:17:::1;::::0;::::1;::::0;19619:29:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;19588:60:0;;::::1;-1:-1:-1::0;;;19588:60:0::1;-1:-1:-1::0;;;;19547:36:0;;::::1;-1:-1:-1::0;;;19547:36:0::1;19588:60:::0;;;;;19516:26;;::::1;-1:-1:-1::0;;;19516:26:0::1;-1:-1:-1::0;;19516:26:0;;;19469:42;;;::::1;19516:26:::0;;;;::::1;19588:60:::0;;;;;::::1;::::0;;-1:-1:-1;19249:406:0:o;18384:81::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;18444:5:::1;:16:::0;;-1:-1:-1;;;;;;18444:16:0::1;-1:-1:-1::0;;;;;18444:16:0;;;::::1;::::0;;;::::1;::::0;;18384:81::o;22736:614::-;22836:11;22850:56;22866:10;22878:9;22889:8;22899:6;22850:15;:56::i;:::-;22913:18;22934:11;;;:6;:11;;;;;;;;;22913:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22913:32:0;;;;;;;;;;;-1:-1:-1;;;22913:32:0;;;;;;;;;;;22836:70;;-1:-1:-1;22913:32:0;22950:34;;;;-1:-1:-1;;;22950:34:0;;16323:2:1;22950:34:0;;;16305:21:1;16362:1;16342:18;;;16335:29;-1:-1:-1;;;16380:18:1;;;16373:37;16427:18;;22950:34:0;16121:330:1;22950:34:0;22991:22;23016:19;;;:8;:19;;;;;;;;22991:44;;;;;;;;;-1:-1:-1;;;;;22991:44:0;;;;;-1:-1:-1;;;22991:44:0;;;;;;;;-1:-1:-1;;;22991:44:0;;;;;;;;;;-1:-1:-1;;;22991:44:0;;;;;;;;23054:10;;;;22991:44;;:22;23081:5;;23054:24;;;:::i;:::-;:32;;;;:::i;:::-;23100:11;;;;:6;:11;;;;;23093:18;;-1:-1:-1;;;;;;23093:18:0;;;23181:13;;-1:-1:-1;;;;;23040:46:0;;;;;-1:-1:-1;23040:46:0;;23176:114;;23202:47;23222:8;23232:5;:10;;;-1:-1:-1;;;;;23202:47:0;23244:4;23202:19;:47::i;:::-;23272:12;;;;23255:29;;-1:-1:-1;;;;;23255:29:0;;;:::i;:::-;;;23176:114;23294:49;23307:8;23317:10;23329:13;23294:12;:49::i;:::-;22829:521;;;;;22736:614;;;:::o;26609:1158::-;32653:6;;-1:-1:-1;;;;;32653:6:0;32639:10;:20;32631:40;;;;-1:-1:-1;;;32631:40:0;;15314:2:1;32631:40:0;;;15296:21:1;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15371:18:1;;;15364:37;15418:18;;32631:40:0;15112:330:1;32631:40:0;26761:11:::1;26775:50;26791:4;26797:9;26808:8;26818:6;26775:15;:50::i;:::-;26832:24;26859:14:::0;;;:9:::1;:14;::::0;;;;;;;;26832:41;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;26832:41:0;;::::1;::::0;;-1:-1:-1;;;26832:41:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;26832:41:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;26832:41:0;::::1;::::0;;::::1;::::0;;;;26761:64;;-1:-1:-1;26832:41:0;26884:20;;:42:::1;;-1:-1:-1::0;26908:13:0;;-1:-1:-1;;;;;26908:18:0::1;::::0;26884:42:::1;26880:66;;;26934:7;;;;26880:66;26952:23;26978:19:::0;;;:8:::1;:19;::::0;;;;27012:21:::1;27027:5:::0;27012:14:::1;:21::i;:::-;27004:29;;27040:10;27053:91;27061:6;27069:5;27076:8;:14;;;-1:-1:-1::0;;;;;27053:91:0::1;27092:8;:13;;;-1:-1:-1::0;;;;;27053:91:0::1;27107:7;:16;;;;;;;;;;-1:-1:-1::0;;;;;27107:16:0::1;-1:-1:-1::0;;;;;27053:91:0::1;27125:8;:18;;;-1:-1:-1::0;;;;;27053:91:0::1;:7;:91::i;:::-;27040:104;;27151:17;27220:5;27189:7;:28;;;;;;;;;;-1:-1:-1::0;;;;;27189:28:0::1;27171:8;:15;;;:46;;;;:::i;:::-;:54;;;;:::i;:::-;-1:-1:-1::0;;;;;27151:74:0::1;::::0;-1:-1:-1;27243:22:0::1;27151:74:::0;-1:-1:-1;;27243:22:0::1;:::i;:::-;27236:3;:29;27232:529;;27275:11;27307:9;27289:8;:15;;;-1:-1:-1::0;;;;;27289:27:0::1;;;;;:::i;:::-;27345:6;::::0;27337:33:::1;::::0;-1:-1:-1;;;27337:33:0;;-1:-1:-1;;;;;8814:32:1;;;27337:33:0::1;::::0;::::1;8796:51:1::0;27275:41:0;;-1:-1:-1;27322:12:0::1;::::0;27345:6;;::::1;::::0;27337:23:::1;::::0;8769:18:1;;27337:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27322:48;;27378:39;27391:8;27401:4;27407:9;27378:12;:39::i;:::-;27423:50;27443:8;27453;:13;;;-1:-1:-1::0;;;;;27423:50:0::1;27468:4;27423:19;:50::i;:::-;-1:-1:-1::0;;;;;27479:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;:28;;27504:3;;27479:21;:28:::1;::::0;27504:3;;27479:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;27618:15:0::1;::::0;::::1;::::0;27640:13;;27562:9;;-1:-1:-1;;;;;27520:204:0;::::1;::::0;27540:3;;27520:204:::1;::::0;27578:8;;27593:6;;27606:5;;27618:15;27660:3;27670:37:::1;-1:-1:-1::0;;;;;27682:24:0;::::1;-1:-1:-1::0;;27670:37:0::1;:::i;:::-;27520:204;::::0;;-1:-1:-1;;;;;10825:32:1;;;10807:51;;10901:14;;10894:22;10889:2;10874:18;;10867:50;10933:18;;;10926:34;;;;-1:-1:-1;;;;;11033:15:1;;;11028:2;11013:18;;11006:43;11086:15;11080:3;11065:19;;11058:44;10845:3;11118:19;;11111:35;11177:3;11162:19;;11155:35;27714:4:0::1;11221:3:1::0;11206:19;;11199:51;10794:3;10779:19;27520:204:0::1;;;;;;;-1:-1:-1::0;;27739:14:0::1;::::0;;;:9:::1;:14;::::0;;;;27732:21;27232:529:::1;26754:1013;;;;;32676:1;26609:1158:::0;;;;;:::o;32156:286::-;32225:28;32277:4;;-1:-1:-1;;;;;32306:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32306:22:0;;-1:-1:-1;;32306:22:0;;;;;;;;;;;;32293:35;;32338:9;32333:83;32357:6;32353:1;:10;32333:83;;;32392:9;:18;32402:4;;32407:1;32402:7;;;;;;;:::i;:::-;;;;;;;;;;32392:18;;-1:-1:-1;32392:18:0;;;;;;;;;;;-1:-1:-1;32392:18:0;32376:34;;;;;;;;;-1:-1:-1;;;;;32376:34:0;;;;;-1:-1:-1;;;32376:34:0;;;;;;;;;;;-1:-1:-1;;;32376:34:0;;;;;;;;;;;-1:-1:-1;;;32376:34:0;;;;;;;;;;:13;;:10;;32387:1;;32376:13;;;;;;:::i;:::-;;;;;;:34;;;;32365:3;;;;;:::i;:::-;;;;32333:83;;;;32420:17;32156:286;;;;;:::o;19984:1594::-;-1:-1:-1;;;;;20132:22:0;;20128:193;;20211:18;17529:1;20211:2;:18;:::i;:::-;20206:24;;:2;:24;:::i;:::-;20194:36;;:9;:36;:::i;:::-;20185:45;;20128:193;;;20264:6;;20256:45;;-1:-1:-1;;;20256:45:0;;-1:-1:-1;;;;;8814:32:1;;;20256:45:0;;;8796:51:1;20264:6:0;;;;20256:35;;8769:18:1;;20256:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20248:67;;;;-1:-1:-1;;;20248:67:0;;17850:2:1;20248:67:0;;;17832:21:1;17889:1;17869:18;;;17862:29;-1:-1:-1;;;17907:18:1;;;17900:39;17956:18;;20248:67:0;17648:332:1;20248:67:0;20363:1;20354:6;:10;:39;;;;-1:-1:-1;;;;;;20368:25:0;;20354:39;20346:59;;;;-1:-1:-1;;;20346:59:0;;19213:2:1;20346:59:0;;;19195:21:1;19252:1;19232:18;;;19225:29;-1:-1:-1;;;19270:18:1;;;19263:37;19317:18;;20346:59:0;19011:330:1;20346:59:0;20425:1;20418:4;:8;:35;;;;-1:-1:-1;;;;;;20430:23:0;;20418:35;20410:53;;;;-1:-1:-1;;;20410:53:0;;18187:2:1;20410:53:0;;;18169:21:1;18226:1;18206:18;;;18199:29;-1:-1:-1;;;18244:18:1;;;18237:35;18289:18;;20410:53:0;17985:328:1;20410:53:0;20470:11;20484:56;20500:10;20512:9;20523:8;20533:6;20484:15;:56::i;:::-;20547:18;20568:11;;;:6;:11;;;;;;;;;20547:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20547:32:0;;;;;;;;;;;-1:-1:-1;;;20547:32:0;;;;;;;;;;;20470:70;;-1:-1:-1;20547:32:0;20592:15;20584:34;;;;-1:-1:-1;;;20584:34:0;;22685:2:1;20584:34:0;;;22667:21:1;22724:1;22704:18;;;22697:29;-1:-1:-1;;;22742:18:1;;;22735:36;22788:18;;20584:34:0;22483:329:1;20584:34:0;20643:22;20668:19;;;:8;:19;;;;;;;;20643:44;;;;;;;;;-1:-1:-1;;;;;20643:44:0;;;;;-1:-1:-1;;;20643:44:0;;;;;;;;;;;-1:-1:-1;;;20643:44:0;;;;;;;;;;-1:-1:-1;;;20643:44:0;;;;;;;;;;;:22;20727:5;;20706:18;;:4;:18;:::i;:::-;:26;;;;:::i;:::-;20692:40;-1:-1:-1;;;;;;20743:22:0;;20739:148;;20790:3;20781:6;:12;20773:36;;;;-1:-1:-1;;;20773:36:0;;14974:2:1;20773:36:0;;;14956:21:1;15013:2;14993:18;;;14986:30;-1:-1:-1;;;15032:18:1;;;15025:41;15083:18;;20773:36:0;14772:335:1;20773:36:0;20815:13;20825:3;20815:13;;:::i;:::-;;;20739:148;;;20846:35;20858:8;20868:12;20877:3;20868:6;:12;:::i;:::-;20846:11;:35::i;:::-;-1:-1:-1;;;;;20911:19:0;;;;;;:9;:19;;;;;;20901:29;;;20893:53;;;;-1:-1:-1;;;20893:53:0;;19548:2:1;20893:53:0;;;19530:21:1;19587:2;19567:18;;;19560:30;-1:-1:-1;;;19606:18:1;;;19599:41;19657:18;;20893:53:0;19346:335:1;20893:53:0;20953:16;20986:6;20979:4;17565:17;17529:1;17565:2;:17;:::i;:::-;20972:11;;;;:::i;:::-;:20;;;;:::i;:::-;20953:39;-1:-1:-1;17565:17:0;17529:1;17565:2;:17;:::i;:::-;21005:8;:16;;20997:38;;;;-1:-1:-1;;;20997:38:0;;20232:2:1;20997:38:0;;;20214:21:1;20271:1;20251:18;;;20244:29;-1:-1:-1;;;20289:18:1;;;20282:39;20338:18;;20997:38:0;20030:332:1;20997:38:0;21060:19;;-1:-1:-1;;;;;21048:31:0;;;;21040:57;;;;-1:-1:-1;;;21040:57:0;;21598:2:1;21040:57:0;;;21580:21:1;21637:2;21617:18;;;21610:30;-1:-1:-1;;;21656:18:1;;;21649:43;21709:18;;21040:57:0;21396:337:1;21040:57:0;21143:42;21163:8;21173:4;21179:5;21143:19;:42::i;:::-;21213:6;;21205:33;;-1:-1:-1;;;21205:33:0;;-1:-1:-1;;;;;8814:32:1;;;21205:33:0;;;8796:51:1;21190:12:0;;21213:6;;21205:23;;8769:18:1;;21205:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21190:48;;21243:19;21271:4;-1:-1:-1;;;;;21265:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21243:50;;21320:5;21306:11;:19;21298:44;;;;-1:-1:-1;;;21298:44:0;;18520:2:1;21298:44:0;;;18502:21:1;18559:2;18539:18;;;18532:30;-1:-1:-1;;;18578:18:1;;;18571:42;18630:18;;21298:44:0;18318:336:1;21298:44:0;21363:84;;;;;;;;21384:5;21363:84;;;;;;21408:4;-1:-1:-1;;;;;21363:84:0;;;;;21434:6;-1:-1:-1;;;;;21363:84:0;;;;21349:6;:11;21356:3;21349:11;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21349:98:0;;;;;-1:-1:-1;;;;;21349:98:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21349:98:0;;;;;-1:-1:-1;;;;;21349:98:0;;;;;;;;;21498:9;21482:10;-1:-1:-1;;;;;21459:112:0;21473:3;21459:112;21513:8;21527:6;21539;21551:4;21561:5;21459:112;;;;;;;;;-1:-1:-1;;;;;9503:32:1;;;;9485:51;;9579:14;;9572:22;9567:2;9552:18;;9545:50;9626:2;9611:18;;9604:34;;;;9669:2;9654:18;;9647:34;9725:14;9718:22;9712:3;9697:19;;9690:51;9472:3;9457:19;;9238:509;21459:112:0;;;;;;;;20121:1457;;;;;;;19984:1594;;;;;:::o;31889:262::-;31955:22;32001:4;;-1:-1:-1;;;;;32027:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;32027:19:0;;-1:-1:-1;;32027:19:0;;;;;;;;;;;;32017:29;;32056:9;32051:77;32075:6;32071:1;:10;32051:77;;;32107:6;:15;32114:4;;32119:1;32114:7;;;;;;;:::i;:::-;;;;;;;;;;32107:15;;-1:-1:-1;32107:15:0;;;;;;;;;;;-1:-1:-1;32107:15:0;32094:28;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32094:28:0;;;;;;;;;;;;-1:-1:-1;;;32094:28:0;;;;;;;;;:10;;:7;;32102:1;;32094:10;;;;;;:::i;:::-;;;;;;:28;;;;32083:3;;;;;:::i;:::-;;;;32051:77;;27772:829;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;27922:11:::1;27936:50;27952:4;27958:9;27969:8;27979:6;27936:15;:50::i;:::-;27993:25;28021:14:::0;;;:9:::1;:14;::::0;;;;28048:15;;28021:14;;-1:-1:-1;28021:14:0;-1:-1:-1;;;28048:15:0;::::1;-1:-1:-1::0;;;;;28048:15:0::1;28040:41;;;;-1:-1:-1::0;;;28040:41:0::1;;;;;;;:::i;:::-;28105:15:::0;;28132:155:::1;::::0;;-1:-1:-1;;;;;11623:32:1;;;11605:51;;11699:14;;11692:22;11687:2;11672:18;;11665:50;-1:-1:-1;;;28212:14:0;::::1;-1:-1:-1::0;;;;;28212:14:0;;::::1;11768:18:1::0;;;11761:43;-1:-1:-1;;;28105:15:0;::::1;::::0;::::1;11835:2:1::0;11820:18;;11813:34;;;28244:13:0;::::1;11878:3:1::0;11863:19;;11856:44;-1:-1:-1;11643:3:1;11916:19;;11909:35;;;11975:3;11960:19;;11953:35;;;12019:3;12004:19;;11997:51;28132:155:0;;28171:9;;28132:155;::::1;::::0;28151:3;;28132:155:::1;::::0;;;;11592:3:1;28132:155:0;;::::1;28301:11;::::0;;;:6:::1;:11;::::0;;;;28294:18;;-1:-1:-1;;;;;;28294:18:0;;;28319:146;::::1;;;28341:22;28366:19:::0;;;:8:::1;:19;::::0;;;;;;;28341:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;28341:44:0;;::::1;::::0;;-1:-1:-1;;;28341:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;28341:44:0;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;28341:44:0;::::1;::::0;::::1;::::0;;;;28405:13;;28341:44;;:22;28435:5:::1;::::0;28405:27:::1;::::0;28341:44;;28405:13:::1;:27;:::i;:::-;:35;;;;:::i;:::-;-1:-1:-1::0;;;;;28391:49:0::1;::::0;-1:-1:-1;28446:13:0::1;28391:49:::0;28446:13;::::1;:::i;:::-;;;28335:130;;28319:146;28501:13:::0;;28471:50:::1;::::0;28491:8;;-1:-1:-1;;;;;28501:13:0::1;::::0;28471:19:::1;:50::i;:::-;28537:14;::::0;;;:9:::1;:14;::::0;;;;28530:21;28558:36:::1;28571:8:::0;28581:4;28587:6;28558:12:::1;:36::i;31393:249::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31561:50:0;31577:4;31583:9;31594:8;31604:6;31561:15;:50::i;:::-;31623:14;;;;:9;:14;;;;;;;;;31616:21;;;;;;;;;-1:-1:-1;;;;;31616:21:0;;;;;-1:-1:-1;;;31616:21:0;;;;;;;;;;;-1:-1:-1;;;31616:21:0;;;;;;;;;;;-1:-1:-1;;;31616:21:0;;;;;;;;;31393:249;-1:-1:-1;;;;;;31393:249:0:o;23405:2011::-;32653:6;;-1:-1:-1;;;;;32653:6:0;32639:10;:20;32631:40;;;;-1:-1:-1;;;32631:40:0;;15314:2:1;32631:40:0;;;15296:21:1;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15371:18:1;;;15364:37;15418:18;;32631:40:0;15112:330:1;32631:40:0;23551:11:::1;23565:50;23581:4;23587:9;23598:8;23608:6;23565:15;:50::i;:::-;23622:19;23644:11:::0;;;:6:::1;:11;::::0;;;;23668:10;;23644:11;;-1:-1:-1;23644:11:0;23668:10:::1;::::0;::::1;-1:-1:-1::0;;;;;23668:10:0::1;23660:34;;;::::0;-1:-1:-1;;;23660:34:0;;16323:2:1;23660:34:0::1;::::0;::::1;16305:21:1::0;16362:1;16342:18;;;16335:29;-1:-1:-1;;;16380:18:1;;;16373:37;16427:18;;23660:34:0::1;16121:330:1::0;23660:34:0::1;23711:22;23736:19:::0;;;:8:::1;:19;::::0;;;;;;;23711:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;23711:44:0;;::::1;::::0;;-1:-1:-1;;;23711:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;23711:44:0;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;23711:44:0;::::1;::::0;::::1;::::0;;;;23774:10;;23711:44;;:22;23801:5:::1;::::0;23774:24:::1;::::0;23711:44;;::::1;23774:10:::0;;::::1;;:24;:::i;:::-;:32;;;;:::i;:::-;-1:-1:-1::0;;;;;23760:46:0::1;;;23836:3;23811:11;:21;23823:8;-1:-1:-1::0;;;;;23811:21:0::1;-1:-1:-1::0;;;;;23811:21:0::1;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;23850:13:0;;::::1;;23846:1564;;;23884:14;23900:12:::0;23914:10:::1;23928:59;23946:4;23952:9;23963:8;23973:6;23981:5;23928:17;:59::i;:::-;24019:6;::::0;24011:33:::1;::::0;-1:-1:-1;;;24011:33:0;;-1:-1:-1;;;;;8814:32:1;;;24011:33:0::1;::::0;::::1;8796:51:1::0;23883:104:0;;-1:-1:-1;23883:104:0;;-1:-1:-1;23883:104:0;;-1:-1:-1;23996:12:0::1;::::0;24019:6:::1;::::0;24011:23:::1;::::0;8769:18:1;;24011:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23996:48;;24063:1;24057:3;:7;24053:378;;;24083:19;24113:8;24118:3:::0;-1:-1:-1;;24113:8:0::1;:::i;:::-;24083:39;;24131:41;24144:8;24154:4;24160:11;24131:12;:41::i;:::-;24199:6;24185:11;:20;24181:96;;;24217:50;24230:8:::0;24240:4;24246:20:::1;24255:11:::0;24246:6;:20:::1;:::i;:::-;24217:12;:50::i;:::-;24074:211;24053:378;;;-1:-1:-1::0;;;;;24306:28:0;::::1;;24335:4:::0;24361:16:::1;17529:1;24361:2;:16;:::i;:::-;24356:22;::::0;:2:::1;:22;:::i;:::-;24341:37;::::0;24349:3;24341:37:::1;:::i;:::-;24306:73;::::0;-1:-1:-1;;;;;;24306:73:0::1;::::0;;;;;;-1:-1:-1;;;;;12888:32:1;;;24306:73:0::1;::::0;::::1;12870:51:1::0;12937:18;;;12930:34;12843:18;;24306:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24387:36;24400:8;24410:4;24416:6;24387:12;:36::i;:::-;24439:41;24459:8;24469:4;24475;24439:19;:41::i;:::-;24494:165;::::0;;-1:-1:-1;;;;;10099:32:1;;;10081:51;;10175:14;;10168:22;10163:2;10148:18;;10141:50;10207:18;;;10200:34;;;10265:2;10250:18;;10243:34;;;10308:3;10293:19;;10286:35;;;10119:3;10337:19;;10330:35;;;10396:3;10381:19;;10374:35;;;24647:5:0::1;10440:3:1::0;10425:19;;10418:51;24539:9:0;;24494:165;::::1;::::0;24515:3;;24494:165:::1;::::0;10068:3:1;10053:19;24494:165:0::1;;;;;;;23876:792;;;;23846:1564;;;24739:21;24754:5;24739:14;:21::i;:::-;24768:25;24796:14:::0;;;:9:::1;:14;::::0;;;;24967:10;;24942:13;;24731:29;;-1:-1:-1;24796:14:0;;24934:44:::1;::::0;-1:-1:-1;;;;;24967:10:0::1;::::0;;::::1;::::0;::::1;::::0;24942:13:::1;24934:44;:::i;:::-;24901:10:::0;;24893:36:::1;::::0;24923:5;;24901:10:::1;::::0;::::1;-1:-1:-1::0;;;;;24901:10:0::1;24893:36;:::i;:::-;24875:14:::0;;24842:48:::1;::::0;-1:-1:-1;;;;;;;;24875:14:0;::::1;::::0;::::1;::::0;24850:13:::1;24842:48;:::i;:::-;:87;;;;:::i;:::-;24841:138;;;;:::i;:::-;24991:18:::0;;24818:161;;-1:-1:-1;;;;24991:18:0;::::1;-1:-1:-1::0;;;;;24991:18:0::1;24987:87;;25023:44:::0;;-1:-1:-1;;;;25023:44:0::1;-1:-1:-1::0;;;25051:15:0::1;-1:-1:-1::0;;;;;25023:44:0::1;;;::::0;;24987:87:::1;25105:10:::0;;25081:35;;-1:-1:-1;;;;;25105:10:0::1;::::0;;::::1;::::0;::::1;::::0;25081:8;;25105:10:::1;::::0;25081:35:::1;::::0;25105:10;;25081:35:::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;25081:35:0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;25148:12;;25122:39;;-1:-1:-1;;;25148:12:0;;::::1;::::0;::::1;::::0;-1:-1:-1;25122:39:0;;:15:::1;::::0;:39:::1;::::0;25148:12;;-1:-1:-1;;;25122:39:0;::::1;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;25122:39:0::1;;;;;-1:-1:-1::0;;;;;25122:39:0::1;;;;;;25191:12;25167:8;:14;;;:37;;;;;-1:-1:-1::0;;;;;25167:37:0::1;;;;;-1:-1:-1::0;;;;;25167:37:0::1;;;;;;25219:6;:11;25226:3;25219:11;;;;;;;;;;;;25212:18:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25212:18:0::1;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25212:18:0::1;;;;;;;25286:9;25275:4;-1:-1:-1::0;;;;;25243:159:0::1;25265:3;25243:159;25302:8;25317:6;25330:8;:15;;;;;;;;;;-1:-1:-1::0;;;;;25330:15:0::1;25352:8;:13;;;;;;;;;;-1:-1:-1::0;;;;;25352:13:0::1;25372:8;:14;;;;;;;;;;-1:-1:-1::0;;;;;25372:14:0::1;25393:3;25243:159;;;;;;;;;;-1:-1:-1::0;;;;;12355:32:1;;;;12337:51;;12431:14;;12424:22;12419:2;12404:18;;12397:50;-1:-1:-1;;;;;12520:15:1;;;12515:2;12500:18;;12493:43;12572:15;;;12567:2;12552:18;;12545:43;12625:15;12619:3;12604:19;;12597:44;12375:3;12657:19;;12650:35;12324:3;12309:19;;12059:632;25243:159:0::1;;;;;;;;24681:729;;23846:1564;23544:1872;;;;23405:2011:::0;;;;;:::o;18772:472::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;18864:22:::1;18889:19:::0;;;:8:::1;:19;::::0;;;;;;;;18864:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;18864:44:0;;::::1;::::0;;-1:-1:-1;;;18864:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;18864:44:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;18864:44:0;::::1;::::0;;::::1;::::0;;;;18925:33;18917:61:::1;;;::::0;-1:-1:-1;;;18917:61:0;;19888:2:1;18917:61:0::1;::::0;::::1;19870:21:1::0;19927:2;19907:18;;;19900:30;-1:-1:-1;;;19946:18:1;;;19939:45;20001:18;;18917:61:0::1;19686:339:1::0;18917:61:0::1;19023:1;18991:8;:29;;;-1:-1:-1::0;;;;;18991:33:0::1;;18983:59;;;::::0;-1:-1:-1;;;18983:59:0;;15981:2:1;18983:59:0::1;::::0;::::1;15963:21:1::0;16020:2;16000:18;;;15993:30;-1:-1:-1;;;16039:18:1;;;16032:43;16092:18;;18983:59:0::1;15779:337:1::0;18983:59:0::1;-1:-1:-1::0;19071:166:0::1;::::0;;::::1;::::0;::::1;::::0;;19098:20;;-1:-1:-1;;;;;19071:166:0;;::::1;::::0;;::::1;19202:29:::0;;::::1;::::0;19071:166;::::1;::::0;;::::1;::::0;;;19129:12;;::::1;::::0;19071:166;::::1;::::0;;;;;;;19157:17;;::::1;::::0;19071:166;::::1;::::0;;;;;;-1:-1:-1;19049:19:0;;;:8:::1;:19:::0;;;;;;;:188;;;;;;;;;;;::::1;-1:-1:-1::0;;;19049:188:0::1;-1:-1:-1::0;;;;;19049:188:0;;::::1;-1:-1:-1::0;;;19049:188:0::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;19049:188:0::1;-1:-1:-1::0;;19049:188:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;18772:472::o;18636:131::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18730:19:0;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:32;18636:131::o;19675:304::-;-1:-1:-1;;;;;19752:21:0;;19731:18;19752:21;;;:11;:21;;;;;;19782:14;;19778:197;;-1:-1:-1;;;;;19804:21:0;;;19828:1;19804:21;;;:11;:21;;;;;:25;19858:8;;19835:44;;19816:8;;19858;19868:10;19835:12;:44::i;:::-;19895:8;;-1:-1:-1;;;;;19895:8:0;19885:37;19923:8;19951:16;17529:1;19951:2;:16;:::i;:::-;19946:22;;:2;:22;:::i;:::-;19933:35;;:10;:35;:::i;:::-;19885:84;;-1:-1:-1;;;;;;19885:84:0;;;;;;;-1:-1:-1;;;;;12888:32:1;;;19885:84:0;;;12870:51:1;12937:18;;;12930:34;12843:18;;19885:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19778:197;19726:253;19675:304;:::o;17534:48::-;17565:17;17529:1;17565:2;:17;:::i;:::-;17534:48;:::o;18470:161::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;18530:6:::1;:16:::0;;-1:-1:-1;;;;;;18530:16:0::1;-1:-1:-1::0;;;;;18530:16:0;::::1;::::0;;::::1;::::0;;;18562:26:::1;::::0;;-1:-1:-1;;;18562:26:0;;;;:24:::1;::::0;:26:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;18530:16;18562:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18551:8;:37:::0;;-1:-1:-1;;;;;;18551:37:0::1;-1:-1:-1::0;;;;;18551:37:0;;::::1;;::::0;;-1:-1:-1;18610:6:0;18602:24:::1;::::0;;-1:-1:-1;;;18602:24:0;;;;18610:6;;;::::1;::::0;18602:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;18610:6;18602:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18593:6;:33:::0;;-1:-1:-1;;;;;;18593:33:0::1;-1:-1:-1::0;;;;;18593:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;18470:161:0:o;32447:135::-;32510:7;32560:16;17529:1;32560:2;:16;:::i;:::-;32555:22;;:2;:22;:::i;:::-;-1:-1:-1;;;;;32531:21:0;;;;;;:11;:21;;;;;;:46;;;;:::i;31647:237::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31806:50:0;31822:4;31828:9;31839:8;31849:6;31806:15;:50::i;:::-;31868:11;;;;:6;:11;;;;;;;;;31861:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31861:18:0;;;;;;;;;;;;-1:-1:-1;;;31861:18:0;;;;;;;;;;;;;-1:-1:-1;;31647:237:0;;;;;;:::o;21583:1148::-;21728:1;21721:4;:8;21713:26;;;;-1:-1:-1;;;21713:26:0;;18187:2:1;21713:26:0;;;18169:21:1;18226:1;18206:18;;;18199:29;-1:-1:-1;;;18244:18:1;;;18237:35;18289:18;;21713:26:0;17985:328:1;21713:26:0;21746:11;21760:56;21776:10;21788:9;21799:8;21809:6;21760:15;:56::i;:::-;21823:18;21844:11;;;:6;:11;;;;;;;;;21823:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21823:32:0;;;;;;;;;;;-1:-1:-1;;;21823:32:0;;;;;;;;;;;21746:70;;-1:-1:-1;21823:32:0;21868:15;21860:34;;;;-1:-1:-1;;;21860:34:0;;22685:2:1;21860:34:0;;;22667:21:1;22724:1;22704:18;;;22697:29;-1:-1:-1;;;22742:18:1;;;22735:36;22788:18;;21860:34:0;22483:329:1;21860:34:0;21940:25;21968:14;;;:9;:14;;;;;21995:15;;-1:-1:-1;;;21995:15:0;;-1:-1:-1;;;;;21995:15:0;21987:41;;;;-1:-1:-1;;;21987:41:0;;;;;;;:::i;:::-;22046:13;;-1:-1:-1;;;;;22046:13:0;22039:20;;22035:58;;;22074:13;;-1:-1:-1;;;;;22074:13:0;;-1:-1:-1;22035:58:0;22099:22;22124:19;;;:8;:19;;;;;;;;22099:44;;;;;;;;;-1:-1:-1;;;;;22099:44:0;;;;;-1:-1:-1;;;22099:44:0;;;;;;;;;;;-1:-1:-1;;;22099:44:0;;;;;;;;;;-1:-1:-1;;;22099:44:0;;;;;;;;;;;:22;22183:5;;22162:18;;:4;:18;:::i;:::-;:26;;;;:::i;:::-;22148:40;-1:-1:-1;;;;;;22199:22:0;;22195:223;;22229:17;22260:16;17529:1;22260:2;:16;:::i;:::-;22255:22;;:2;:22;:::i;:::-;22249:28;;:3;:28;:::i;:::-;22229:48;;22304:9;22291;:22;;:68;;;;-1:-1:-1;22354:5:0;22330:23;:9;22343;22330:23;:::i;:::-;:29;;;;:::i;:::-;22317:9;:42;;22291:68;22283:85;;;;-1:-1:-1;;;22283:85:0;;;;;;15649:2:1;15631:21;;;15688:1;15668:18;;;15661:29;-1:-1:-1;;;15721:2:1;15706:18;;15699:34;15765:2;15750:18;;15447:327;22283:85:0;22223:151;22195:223;;;22386:26;22398:8;22408:3;22386:11;:26::i;:::-;22483:13;;22424:14;;-1:-1:-1;;;;;22483:13:0;;;;22441:31;;-1:-1:-1;;;22456:15:0;;;;22441:4;:31;:::i;:::-;:56;;;;:::i;:::-;22518:83;;;;;;;;;22539:4;22518:83;;;-1:-1:-1;;;;;22518:83:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;22504:11:0;;;:6;:11;;;;;:97;;;;;;;;-1:-1:-1;;22504:97:0;;;;;;-1:-1:-1;;22504:97:0;;;;;;;;;;;-1:-1:-1;;22504:97:0;-1:-1:-1;;;22504:97:0;;;;;;;;;;;;;;;22613:111;;-1:-1:-1;;;;;9503:32:1;;9485:51;;9579:14;;9572:22;9552:18;;;9545:50;;;;9611:18;;;9604:34;;;9654:18;;9647:34;;;9712:3;9697:19;;9690:51;;;;22518:83:0;;-1:-1:-1;22652:9:0;;22636:10;;22504:11;;22613:111;;9472:3:1;9457:19;22613:111:0;;;;;;;21706:1025;;;;;;21583:1148;;;;:::o;28717:209::-;28866:51;;-1:-1:-1;;7950:2:1;7946:15;;;7942:24;;28866:51:0;;;7930:37:1;7983:12;;;7976:28;;;8038:15;;;8034:24;8020:12;;;8013:46;8105:14;;8098:22;8093:3;8089:32;8075:12;;;8068:54;28829:7:0;;8138:12:1;;28866:51:0;;;;;;;;;;;;28856:62;;;;;;28849:69;;28717:209;;;;;;:::o;28931:229::-;29048:6;;29040:33;;-1:-1:-1;;;29040:33:0;;-1:-1:-1;;;;;8814:32:1;;;29040:33:0;;;8796:51:1;29025:12:0;;29048:6;;29040:23;;8769:18:1;;29040:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29025:48;-1:-1:-1;;;;;;29078:30:0;;;29123:18;17529:1;29123:2;:18;:::i;:::-;29118:24;;:2;:24;:::i;:::-;29109:33;;:6;:33;:::i;:::-;29078:77;;-1:-1:-1;;;;;;29078:77:0;;;;;;;;;;23914:25:1;;;;23982:14;;23975:22;23955:18;;;23948:50;23887:18;;29078:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29508:404;29594:11;;;:31;;-1:-1:-1;;;;;;29609:16:0;;;29594:31;29590:44;;;29508:404;;;:::o;29590:44::-;29687:6;;29679:37;;-1:-1:-1;;;29679:37:0;;-1:-1:-1;;;;;8814:32:1;;;29679:37:0;;;8796:51:1;29660:16:0;;29687:6;;29679:27;;8769:18:1;;29679:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29660:56;;;-1:-1:-1;29757:17:0;17529:1;29757:2;:17;:::i;:::-;29740:12;29744:8;29740:2;:12;:::i;:::-;29730:23;;:6;:23;:::i;:::-;:45;;;;:::i;:::-;29721:54;-1:-1:-1;;;;;;29784:22:0;;29780:128;;29814:29;-1:-1:-1;;;;;29814:21:0;;29836:6;29814:21;:29::i;:::-;29780:128;;;29861:41;-1:-1:-1;;;;;29861:29:0;;29891:2;29895:6;29861:29;:41::i;:::-;29585:327;29508:404;;;:::o;29917:185::-;29999:7;30029:1;30021:5;:9;30013:28;;;;-1:-1:-1;;;30013:28:0;;21264:2:1;30013:28:0;;;21246:21:1;21303:1;21283:18;;;21276:29;-1:-1:-1;;;21321:18:1;;;21314:36;21367:18;;30013:28:0;21062:329:1;30013:28:0;30066:30;17629:1;;30066:30;:::i;:::-;30061:36;;:2;:36;:::i;:::-;30053:44;;:5;:44;:::i;30108:1147::-;30271:11;30291:18;30314:11;30336:6;30332:425;;;30363:13;30354:5;:22;30350:193;;30424:13;30399:21;30424:13;30399:5;:21;:::i;:::-;30391:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30385:52;;30332:425;;30350:193;30496:13;30471:21;30487:5;30496:13;30471:21;:::i;:::-;30463:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30457:52;;30532:4;30516:20;;30332:425;;;30572:13;30564:5;:21;30560:192;;;30633:13;30608:21;30633:13;30608:5;:21;:::i;30560:192::-;30732:13;30707:21;30723:5;30732:13;30707:21;:::i;:::-;30699:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30693:52;;30560:192;30819:22;:9;30831:10;30819:22;:::i;:::-;30800:15;:41;30796:339;;30851:17;17565;17529:1;17565:2;:17;:::i;:::-;30922:12;;30929:5;30922:12;:::i;:::-;:23;;30937:8;30922:23;:::i;:::-;30890:27;30908:9;30890:15;:27;:::i;:::-;30871:15;30878:8;30871:4;:15;:::i;:::-;:47;;;;:::i;:::-;:75;;;;:::i;:::-;30851:95;;30958:13;30954:174;;;30980:16;30987:9;30980:16;;:::i;:::-;;;30954:174;;;31019:9;31013:3;:15;31009:119;;;31043:15;31055:3;31043:9;:15;:::i;:::-;31037:21;;31081:4;31065:20;;31009:119;;;31105:16;31112:9;31105:16;;:::i;:::-;;;31009:119;30843:292;30796:339;31145:13;31141:90;;;31173:16;31185:3;-1:-1:-1;;31173:16:0;:::i;:::-;31166:23;;31141:90;;;31221:3;31207:18;;31141:90;31237:11;;30108:1147;;;;;;;;:::o;29165:338::-;29238:11;;;:37;;-1:-1:-1;;;;;;29253:22:0;;;29238:37;29234:50;;;29165:338;;:::o;29234:50::-;29337:6;;29329:37;;-1:-1:-1;;;29329:37:0;;-1:-1:-1;;;;;8814:32:1;;;29329:37:0;;;8796:51:1;29310:16:0;;29337:6;;29329:27;;8769:18:1;;29329:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29310:56;;;-1:-1:-1;29407:17:0;17529:1;29407:2;:17;:::i;:::-;29390:12;29394:8;29390:2;:12;:::i;:::-;29380:23;;:6;:23;:::i;:::-;:45;;;;:::i;:::-;29371:54;-1:-1:-1;29430:68:0;-1:-1:-1;;;;;29430:33:0;;29464:10;29484:4;29371:54;29430:33;:68::i;:::-;29229:274;29165:338;;:::o;25421:1147::-;25563:7;25572;25581:6;25596:11;25610:50;25626:4;25632:9;25643:8;25653:6;25610:15;:50::i;:::-;25696:18;25717:11;;;:6;:11;;;;;;;;25696:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25696:32:0;;;;;;;;;;;-1:-1:-1;;;25696:32:0;;;;;;;;;;;25827:14;;;:9;:14;;;;;;;25854:15;;25596:64;;-1:-1:-1;25696:32:0;;25827:14;;-1:-1:-1;;;25854:15:0;;;;25846:41;;;;-1:-1:-1;;;25846:41:0;;;;;;;:::i;:::-;25894:22;25919:19;;;:8;:19;;;;;;;;;25894:44;;;;;;;;;-1:-1:-1;;;;;25894:44:0;;;;;-1:-1:-1;;;25894:44:0;;;;;;;;;;;-1:-1:-1;;;25894:44:0;;;;;;;;;;;-1:-1:-1;;;25894:44:0;;;;;;;;25953:21;25968:5;25953:14;:21::i;:::-;26017:14;;26039:16;;;;25945:29;;-1:-1:-1;25981:10:0;;25994:82;;26002:6;;25945:29;;-1:-1:-1;;;;;;;;26017:14:0;;;;;26033:4;;25994:82;;;;-1:-1:-1;;;26057:18:0;;;;25994:7;:82::i;:::-;26175:28;;;;26148:15;;25981:95;;-1:-1:-1;26207:5:0;;26140:64;;-1:-1:-1;;;;;26167:37:0;;;;-1:-1:-1;;;26148:15:0;;;26140:64;:::i;:::-;:72;;;;:::i;:::-;26128:85;;-1:-1:-1;;26128:85:0;:::i;:::-;26121:3;:92;26117:320;;26247:15;;26227:37;;-1:-1:-1;;;26247:15:0;;-1:-1:-1;;;;;26247:15:0;-1:-1:-1;;26227:37:0;:::i;:::-;26279:15;;-1:-1:-1;;;;26326:19:0;;;;-1:-1:-1;;;;;26307:13:0;;;;-1:-1:-1;;;;26279:15:0;;;;;-1:-1:-1;26221:43:0;-1:-1:-1;26117:320:0;;;26363:33;;26389:6;;26363:33;;:15;;:33;;26389:6;;-1:-1:-1;;;26363:33:0;;-1:-1:-1;;;;;26363:33:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26363:33:0;;;;;-1:-1:-1;;;;;26363:33:0;;;;;;26426:4;26402:8;:13;;;:29;;;;;;;;;;-1:-1:-1;;;;;26402:29:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26402:29:0;;;;;-1:-1:-1;;;;;26402:29:0;;;;;;26117:320;26449:15;;-1:-1:-1;;;26449:15:0;;-1:-1:-1;;;;;26449:15:0;26445:59;;26484:14;;;;:9;:14;;;;;26477:21;26445:59;26517:11;;;;:6;:11;;;;;;26510:18;;-1:-1:-1;;;;;;26510:18:0;;;-1:-1:-1;26543:6:0;;26551:4;;-1:-1:-1;26517:11:0;;-1:-1:-1;25421:1147:0;-1:-1:-1;;;;;;;;25421:1147:0:o;4923:317::-;5038:6;5013:21;:31;;5005:73;;;;-1:-1:-1;;;5005:73:0;;17085:2:1;5005:73:0;;;17067:21:1;17124:2;17104:18;;;17097:30;17163:31;17143:18;;;17136:59;17212:18;;5005:73:0;16883:353:1;5005:73:0;5092:12;5110:9;-1:-1:-1;;;;;5110:14:0;5132:6;5110:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5091:52;;;5162:7;5154:78;;;;-1:-1:-1;;;5154:78:0;;16658:2:1;5154:78:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:34;16716:18;;;16709:62;16807:28;16787:18;;;16780:56;16853:19;;5154:78:0;16456:422:1;11456:211:0;11600:58;;-1:-1:-1;;;;;12888:32:1;;11600:58:0;;;12870:51:1;12937:18;;;12930:34;;;11573:86:0;;11593:5;;-1:-1:-1;;;11623:23:0;12843:18:1;;11600:58:0;;;;-1:-1:-1;;11600:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11600:58:0;-1:-1:-1;;;;;;11600:58:0;;;;;;;;;;11573:19;:86::i;11675:248::-;11846:68;;-1:-1:-1;;;;;9116:15:1;;;11846:68:0;;;9098:34:1;9168:15;;9148:18;;;9141:43;9200:18;;;9193:34;;;11819:96:0;;11839:5;;-1:-1:-1;;;11869:27:0;9033:18:1;;11846:68:0;8858:375:1;14029:716:0;14453:23;14479:69;14507:4;14479:69;;;;;;;;;;;;;;;;;14487:5;-1:-1:-1;;;;;14479:27:0;;;:69;;;;;:::i;:::-;14563:17;;14453:95;;-1:-1:-1;14563:21:0;14559:179;;14660:10;14649:30;;;;;;;;;;;;:::i;:::-;14641:85;;;;-1:-1:-1;;;14641:85:0;;21940:2:1;14641:85:0;;;21922:21:1;21979:2;21959:18;;;21952:30;22018:34;21998:18;;;21991:62;-1:-1:-1;;;22069:18:1;;;22062:40;22119:19;;14641:85:0;21738:406:1;6407:229:0;6544:12;6576:52;6598:6;6606:4;6612:1;6615:12;6576:21;:52::i;:::-;6569:59;;6407:229;;;;;;:::o;7527:510::-;7697:12;7755:5;7730:21;:30;;7722:81;;;;-1:-1:-1;;;7722:81:0;;17443:2:1;7722:81:0;;;17425:21:1;17482:2;17462:18;;;17455:30;17521:34;17501:18;;;17494:62;-1:-1:-1;;;17572:18:1;;;17565:36;17618:19;;7722:81:0;17241:402:1;7722:81:0;3924:20;;7814:60;;;;-1:-1:-1;;;7814:60:0;;20569:2:1;7814:60:0;;;20551:21:1;20608:2;20588:18;;;20581:30;20647:31;20627:18;;;20620:59;20696:18;;7814:60:0;20367:353:1;7814:60:0;7888:12;7902:23;7929:6;-1:-1:-1;;;;;7929:11:0;7948:5;7955:4;7929:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7887:73;;;;7978:51;7995:7;8004:10;8016:12;7978:16;:51::i;:::-;7971:58;7527:510;-1:-1:-1;;;;;;;7527:510:0:o;10213:712::-;10363:12;10392:7;10388:530;;;-1:-1:-1;10423:10:0;10416:17;;10388:530;10537:17;;:21;10533:374;;10735:10;10729:17;10796:15;10783:10;10779:2;10775:19;10768:44;10533:374;10878:12;10871:20;;-1:-1:-1;;;10871:20:0;;;;;;;;:::i;14:171:1:-;81:20;;-1:-1:-1;;;;;130:30:1;;120:41;;110:69;;175:1;172;165:12;110:69;14:171;;;:::o;190:247::-;249:6;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;442:251::-;512:6;565:2;553:9;544:7;540:23;536:32;533:52;;;581:1;578;571:12;533:52;613:9;607:16;632:31;657:5;632:31;:::i;698:592::-;781:6;789;797;805;858:3;846:9;837:7;833:23;829:33;826:53;;;875:1;872;865:12;826:53;914:9;901:23;933:31;958:5;933:31;:::i;:::-;983:5;-1:-1:-1;1040:2:1;1025:18;;1012:32;1053:33;1012:32;1053:33;:::i;:::-;1105:7;-1:-1:-1;1159:2:1;1144:18;;1131:32;;-1:-1:-1;1215:2:1;1200:18;;1187:32;1228:30;1187:32;1228:30;:::i;:::-;698:592;;;;-1:-1:-1;698:592:1;;-1:-1:-1;;698:592:1:o;1295:728::-;1384:6;1392;1400;1408;1416;1469:3;1457:9;1448:7;1444:23;1440:33;1437:53;;;1486:1;1483;1476:12;1437:53;1525:9;1512:23;1544:31;1569:5;1544:31;:::i;:::-;1594:5;-1:-1:-1;1646:2:1;1631:18;;1618:32;;-1:-1:-1;1702:2:1;1687:18;;1674:32;1715:33;1674:32;1715:33;:::i;:::-;1767:7;-1:-1:-1;1826:2:1;1811:18;;1798:32;1839:30;1798:32;1839:30;:::i;:::-;1888:7;-1:-1:-1;1947:3:1;1932:19;;1919:33;1961:30;1919:33;1961:30;:::i;:::-;2010:7;2000:17;;;1295:728;;;;;;;;:::o;2028:661::-;2120:6;2128;2136;2144;2152;2205:3;2193:9;2184:7;2180:23;2176:33;2173:53;;;2222:1;2219;2212:12;2173:53;2261:9;2248:23;2280:31;2305:5;2280:31;:::i;:::-;2330:5;-1:-1:-1;2382:2:1;2367:18;;2354:32;;-1:-1:-1;2438:2:1;2423:18;;2410:32;2451:33;2410:32;2451:33;:::i;:::-;2503:7;-1:-1:-1;2562:2:1;2547:18;;2534:32;2575:30;2534:32;2575:30;:::i;:::-;2028:661;;;;-1:-1:-1;2028:661:1;;2678:3;2663:19;2650:33;;2028:661;-1:-1:-1;;2028:661:1:o;2694:315::-;2762:6;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2878:9;2865:23;2897:31;2922:5;2897:31;:::i;:::-;2947:5;2999:2;2984:18;;;;2971:32;;-1:-1:-1;;;2694:315:1:o;3014:615::-;3100:6;3108;3161:2;3149:9;3140:7;3136:23;3132:32;3129:52;;;3177:1;3174;3167:12;3129:52;3217:9;3204:23;-1:-1:-1;;;;;3287:2:1;3279:6;3276:14;3273:34;;;3303:1;3300;3293:12;3273:34;3341:6;3330:9;3326:22;3316:32;;3386:7;3379:4;3375:2;3371:13;3367:27;3357:55;;3408:1;3405;3398:12;3357:55;3448:2;3435:16;3474:2;3466:6;3463:14;3460:34;;;3490:1;3487;3480:12;3460:34;3543:7;3538:2;3528:6;3525:1;3521:14;3517:2;3513:23;3509:32;3506:45;3503:65;;;3564:1;3561;3554:12;3503:65;3595:2;3587:11;;;;;3617:6;;-1:-1:-1;3014:615:1;;-1:-1:-1;;;;3014:615:1:o;3634:245::-;3701:6;3754:2;3742:9;3733:7;3729:23;3725:32;3722:52;;;3770:1;3767;3760:12;3722:52;3802:9;3796:16;3821:28;3843:5;3821:28;:::i;3884:180::-;3943:6;3996:2;3984:9;3975:7;3971:23;3967:32;3964:52;;;4012:1;4009;4002:12;3964:52;-1:-1:-1;4035:23:1;;3884:180;-1:-1:-1;3884:180:1:o;4069:450::-;4143:6;4151;4159;4212:2;4200:9;4191:7;4187:23;4183:32;4180:52;;;4228:1;4225;4218:12;4180:52;4264:9;4251:23;4241:33;;4324:2;4313:9;4309:18;4296:32;4337:31;4362:5;4337:31;:::i;:::-;4387:5;-1:-1:-1;4444:2:1;4429:18;;4416:32;4457:30;4416:32;4457:30;:::i;:::-;4506:7;4496:17;;;4069:450;;;;;:::o;4524:519::-;4607:6;4615;4623;4631;4684:3;4672:9;4663:7;4659:23;4655:33;4652:53;;;4701:1;4698;4691:12;4652:53;4737:9;4724:23;4714:33;;4797:2;4786:9;4782:18;4769:32;4810:31;4835:5;4810:31;:::i;:::-;4860:5;-1:-1:-1;4917:2:1;4902:18;;4889:32;4930:30;4889:32;4930:30;:::i;:::-;4524:519;;;;-1:-1:-1;4979:7:1;;5033:2;5018:18;5005:32;;-1:-1:-1;;4524:519:1:o;5048:588::-;5140:6;5148;5156;5164;5172;5225:3;5213:9;5204:7;5200:23;5196:33;5193:53;;;5242:1;5239;5232:12;5193:53;5278:9;5265:23;5255:33;;5338:2;5327:9;5323:18;5310:32;5351:31;5376:5;5351:31;:::i;:::-;5401:5;-1:-1:-1;5458:2:1;5443:18;;5430:32;5471:30;5430:32;5471:30;:::i;:::-;5048:588;;;;-1:-1:-1;5520:7:1;;5574:2;5559:18;;5546:32;;-1:-1:-1;5625:3:1;5610:19;5597:33;;5048:588;-1:-1:-1;;5048:588:1:o;5641:902::-;5733:6;5741;5785:9;5776:7;5772:23;5815:3;5811:2;5807:12;5804:32;;;5832:1;5829;5822:12;5804:32;5855:23;;;-1:-1:-1;5912:4:1;-1:-1:-1;;5894:16:1;;5890:27;5887:47;;;5930:1;5927;5920:12;5887:47;;5963:2;5957:9;6005:4;5997:6;5993:17;6076:6;6064:10;6061:22;-1:-1:-1;;;;;6028:10:1;6025:34;6022:62;6019:185;;;6126:10;6121:3;6117:20;6114:1;6107:31;6161:4;6158:1;6151:15;6189:4;6186:1;6179:15;6019:185;6220:2;6213:22;6259:37;6292:2;6277:18;;6259:37;:::i;:::-;6251:6;6244:53;6330:37;6363:2;6352:9;6348:18;6330:37;:::i;:::-;6325:2;6317:6;6313:15;6306:62;6401:37;6434:2;6423:9;6419:18;6401:37;:::i;:::-;6396:2;6388:6;6384:15;6377:62;6472:39;6505:4;6494:9;6490:20;6472:39;:::i;:::-;6467:2;6459:6;6455:15;6448:64;6531:6;6521:16;;;5641:902;;;;;:::o;6548:184::-;6618:6;6671:2;6659:9;6650:7;6646:23;6642:32;6639:52;;;6687:1;6684;6677:12;6639:52;-1:-1:-1;6710:16:1;;6548:184;-1:-1:-1;6548:184:1:o;6737:273::-;6805:6;6858:2;6846:9;6837:7;6833:23;6829:32;6826:52;;;6874:1;6871;6864:12;6826:52;6906:9;6900:16;6956:4;6949:5;6945:16;6938:5;6935:27;6925:55;;6976:1;6973;6966:12;8161:274;8290:3;8328:6;8322:13;8344:53;8390:6;8385:3;8378:4;8370:6;8366:17;8344:53;:::i;:::-;8413:16;;;;;8161:274;-1:-1:-1;;8161:274:1:o;12975:695::-;13190:2;13242:21;;;13312:13;;13215:18;;;13334:22;;;13161:4;;13190:2;13413:15;;;;13387:2;13372:18;;;13161:4;13456:188;13470:6;13467:1;13464:13;13456:188;;;13519:43;13558:3;13549:6;13543:13;7100:12;;7093:20;7086:28;7074:41;;7161:4;7150:16;;;7144:23;-1:-1:-1;;;;;7236:21:1;;;7220:14;;;7213:45;;;;7311:4;7300:16;;;7294:23;7290:32;7274:14;;7267:56;7015:314;13519:43;13619:15;;;;13591:4;13582:14;;;;;13492:1;13485:9;13456:188;;;-1:-1:-1;13661:3:1;;12975:695;-1:-1:-1;;;;;;12975:695:1:o;13675:704::-;13896:2;13948:21;;;14018:13;;13921:18;;;14040:22;;;13867:4;;13896:2;14119:15;;;;14093:2;14078:18;;;13867:4;14162:191;14176:6;14173:1;14170:13;14162:191;;;14225:46;14267:3;14258:6;14252:13;7449:12;;-1:-1:-1;;;;;7445:21:1;;;7433:34;;7520:4;7509:16;;;7503:23;7499:32;;7483:14;;;7476:56;7585:4;7574:16;;;7568:23;7564:32;;7548:14;;;7541:56;7650:4;7639:16;;;7633:23;7629:32;7613:14;;7606:56;7334:334;14225:46;14328:15;;;;14300:4;14291:14;;;;;14198:1;14191:9;14162:191;;14384:383;14533:2;14522:9;14515:21;14496:4;14565:6;14559:13;14608:6;14603:2;14592:9;14588:18;14581:34;14624:66;14683:6;14678:2;14667:9;14663:18;14658:2;14650:6;14646:15;14624:66;:::i;:::-;14751:2;14730:15;-1:-1:-1;;14726:29:1;14711:45;;;;14758:2;14707:54;;14384:383;-1:-1:-1;;14384:383:1:o;20725:332::-;20927:2;20909:21;;;20966:1;20946:18;;;20939:29;-1:-1:-1;;;20999:2:1;20984:18;;20977:39;21048:2;21033:18;;20725:332::o;22149:329::-;22351:2;22333:21;;;22390:1;22370:18;;;22363:29;-1:-1:-1;;;22423:2:1;22408:18;;22401:36;22469:2;22454:18;;22149:329::o;22817:238::-;22995:2;22980:18;;23007:42;22984:9;23031:6;7100:12;;7093:20;7086:28;7074:41;;7161:4;7150:16;;;7144:23;-1:-1:-1;;;;;7236:21:1;;;7220:14;;;7213:45;;;;7311:4;7300:16;;;7294:23;7290:32;7274:14;;7267:56;7015:314;23060:248;23244:3;23229:19;;23257:45;23233:9;23284:6;7449:12;;-1:-1:-1;;;;;7445:21:1;;;7433:34;;7520:4;7509:16;;;7503:23;7499:32;;7483:14;;;7476:56;7585:4;7574:16;;;7568:23;7564:32;;7548:14;;;7541:56;7650:4;7639:16;;;7633:23;7629:32;7613:14;;7606:56;7334:334;24009:128;24049:3;24080:1;24076:6;24073:1;24070:13;24067:39;;;24086:18;;:::i;:::-;-1:-1:-1;24122:9:1;;24009:128::o;24142:236::-;24181:3;-1:-1:-1;;;;;24254:2:1;24251:1;24247:10;24284:2;24281:1;24277:10;24315:3;24311:2;24307:12;24302:3;24299:21;24296:47;;;24323:18;;:::i;:::-;24359:13;;24142:236;-1:-1:-1;;;;24142:236:1:o;24383:120::-;24423:1;24449;24439:35;;24454:18;;:::i;:::-;-1:-1:-1;24488:9:1;;24383:120::o;24508:199::-;24547:1;-1:-1:-1;;;;;24618:2:1;24615:1;24611:10;24640:3;24630:37;;24647:18;;:::i;:::-;24685:10;;24681:20;;;;;24508:199;-1:-1:-1;;24508:199:1:o;24712:422::-;24801:1;24844:5;24801:1;24858:270;24879:7;24869:8;24866:21;24858:270;;;24938:4;24934:1;24930:6;24926:17;24920:4;24917:27;24914:53;;;24947:18;;:::i;:::-;24997:7;24987:8;24983:22;24980:55;;;25017:16;;;;24980:55;25096:22;;;;25056:15;;;;24858:270;;;24862:3;24712:422;;;;;:::o;25139:131::-;25199:5;25228:36;25255:8;25249:4;25324:5;25354:8;25344:80;;-1:-1:-1;25395:1:1;25409:5;;25344:80;25443:4;25433:76;;-1:-1:-1;25480:1:1;25494:5;;25433:76;25525:4;25543:1;25538:59;;;;25611:1;25606:130;;;;25518:218;;25538:59;25568:1;25559:10;;25582:5;;;25606:130;25643:3;25633:8;25630:17;25627:43;;;25650:18;;:::i;:::-;-1:-1:-1;;25706:1:1;25692:16;;25721:5;;25518:218;;25820:2;25810:8;25807:16;25801:3;25795:4;25792:13;25788:36;25782:2;25772:8;25769:16;25764:2;25758:4;25755:12;25751:35;25748:77;25745:159;;;-1:-1:-1;25857:19:1;;;25889:5;;25745:159;25936:34;25961:8;25955:4;25936:34;:::i;:::-;26006:6;26002:1;25998:6;25994:19;25985:7;25982:32;25979:58;;;26017:18;;:::i;:::-;26055:20;;25275:806;-1:-1:-1;;;25275:806:1:o;26086:553::-;26125:7;-1:-1:-1;;;;;26195:9:1;;;26223;;;26248:11;;;26267:10;;;26261:17;;26244:35;26241:61;;;26282:18;;:::i;:::-;-1:-1:-1;;;26358:1:1;26351:9;;26376:11;;;26396;;;26389:19;;26372:37;26369:63;;;26412:18;;:::i;:::-;26458:1;26455;26451:9;26441:19;;26505:1;26501:2;26496:11;26493:1;26489:19;26484:2;26480;26476:11;26472:37;26469:63;;;26512:18;;:::i;:::-;26577:1;26573:2;26568:11;26565:1;26561:19;26556:2;26552;26548:11;26544:37;26541:63;;;26584:18;;:::i;:::-;-1:-1:-1;;;26624:9:1;;;;;26086:553;-1:-1:-1;;;26086:553:1:o;26644:168::-;26684:7;26750:1;26746;26742:6;26738:14;26735:1;26732:21;26727:1;26720:9;26713:17;26709:45;26706:71;;;26757:18;;:::i;:::-;-1:-1:-1;26797:9:1;;26644:168::o;26817:270::-;26856:7;-1:-1:-1;;;;;26933:2:1;26930:1;26926:10;26963:2;26960:1;26956:10;27019:3;27015:2;27011:12;27006:3;27003:21;26996:3;26989:11;26982:19;26978:47;26975:73;;;27028:18;;:::i;:::-;27068:13;;26817:270;-1:-1:-1;;;;26817:270:1:o;27092:125::-;27132:4;27160:1;27157;27154:8;27151:34;;;27165:18;;:::i;:::-;-1:-1:-1;27202:9:1;;27092:125::o;27222:229::-;27261:4;-1:-1:-1;;;;;27358:10:1;;;;27328;;27380:12;;;27377:38;;;27395:18;;:::i;:::-;27432:13;;27222:229;-1:-1:-1;;;27222:229:1:o;27456:258::-;27528:1;27538:113;27552:6;27549:1;27546:13;27538:113;;;27628:11;;;27622:18;27609:11;;;27602:39;27574:2;27567:10;27538:113;;;27669:6;27666:1;27663:13;27660:48;;;-1:-1:-1;;27704:1:1;27686:16;;27679:27;27456:258::o;27719:135::-;27758:3;-1:-1:-1;;27779:17:1;;27776:43;;;27799:18;;:::i;:::-;-1:-1:-1;27846:1:1;27835:13;;27719:135::o;27859:127::-;27920:10;27915:3;27911:20;27908:1;27901:31;27951:4;27948:1;27941:15;27975:4;27972:1;27965:15;27991:127;28052:10;28047:3;28043:20;28040:1;28033:31;28083:4;28080:1;28073:15;28107:4;28104:1;28097:15;28123:127;28184:10;28179:3;28175:20;28172:1;28165:31;28215:4;28212:1;28205:15;28239:4;28236:1;28229:15;28255:127;28316:10;28311:3;28307:20;28304:1;28297:31;28347:4;28344:1;28337:15;28371:4;28368:1;28361:15;28387:131;-1:-1:-1;;;;;28462:31:1;;28452:42;;28442:70;;28508:1;28505;28498:12;28442:70;28387:131;:::o;28523:118::-;28609:5;28602:13;28595:21;28588:5;28585:32;28575:60;;28631:1;28628;28621:12

Metadata Hash

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