Contract 0x5bc42ecb93a320918653856b9bb441b3707a2f19

Contract Overview

Balance:
0 BTT
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8c04ebb4e75b028c302bed9c69b2434d370d47ca89f6a8223fb7122af09cfa080x60a06040113257402022-08-30 9:16:2198 days 21 hrs ago0x22df207ec3c8d18fedeed87752c5a68e5b4f6fbd IN  Create: BtfsStatus0 BTT1,069.4799
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7e1315d8d0499f9b292724cba31709738b6179f73b54c8afd42ddd053e8fa661154522502022-12-07 4:55:581 hr 45 mins ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xf9ce3611d086b30b12a4f34ec609012f39b13f9fc73024d1f2cb675d65e7b8c1154361202022-12-06 19:41:3011 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x4a34cc5bbe2f5902b40001bdb7af785ec76ece7a2bcca483c74e4ed0e0c6bfff154357452022-12-06 19:28:3611 hrs 12 mins ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xea177ec259a0cc615fa09ea189715f1d00e8c241eec628efe41df0bcef5233bd154103612022-12-06 4:56:001 day 1 hr ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x1140e1cb3f61f1f37c41288167847309bc1afd548c2ff4971679362cfea321e6153942302022-12-05 19:41:301 day 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x8fd7d7eb1aa7a534e3f0627c5ba7d1f1e400baba8a78a4c528a17f60aab44f28153938562022-12-05 19:28:421 day 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x9c287c0581829ad281581af52e4f8d1d3438466a9fc50132d69242df34a5eecb153884722022-12-05 16:23:341 day 14 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x4d990816a3ba1a9b7c14c8efbd6da965ce36e1ca8722f1482bbdf5c5841829cd153810362022-12-05 12:07:581 day 18 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x0736792d1bda8fae9797e80caa75c349f7174a7de121b57717c1b80c84803989153754762022-12-05 8:56:501 day 21 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x16a7141141a9d0ad5818745429206d8aa33af1e116981f33c244a5701d8bb006153684702022-12-05 4:56:022 days 1 hr ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xace3b5609b15f482b888f51cdccd11f0a6630902c55ba25c080108b4a6cd824d153668052022-12-05 3:58:482 days 2 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x7c8d6062f33fb09019e7d2d174ae6404aee3357c818719395251b3a85b1c5cea153523382022-12-04 19:41:302 days 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xd5c963d493da740f9b1a1e288c22c880a59c40aa4413fe9d14d31a244beaf006153519652022-12-04 19:28:402 days 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x6b3a1f3ccda52221a9410bca8228fbf7fdc3113932dc4bb0476835151bbcaa73153465802022-12-04 16:23:342 days 14 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xcb7645185adac6ae4b69424dccdb8c7ccc18a2febd8c8e459c68c9d941dd5319153391442022-12-04 12:07:582 days 18 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x38098403c8ad3d910662c511018612622c1cd286181de91953a490672c386c48153265812022-12-04 4:56:043 days 1 hr ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x2fc842358a97fd6d383d3fc49ce9d7d70fd397d374e89fad26ef0b11f088113a153104482022-12-03 19:41:303 days 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xa7ae637d0360b2d3f26dc65671eec2c9b8a5a2fcaec0f8445e3b9a59579ed9f7153100762022-12-03 19:28:423 days 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xfb365f83460f69dddc1040c17a5d038b1a1750c580d6c4b480b3a67d757c4ff1153046902022-12-03 16:23:343 days 14 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xd57378bf0977c4588bf6dcc2e190a5cccc8462188a8de0975cb230ec79857b60152972542022-12-03 12:07:583 days 18 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xf6f71ddda49dba78a4748a552e1a857a43a93f7035513df8913e5d8f0a8ffb38152846892022-12-03 4:56:044 days 1 hr ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x7b634d3983bc58e5a89608dc569e2c2fbd9fb1c47d98e3fc4543ac3b3e677462152685562022-12-02 19:41:304 days 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x69303dc6c2bd10f709ab2597a02e84b979bac4ad812ab091a089afe68de2f940152681842022-12-02 19:28:424 days 11 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0x8741751845476ae07592a0fd1858adf11d6a58ef1cac6affc9c27b0affa4ac70152627982022-12-02 16:23:344 days 14 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
0xc41e3fcc4c1edba2882ba46a0750c2f5ab334b70aa5eab7e1923ba59c2b12e78152553622022-12-02 12:07:584 days 18 hrs ago 0x38d1ff2c2e9744273e4531fa4608eb6432c1f26a 0x5bc42ecb93a320918653856b9bb441b3707a2f190 BTT
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
BtfsStatus

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.bttcscan.com on 2022-08-30
*/

// File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
 */
library StorageSlotUpgradeable {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)

pragma solidity ^0.8.0;

/**
 * @dev This is the interface that {BeaconProxy} expects of its beacon.
 */
interface IBeaconUpgradeable {
    /**
     * @dev Must return an address that can be used as a delegate call target.
     *
     * {BeaconProxy} will check that this address is a contract.
     */
    function implementation() external view returns (address);
}

// File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)

pragma solidity ^0.8.0;

/**
 * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
 * proxy whose upgrades are fully controlled by the current implementation.
 */
interface IERC1822ProxiableUpgradeable {
    /**
     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
     * address.
     *
     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
     * function revert if invoked through a proxy.
     */
    function proxiableUUID() external view returns (bytes32);
}

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.2;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
     */
    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
     * initialization step. This is essential to configure modules that are added through upgrades and that require
     * initialization.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     */
    modifier reinitializer(uint8 version) {
        require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
        _initialized = version;
        _initializing = true;
        _;
        _initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     */
    function _disableInitializers() internal virtual {
        require(!_initializing, "Initializable: contract is initializing");
        if (_initialized < type(uint8).max) {
            _initialized = type(uint8).max;
            emit Initialized(type(uint8).max);
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;


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

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)

pragma solidity ^0.8.2;






/**
 * @dev This abstract contract provides getters and event emitting update functions for
 * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
 *
 * _Available since v4.1._
 *
 * @custom:oz-upgrades-unsafe-allow delegatecall
 */
abstract contract ERC1967UpgradeUpgradeable is Initializable {
    function __ERC1967Upgrade_init() internal onlyInitializing {
    }

    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {
    }
    // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Emitted when the implementation is upgraded.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Returns the current implementation address.
     */
    function _getImplementation() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 implementation slot.
     */
    function _setImplementation(address newImplementation) private {
        require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract");
        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
    }

    /**
     * @dev Perform implementation upgrade
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Perform implementation upgrade with additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCall(
        address newImplementation,
        bytes memory data,
        bool forceCall
    ) internal {
        _upgradeTo(newImplementation);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(newImplementation, data);
        }
    }

    /**
     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCallUUPS(
        address newImplementation,
        bytes memory data,
        bool forceCall
    ) internal {
        // Upgrades from old implementations will perform a rollback test. This test requires the new
        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
        // this special case will break upgrade paths from old UUPS implementation to new ones.
        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {
            _setImplementation(newImplementation);
        } else {
            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
            } catch {
                revert("ERC1967Upgrade: new implementation is not UUPS");
            }
            _upgradeToAndCall(newImplementation, data, forceCall);
        }
    }

    /**
     * @dev Storage slot with the admin of the contract.
     * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

    /**
     * @dev Emitted when the admin account has changed.
     */
    event AdminChanged(address previousAdmin, address newAdmin);

    /**
     * @dev Returns the current admin.
     */
    function _getAdmin() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 admin slot.
     */
    function _setAdmin(address newAdmin) private {
        require(newAdmin != address(0), "ERC1967: new admin is the zero address");
        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {AdminChanged} event.
     */
    function _changeAdmin(address newAdmin) internal {
        emit AdminChanged(_getAdmin(), newAdmin);
        _setAdmin(newAdmin);
    }

    /**
     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
     */
    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;

    /**
     * @dev Emitted when the beacon is upgraded.
     */
    event BeaconUpgraded(address indexed beacon);

    /**
     * @dev Returns the current beacon.
     */
    function _getBeacon() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
    }

    /**
     * @dev Stores a new beacon in the EIP1967 beacon slot.
     */
    function _setBeacon(address newBeacon) private {
        require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract");
        require(
            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),
            "ERC1967: beacon implementation is not a contract"
        );
        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
    }

    /**
     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
     *
     * Emits a {BeaconUpgraded} event.
     */
    function _upgradeBeaconToAndCall(
        address newBeacon,
        bytes memory data,
        bool forceCall
    ) internal {
        _setBeacon(newBeacon);
        emit BeaconUpgraded(newBeacon);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);
        }
    }

    /**
     * @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) private returns (bytes memory) {
        require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed");
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol)

pragma solidity ^0.8.0;




/**
 * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
 * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
 *
 * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
 * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
 * `UUPSUpgradeable` with a custom implementation of upgrades.
 *
 * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
 *
 * _Available since v4.1._
 */
abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {
    function __UUPSUpgradeable_init() internal onlyInitializing {
    }

    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
    }
    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
    address private immutable __self = address(this);

    /**
     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is
     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
     * fail.
     */
    modifier onlyProxy() {
        require(address(this) != __self, "Function must be called through delegatecall");
        require(_getImplementation() == __self, "Function must be called through active proxy");
        _;
    }

    /**
     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
     * callable on the implementing contract but not through proxies.
     */
    modifier notDelegated() {
        require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall");
        _;
    }

    /**
     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
     * implementation. It is used to validate that the this implementation remains valid after an upgrade.
     *
     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
     */
    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {
        return _IMPLEMENTATION_SLOT;
    }

    /**
     * @dev Upgrade the implementation of the proxy to `newImplementation`.
     *
     * Calls {_authorizeUpgrade}.
     *
     * Emits an {Upgraded} event.
     */
    function upgradeTo(address newImplementation) external virtual onlyProxy {
        _authorizeUpgrade(newImplementation);
        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);
    }

    /**
     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
     * encoded in `data`.
     *
     * Calls {_authorizeUpgrade}.
     *
     * Emits an {Upgraded} event.
     */
    function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {
        _authorizeUpgrade(newImplementation);
        _upgradeToAndCallUUPS(newImplementation, data, true);
    }

    /**
     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
     * {upgradeTo} and {upgradeToAndCall}.
     *
     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
     *
     * ```solidity
     * function _authorizeUpgrade(address) internal override onlyOwner {}
     * ```
     */
    function _authorizeUpgrade(address newImplementation) internal virtual;

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

// File: contracts/status.sol



pragma solidity ^0.8.4;

// Open Zeppelin libraries for controlling upgradability and access.






// BtfsStatus for hosts' heartbeat report
contract BtfsStatus is Initializable, UUPSUpgradeable, OwnableUpgradeable{
    using SafeMath for uint256;

    // map[peer]info
    struct info {
        uint32 createTime;
        string version;
        uint32 lastNonce;
        uint32 lastSignedTime;
        bytes lastSigned;
        uint16[30] hearts;
    }
    mapping(string => info) private peerMap;

    // sign address
    address currentSignAddress;
    address[20] currentSignAddressList;

    // version
    string public currentVersion;

    event signAddressChanged(address lastSignAddress, address currentSignAddress);
    event versionChanged(string currentVersion, string version);
    event statusReported(string peer, uint32 createTime, string version, uint32 Nonce, address bttcAddress, uint32 signedTime, uint32 lastNonce, uint32 nowTime, uint16[30] hearts);

    // stat
    struct statistics {
        uint64 total;
        uint64 totalUsers;
    }
    statistics  public totalStat;

    // initialize
    function initialize(address signAddress) public initializer {
        currentSignAddress = signAddress;
        __Ownable_init();
    }

    ///@dev required by the OZ UUPS module
    function _authorizeUpgrade(address) internal override onlyOwner {}

    // set sign address, only owner do it
    function setSignAddress(address addr) public onlyOwner {
        emit signAddressChanged(currentSignAddress, addr);
        currentSignAddress = addr;
    }

    // get sign address, only owner do it
    function getSignAddress() public view onlyOwner returns (address) {
        return (currentSignAddress);
    }

    // set current version, only owner do it
    function setCurrentVersion(string memory ver) public onlyOwner {
        emit versionChanged(currentVersion, ver);
        currentVersion = ver;
    }

    // get host when score = 8.0
    function getHighScoreHost() external returns(info[] memory) {}

    function getStatus(string memory peer) external view returns(string memory, uint32, string memory, uint32, uint32, bytes memory, uint16[30] memory) {
        if (peerMap[peer].lastNonce == 0) {
            uint16[30] memory hearts;
            bytes memory s;
            return ("", 0, "", 0, 0, s, hearts);
        } else {
            info memory node = peerMap[peer];
            return (peer, node.createTime, node.version, node.lastNonce, node.lastSignedTime, node.lastSigned, node.hearts);
        }
    }


    // set heart, max idle days = 10
    function setHeart(string memory peer, uint32 Nonce, uint32 nowTime) internal {
        uint32 diffTime = nowTime - peerMap[peer].lastSignedTime;
        if (diffTime > 30 * 86400) {
            diffTime = 30 * 86400;
        }
        uint32 diffDays = diffTime / 86400;

        uint32 diffNonce = Nonce - peerMap[peer].lastNonce;
        if (diffDays > 0 && diffNonce > diffDays * 24) {
            diffNonce = diffDays * 24;
        }
        uint32 balanceNum = diffNonce;

        // 1.set new (diffDays-1) average Nonce; (it is alse reset 0 for more than 30 days' diffDays)
        for (uint32 i = 1; i < diffDays; i++) {
            uint indexTmp = ((nowTime - i * 86400) / 86400) % 30;
            peerMap[peer].hearts[indexTmp] = uint16(diffNonce/diffDays);

            balanceNum = balanceNum - diffNonce/diffDays;
        }

        // 2.set today balanceNum
        uint index = (nowTime / 86400) % 30;
        peerMap[peer].hearts[index] += uint16(balanceNum);
    }

    // report status
    function reportStatus(string memory peer, uint32 createTime, string memory version, uint32 Nonce, address bttcAddress, uint32 signedTime, bytes memory signed) external {

        require(0 < createTime, "reportStatus: Invalid createTime");
        require(0 < Nonce, "reportStatus: Invalid Nonce");
        require(0 < signedTime, "reportStatus: Invalid signedTime");
        require(0 < signed.length, "reportStatus: Invalid signed");
        require(peerMap[peer].lastNonce < Nonce, "reportStatus: Invalid lastNonce<Nonce");

        // verify input param with the signed data.
        bytes32 hash = genHash(peer, createTime, version, Nonce, bttcAddress, signedTime);
        require( recoverSigner(hash, signed) == currentSignAddress, "reportStatus: Invalid signed address.");

        // only bttcAddress is sender, to report status
        require(bttcAddress == msg.sender, "reportStatus: Invalid msg.sender");

        uint32 lastNonce = peerMap[peer].lastNonce;
        uint32 nowTime = uint32(block.timestamp);
        uint index = (nowTime / 86400) % 30;

        // first report
        if (peerMap[peer].lastNonce == 0) {
            uint32 initNonce = Nonce;
            if (initNonce > 24) {
                initNonce = 24;
            }

            peerMap[peer].hearts[index] = uint16(initNonce);

            totalStat.totalUsers += 1;
            totalStat.total += 1;
        } else {
            require(nowTime-signedTime <= 86400, "reportStatus: signed time must be within 1 days of the current time.");
            require(peerMap[peer].createTime == createTime, "reportStatus: Invalid createTime.");

            setHeart(peer, Nonce, nowTime);
            totalStat.total += Nonce - peerMap[peer].lastNonce;
        }

        peerMap[peer].createTime = createTime;
        peerMap[peer].version = version;
        peerMap[peer].lastNonce = Nonce;
        peerMap[peer].lastSignedTime = signedTime;
        peerMap[peer].lastSigned = signed;

        emitStatusReported(
            peer,
            createTime,
            version,
            Nonce,
            bttcAddress,
            signedTime,
            lastNonce,
            uint32(block.timestamp)
        );
    }

    function emitStatusReported(string memory peer, uint32 createTime, string memory version, uint32 Nonce, address bttcAddress, uint32 signedTime, uint32 lastNonce, uint32 nowTime) internal {
        uint16[30] memory hearts = peerMap[peer].hearts;
        emit statusReported(
            peer,
            createTime,
            version,
            Nonce,
            bttcAddress,
            signedTime,
            lastNonce,
            nowTime,
            hearts
        );
    }

    function recoverSigner(bytes32 hash, bytes memory sig) internal pure returns (address)
    {
        (uint8 v, bytes32 r, bytes32 s) = splitSignature(sig);
        return ecrecover(hash, v+27, r, s);
    }

    function splitSignature(bytes memory sig) internal pure returns (uint8, bytes32, bytes32)
    {
        require(sig.length == 65);

        bytes32 r;
        bytes32 s;
        uint8 v;

        assembly {
        // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
        // second 32 bytes
            s := mload(add(sig, 64))
        // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        return (v, r, s);
    }

    function genHash(string memory peer, uint32 createTime, string memory version, uint32 Nonce, address bttcAddress, uint32 signedTime) internal pure returns (bytes32) {
        bytes memory data = abi.encode(peer, createTime, version, Nonce, bttcAddress, signedTime);
        return keccak256(abi.encode("\x19Ethereum Signed Message:\n", data.length, data));
    }

    // call from external
    function genHashExt(string memory peer, uint32 createTime, string memory version, uint32 Nonce, address bttcAddress, uint32 signedTime) external pure returns (bytes32) {
        return genHash(peer, createTime, version, Nonce, bttcAddress, signedTime);
    }

    // call from external
    function recoverSignerExt(bytes32 hash, bytes memory sig) external pure returns (address)
    {
        (uint8 v, bytes32 r, bytes32 s) = splitSignature(sig);
        return ecrecover(hash, v+27, r, s);
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lastSignAddress","type":"address"},{"indexed":false,"internalType":"address","name":"currentSignAddress","type":"address"}],"name":"signAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"peer","type":"string"},{"indexed":false,"internalType":"uint32","name":"createTime","type":"uint32"},{"indexed":false,"internalType":"string","name":"version","type":"string"},{"indexed":false,"internalType":"uint32","name":"Nonce","type":"uint32"},{"indexed":false,"internalType":"address","name":"bttcAddress","type":"address"},{"indexed":false,"internalType":"uint32","name":"signedTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"lastNonce","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"nowTime","type":"uint32"},{"indexed":false,"internalType":"uint16[30]","name":"hearts","type":"uint16[30]"}],"name":"statusReported","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"currentVersion","type":"string"},{"indexed":false,"internalType":"string","name":"version","type":"string"}],"name":"versionChanged","type":"event"},{"inputs":[],"name":"currentVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"peer","type":"string"},{"internalType":"uint32","name":"createTime","type":"uint32"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint32","name":"Nonce","type":"uint32"},{"internalType":"address","name":"bttcAddress","type":"address"},{"internalType":"uint32","name":"signedTime","type":"uint32"}],"name":"genHashExt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getHighScoreHost","outputs":[{"components":[{"internalType":"uint32","name":"createTime","type":"uint32"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint32","name":"lastNonce","type":"uint32"},{"internalType":"uint32","name":"lastSignedTime","type":"uint32"},{"internalType":"bytes","name":"lastSigned","type":"bytes"},{"internalType":"uint16[30]","name":"hearts","type":"uint16[30]"}],"internalType":"struct BtfsStatus.info[]","name":"","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSignAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"peer","type":"string"}],"name":"getStatus","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint16[30]","name":"","type":"uint16[30]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"recoverSignerExt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"peer","type":"string"},{"internalType":"uint32","name":"createTime","type":"uint32"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint32","name":"Nonce","type":"uint32"},{"internalType":"address","name":"bttcAddress","type":"address"},{"internalType":"uint32","name":"signedTime","type":"uint32"},{"internalType":"bytes","name":"signed","type":"bytes"}],"name":"reportStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ver","type":"string"}],"name":"setCurrentVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStat","outputs":[{"internalType":"uint64","name":"total","type":"uint64"},{"internalType":"uint64","name":"totalUsers","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]

60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b81525034801561004657600080fd5b5060805160601c613fc96100816000396000818161082f015281816108be015281816109f201528181610a810152610b310152613fc96000f3fe6080604052600436106100fe5760003560e01c80636846874d116100955780639d888e86116100645780639d888e8614610307578063a6a83a0914610332578063c4d66de81461036f578063e77fdbb314610398578063f2fde38b146103c3576100fe565b80636846874d1461025f578063715018a61461028857806375839f3a1461029f5780638da5cb5b146102dc576100fe565b80633659cfe6116100d15780633659cfe6146101c357806338b88cb1146101ec5780634f1ef2861461021857806352d1902d14610234576100fe565b806313930cf614610103578063151370451461012c5780631a82de771461015557806322b05ed214610180575b600080fd5b34801561010f57600080fd5b5061012a60048036038101906101259190612526565b6103ec565b005b34801561013857600080fd5b50610153600480360381019061014e9190612414565b610448565b005b34801561016157600080fd5b5061016a6104ef565b6040516101779190612e64565b60405180910390f35b34801561018c57600080fd5b506101a760048036038101906101a29190612526565b610521565b6040516101ba9796959493929190613071565b60405180910390f35b3480156101cf57600080fd5b506101ea60048036038101906101e59190612414565b61082d565b005b3480156101f857600080fd5b506102016109b6565b60405161020f9291906133f0565b60405180910390f35b610232600480360381019061022d9190612441565b6109f0565b005b34801561024057600080fd5b50610249610b2d565b6040516102569190612eca565b60405180910390f35b34801561026b57600080fd5b5061028660048036038101906102819190612634565b610be6565b005b34801561029457600080fd5b5061029d61130e565b005b3480156102ab57600080fd5b506102c660048036038101906102c1919061256f565b611322565b6040516102d39190612eca565b60405180910390f35b3480156102e857600080fd5b506102f161133e565b6040516102fe9190612e64565b60405180910390f35b34801561031357600080fd5b5061031c611368565b6040516103299190612f45565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906124ca565b6113f6565b6040516103669190612e64565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190612414565b611471565b005b3480156103a457600080fd5b506103ad6115f1565b6040516103ba9190612ea8565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190612414565b6115f6565b005b6103f461167a565b7f80af6bbb3cb9aa0aad01eae48ff867ec029bd4a463b03ad7426f9508b2eaac8160df826040516104269291906130f6565b60405180910390a18060df9080519060200190610444929190612194565b5050565b61045061167a565b7f799687174e9d4c0b0c3552621923bcfe3569533db0b1ade3cd8192bc8f854b3760ca60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516104a3929190612e7f565b60405180910390a18060ca60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006104f961167a565b60ca60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060006060600080606061053461221a565b600060c9896040516105469190612e4d565b908152602001604051809103902060020160009054906101000a900463ffffffff1663ffffffff1614156105c35761057c61221a565b606060008060008385604051806020016040528060008152509493929190604051806020016040528060008152509392919098509850985098509850985098505050610822565b600060c9896040516105d59190612e4d565b90815260200160405180910390206040518060c00160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182018054610624906137bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610650906137bf565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b505050505081526020016002820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600382018054610702906137bf565b80601f016020809104026020016040519081016040528092919081815260200182805461072e906137bf565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050815260200160048201601e806020026040519081016040528092919082601e80156107e8576020028201916000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116107af5790505b505050505081525050905088816000015182602001518360400151846060015185608001518660a001519750975097509750975097509750505b919395979092949650565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b39061316d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fb6116f8565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906131cd565b60405180910390fd5b61095a8161174f565b6109b381600067ffffffffffffffff8111156109795761097861393c565b5b6040519080825280601f01601f1916602001820160405280156109ab5781602001600182028036833780820191505090505b50600061175a565b50565b60e08060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900467ffffffffffffffff16905082565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a769061316d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610abe6116f8565b73ffffffffffffffffffffffffffffffffffffffff1614610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b906131cd565b60405180910390fd5b610b1d8261174f565b610b298282600161175a565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb4906131ed565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b8563ffffffff16600010610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c26906133b0565b60405180910390fd5b8363ffffffff16600010610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906131ad565b60405180910390fd5b8163ffffffff16600010610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613350565b60405180910390fd5b8051600010610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc9061326d565b60405180910390fd5b8363ffffffff1660c988604051610d1c9190612e4d565b908152602001604051809103902060020160009054906101000a900463ffffffff1663ffffffff1610610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b9061324d565b60405180910390fd5b6000610d948888888888886118d7565b905060ca60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610dd9828461193d565b73ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e269061314d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9490613390565b60405180910390fd5b600060c989604051610eaf9190612e4d565b908152602001604051809103902060020160009054906101000a900463ffffffff16905060004290506000601e6201518083610eeb9190613643565b610ef5919061384f565b63ffffffff169050600060c98c604051610f0f9190612e4d565b908152602001604051809103902060020160009054906101000a900463ffffffff1663ffffffff16141561105357600088905060188163ffffffff161115610f5657601890505b8060c98d604051610f679190612e4d565b908152602001604051809103902060040183601e8110610f8a57610f8961390d565b5b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600160e060000160088282829054906101000a900467ffffffffffffffff16610fd891906135ce565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160e060000160008282829054906101000a900467ffffffffffffffff1661102791906135ce565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550506111c5565b62015180868361106391906136b2565b63ffffffff1611156110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a1906132ad565b60405180910390fd5b8963ffffffff1660c98c6040516110c19190612e4d565b908152602001604051809103902060000160009054906101000a900463ffffffff1663ffffffff1614611129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111209061318d565b60405180910390fd5b6111348b89846119b8565b60c98b6040516111449190612e4d565b908152602001604051809103902060020160009054906101000a900463ffffffff168861117191906136b2565b63ffffffff1660e060000160008282829054906101000a900467ffffffffffffffff1661119e91906135ce565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b8960c98c6040516111d69190612e4d565b908152602001604051809103902060000160006101000a81548163ffffffff021916908363ffffffff1602179055508860c98c6040516112169190612e4d565b9081526020016040518091039020600101908051906020019061123a929190612194565b508760c98c60405161124c9190612e4d565b908152602001604051809103902060020160006101000a81548163ffffffff021916908363ffffffff1602179055508560c98c60405161128c9190612e4d565b908152602001604051809103902060020160046101000a81548163ffffffff021916908363ffffffff1602179055508460c98c6040516112cc9190612e4d565b908152602001604051809103902060030190805190602001906112f092919061223d565b506113018b8b8b8b8b8b8942611c38565b5050505050505050505050565b61131661167a565b6113206000611d13565b565b60006113328787878787876118d7565b90509695505050505050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60df8054611375906137bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113a1906137bf565b80156113ee5780601f106113c3576101008083540402835291602001916113ee565b820191906000526020600020905b8154815290600101906020018083116113d157829003601f168201915b505050505081565b60008060008061140585611dd9565b925092509250600186601b8561141b919061360c565b84846040516000815260200160405260405161143a9493929190612ee5565b6020604051602081039080840390855afa15801561145c573d6000803e3d6000fd5b50505060206040510351935050505092915050565b60008060019054906101000a900460ff161590508080156114a25750600160008054906101000a900460ff1660ff16105b806114cf57506114b130611e1c565b1580156114ce5750600160008054906101000a900460ff1660ff16145b5b61150e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115059061322d565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801561154b576001600060016101000a81548160ff0219169083151502179055505b8160ca60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611594611e3f565b80156115ed5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516115e49190612f2a565b60405180910390a15b5050565b606090565b6115fe61167a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561166e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116659061312d565b60405180910390fd5b61167781611d13565b50565b611682611e98565b73ffffffffffffffffffffffffffffffffffffffff166116a061133e565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed906132ed565b60405180910390fd5b565b60006117267f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611ea0565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61175761167a565b50565b6117867f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b611eaa565b60000160009054906101000a900460ff16156117aa576117a583611eb4565b6118d2565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117f057600080fd5b505afa92505050801561182157506040513d601f19601f8201168201806040525081019061181e919061249d565b60015b611860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118579061328d565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b81146118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc9061320d565b60405180910390fd5b506118d1838383611f6d565b5b505050565b6000808787878787876040516020016118f596959493929190612f67565b604051602081830303815290604052905080518160405160200161191a92919061330d565b604051602081830303815290604052805190602001209150509695505050505050565b60008060008061194c85611dd9565b925092509250600186601b85611962919061360c565b8484604051600081526020016040526040516119819493929190612ee5565b6020604051602081039080840390855afa1580156119a3573d6000803e3d6000fd5b50505060206040510351935050505092915050565b600060c9846040516119ca9190612e4d565b908152602001604051809103902060020160049054906101000a900463ffffffff16826119f791906136b2565b905062278d008163ffffffff161115611a115762278d0090505b60006201518082611a229190613643565b9050600060c986604051611a369190612e4d565b908152602001604051809103902060020160009054906101000a900463ffffffff1685611a6391906136b2565b905060008263ffffffff16118015611a925750601882611a839190613674565b63ffffffff168163ffffffff16115b15611aa757601882611aa49190613674565b90505b60008190506000600190505b8363ffffffff168163ffffffff161015611b93576000601e620151808084611adb9190613674565b89611ae691906136b2565b611af09190613643565b611afa919061384f565b63ffffffff1690508484611b0e9190613643565b60c98a604051611b1e9190612e4d565b908152602001604051809103902060040182601e8110611b4157611b4061390d565b5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508484611b729190613643565b83611b7d91906136b2565b9250508080611b8b90613822565b915050611ab3565b506000601e6201518087611ba79190613643565b611bb1919061384f565b63ffffffff1690508160c989604051611bca9190612e4d565b908152602001604051809103902060040182601e8110611bed57611bec61390d565b5b601091828204019190066002028282829054906101000a900461ffff16611c149190613596565b92506101000a81548161ffff021916908361ffff1602179055505050505050505050565b600060c989604051611c4a9190612e4d565b9081526020016040518091039020600401601e806020026040519081016040528092919082601e8015611cba576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611c815790505b505050505090507febfed14756579dd6c3419c51b35d199e7a08b687258f3e8232ff772aa9dd679c898989898989898989604051611d0099989796959493929190612fd6565b60405180910390a1505050505050505050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060006041845114611dec57600080fd5b60008060006020870151925060408701519150606087015160001a90508083839550955095505050509193909250565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e85906133d0565b60405180910390fd5b611e96611f99565b565b600033905090565b6000819050919050565b6000819050919050565b611ebd81611e1c565b611efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef3906132cd565b60405180910390fd5b80611f297f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611ea0565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f7683611ffa565b600082511180611f835750805b15611f9457611f928383612049565b505b505050565b600060019054906101000a900460ff16611fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdf906133d0565b60405180910390fd5b611ff8611ff3611e98565b611d13565b565b61200381611eb4565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606061205483611e1c565b612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90613370565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff16846040516120bb9190612e36565b600060405180830381855af49150503d80600081146120f6576040519150601f19603f3d011682016040523d82523d6000602084013e6120fb565b606091505b50915091506121238282604051806060016040528060278152602001613f6d6027913961212d565b9250505092915050565b6060831561213d5782905061218d565b6000835111156121505782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121849190612f45565b60405180910390fd5b9392505050565b8280546121a0906137bf565b90600052602060002090601f0160209004810192826121c25760008555612209565b82601f106121db57805160ff1916838001178555612209565b82800160010185558215612209579182015b828111156122085782518255916020019190600101906121ed565b5b50905061221691906122c3565b5090565b604051806103c00160405280601e90602082028036833780820191505090505090565b828054612249906137bf565b90600052602060002090601f01602090048101928261226b57600085556122b2565b82601f1061228457805160ff19168380011785556122b2565b828001600101855582156122b2579182015b828111156122b1578251825591602001919060010190612296565b5b5090506122bf91906122c3565b5090565b5b808211156122dc5760008160009055506001016122c4565b5090565b60006122f36122ee8461343e565b613419565b90508281526020810184848401111561230f5761230e613970565b5b61231a84828561377d565b509392505050565b60006123356123308461346f565b613419565b90508281526020810184848401111561235157612350613970565b5b61235c84828561377d565b509392505050565b60008135905061237381613f27565b92915050565b60008135905061238881613f3e565b92915050565b60008151905061239d81613f3e565b92915050565b600082601f8301126123b8576123b761396b565b5b81356123c88482602086016122e0565b91505092915050565b600082601f8301126123e6576123e561396b565b5b81356123f6848260208601612322565b91505092915050565b60008135905061240e81613f55565b92915050565b60006020828403121561242a5761242961397a565b5b600061243884828501612364565b91505092915050565b600080604083850312156124585761245761397a565b5b600061246685828601612364565b925050602083013567ffffffffffffffff81111561248757612486613975565b5b612493858286016123a3565b9150509250929050565b6000602082840312156124b3576124b261397a565b5b60006124c18482850161238e565b91505092915050565b600080604083850312156124e1576124e061397a565b5b60006124ef85828601612379565b925050602083013567ffffffffffffffff8111156125105761250f613975565b5b61251c858286016123a3565b9150509250929050565b60006020828403121561253c5761253b61397a565b5b600082013567ffffffffffffffff81111561255a57612559613975565b5b612566848285016123d1565b91505092915050565b60008060008060008060c0878903121561258c5761258b61397a565b5b600087013567ffffffffffffffff8111156125aa576125a9613975565b5b6125b689828a016123d1565b96505060206125c789828a016123ff565b955050604087013567ffffffffffffffff8111156125e8576125e7613975565b5b6125f489828a016123d1565b945050606061260589828a016123ff565b935050608061261689828a01612364565b92505060a061262789828a016123ff565b9150509295509295509295565b600080600080600080600060e0888a0312156126535761265261397a565b5b600088013567ffffffffffffffff81111561267157612670613975565b5b61267d8a828b016123d1565b975050602061268e8a828b016123ff565b965050604088013567ffffffffffffffff8111156126af576126ae613975565b5b6126bb8a828b016123d1565b95505060606126cc8a828b016123ff565b94505060806126dd8a828b01612364565b93505060a06126ee8a828b016123ff565b92505060c088013567ffffffffffffffff81111561270f5761270e613975565b5b61271b8a828b016123a3565b91505092959891949750929550565b60006127368383612d4b565b905092915050565b600061274a8383612ddc565b60208301905092915050565b61275f816136e6565b82525050565b6000612770826134cf565b61277a8185613515565b93508360208202850161278c856134a0565b8060005b858110156127c857848403895281516127a9858261272a565b94506127b4836134fb565b925060208a01995050600181019050612790565b50829750879550505050505092915050565b6127e3816134da565b6127ed8184613526565b92506127f8826134b0565b8060005b83811015612829578151612810878261273e565b965061281b83613508565b9250506001810190506127fc565b505050505050565b61283a816134da565b6128448184613531565b925061284f826134b0565b8060005b83811015612880578151612867878261273e565b965061287283613508565b925050600181019050612853565b505050505050565b612891816136f8565b82525050565b60006128a2826134e5565b6128ac818561353c565b93506128bc81856020860161378c565b6128c58161397f565b840191505092915050565b60006128db826134e5565b6128e5818561354d565b93506128f581856020860161378c565b6128fe8161397f565b840191505092915050565b6000612914826134e5565b61291e818561355e565b935061292e81856020860161378c565b80840191505092915050565b6129438161376b565b82525050565b6000612954826134f0565b61295e8185613569565b935061296e81856020860161378c565b6129778161397f565b840191505092915050565b600061298d826134f0565b612997818561357a565b93506129a781856020860161378c565b6129b08161397f565b840191505092915050565b60006129c6826134f0565b6129d0818561358b565b93506129e081856020860161378c565b80840191505092915050565b600081546129f9816137bf565b612a03818661357a565b94506001821660008114612a1e5760018114612a3057612a63565b60ff1983168652602086019350612a63565b612a39856134ba565b60005b83811015612a5b57815481890152600182019150602081019050612a3c565b808801955050505b50505092915050565b6000612a7960268361357a565b9150612a8482613990565b604082019050919050565b6000612a9c60258361357a565b9150612aa7826139df565b604082019050919050565b6000612abf602c8361357a565b9150612aca82613a2e565b604082019050919050565b6000612ae260218361357a565b9150612aed82613a7d565b604082019050919050565b6000612b05601b8361357a565b9150612b1082613acc565b602082019050919050565b6000612b28602c8361357a565b9150612b3382613af5565b604082019050919050565b6000612b4b60388361357a565b9150612b5682613b44565b604082019050919050565b6000612b6e60298361357a565b9150612b7982613b93565b604082019050919050565b6000612b91602e8361357a565b9150612b9c82613be2565b604082019050919050565b6000612bb460258361357a565b9150612bbf82613c31565b604082019050919050565b6000612bd7601c8361357a565b9150612be282613c80565b602082019050919050565b6000612bfa602e8361357a565b9150612c0582613ca9565b604082019050919050565b6000612c1d60448361357a565b9150612c2882613cf8565b606082019050919050565b6000612c40602d8361357a565b9150612c4b82613d6d565b604082019050919050565b6000612c6360208361357a565b9150612c6e82613dbc565b602082019050919050565b6000612c86601a8361357a565b9150612c9182613de5565b602082019050919050565b6000612ca960208361357a565b9150612cb482613e0e565b602082019050919050565b6000612ccc60268361357a565b9150612cd782613e37565b604082019050919050565b6000612cef60208361357a565b9150612cfa82613e86565b602082019050919050565b6000612d1260208361357a565b9150612d1d82613eaf565b602082019050919050565b6000612d35602b8361357a565b9150612d4082613ed8565b604082019050919050565b600061046083016000830151612d646000860182612dfa565b5060208301518482036020860152612d7c8282612949565b9150506040830151612d916040860182612dfa565b506060830151612da46060860182612dfa565b5060808301518482036080860152612dbc8282612897565b91505060a0830151612dd160a08601826127da565b508091505092915050565b612de581613702565b82525050565b612df481613730565b82525050565b612e038161373a565b82525050565b612e128161373a565b82525050565b612e218161374a565b82525050565b612e308161375e565b82525050565b6000612e428284612909565b915081905092915050565b6000612e5982846129bb565b915081905092915050565b6000602082019050612e796000830184612756565b92915050565b6000604082019050612e946000830185612756565b612ea16020830184612756565b9392505050565b60006020820190508181036000830152612ec28184612765565b905092915050565b6000602082019050612edf6000830184612888565b92915050565b6000608082019050612efa6000830187612888565b612f076020830186612e27565b612f146040830185612888565b612f216060830184612888565b95945050505050565b6000602082019050612f3f600083018461293a565b92915050565b60006020820190508181036000830152612f5f8184612982565b905092915050565b600060c0820190508181036000830152612f818189612982565b9050612f906020830188612e09565b8181036040830152612fa28187612982565b9050612fb16060830186612e09565b612fbe6080830185612756565b612fcb60a0830184612e09565b979650505050505050565b60006104c0820190508181036000830152612ff1818c612982565b9050613000602083018b612e09565b8181036040830152613012818a612982565b90506130216060830189612e09565b61302e6080830188612756565b61303b60a0830187612e09565b61304860c0830186612e09565b61305560e0830185612e09565b613063610100830184612831565b9a9950505050505050505050565b600061048082019050818103600083015261308c818a612982565b905061309b6020830189612e09565b81810360408301526130ad8188612982565b90506130bc6060830187612e09565b6130c96080830186612e09565b81810360a08301526130db81856128d0565b90506130ea60c0830184612831565b98975050505050505050565b6000604082019050818103600083015261311081856129ec565b905081810360208301526131248184612982565b90509392505050565b6000602082019050818103600083015261314681612a6c565b9050919050565b6000602082019050818103600083015261316681612a8f565b9050919050565b6000602082019050818103600083015261318681612ab2565b9050919050565b600060208201905081810360008301526131a681612ad5565b9050919050565b600060208201905081810360008301526131c681612af8565b9050919050565b600060208201905081810360008301526131e681612b1b565b9050919050565b6000602082019050818103600083015261320681612b3e565b9050919050565b6000602082019050818103600083015261322681612b61565b9050919050565b6000602082019050818103600083015261324681612b84565b9050919050565b6000602082019050818103600083015261326681612ba7565b9050919050565b6000602082019050818103600083015261328681612bca565b9050919050565b600060208201905081810360008301526132a681612bed565b9050919050565b600060208201905081810360008301526132c681612c10565b9050919050565b600060208201905081810360008301526132e681612c33565b9050919050565b6000602082019050818103600083015261330681612c56565b9050919050565b6000606082019050818103600083015261332681612c79565b90506133356020830185612deb565b818103604083015261334781846128d0565b90509392505050565b6000602082019050818103600083015261336981612c9c565b9050919050565b6000602082019050818103600083015261338981612cbf565b9050919050565b600060208201905081810360008301526133a981612ce2565b9050919050565b600060208201905081810360008301526133c981612d05565b9050919050565b600060208201905081810360008301526133e981612d28565b9050919050565b60006040820190506134056000830185612e18565b6134126020830184612e18565b9392505050565b6000613423613434565b905061342f82826137f1565b919050565b6000604051905090565b600067ffffffffffffffff8211156134595761345861393c565b5b6134628261397f565b9050602081019050919050565b600067ffffffffffffffff82111561348a5761348961393c565b5b6134938261397f565b9050602081019050919050565b6000819050602082019050919050565b6000819050919050565b60008190508160005260206000209050919050565b600081519050919050565b6000601e9050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006135a182613702565b91506135ac83613702565b92508261ffff038211156135c3576135c2613880565b5b828201905092915050565b60006135d98261374a565b91506135e48361374a565b92508267ffffffffffffffff0382111561360157613600613880565b5b828201905092915050565b60006136178261375e565b91506136228361375e565b92508260ff0382111561363857613637613880565b5b828201905092915050565b600061364e8261373a565b91506136598361373a565b925082613669576136686138af565b5b828204905092915050565b600061367f8261373a565b915061368a8361373a565b92508163ffffffff04831182151516156136a7576136a6613880565b5b828202905092915050565b60006136bd8261373a565b91506136c88361373a565b9250828210156136db576136da613880565b5b828203905092915050565b60006136f182613710565b9050919050565b6000819050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006137768261375e565b9050919050565b82818337600083830152505050565b60005b838110156137aa57808201518184015260208101905061378f565b838111156137b9576000848401525b50505050565b600060028204905060018216806137d757607f821691505b602082108114156137eb576137ea6138de565b5b50919050565b6137fa8261397f565b810181811067ffffffffffffffff821117156138195761381861393c565b5b80604052505050565b600061382d8261373a565b915063ffffffff82141561384457613843613880565b5b600182019050919050565b600061385a8261373a565b91506138658361373a565b925082613875576138746138af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a20496e76616c6964207369676e65642061646460008201527f726573732e000000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a20496e76616c69642063726561746554696d6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a20496e76616c6964204e6f6e63650000000000600082015250565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a20496e76616c6964206c6173744e6f6e63653c60008201527f4e6f6e6365000000000000000000000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a20496e76616c6964207369676e656400000000600082015250565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a207369676e65642074696d65206d757374206260008201527f652077697468696e20312064617973206f66207468652063757272656e74207460208201527f696d652e00000000000000000000000000000000000000000000000000000000604082015250565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b7f7265706f72745374617475733a20496e76616c6964207369676e656454696d65600082015250565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f7265706f72745374617475733a20496e76616c6964206d73672e73656e646572600082015250565b7f7265706f72745374617475733a20496e76616c69642063726561746554696d65600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b613f30816136e6565b8114613f3b57600080fd5b50565b613f47816136f8565b8114613f5257600080fd5b50565b613f5e8161373a565b8114613f6957600080fd5b5056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fa08e372fe5eb095429883f1e0819d115e1e483edd7366ed8fbeead3887063a964736f6c63430008070033

Deployed ByteCode Sourcemap

42238:7995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43935:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43559:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43769:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44200:521;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;33528:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43196:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;33987:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33206:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45803:2260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21231:103;;;;;;;;;;;;;:::i;:::-;;49723:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20583:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42729:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50018:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43252:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44130:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21489:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43935:153;20469:13;:11;:13::i;:::-;44014:35:::1;44029:14;44045:3;44014:35;;;;;;;:::i;:::-;;;;;;;;44077:3;44060:14;:20;;;;;;;;;;;;:::i;:::-;;43935:153:::0;:::o;43559:159::-;20469:13;:11;:13::i;:::-;43630:44:::1;43649:18;;;;;;;;;;;43669:4;43630:44;;;;;;;:::i;:::-;;;;;;;;43706:4;43685:18;;:25;;;;;;;;;;;;;;;;;;43559:159:::0;:::o;43769:112::-;43826:7;20469:13;:11;:13::i;:::-;43854:18:::1;;;;;;;;;;;43846:27;;43769:112:::0;:::o;44200:521::-;44261:13;44276:6;44284:13;44299:6;44307;44315:12;44329:17;;:::i;:::-;44390:1;44363:7;44371:4;44363:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;:28;;;44359:355;;;44408:24;;:::i;:::-;44447:14;44488:1;44495;44498;44501;44504:6;44476:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44359:355;44544:16;44563:7;44571:4;44563:13;;;;;;:::i;:::-;;;;;;;;;;;;;44544:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44599:4;44605;:15;;;44622:4;:12;;;44636:4;:14;;;44652:4;:19;;;44673:4;:15;;;44690:4;:11;;;44591:111;;;;;;;;;;;;;;;44200:521;;;;;;;;;;:::o;33528:200::-;32078:6;32061:23;;32069:4;32061:23;;;;32053:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32176:6;32152:30;;:20;:18;:20::i;:::-;:30;;;32144:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33612:36:::1;33630:17;33612;:36::i;:::-;33659:61;33681:17;33710:1;33700:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33714:5;33659:21;:61::i;:::-;33528:200:::0;:::o;43196:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33987:225::-;32078:6;32061:23;;32069:4;32061:23;;;;32053:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32176:6;32152:30;;:20;:18;:20::i;:::-;:30;;;32144:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34105:36:::1;34123:17;34105;:36::i;:::-;34152:52;34174:17;34193:4;34199;34152:21;:52::i;:::-;33987:225:::0;;:::o;33206:133::-;33284:7;32523:6;32506:23;;32514:4;32506:23;;;32498:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;23504:66:::1;33311:20;;33304:27;;33206:133:::0;:::o;45803:2260::-;45996:10;45992:14;;:1;:14;45984:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;46066:5;46062:9;;:1;:9;46054:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;46126:10;46122:14;;:1;:14;46114:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;46196:6;:13;46192:1;:17;46184:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46287:5;46261:31;;:7;46269:4;46261:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;:31;;;46253:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46400:12;46415:66;46423:4;46429:10;46441:7;46450:5;46457:11;46470:10;46415:7;:66::i;:::-;46400:81;;46532:18;;;;;;;;;;;46501:49;;:27;46515:4;46521:6;46501:13;:27::i;:::-;:49;;;46492:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;46687:10;46672:25;;:11;:25;;;46664:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;46747:16;46766:7;46774:4;46766:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;46747:42;;46800:14;46824:15;46800:40;;46851:10;46884:2;46875:5;46865:7;:15;;;;:::i;:::-;46864:22;;;;:::i;:::-;46851:35;;;;46955:1;46928:7;46936:4;46928:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;:28;;;46924:661;;;46973:16;46992:5;46973:24;;47028:2;47016:9;:14;;;47012:69;;;47063:2;47051:14;;47012:69;47134:9;47097:7;47105:4;47097:13;;;;;;:::i;:::-;;;;;;;;;;;;;:20;;47118:5;47097:27;;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;47185:1;47161:9;:20;;;:25;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47220:1;47201:9;:15;;;:20;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46958:275;46924:661;;;47284:5;47270:10;47262:7;:18;;;;:::i;:::-;:27;;;;47254:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;47413:10;47385:38;;:7;47393:4;47385:13;;;;;;:::i;:::-;;;;;;;;;;;;;:24;;;;;;;;;;;;:38;;;47377:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;47478:30;47487:4;47493:5;47500:7;47478:8;:30::i;:::-;47550:7;47558:4;47550:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;47542:5;:31;;;;:::i;:::-;47523:50;;:9;:15;;;:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46924:661;47624:10;47597:7;47605:4;47597:13;;;;;;:::i;:::-;;;;;;;;;;;;;:24;;;:37;;;;;;;;;;;;;;;;;;47669:7;47645;47653:4;47645:13;;;;;;:::i;:::-;;;;;;;;;;;;;:21;;:31;;;;;;;;;;;;:::i;:::-;;47713:5;47687:7;47695:4;47687:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;:31;;;;;;;;;;;;;;;;;;47760:10;47729:7;47737:4;47729:13;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;:41;;;;;;;;;;;;;;;;;;47808:6;47781:7;47789:4;47781:13;;;;;;:::i;:::-;;;;;;;;;;;;;:24;;:33;;;;;;;;;;;;:::i;:::-;;47827:228;47860:4;47879:10;47904:7;47926:5;47946:11;47972:10;47997:9;48028:15;47827:18;:228::i;:::-;45971:2092;;;;45803:2260;;;;;;;:::o;21231:103::-;20469:13;:11;:13::i;:::-;21296:30:::1;21323:1;21296:18;:30::i;:::-;21231:103::o:0;49723:260::-;49882:7;49909:66;49917:4;49923:10;49935:7;49944:5;49951:11;49964:10;49909:7;:66::i;:::-;49902:73;;49723:260;;;;;;;;:::o;20583:87::-;20629:7;20656:6;;;;;;;;;;;20649:13;;20583:87;:::o;42729:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50018:212::-;50099:7;50125;50134:9;50145;50158:19;50173:3;50158:14;:19::i;:::-;50124:53;;;;;;50195:27;50205:4;50213:2;50211:1;:4;;;;:::i;:::-;50217:1;50220;50195:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50188:34;;;;;50018:212;;;;:::o;43252:138::-;15124:19;15147:13;;;;;;;;;;;15146:14;15124:36;;15194:14;:34;;;;;15227:1;15212:12;;;;;;;;;;:16;;;15194:34;15193:108;;;;15235:44;15273:4;15235:29;:44::i;:::-;15234:45;:66;;;;;15299:1;15283:12;;;;;;;;;;:17;;;15234:66;15193:108;15171:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;15401:1;15386:12;;:16;;;;;;;;;;;;;;;;;;15417:14;15413:67;;;15464:4;15448:13;;:20;;;;;;;;;;;;;;;;;;15413:67;43344:11:::1;43323:18;;:32;;;;;;;;;;;;;;;;;;43366:16;:14;:16::i;:::-;15506:14:::0;15502:102;;;15553:5;15537:13;;:21;;;;;;;;;;;;;;;;;;15578:14;15590:1;15578:14;;;;;;:::i;:::-;;;;;;;;15502:102;15113:498;43252:138;:::o;44130:62::-;44175:13;44130:62;:::o;21489:201::-;20469:13;:11;:13::i;:::-;21598:1:::1;21578:22;;:8;:22;;;;21570:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21654:28;21673:8;21654:18;:28::i;:::-;21489:201:::0;:::o;20748:132::-;20823:12;:10;:12::i;:::-;20812:23;;:7;:5;:7::i;:::-;:23;;;20804:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20748:132::o;23785:153::-;23838:7;23865:59;23504:66;23903:20;;23865:37;:59::i;:::-;:65;;;;;;;;;;;;23858:72;;23785:153;:::o;43442:66::-;20469:13;:11;:13::i;:::-;43442:66;:::o;25203:992::-;25657:53;23156:66;25695:14;;25657:37;:53::i;:::-;:59;;;;;;;;;;;;25653:535;;;25733:37;25752:17;25733:18;:37::i;:::-;25653:535;;;25836:17;25807:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25803:306;;26037:56;;;;;;;;;;:::i;:::-;;;;;;;;25803:306;23504:66;25929:20;;25921:4;:28;25913:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;25871:140;26123:53;26141:17;26160:4;26166:9;26123:17;:53::i;:::-;25653:535;25203:992;;;:::o;49323:365::-;49479:7;49499:17;49530:4;49536:10;49548:7;49557:5;49564:11;49577:10;49519:69;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49499:89;;49661:4;:11;49674:4;49616:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49606:74;;;;;;49599:81;;;49323:365;;;;;;;;:::o;48577:209::-;48655:7;48681;48690:9;48701;48714:19;48729:3;48714:14;:19::i;:::-;48680:53;;;;;;48751:27;48761:4;48769:2;48767:1;:4;;;;:::i;:::-;48773:1;48776;48751:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48744:34;;;;;48577:209;;;;:::o;44769:1004::-;44857:15;44885:7;44893:4;44885:13;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;;;;;;;;;44875:7;:38;;;;:::i;:::-;44857:56;;44939:10;44928:8;:21;;;44924:75;;;44977:10;44966:21;;44924:75;45009:15;45038:5;45027:8;:16;;;;:::i;:::-;45009:34;;45056:16;45083:7;45091:4;45083:13;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;45075:5;:31;;;;:::i;:::-;45056:50;;45132:1;45121:8;:12;;;:41;;;;;45160:2;45149:8;:13;;;;:::i;:::-;45137:25;;:9;:25;;;45121:41;45117:99;;;45202:2;45191:8;:13;;;;:::i;:::-;45179:25;;45117:99;45226:17;45246:9;45226:29;;45376:8;45387:1;45376:12;;45371:252;45394:8;45390:12;;:1;:12;;;45371:252;;;45424:13;45474:2;45465:5;45456;45452:1;:9;;;;:::i;:::-;45442:7;:19;;;;:::i;:::-;45441:29;;;;:::i;:::-;45440:36;;;;:::i;:::-;45424:52;;;;45541:8;45531:9;:18;;;;:::i;:::-;45491:7;45499:4;45491:13;;;;;;:::i;:::-;;;;;;;;;;;;;:20;;45512:8;45491:30;;;;;;;:::i;:::-;;;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;45603:8;45593:9;:18;;;;:::i;:::-;45580:10;:31;;;;:::i;:::-;45567:44;;45409:214;45404:3;;;;;:::i;:::-;;;;45371:252;;;;45670:10;45703:2;45694:5;45684:7;:15;;;;:::i;:::-;45683:22;;;;:::i;:::-;45670:35;;;;45754:10;45716:7;45724:4;45716:13;;;;;;:::i;:::-;;;;;;;;;;;;;:20;;45737:5;45716:27;;;;;;;:::i;:::-;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44846:927;;;;;44769:1004;;;:::o;48071:498::-;48269:24;48296:7;48304:4;48296:13;;;;;;:::i;:::-;;;;;;;;;;;;;:20;;48269:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48332:229;48361:4;48380:10;48405:7;48427:5;48447:11;48473:10;48498:9;48522:7;48544:6;48332:229;;;;;;;;;;;;;;:::i;:::-;;;;;;;;48258:311;48071:498;;;;;;;;:::o;21850:191::-;21924:16;21943:6;;;;;;;;;;;21924:25;;21969:8;21960:6;;:17;;;;;;;;;;;;;;;;;;22024:8;21993:40;;22014:8;21993:40;;;;;;;;;;;;21913:128;21850:191;:::o;48794:521::-;48859:5;48866:7;48875;48922:2;48908:3;:10;:16;48900:25;;;;;;48938:9;48958;48978:7;49094:2;49089:3;49085:12;49079:19;49074:24;;49160:2;49155:3;49151:12;49145:19;49140:24;;49263:2;49258:3;49254:12;49248:19;49245:1;49240:28;49235:33;;49299:1;49302;49305;49291:16;;;;;;;;;48794:521;;;;;:::o;5591:326::-;5651:4;5908:1;5886:7;:19;;;:23;5879:30;;5591:326;;;:::o;20126:97::-;16965:13;;;;;;;;;;;16957:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;20189:26:::1;:24;:26::i;:::-;20126:97::o:0;18621:98::-;18674:7;18701:10;18694:17;;18621:98;:::o;1726:195::-;1787:21;1899:4;1889:14;;1726:195;;;:::o;2024:::-;2085:21;2197:4;2187:14;;2024:195;;;:::o;24034:284::-;24116:48;24146:17;24116:29;:48::i;:::-;24108:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;24293:17;24225:59;23504:66;24263:20;;24225:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;24034:284;:::o;24727:297::-;24870:29;24881:17;24870:10;:29::i;:::-;24928:1;24914:4;:11;:15;:28;;;;24933:9;24914:28;24910:107;;;24959:46;24981:17;25000:4;24959:21;:46::i;:::-;;24910:107;24727:297;;;:::o;20231:113::-;16965:13;;;;;;;;;;;16957:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;20304:32:::1;20323:12;:10;:12::i;:::-;20304:18;:32::i;:::-;20231:113::o:0;24431:155::-;24498:37;24517:17;24498:18;:37::i;:::-;24560:17;24551:27;;;;;;;;;;;;24431:155;:::o;29464:461::-;29547:12;29580:37;29610:6;29580:29;:37::i;:::-;29572:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;29734:12;29748:23;29775:6;:19;;29795:4;29775:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29733:67;;;;29818:99;29854:7;29863:10;29818:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;29811:106;;;;29464:461;;;;:::o;11165:762::-;11315:12;11344:7;11340:580;;;11375:10;11368:17;;;;11340:580;11509:1;11489:10;:17;:21;11485:424;;;11737:10;11731:17;11798:15;11785:10;11781:2;11777:19;11770:44;11485:424;11880:12;11873:20;;;;;;;;;;;:::i;:::-;;;;;;;;11165:762;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:::-;1032:5;1070:6;1057:20;1048:29;;1086:33;1113:5;1086:33;:::i;:::-;986:139;;;;:::o;1131:143::-;1188:5;1219:6;1213:13;1204:22;;1235:33;1262:5;1235:33;:::i;:::-;1131:143;;;;:::o;1293:338::-;1348:5;1397:3;1390:4;1382:6;1378:17;1374:27;1364:122;;1405:79;;:::i;:::-;1364:122;1522:6;1509:20;1547:78;1621:3;1613:6;1606:4;1598:6;1594:17;1547:78;:::i;:::-;1538:87;;1354:277;1293:338;;;;:::o;1651:340::-;1707:5;1756:3;1749:4;1741:6;1737:17;1733:27;1723:122;;1764:79;;:::i;:::-;1723:122;1881:6;1868:20;1906:79;1981:3;1973:6;1966:4;1958:6;1954:17;1906:79;:::i;:::-;1897:88;;1713:278;1651:340;;;;:::o;1997:137::-;2042:5;2080:6;2067:20;2058:29;;2096:32;2122:5;2096:32;:::i;:::-;1997:137;;;;:::o;2140:329::-;2199:6;2248:2;2236:9;2227:7;2223:23;2219:32;2216:119;;;2254:79;;:::i;:::-;2216:119;2374:1;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2345:117;2140:329;;;;:::o;2475:652::-;2552:6;2560;2609:2;2597:9;2588:7;2584:23;2580:32;2577:119;;;2615:79;;:::i;:::-;2577:119;2735:1;2760:53;2805:7;2796:6;2785:9;2781:22;2760:53;:::i;:::-;2750:63;;2706:117;2890:2;2879:9;2875:18;2862:32;2921:18;2913:6;2910:30;2907:117;;;2943:79;;:::i;:::-;2907:117;3048:62;3102:7;3093:6;3082:9;3078:22;3048:62;:::i;:::-;3038:72;;2833:287;2475:652;;;;;:::o;3133:351::-;3203:6;3252:2;3240:9;3231:7;3227:23;3223:32;3220:119;;;3258:79;;:::i;:::-;3220:119;3378:1;3403:64;3459:7;3450:6;3439:9;3435:22;3403:64;:::i;:::-;3393:74;;3349:128;3133:351;;;;:::o;3490:652::-;3567:6;3575;3624:2;3612:9;3603:7;3599:23;3595:32;3592:119;;;3630:79;;:::i;:::-;3592:119;3750:1;3775:53;3820:7;3811:6;3800:9;3796:22;3775:53;:::i;:::-;3765:63;;3721:117;3905:2;3894:9;3890:18;3877:32;3936:18;3928:6;3925:30;3922:117;;;3958:79;;:::i;:::-;3922:117;4063:62;4117:7;4108:6;4097:9;4093:22;4063:62;:::i;:::-;4053:72;;3848:287;3490:652;;;;;:::o;4148:509::-;4217:6;4266:2;4254:9;4245:7;4241:23;4237:32;4234:119;;;4272:79;;:::i;:::-;4234:119;4420:1;4409:9;4405:17;4392:31;4450:18;4442:6;4439:30;4436:117;;;4472:79;;:::i;:::-;4436:117;4577:63;4632:7;4623:6;4612:9;4608:22;4577:63;:::i;:::-;4567:73;;4363:287;4148:509;;;;:::o;4663:1411::-;4784:6;4792;4800;4808;4816;4824;4873:3;4861:9;4852:7;4848:23;4844:33;4841:120;;;4880:79;;:::i;:::-;4841:120;5028:1;5017:9;5013:17;5000:31;5058:18;5050:6;5047:30;5044:117;;;5080:79;;:::i;:::-;5044:117;5185:63;5240:7;5231:6;5220:9;5216:22;5185:63;:::i;:::-;5175:73;;4971:287;5297:2;5323:52;5367:7;5358:6;5347:9;5343:22;5323:52;:::i;:::-;5313:62;;5268:117;5452:2;5441:9;5437:18;5424:32;5483:18;5475:6;5472:30;5469:117;;;5505:79;;:::i;:::-;5469:117;5610:63;5665:7;5656:6;5645:9;5641:22;5610:63;:::i;:::-;5600:73;;5395:288;5722:2;5748:52;5792:7;5783:6;5772:9;5768:22;5748:52;:::i;:::-;5738:62;;5693:117;5849:3;5876:53;5921:7;5912:6;5901:9;5897:22;5876:53;:::i;:::-;5866:63;;5820:119;5978:3;6005:52;6049:7;6040:6;6029:9;6025:22;6005:52;:::i;:::-;5995:62;;5949:118;4663:1411;;;;;;;;:::o;6080:1735::-;6219:6;6227;6235;6243;6251;6259;6267;6316:3;6304:9;6295:7;6291:23;6287:33;6284:120;;;6323:79;;:::i;:::-;6284:120;6471:1;6460:9;6456:17;6443:31;6501:18;6493:6;6490:30;6487:117;;;6523:79;;:::i;:::-;6487:117;6628:63;6683:7;6674:6;6663:9;6659:22;6628:63;:::i;:::-;6618:73;;6414:287;6740:2;6766:52;6810:7;6801:6;6790:9;6786:22;6766:52;:::i;:::-;6756:62;;6711:117;6895:2;6884:9;6880:18;6867:32;6926:18;6918:6;6915:30;6912:117;;;6948:79;;:::i;:::-;6912:117;7053:63;7108:7;7099:6;7088:9;7084:22;7053:63;:::i;:::-;7043:73;;6838:288;7165:2;7191:52;7235:7;7226:6;7215:9;7211:22;7191:52;:::i;:::-;7181:62;;7136:117;7292:3;7319:53;7364:7;7355:6;7344:9;7340:22;7319:53;:::i;:::-;7309:63;;7263:119;7421:3;7448:52;7492:7;7483:6;7472:9;7468:22;7448:52;:::i;:::-;7438:62;;7392:118;7577:3;7566:9;7562:19;7549:33;7609:18;7601:6;7598:30;7595:117;;;7631:79;;:::i;:::-;7595:117;7736:62;7790:7;7781:6;7770:9;7766:22;7736:62;:::i;:::-;7726:72;;7520:288;6080:1735;;;;;;;;;;:::o;7821:244::-;7934:10;7969:90;8055:3;8047:6;7969:90;:::i;:::-;7955:104;;7821:244;;;;:::o;8071:175::-;8138:10;8159:44;8199:3;8191:6;8159:44;:::i;:::-;8235:4;8230:3;8226:14;8212:28;;8071:175;;;;:::o;8252:118::-;8339:24;8357:5;8339:24;:::i;:::-;8334:3;8327:37;8252:118;;:::o;8436:1087::-;8599:3;8628:76;8698:5;8628:76;:::i;:::-;8720:108;8821:6;8816:3;8720:108;:::i;:::-;8713:115;;8854:3;8899:4;8891:6;8887:17;8882:3;8878:27;8929:78;9001:5;8929:78;:::i;:::-;9030:7;9061:1;9046:432;9071:6;9068:1;9065:13;9046:432;;;9142:9;9136:4;9132:20;9127:3;9120:33;9193:6;9187:13;9221:108;9324:4;9309:13;9221:108;:::i;:::-;9213:116;;9352:82;9427:6;9352:82;:::i;:::-;9342:92;;9463:4;9458:3;9454:14;9447:21;;9106:372;9093:1;9090;9086:9;9081:14;;9046:432;;;9050:14;9494:4;9487:11;;9514:3;9507:10;;8604:919;;;;;8436:1087;;;;:::o;9561:672::-;9687:52;9733:5;9687:52;:::i;:::-;9755:74;9822:6;9817:3;9755:74;:::i;:::-;9748:81;;9853:54;9901:5;9853:54;:::i;:::-;9930:7;9961:1;9946:280;9971:6;9968:1;9965:13;9946:280;;;10047:6;10041:13;10074:61;10131:3;10116:13;10074:61;:::i;:::-;10067:68;;10158:58;10209:6;10158:58;:::i;:::-;10148:68;;10006:220;9993:1;9990;9986:9;9981:14;;9946:280;;;9950:14;9663:570;;;9561:672;;:::o;10271:692::-;10407:52;10453:5;10407:52;:::i;:::-;10475:84;10552:6;10547:3;10475:84;:::i;:::-;10468:91;;10583:54;10631:5;10583:54;:::i;:::-;10660:7;10691:1;10676:280;10701:6;10698:1;10695:13;10676:280;;;10777:6;10771:13;10804:61;10861:3;10846:13;10804:61;:::i;:::-;10797:68;;10888:58;10939:6;10888:58;:::i;:::-;10878:68;;10736:220;10723:1;10720;10716:9;10711:14;;10676:280;;;10680:14;10383:580;;;10271:692;;:::o;10969:118::-;11056:24;11074:5;11056:24;:::i;:::-;11051:3;11044:37;10969:118;;:::o;11093:340::-;11169:3;11197:38;11229:5;11197:38;:::i;:::-;11251:60;11304:6;11299:3;11251:60;:::i;:::-;11244:67;;11320:52;11365:6;11360:3;11353:4;11346:5;11342:16;11320:52;:::i;:::-;11397:29;11419:6;11397:29;:::i;:::-;11392:3;11388:39;11381:46;;11173:260;11093:340;;;;:::o;11439:360::-;11525:3;11553:38;11585:5;11553:38;:::i;:::-;11607:70;11670:6;11665:3;11607:70;:::i;:::-;11600:77;;11686:52;11731:6;11726:3;11719:4;11712:5;11708:16;11686:52;:::i;:::-;11763:29;11785:6;11763:29;:::i;:::-;11758:3;11754:39;11747:46;;11529:270;11439:360;;;;:::o;11805:373::-;11909:3;11937:38;11969:5;11937:38;:::i;:::-;11991:88;12072:6;12067:3;11991:88;:::i;:::-;11984:95;;12088:52;12133:6;12128:3;12121:4;12114:5;12110:16;12088:52;:::i;:::-;12165:6;12160:3;12156:16;12149:23;;11913:265;11805:373;;;;:::o;12184:143::-;12277:43;12314:5;12277:43;:::i;:::-;12272:3;12265:56;12184:143;;:::o;12333:344::-;12411:3;12439:39;12472:5;12439:39;:::i;:::-;12494:61;12548:6;12543:3;12494:61;:::i;:::-;12487:68;;12564:52;12609:6;12604:3;12597:4;12590:5;12586:16;12564:52;:::i;:::-;12641:29;12663:6;12641:29;:::i;:::-;12636:3;12632:39;12625:46;;12415:262;12333:344;;;;:::o;12683:364::-;12771:3;12799:39;12832:5;12799:39;:::i;:::-;12854:71;12918:6;12913:3;12854:71;:::i;:::-;12847:78;;12934:52;12979:6;12974:3;12967:4;12960:5;12956:16;12934:52;:::i;:::-;13011:29;13033:6;13011:29;:::i;:::-;13006:3;13002:39;12995:46;;12775:272;12683:364;;;;:::o;13053:377::-;13159:3;13187:39;13220:5;13187:39;:::i;:::-;13242:89;13324:6;13319:3;13242:89;:::i;:::-;13235:96;;13340:52;13385:6;13380:3;13373:4;13366:5;13362:16;13340:52;:::i;:::-;13417:6;13412:3;13408:16;13401:23;;13163:267;13053:377;;;;:::o;13460:802::-;13545:3;13582:5;13576:12;13611:36;13637:9;13611:36;:::i;:::-;13663:71;13727:6;13722:3;13663:71;:::i;:::-;13656:78;;13765:1;13754:9;13750:17;13781:1;13776:135;;;;13925:1;13920:336;;;;13743:513;;13776:135;13860:4;13856:9;13845;13841:25;13836:3;13829:38;13896:4;13891:3;13887:14;13880:21;;13776:135;;13920:336;13987:38;14019:5;13987:38;:::i;:::-;14047:1;14061:154;14075:6;14072:1;14069:13;14061:154;;;14149:7;14143:14;14139:1;14134:3;14130:11;14123:35;14199:1;14190:7;14186:15;14175:26;;14097:4;14094:1;14090:12;14085:17;;14061:154;;;14244:1;14239:3;14235:11;14228:18;;13927:329;;13743:513;;13549:713;;13460:802;;;;:::o;14268:366::-;14410:3;14431:67;14495:2;14490:3;14431:67;:::i;:::-;14424:74;;14507:93;14596:3;14507:93;:::i;:::-;14625:2;14620:3;14616:12;14609:19;;14268:366;;;:::o;14640:::-;14782:3;14803:67;14867:2;14862:3;14803:67;:::i;:::-;14796:74;;14879:93;14968:3;14879:93;:::i;:::-;14997:2;14992:3;14988:12;14981:19;;14640:366;;;:::o;15012:::-;15154:3;15175:67;15239:2;15234:3;15175:67;:::i;:::-;15168:74;;15251:93;15340:3;15251:93;:::i;:::-;15369:2;15364:3;15360:12;15353:19;;15012:366;;;:::o;15384:::-;15526:3;15547:67;15611:2;15606:3;15547:67;:::i;:::-;15540:74;;15623:93;15712:3;15623:93;:::i;:::-;15741:2;15736:3;15732:12;15725:19;;15384:366;;;:::o;15756:::-;15898:3;15919:67;15983:2;15978:3;15919:67;:::i;:::-;15912:74;;15995:93;16084:3;15995:93;:::i;:::-;16113:2;16108:3;16104:12;16097:19;;15756:366;;;:::o;16128:::-;16270:3;16291:67;16355:2;16350:3;16291:67;:::i;:::-;16284:74;;16367:93;16456:3;16367:93;:::i;:::-;16485:2;16480:3;16476:12;16469:19;;16128:366;;;:::o;16500:::-;16642:3;16663:67;16727:2;16722:3;16663:67;:::i;:::-;16656:74;;16739:93;16828:3;16739:93;:::i;:::-;16857:2;16852:3;16848:12;16841:19;;16500:366;;;:::o;16872:::-;17014:3;17035:67;17099:2;17094:3;17035:67;:::i;:::-;17028:74;;17111:93;17200:3;17111:93;:::i;:::-;17229:2;17224:3;17220:12;17213:19;;16872:366;;;:::o;17244:::-;17386:3;17407:67;17471:2;17466:3;17407:67;:::i;:::-;17400:74;;17483:93;17572:3;17483:93;:::i;:::-;17601:2;17596:3;17592:12;17585:19;;17244:366;;;:::o;17616:::-;17758:3;17779:67;17843:2;17838:3;17779:67;:::i;:::-;17772:74;;17855:93;17944:3;17855:93;:::i;:::-;17973:2;17968:3;17964:12;17957:19;;17616:366;;;:::o;17988:::-;18130:3;18151:67;18215:2;18210:3;18151:67;:::i;:::-;18144:74;;18227:93;18316:3;18227:93;:::i;:::-;18345:2;18340:3;18336:12;18329:19;;17988:366;;;:::o;18360:::-;18502:3;18523:67;18587:2;18582:3;18523:67;:::i;:::-;18516:74;;18599:93;18688:3;18599:93;:::i;:::-;18717:2;18712:3;18708:12;18701:19;;18360:366;;;:::o;18732:::-;18874:3;18895:67;18959:2;18954:3;18895:67;:::i;:::-;18888:74;;18971:93;19060:3;18971:93;:::i;:::-;19089:2;19084:3;19080:12;19073:19;;18732:366;;;:::o;19104:::-;19246:3;19267:67;19331:2;19326:3;19267:67;:::i;:::-;19260:74;;19343:93;19432:3;19343:93;:::i;:::-;19461:2;19456:3;19452:12;19445:19;;19104:366;;;:::o;19476:::-;19618:3;19639:67;19703:2;19698:3;19639:67;:::i;:::-;19632:74;;19715:93;19804:3;19715:93;:::i;:::-;19833:2;19828:3;19824:12;19817:19;;19476:366;;;:::o;19848:::-;19990:3;20011:67;20075:2;20070:3;20011:67;:::i;:::-;20004:74;;20087:93;20176:3;20087:93;:::i;:::-;20205:2;20200:3;20196:12;20189:19;;19848:366;;;:::o;20220:::-;20362:3;20383:67;20447:2;20442:3;20383:67;:::i;:::-;20376:74;;20459:93;20548:3;20459:93;:::i;:::-;20577:2;20572:3;20568:12;20561:19;;20220:366;;;:::o;20592:::-;20734:3;20755:67;20819:2;20814:3;20755:67;:::i;:::-;20748:74;;20831:93;20920:3;20831:93;:::i;:::-;20949:2;20944:3;20940:12;20933:19;;20592:366;;;:::o;20964:::-;21106:3;21127:67;21191:2;21186:3;21127:67;:::i;:::-;21120:74;;21203:93;21292:3;21203:93;:::i;:::-;21321:2;21316:3;21312:12;21305:19;;20964:366;;;:::o;21336:::-;21478:3;21499:67;21563:2;21558:3;21499:67;:::i;:::-;21492:74;;21575:93;21664:3;21575:93;:::i;:::-;21693:2;21688:3;21684:12;21677:19;;21336:366;;;:::o;21708:::-;21850:3;21871:67;21935:2;21930:3;21871:67;:::i;:::-;21864:74;;21947:93;22036:3;21947:93;:::i;:::-;22065:2;22060:3;22056:12;22049:19;;21708:366;;;:::o;22136:1429::-;22239:3;22275:6;22270:3;22266:16;22370:4;22363:5;22359:16;22353:23;22389:61;22444:4;22439:3;22435:14;22421:12;22389:61;:::i;:::-;22292:168;22545:4;22538:5;22534:16;22528:23;22598:3;22592:4;22588:14;22581:4;22576:3;22572:14;22565:38;22624:73;22692:4;22678:12;22624:73;:::i;:::-;22616:81;;22470:238;22795:4;22788:5;22784:16;22778:23;22814:61;22869:4;22864:3;22860:14;22846:12;22814:61;:::i;:::-;22718:167;22977:4;22970:5;22966:16;22960:23;22996:61;23051:4;23046:3;23042:14;23028:12;22996:61;:::i;:::-;22895:172;23155:4;23148:5;23144:16;23138:23;23208:3;23202:4;23198:14;23191:4;23186:3;23182:14;23175:38;23234:71;23300:4;23286:12;23234:71;:::i;:::-;23226:79;;23077:239;23400:4;23393:5;23389:16;23383:23;23419:109;23522:4;23517:3;23513:14;23499:12;23419:109;:::i;:::-;23326:212;23555:4;23548:11;;22244:1321;22136:1429;;;;:::o;23571:105::-;23646:23;23663:5;23646:23;:::i;:::-;23641:3;23634:36;23571:105;;:::o;23682:118::-;23769:24;23787:5;23769:24;:::i;:::-;23764:3;23757:37;23682:118;;:::o;23806:105::-;23881:23;23898:5;23881:23;:::i;:::-;23876:3;23869:36;23806:105;;:::o;23917:115::-;24002:23;24019:5;24002:23;:::i;:::-;23997:3;23990:36;23917:115;;:::o;24038:::-;24123:23;24140:5;24123:23;:::i;:::-;24118:3;24111:36;24038:115;;:::o;24159:112::-;24242:22;24258:5;24242:22;:::i;:::-;24237:3;24230:35;24159:112;;:::o;24277:271::-;24407:3;24429:93;24518:3;24509:6;24429:93;:::i;:::-;24422:100;;24539:3;24532:10;;24277:271;;;;:::o;24554:275::-;24686:3;24708:95;24799:3;24790:6;24708:95;:::i;:::-;24701:102;;24820:3;24813:10;;24554:275;;;;:::o;24835:222::-;24928:4;24966:2;24955:9;24951:18;24943:26;;24979:71;25047:1;25036:9;25032:17;25023:6;24979:71;:::i;:::-;24835:222;;;;:::o;25063:332::-;25184:4;25222:2;25211:9;25207:18;25199:26;;25235:71;25303:1;25292:9;25288:17;25279:6;25235:71;:::i;:::-;25316:72;25384:2;25373:9;25369:18;25360:6;25316:72;:::i;:::-;25063:332;;;;;:::o;25401:461::-;25588:4;25626:2;25615:9;25611:18;25603:26;;25675:9;25669:4;25665:20;25661:1;25650:9;25646:17;25639:47;25703:152;25850:4;25841:6;25703:152;:::i;:::-;25695:160;;25401:461;;;;:::o;25868:222::-;25961:4;25999:2;25988:9;25984:18;25976:26;;26012:71;26080:1;26069:9;26065:17;26056:6;26012:71;:::i;:::-;25868:222;;;;:::o;26096:545::-;26269:4;26307:3;26296:9;26292:19;26284:27;;26321:71;26389:1;26378:9;26374:17;26365:6;26321:71;:::i;:::-;26402:68;26466:2;26455:9;26451:18;26442:6;26402:68;:::i;:::-;26480:72;26548:2;26537:9;26533:18;26524:6;26480:72;:::i;:::-;26562;26630:2;26619:9;26615:18;26606:6;26562:72;:::i;:::-;26096:545;;;;;;;:::o;26647:234::-;26746:4;26784:2;26773:9;26769:18;26761:26;;26797:77;26871:1;26860:9;26856:17;26847:6;26797:77;:::i;:::-;26647:234;;;;:::o;26887:313::-;27000:4;27038:2;27027:9;27023:18;27015:26;;27087:9;27081:4;27077:20;27073:1;27062:9;27058:17;27051:47;27115:78;27188:4;27179:6;27115:78;:::i;:::-;27107:86;;26887:313;;;;:::o;27206:945::-;27473:4;27511:3;27500:9;27496:19;27488:27;;27561:9;27555:4;27551:20;27547:1;27536:9;27532:17;27525:47;27589:78;27662:4;27653:6;27589:78;:::i;:::-;27581:86;;27677:70;27743:2;27732:9;27728:18;27719:6;27677:70;:::i;:::-;27794:9;27788:4;27784:20;27779:2;27768:9;27764:18;27757:48;27822:78;27895:4;27886:6;27822:78;:::i;:::-;27814:86;;27910:70;27976:2;27965:9;27961:18;27952:6;27910:70;:::i;:::-;27990:73;28058:3;28047:9;28043:19;28034:6;27990:73;:::i;:::-;28073:71;28139:3;28128:9;28124:19;28115:6;28073:71;:::i;:::-;27206:945;;;;;;;;;:::o;28157:1363::-;28550:4;28588;28577:9;28573:20;28565:28;;28639:9;28633:4;28629:20;28625:1;28614:9;28610:17;28603:47;28667:78;28740:4;28731:6;28667:78;:::i;:::-;28659:86;;28755:70;28821:2;28810:9;28806:18;28797:6;28755:70;:::i;:::-;28872:9;28866:4;28862:20;28857:2;28846:9;28842:18;28835:48;28900:78;28973:4;28964:6;28900:78;:::i;:::-;28892:86;;28988:70;29054:2;29043:9;29039:18;29030:6;28988:70;:::i;:::-;29068:73;29136:3;29125:9;29121:19;29112:6;29068:73;:::i;:::-;29151:71;29217:3;29206:9;29202:19;29193:6;29151:71;:::i;:::-;29232;29298:3;29287:9;29283:19;29274:6;29232:71;:::i;:::-;29313;29379:3;29368:9;29364:19;29355:6;29313:71;:::i;:::-;29394:119;29508:3;29497:9;29493:19;29484:6;29394:119;:::i;:::-;28157:1363;;;;;;;;;;;;:::o;29526:1236::-;29885:4;29923;29912:9;29908:20;29900:28;;29974:9;29968:4;29964:20;29960:1;29949:9;29945:17;29938:47;30002:78;30075:4;30066:6;30002:78;:::i;:::-;29994:86;;30090:70;30156:2;30145:9;30141:18;30132:6;30090:70;:::i;:::-;30207:9;30201:4;30197:20;30192:2;30181:9;30177:18;30170:48;30235:78;30308:4;30299:6;30235:78;:::i;:::-;30227:86;;30323:70;30389:2;30378:9;30374:18;30365:6;30323:70;:::i;:::-;30403:71;30469:3;30458:9;30454:19;30445:6;30403:71;:::i;:::-;30522:9;30516:4;30512:20;30506:3;30495:9;30491:19;30484:49;30550:76;30621:4;30612:6;30550:76;:::i;:::-;30542:84;;30636:119;30750:3;30739:9;30735:19;30726:6;30636:119;:::i;:::-;29526:1236;;;;;;;;;;:::o;30768:508::-;30926:4;30964:2;30953:9;30949:18;30941:26;;31013:9;31007:4;31003:20;30999:1;30988:9;30984:17;30977:47;31041:75;31111:4;31102:6;31041:75;:::i;:::-;31033:83;;31163:9;31157:4;31153:20;31148:2;31137:9;31133:18;31126:48;31191:78;31264:4;31255:6;31191:78;:::i;:::-;31183:86;;30768:508;;;;;:::o;31282:419::-;31448:4;31486:2;31475:9;31471:18;31463:26;;31535:9;31529:4;31525:20;31521:1;31510:9;31506:17;31499:47;31563:131;31689:4;31563:131;:::i;:::-;31555:139;;31282:419;;;:::o;31707:::-;31873:4;31911:2;31900:9;31896:18;31888:26;;31960:9;31954:4;31950:20;31946:1;31935:9;31931:17;31924:47;31988:131;32114:4;31988:131;:::i;:::-;31980:139;;31707:419;;;:::o;32132:::-;32298:4;32336:2;32325:9;32321:18;32313:26;;32385:9;32379:4;32375:20;32371:1;32360:9;32356:17;32349:47;32413:131;32539:4;32413:131;:::i;:::-;32405:139;;32132:419;;;:::o;32557:::-;32723:4;32761:2;32750:9;32746:18;32738:26;;32810:9;32804:4;32800:20;32796:1;32785:9;32781:17;32774:47;32838:131;32964:4;32838:131;:::i;:::-;32830:139;;32557:419;;;:::o;32982:::-;33148:4;33186:2;33175:9;33171:18;33163:26;;33235:9;33229:4;33225:20;33221:1;33210:9;33206:17;33199:47;33263:131;33389:4;33263:131;:::i;:::-;33255:139;;32982:419;;;:::o;33407:::-;33573:4;33611:2;33600:9;33596:18;33588:26;;33660:9;33654:4;33650:20;33646:1;33635:9;33631:17;33624:47;33688:131;33814:4;33688:131;:::i;:::-;33680:139;;33407:419;;;:::o;33832:::-;33998:4;34036:2;34025:9;34021:18;34013:26;;34085:9;34079:4;34075:20;34071:1;34060:9;34056:17;34049:47;34113:131;34239:4;34113:131;:::i;:::-;34105:139;;33832:419;;;:::o;34257:::-;34423:4;34461:2;34450:9;34446:18;34438:26;;34510:9;34504:4;34500:20;34496:1;34485:9;34481:17;34474:47;34538:131;34664:4;34538:131;:::i;:::-;34530:139;;34257:419;;;:::o;34682:::-;34848:4;34886:2;34875:9;34871:18;34863:26;;34935:9;34929:4;34925:20;34921:1;34910:9;34906:17;34899:47;34963:131;35089:4;34963:131;:::i;:::-;34955:139;;34682:419;;;:::o;35107:::-;35273:4;35311:2;35300:9;35296:18;35288:26;;35360:9;35354:4;35350:20;35346:1;35335:9;35331:17;35324:47;35388:131;35514:4;35388:131;:::i;:::-;35380:139;;35107:419;;;:::o;35532:::-;35698:4;35736:2;35725:9;35721:18;35713:26;;35785:9;35779:4;35775:20;35771:1;35760:9;35756:17;35749:47;35813:131;35939:4;35813:131;:::i;:::-;35805:139;;35532:419;;;:::o;35957:::-;36123:4;36161:2;36150:9;36146:18;36138:26;;36210:9;36204:4;36200:20;36196:1;36185:9;36181:17;36174:47;36238:131;36364:4;36238:131;:::i;:::-;36230:139;;35957:419;;;:::o;36382:::-;36548:4;36586:2;36575:9;36571:18;36563:26;;36635:9;36629:4;36625:20;36621:1;36610:9;36606:17;36599:47;36663:131;36789:4;36663:131;:::i;:::-;36655:139;;36382:419;;;:::o;36807:::-;36973:4;37011:2;37000:9;36996:18;36988:26;;37060:9;37054:4;37050:20;37046:1;37035:9;37031:17;37024:47;37088:131;37214:4;37088:131;:::i;:::-;37080:139;;36807:419;;;:::o;37232:::-;37398:4;37436:2;37425:9;37421:18;37413:26;;37485:9;37479:4;37475:20;37471:1;37460:9;37456:17;37449:47;37513:131;37639:4;37513:131;:::i;:::-;37505:139;;37232:419;;;:::o;37657:726::-;37897:4;37935:2;37924:9;37920:18;37912:26;;37984:9;37978:4;37974:20;37970:1;37959:9;37955:17;37948:47;38012:131;38138:4;38012:131;:::i;:::-;38004:139;;38153:72;38221:2;38210:9;38206:18;38197:6;38153:72;:::i;:::-;38272:9;38266:4;38262:20;38257:2;38246:9;38242:18;38235:48;38300:76;38371:4;38362:6;38300:76;:::i;:::-;38292:84;;37657:726;;;;;:::o;38389:419::-;38555:4;38593:2;38582:9;38578:18;38570:26;;38642:9;38636:4;38632:20;38628:1;38617:9;38613:17;38606:47;38670:131;38796:4;38670:131;:::i;:::-;38662:139;;38389:419;;;:::o;38814:::-;38980:4;39018:2;39007:9;39003:18;38995:26;;39067:9;39061:4;39057:20;39053:1;39042:9;39038:17;39031:47;39095:131;39221:4;39095:131;:::i;:::-;39087:139;;38814:419;;;:::o;39239:::-;39405:4;39443:2;39432:9;39428:18;39420:26;;39492:9;39486:4;39482:20;39478:1;39467:9;39463:17;39456:47;39520:131;39646:4;39520:131;:::i;:::-;39512:139;;39239:419;;;:::o;39664:::-;39830:4;39868:2;39857:9;39853:18;39845:26;;39917:9;39911:4;39907:20;39903:1;39892:9;39888:17;39881:47;39945:131;40071:4;39945:131;:::i;:::-;39937:139;;39664:419;;;:::o;40089:::-;40255:4;40293:2;40282:9;40278:18;40270:26;;40342:9;40336:4;40332:20;40328:1;40317:9;40313:17;40306:47;40370:131;40496:4;40370:131;:::i;:::-;40362:139;;40089:419;;;:::o;40514:324::-;40631:4;40669:2;40658:9;40654:18;40646:26;;40682:69;40748:1;40737:9;40733:17;40724:6;40682:69;:::i;:::-;40761:70;40827:2;40816:9;40812:18;40803:6;40761:70;:::i;:::-;40514:324;;;;;:::o;40844:129::-;40878:6;40905:20;;:::i;:::-;40895:30;;40934:33;40962:4;40954:6;40934:33;:::i;:::-;40844:129;;;:::o;40979:75::-;41012:6;41045:2;41039:9;41029:19;;40979:75;:::o;41060:307::-;41121:4;41211:18;41203:6;41200:30;41197:56;;;41233:18;;:::i;:::-;41197:56;41271:29;41293:6;41271:29;:::i;:::-;41263:37;;41355:4;41349;41345:15;41337:23;;41060:307;;;:::o;41373:308::-;41435:4;41525:18;41517:6;41514:30;41511:56;;;41547:18;;:::i;:::-;41511:56;41585:29;41607:6;41585:29;:::i;:::-;41577:37;;41669:4;41663;41659:15;41651:23;;41373:308;;;:::o;41687:154::-;41776:4;41799:3;41791:11;;41829:4;41824:3;41820:14;41812:22;;41687:154;;;:::o;41847:98::-;41912:4;41935:3;41927:11;;41847:98;;;:::o;41951:141::-;42000:4;42023:3;42015:11;;42046:3;42043:1;42036:14;42080:4;42077:1;42067:18;42059:26;;41951:141;;;:::o;42098:136::-;42187:6;42221:5;42215:12;42205:22;;42098:136;;;:::o;42240:104::-;42305:6;42333:4;42323:14;;42240:104;;;:::o;42350:98::-;42401:6;42435:5;42429:12;42419:22;;42350:98;;;:::o;42454:99::-;42506:6;42540:5;42534:12;42524:22;;42454:99;;;:::o;42559:135::-;42651:4;42683;42678:3;42674:14;42666:22;;42559:135;;;:::o;42700:111::-;42768:4;42800;42795:3;42791:14;42783:22;;42700:111;;;:::o;42817:206::-;42938:11;42972:6;42967:3;42960:19;43012:4;43007:3;43003:14;42988:29;;42817:206;;;;:::o;43029:133::-;43116:11;43153:3;43138:18;;43029:133;;;;:::o;43168:143::-;43265:11;43302:3;43287:18;;43168:143;;;;:::o;43317:158::-;43390:11;43424:6;43419:3;43412:19;43464:4;43459:3;43455:14;43440:29;;43317:158;;;;:::o;43481:168::-;43564:11;43598:6;43593:3;43586:19;43638:4;43633:3;43629:14;43614:29;;43481:168;;;;:::o;43655:147::-;43756:11;43793:3;43778:18;;43655:147;;;;:::o;43808:159::-;43882:11;43916:6;43911:3;43904:19;43956:4;43951:3;43947:14;43932:29;;43808:159;;;;:::o;43973:169::-;44057:11;44091:6;44086:3;44079:19;44131:4;44126:3;44122:14;44107:29;;43973:169;;;;:::o;44148:148::-;44250:11;44287:3;44272:18;;44148:148;;;;:::o;44302:242::-;44341:3;44360:19;44377:1;44360:19;:::i;:::-;44355:24;;44393:19;44410:1;44393:19;:::i;:::-;44388:24;;44486:1;44478:6;44474:14;44471:1;44468:21;44465:47;;;44492:18;;:::i;:::-;44465:47;44536:1;44533;44529:9;44522:16;;44302:242;;;;:::o;44550:254::-;44589:3;44608:19;44625:1;44608:19;:::i;:::-;44603:24;;44641:19;44658:1;44641:19;:::i;:::-;44636:24;;44746:1;44726:18;44722:26;44719:1;44716:33;44713:59;;;44752:18;;:::i;:::-;44713:59;44796:1;44793;44789:9;44782:16;;44550:254;;;;:::o;44810:237::-;44848:3;44867:18;44883:1;44867:18;:::i;:::-;44862:23;;44899:18;44915:1;44899:18;:::i;:::-;44894:23;;44989:1;44983:4;44979:12;44976:1;44973:19;44970:45;;;44995:18;;:::i;:::-;44970:45;45039:1;45036;45032:9;45025:16;;44810:237;;;;:::o;45053:182::-;45092:1;45109:19;45126:1;45109:19;:::i;:::-;45104:24;;45142:19;45159:1;45142:19;:::i;:::-;45137:24;;45180:1;45170:35;;45185:18;;:::i;:::-;45170:35;45227:1;45224;45220:9;45215:14;;45053:182;;;;:::o;45241:289::-;45280:7;45303:19;45320:1;45303:19;:::i;:::-;45298:24;;45336:19;45353:1;45336:19;:::i;:::-;45331:24;;45467:1;45455:10;45451:18;45448:1;45445:25;45440:1;45433:9;45426:17;45422:49;45419:75;;;45474:18;;:::i;:::-;45419:75;45522:1;45519;45515:9;45504:20;;45241:289;;;;:::o;45536:188::-;45575:4;45595:19;45612:1;45595:19;:::i;:::-;45590:24;;45628:19;45645:1;45628:19;:::i;:::-;45623:24;;45666:1;45663;45660:8;45657:34;;;45671:18;;:::i;:::-;45657:34;45716:1;45713;45709:9;45701:17;;45536:188;;;;:::o;45730:96::-;45767:7;45796:24;45814:5;45796:24;:::i;:::-;45785:35;;45730:96;;;:::o;45832:77::-;45869:7;45898:5;45887:16;;45832:77;;;:::o;45915:89::-;45951:7;45991:6;45984:5;45980:18;45969:29;;45915:89;;;:::o;46010:126::-;46047:7;46087:42;46080:5;46076:54;46065:65;;46010:126;;;:::o;46142:77::-;46179:7;46208:5;46197:16;;46142:77;;;:::o;46225:93::-;46261:7;46301:10;46294:5;46290:22;46279:33;;46225:93;;;:::o;46324:101::-;46360:7;46400:18;46393:5;46389:30;46378:41;;46324:101;;;:::o;46431:86::-;46466:7;46506:4;46499:5;46495:16;46484:27;;46431:86;;;:::o;46523:117::-;46579:9;46612:22;46628:5;46612:22;:::i;:::-;46599:35;;46523:117;;;:::o;46646:154::-;46730:6;46725:3;46720;46707:30;46792:1;46783:6;46778:3;46774:16;46767:27;46646:154;;;:::o;46806:307::-;46874:1;46884:113;46898:6;46895:1;46892:13;46884:113;;;46983:1;46978:3;46974:11;46968:18;46964:1;46959:3;46955:11;46948:39;46920:2;46917:1;46913:10;46908:15;;46884:113;;;47015:6;47012:1;47009:13;47006:101;;;47095:1;47086:6;47081:3;47077:16;47070:27;47006:101;46855:258;46806:307;;;:::o;47119:320::-;47163:6;47200:1;47194:4;47190:12;47180:22;;47247:1;47241:4;47237:12;47268:18;47258:81;;47324:4;47316:6;47312:17;47302:27;;47258:81;47386:2;47378:6;47375:14;47355:18;47352:38;47349:84;;;47405:18;;:::i;:::-;47349:84;47170:269;47119:320;;;:::o;47445:281::-;47528:27;47550:4;47528:27;:::i;:::-;47520:6;47516:40;47658:6;47646:10;47643:22;47622:18;47610:10;47607:34;47604:62;47601:88;;;47669:18;;:::i;:::-;47601:88;47709:10;47705:2;47698:22;47488:238;47445:281;;:::o;47732:175::-;47770:3;47793:23;47810:5;47793:23;:::i;:::-;47784:32;;47838:10;47831:5;47828:21;47825:47;;;47852:18;;:::i;:::-;47825:47;47899:1;47892:5;47888:13;47881:20;;47732:175;;;:::o;47913:173::-;47944:1;47961:19;47978:1;47961:19;:::i;:::-;47956:24;;47994:19;48011:1;47994:19;:::i;:::-;47989:24;;48032:1;48022:35;;48037:18;;:::i;:::-;48022:35;48078:1;48075;48071:9;48066:14;;47913:173;;;;:::o;48092:180::-;48140:77;48137:1;48130:88;48237:4;48234:1;48227:15;48261:4;48258:1;48251:15;48278:180;48326:77;48323:1;48316:88;48423:4;48420:1;48413:15;48447:4;48444:1;48437:15;48464:180;48512:77;48509:1;48502:88;48609:4;48606:1;48599:15;48633:4;48630:1;48623:15;48650:180;48698:77;48695:1;48688:88;48795:4;48792:1;48785:15;48819:4;48816:1;48809:15;48836:180;48884:77;48881:1;48874:88;48981:4;48978:1;48971:15;49005:4;49002:1;48995:15;49022:117;49131:1;49128;49121:12;49145:117;49254:1;49251;49244:12;49268:117;49377:1;49374;49367:12;49391:117;49500:1;49497;49490:12;49514:102;49555:6;49606:2;49602:7;49597:2;49590:5;49586:14;49582:28;49572:38;;49514:102;;;:::o;49622:225::-;49762:34;49758:1;49750:6;49746:14;49739:58;49831:8;49826:2;49818:6;49814:15;49807:33;49622:225;:::o;49853:224::-;49993:34;49989:1;49981:6;49977:14;49970:58;50062:7;50057:2;50049:6;50045:15;50038:32;49853:224;:::o;50083:231::-;50223:34;50219:1;50211:6;50207:14;50200:58;50292:14;50287:2;50279:6;50275:15;50268:39;50083:231;:::o;50320:220::-;50460:34;50456:1;50448:6;50444:14;50437:58;50529:3;50524:2;50516:6;50512:15;50505:28;50320:220;:::o;50546:177::-;50686:29;50682:1;50674:6;50670:14;50663:53;50546:177;:::o;50729:231::-;50869:34;50865:1;50857:6;50853:14;50846:58;50938:14;50933:2;50925:6;50921:15;50914:39;50729:231;:::o;50966:243::-;51106:34;51102:1;51094:6;51090:14;51083:58;51175:26;51170:2;51162:6;51158:15;51151:51;50966:243;:::o;51215:228::-;51355:34;51351:1;51343:6;51339:14;51332:58;51424:11;51419:2;51411:6;51407:15;51400:36;51215:228;:::o;51449:233::-;51589:34;51585:1;51577:6;51573:14;51566:58;51658:16;51653:2;51645:6;51641:15;51634:41;51449:233;:::o;51688:224::-;51828:34;51824:1;51816:6;51812:14;51805:58;51897:7;51892:2;51884:6;51880:15;51873:32;51688:224;:::o;51918:178::-;52058:30;52054:1;52046:6;52042:14;52035:54;51918:178;:::o;52102:233::-;52242:34;52238:1;52230:6;52226:14;52219:58;52311:16;52306:2;52298:6;52294:15;52287:41;52102:233;:::o;52341:292::-;52481:34;52477:1;52469:6;52465:14;52458:58;52550:34;52545:2;52537:6;52533:15;52526:59;52619:6;52614:2;52606:6;52602:15;52595:31;52341:292;:::o;52639:232::-;52779:34;52775:1;52767:6;52763:14;52756:58;52848:15;52843:2;52835:6;52831:15;52824:40;52639:232;:::o;52877:182::-;53017:34;53013:1;53005:6;53001:14;52994:58;52877:182;:::o;53065:214::-;53205:66;53201:1;53193:6;53189:14;53182:90;53065:214;:::o;53285:182::-;53425:34;53421:1;53413:6;53409:14;53402:58;53285:182;:::o;53473:225::-;53613:34;53609:1;53601:6;53597:14;53590:58;53682:8;53677:2;53669:6;53665:15;53658:33;53473:225;:::o;53704:182::-;53844:34;53840:1;53832:6;53828:14;53821:58;53704:182;:::o;53892:::-;54032:34;54028:1;54020:6;54016:14;54009:58;53892:182;:::o;54080:230::-;54220:34;54216:1;54208:6;54204:14;54197:58;54289:13;54284:2;54276:6;54272:15;54265:38;54080:230;:::o;54316:122::-;54389:24;54407:5;54389:24;:::i;:::-;54382:5;54379:35;54369:63;;54428:1;54425;54418:12;54369:63;54316:122;:::o;54444:::-;54517:24;54535:5;54517:24;:::i;:::-;54510:5;54507:35;54497:63;;54556:1;54553;54546:12;54497:63;54444:122;:::o;54572:120::-;54644:23;54661:5;54644:23;:::i;:::-;54637:5;54634:34;54624:62;;54682:1;54679;54672:12;54624:62;54572:120;:::o

Swarm Source

ipfs://fa08e372fe5eb095429883f1e0819d115e1e483edd7366ed8fbeead3887063a9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading