Source Code
                
                
                
                    
                
                
            
          
            
        Latest 25 from a total of 4,588 transactions
| Transaction Hash | 
                                         
                                           Method 
                                             
                                     | 
                                    
                                         
                                            
                                                Block
                                            
                                            
                                         
                                     | 
                                    
                                         
                                            
                                                From
                                            
                                             
                                     | 
                                    
                                         | 
                                    
                                         
                                            
                                                To
                                            
                                             
                                     | 
                                    ||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 22167859 | 218 days ago | IN | 0 ETH | 0.00022722 | ||||
| Emergency Withdr... | 22167850 | 218 days ago | IN | 0 ETH | 0.00023106 | ||||
| Emergency Withdr... | 22167848 | 218 days ago | IN | 0 ETH | 0.00046785 | ||||
| Emergency Withdr... | 22167845 | 218 days ago | IN | 0 ETH | 0.00027166 | ||||
| Emergency Withdr... | 22167840 | 218 days ago | IN | 0 ETH | 0.00020596 | ||||
| Emergency Withdr... | 22167837 | 218 days ago | IN | 0 ETH | 0.00019815 | ||||
| Emergency Withdr... | 22084280 | 229 days ago | IN | 0 ETH | 0.00011241 | ||||
| Emergency Withdr... | 22084275 | 229 days ago | IN | 0 ETH | 0.00013837 | ||||
| Emergency Withdr... | 22084273 | 229 days ago | IN | 0 ETH | 0.00011155 | ||||
| Emergency Withdr... | 22084265 | 229 days ago | IN | 0 ETH | 0.00010939 | ||||
| Emergency Withdr... | 22084244 | 229 days ago | IN | 0 ETH | 0.00010666 | ||||
| Emergency Withdr... | 22084238 | 229 days ago | IN | 0 ETH | 0.00010412 | ||||
| Emergency Withdr... | 22084236 | 229 days ago | IN | 0 ETH | 0.00009384 | ||||
| Emergency Withdr... | 22084235 | 229 days ago | IN | 0 ETH | 0.00013229 | ||||
| Emergency Withdr... | 22082970 | 229 days ago | IN | 0 ETH | 0.00019234 | ||||
| Emergency Withdr... | 22082949 | 229 days ago | IN | 0 ETH | 0.00019288 | ||||
| Emergency Withdr... | 22082945 | 229 days ago | IN | 0 ETH | 0.00016256 | ||||
| Emergency Withdr... | 22082940 | 229 days ago | IN | 0 ETH | 0.00016325 | ||||
| Emergency Withdr... | 22082936 | 229 days ago | IN | 0 ETH | 0.00020386 | ||||
| Emergency Withdr... | 22082930 | 229 days ago | IN | 0 ETH | 0.00016301 | ||||
| Emergency Withdr... | 22082914 | 229 days ago | IN | 0 ETH | 0.00019588 | ||||
| Emergency Withdr... | 22081393 | 230 days ago | IN | 0 ETH | 0.00013328 | ||||
| Emergency Withdr... | 22081348 | 230 days ago | IN | 0 ETH | 0.00014972 | ||||
| Emergency Withdr... | 22077919 | 230 days ago | IN | 0 ETH | 0.00010424 | ||||
| Emergency Withdr... | 22066943 | 232 days ago | IN | 0 ETH | 0.00011502 | 
View more zero value Internal Transactions in Advanced View mode
                                    
                                    
                                    
                                         Advanced mode:
                                    
                                    
                                    
                                        
                                    
                                
                            Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
                                        
                                            Staking
                                        
                                    Compiler Version
                                        
                                            v0.8.17+commit.8df45f5f
                                        
                                    Contract Source Code (Solidity)
/**
 *Submitted for verification at Etherscan.io on 2023-01-10
*/
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.
    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor() {
        _status = _NOT_ENTERED;
    }
    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
        _;
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: @openzeppelin/contracts/utils/Context.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 Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: @openzeppelin/contracts/access/Ownable.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 Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}
// 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: @openzeppelin/contracts/utils/Address.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 Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);
    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;
    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }
    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
// File: Staking.sol
pragma solidity ^0.8.0;
contract Staking is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    // Whether it is initialized
    bool public isInitialized;
    uint256 public duration;
    uint256 public slot;
    // Whether a limit is set for users
    bool public hasUserLimit;
    // The pool limit (0 if none)
    uint256 public poolLimitPerUser;
    // The block number when staking starts.
    uint256 public startBlock;
    // The block number when staking ends.
    uint256 public bonusEndBlock;
    address public walletA;
    uint256 private constant  MIN_SLOT = 1;
    uint256 private constant  MAX_SLOT = 60 * 60 * 24;
    uint256 private constant  DAY_LENGTH = 60 * 60 * 24;
    uint256 private constant  MAX_INT = type(uint256).max;
    // The staked token
    address stakingToken;
    uint256 private totalEarnedTokenDeposed;
    struct Lockup {
        uint8 stakeType;
        uint256 duration;
        uint256 depositFee;
        uint256 withdrawFee;
        uint256 rate;
        uint256 lastRewardBlock;
        uint256 totalStaked;
        uint256 totalEarned;
        uint256 totalCompounded;
        uint256 totalWithdrawn;
        bool depositFeeReverse;
        bool withdrawFeeReverse;
    }
    struct UserInfo {
        uint256 lastRewardBlock;
        uint256 totalStaked;
        uint256 totalEarned;
        uint256 totalCompounded;
        uint256 totalWithdrawn;
    }
    struct Stake {
        uint8 stakeType;
        uint256 duration;
        uint256 end;
        uint256 lastRewardBlock;
        uint256 staked;
        uint256 earned;
        uint256 compounded;
        uint256 withdrawn;
    }
    uint256 constant MAX_STAKES = 2048;
    Lockup[] public lockups;
    mapping(address => Stake[]) public userStakes;
    mapping(address => mapping(uint8 => UserInfo)) public userStaked;
    event Deposit(address indexed user, uint256 stakeType, uint256 amount, uint256 depositFee, bool depositFeeReverse, uint256 fee);
    event Withdraw(address indexed user, uint256 stakeType, uint256 amount, uint256 depositFee, bool depositFeeReverse, uint256 fee);
    event EmergencyWithdraw(address indexed user, uint256 amount);
    event AdminTokenRecovered(address tokenRecovered, uint256 amount);
    event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock);
    event LockupUpdated(uint8 _type, uint256 _duration, uint256 _fee0, uint256 _fee1, uint256 _rate, bool _depositFeeReverse, bool _withdrawFeeReverse);
    event NewPoolLimit(bool hasUserLimit, uint256 poolLimitPerUser);
    event RewardsStop(uint256 blockNumber);
    event DurationUpdated(uint256 duration);
    event SetSettings(
        address _walletA
    );
    /* +++
     * @notice Initialize the contract
     * @param _stakingToken: staked token address
     */
    function initialize(
        address _stakingToken,
        uint256 _slot,
        uint256 _duration
    ) external onlyOwner {
        require(!isInitialized, "Already initialized");
        require(_slot >= MIN_SLOT && _slot <= MAX_SLOT, "Incorrect slot!");
        require((DAY_LENGTH / _slot) * _slot == DAY_LENGTH, "Incorrect slot!");
        require(_duration > 0, "Incorrect duration!");
        slot = _slot;
        duration = _duration;
        // Make this contract initialized
        isInitialized = true;
        stakingToken = _stakingToken;
        walletA = msg.sender;
        lockups.push(Lockup(0, 0, 0, 200, 1500, 0, 0, 0, 0, 0, false, false));
        lockups.push(Lockup(1, 30 * 24 * 60 * 60, 0, 0, 2500, 0, 0, 0, 0, 0, false, false));
        lockups.push(Lockup(2, 90 * 24 * 60 * 60, 0, 0, 4000, 0, 0, 0, 0, 0, false, false));
        lockups.push(Lockup(3, 180 * 24 * 60 * 60, 0, 0, 5000, 0, 0, 0, 0, 0, false, false));
        lockups.push(Lockup(4, 360 * 24 * 60 * 60, 0, 0, 6000, 0, 0, 0, 0, 0, false, false));
    }
    /* +++
     * @notice Deposit staked tokens
     */
    function deposit(uint256 _amount, uint8 _stakeType) external nonReentrant {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_amount > 0, "Amount should be greater than 0");
        require(_stakeType < lockups.length, "Invalid stake type");
        UserInfo storage user = userStaked[msg.sender][_stakeType];
        Lockup storage lockup = lockups[_stakeType];
        //calc user and lockup reward
        _calcUserLockupReward(_stakeType);
        uint256 beforeAmount = IERC20(stakingToken).balanceOf(address(this));
        IERC20(stakingToken).safeTransferFrom(
            address(msg.sender),
            address(this),
            _amount
        );
        uint256 afterAmount = IERC20(stakingToken).balanceOf(address(this));
        uint256 realAmount = afterAmount.sub(beforeAmount);
        if (hasUserLimit) {
            require(
                realAmount.add(user.totalStaked) <= poolLimitPerUser,
                "User amount above limit"
            );
        }
        uint256 fee;
        if (lockup.depositFee > 0) {
            fee = realAmount.mul(lockup.depositFee).div(10000);
            if (fee > 0) {
                if(lockup.depositFeeReverse == false){
                    IERC20(stakingToken).safeTransfer(walletA, fee);
                    realAmount = realAmount.sub(fee);
                } else {
                    realAmount = realAmount.add(fee);
                }
            }
        }
        _addStake(_stakeType, msg.sender, lockup.duration, realAmount);
        user.totalStaked = user.totalStaked.add(realAmount);
        lockup.totalStaked = lockup.totalStaked.add(realAmount);
        emit Deposit(msg.sender, _stakeType, realAmount, lockup.depositFee, lockup.depositFeeReverse, fee);
    }
    /* +++ */
    function _addStake(uint8 _stakeType, address _account, uint256 _duration, uint256 _amount) internal {
        Stake[] storage stakes = userStakes[_account];
        // uint256 end = _getSlot().add(_duration.mul(DAY_LENGTH / slot));
        uint256 end = block.timestamp.add(_duration).div(slot);
        uint256 i = stakes.length;
        require(i < MAX_STAKES, "Max stakes");
        stakes.push();
        // insert the stake
        Stake storage newStake = stakes[i];
        newStake.stakeType = _stakeType;
        newStake.duration = _duration;
        newStake.end = end;
        newStake.staked = _amount;
        newStake.lastRewardBlock = _getSlot();
    }
    /* +++
     * @notice Withdraw staked tokens and collect reward tokens
     * @param _amount: amount to withdraw (in earnedToken)
     */
    function withdraw(uint256 _amount, uint8 _stakeType) external nonReentrant {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_amount > 0, "Amount should be greator than 0");
        require(_stakeType < lockups.length, "Invalid stake type");
        UserInfo storage user = userStaked[msg.sender][_stakeType];
        Stake[] storage stakes = userStakes[msg.sender];
        Lockup storage lockup = lockups[_stakeType];
        uint256 remained = _amount;
        uint256 rewardAmount = _claimReward(_stakeType, _amount);
        if (rewardAmount >= remained) {
            remained = 0;
        } else {
            remained = remained.sub(rewardAmount);
        }
        uint256 pending = 0;
        for (uint256 j = 0; j < stakes.length; j++) {
            Stake storage stake = stakes[j];
            if (stake.stakeType != _stakeType) continue;
            if (stake.staked == 0) continue;
            if (_getSlot() <= stake.end) continue;
            if (remained == 0) break;
            uint256 _pending = stake.staked;
            if (_pending > remained) {
                _pending = remained;
            }
            stake.staked = stake.staked.sub(_pending);
            remained = remained.sub(_pending);
            pending = pending.add(_pending);
        }
        if (pending > 0) {
            require(availableRewardTokens() >= pending, "Insufficient reward tokens");
            lockup.totalStaked = lockup.totalStaked.sub(pending);
            user.totalStaked = user.totalStaked.sub(pending);
            uint256 fee;
            if (lockup.withdrawFee > 0) {
                fee = pending.mul(lockup.withdrawFee).div(10000);
                if(fee > 0){
                    if(lockup.withdrawFeeReverse == false){
                        IERC20(stakingToken).safeTransfer(walletA, fee);
                        pending = pending.sub(fee);
                    } else {
                        pending = pending.add(fee);
                    }
                }
            }
            IERC20(stakingToken).safeTransfer(address(msg.sender), pending);
            emit Withdraw(msg.sender, _stakeType, pending, lockup.withdrawFee, lockup.withdrawFeeReverse, fee);
        }
    }
    /* +++ */
    function _claimReward(uint8 _stakeType, uint256 _amount) internal returns (uint256){
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_amount > 0, "Amount should be greator than 0");
        require(_stakeType < lockups.length, "Invalid stake type");
        UserInfo storage user = userStaked[msg.sender][_stakeType];
        Stake[] storage stakes = userStakes[msg.sender];
        Lockup storage lockup = lockups[_stakeType];
        //calc user and lockup reward
        _calcUserLockupReward(_stakeType);
        //calc stake reward
        _calcStakeReward(_stakeType);
        uint256 remained = _amount;
        uint256 pending = 0;
        for (uint256 j = 0; j < stakes.length; j++) {
            Stake storage stake = stakes[j];
            if (stake.stakeType != _stakeType) continue;
            // if (stake.amount == 0) continue;
            if (_getSlot() <= stake.end) continue;
            uint256 _pending = stake.earned.sub(stake.compounded).sub(stake.withdrawn);
            if (_pending > remained) {
                _pending = remained;
            }
            remained = remained.sub(_pending);
            pending = pending.add(_pending);
            stake.withdrawn = stake.withdrawn + _pending;
            if (remained == 0) {
                break;
            }
        }
        if (pending > 0) {
            require(availableRewardTokens() >= pending, "Insufficient reward tokens");
            IERC20(stakingToken).safeTransfer(address(msg.sender), pending);
            lockup.totalWithdrawn = lockup.totalWithdrawn + pending;
            user.totalWithdrawn = user.totalWithdrawn + pending;
            emit Withdraw(msg.sender, _stakeType, pending, lockup.withdrawFee, lockup.withdrawFeeReverse, 0);
        }
        return pending;
    }
    /* +++ */
    function claimReward(uint8 _stakeType) external payable nonReentrant {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_stakeType < lockups.length, "Invalid stake type");
        _claimReward(_stakeType, MAX_INT);
    }
    /* +++ */
    function claimReward(uint8 _stakeType, uint256 _amount) external payable nonReentrant {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_stakeType < lockups.length, "Invalid stake type");
        _claimReward(_stakeType, _amount);
    }
    /* +++ */
    function compoundReward(uint8 _stakeType) external payable nonReentrant {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_stakeType < lockups.length, "Invalid stake type");
        UserInfo storage user = userStaked[msg.sender][_stakeType];
        Stake[] storage stakes = userStakes[msg.sender];
        Lockup storage lockup = lockups[_stakeType];
        //calc user and lockup reward
        _calcUserLockupReward(_stakeType);
        //calc stake reward
        _calcStakeReward(_stakeType);
        uint256 pending = 0;
        for (uint256 j = 0; j < stakes.length; j++) {
            Stake storage stake = stakes[j];
            if (stake.stakeType != _stakeType) continue;
            // if (stake.staked == 0) continue;
            uint256 _pending = stake.earned.sub(stake.compounded).sub(stake.withdrawn);
            pending = pending.add(_pending);
            stake.staked = stake.staked.add(_pending);
            stake.compounded = stake.compounded.add(_pending);
        }
        if (pending > 0) {
            user.totalStaked = user.totalStaked.add(pending);
            user.totalCompounded = user.totalCompounded.add(pending);
            lockup.totalStaked = lockup.totalStaked.add(pending);
            lockup.totalCompounded = lockup.totalCompounded.add(pending);
            emit Deposit(msg.sender, _stakeType, pending, lockup.depositFee, lockup.depositFeeReverse, 0);
        }
    }
    /* +++ */
    function _calcUserLockupReward(uint8 _stakeType) internal {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_stakeType < lockups.length, "Invalid stake type");
        Lockup storage lockup = lockups[_stakeType];
        UserInfo storage user = userStaked[msg.sender][_stakeType];
        uint256 currentSlot = _getSlot();
        uint256 rate;
        uint256 pending;
        rate = _getRate(lockup.rate).mul(_getMultiplier(lockup.lastRewardBlock, currentSlot));
        pending = lockup.totalStaked.mul(rate).div(10 ** 24);
        lockup.totalEarned = lockup.totalEarned + pending;
        lockup.lastRewardBlock = currentSlot;
        rate = _getRate(lockup.rate).mul(_getMultiplier(user.lastRewardBlock, currentSlot));
        pending = user.totalStaked.mul(rate).div(10 ** 24);
        user.totalEarned = user.totalEarned + pending;
        user.lastRewardBlock = currentSlot;
    }
    /* +++ */
    function _calcStakeReward(uint8 _stakeType) internal {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_stakeType < lockups.length, "Invalid stake type");
        Stake[] storage stakes = userStakes[msg.sender];
        Lockup storage lockup = lockups[_stakeType];
        uint256 currentSlot = _getSlot();
        uint256 rate;
        uint256 pending;
        for (uint256 j = 0; j < stakes.length; j++) {
            Stake storage stake = stakes[j];
            if (stake.stakeType != _stakeType) continue;
            if (stake.staked == 0) continue;
            rate = _getRate(lockup.rate).mul(_getMultiplier(stake.lastRewardBlock, currentSlot));
            pending = stake.staked.mul(rate).div(10 ** 24);
            stake.earned = stake.earned.add(pending);
            stake.lastRewardBlock = currentSlot;
        }
    }
    /* +++
     * @notice Withdraw staked tokens without caring about rewards
     * @dev Needs to be for emergency.
     */
    function emergencyWithdraw(uint8 _stakeType) external nonReentrant {
        require(isInitialized, "Not initialized");
        require(startBlock > 0, "Pool not started");
        require(_stakeType < lockups.length, "Invalid stake type");
        UserInfo storage user = userStaked[msg.sender][_stakeType];
        Stake[] storage stakes = userStakes[msg.sender];
        Lockup storage lockup = lockups[_stakeType];
        //calc user and lockup reward
        _calcUserLockupReward(_stakeType);
        //calc stake reward
        _calcStakeReward(_stakeType);
        uint256 amountToTransfer = 0;
        uint256 totalStaked = 0;
        uint256 totalCompounded = 0;
        uint256 totalEarned = 0;
        for (uint256 j = 0; j < stakes.length; j++) {
            Stake storage stake = stakes[j];
            if (stake.stakeType != _stakeType) continue;
            if (stake.staked == 0) continue;
            if (_getSlot() > stake.end) continue;
            amountToTransfer = amountToTransfer.add(stake.staked).sub(stake.compounded);
            totalStaked = totalStaked.add(stake.staked);
            totalCompounded = totalCompounded.add(stake.compounded);
            totalEarned = totalEarned.add(stake.earned);
            stake.staked = 0;
            stake.earned = 0;
            stake.withdrawn = 0;
            stake.compounded = 0;
        }
        if (amountToTransfer > 0) {
            lockup.totalStaked = lockup.totalStaked.sub(totalStaked);
            lockup.totalEarned = lockup.totalEarned.sub(totalEarned);
            lockup.totalCompounded = lockup.totalCompounded.sub(totalCompounded);
            user.totalStaked = user.totalStaked.sub(totalStaked);
            user.totalEarned = user.totalEarned.sub(totalEarned);
            user.totalCompounded = user.totalCompounded.sub(totalCompounded);
            IERC20(stakingToken).safeTransfer(address(msg.sender), amountToTransfer);
        }
        emit EmergencyWithdraw(msg.sender, amountToTransfer);
    }
    /* +++ */
    function rewardPerStakeType(uint8 _stakeType) public view returns (uint256) {
        if (_stakeType >= lockups.length) return 0;
        return lockups[_stakeType].rate;
    }
    /** +++
     * @notice Available amount of reward token
     */
    function availableRewardTokens() public view returns (uint256) {
        uint256 _amount = IERC20(stakingToken).balanceOf(address(this));
        uint256 reserved;
        //        for (uint256 j = 0; j < lockups.length; j++) {
        //            Lockup storage lockup = lockups[j];
        //            reserved = reserved.add(lockup.totalStaked + lockup.totalEarned - lockup.totalCompounded - lockup.totalWithdrawn);
        //        }
        if (_amount > reserved)
            return _amount.sub(reserved);
        else
            return 0;
    }
    /* +++ */
    function userInfo(uint8 _stakeType, address _account) public view returns (uint256 amount, uint256 available, uint256 locked) {
        Stake[] storage stakes = userStakes[_account];
        for (uint256 i = 0; i < stakes.length; i++) {
            Stake storage stake = stakes[i];
            if (stake.stakeType != _stakeType) continue;
            if (stake.staked == 0) continue;
            amount = amount.add(stake.staked);
            if (_getSlot() > stake.end) {
                available = available.add(stake.staked);
            } else {
                locked = locked.add(stake.staked);
            }
        }
    }
    /* +++
     * @notice View function to see pending reward on frontend.
     * @param _user: user address
     * @return Pending reward for a given user
     */
    function pendingReward(address _account, uint8 _stakeType) external view returns (uint256) {
        if (_stakeType >= lockups.length) return 0;
        if (startBlock == 0) return 0;
        Stake[] storage stakes = userStakes[_account];
        Lockup storage lockup = lockups[_stakeType];
        if (lockup.totalStaked == 0) return 0;
        uint256 pending = 0;
        for (uint256 i = 0; i < stakes.length; i++) {
            Stake storage stake = stakes[i];
            if (stake.stakeType != _stakeType) continue;
            // if (stake.staked == 0) continue;
            pending = pending.add(stake.earned - stake.compounded - stake.withdrawn);
            uint256 rate = _getRate(lockup.rate).mul(_getMultiplier(stake.lastRewardBlock, _getSlot()));
            uint256 reward = stake.staked.mul(rate).div(10 ** 24);
            pending = pending.add(reward);
        }
        return pending;
    }
    /* +++
     * @notice Deposit reward token
     * @dev Only call by owner. Needs to be for deposit of reward token.
     */
    function depositRewards(uint _amount) external onlyOwner nonReentrant {
        require(_amount > 0);
        uint256 beforeAmt = IERC20(stakingToken).balanceOf(address(this));
        IERC20(stakingToken).safeTransferFrom(msg.sender, address(this), _amount);
        uint256 afterAmt = IERC20(stakingToken).balanceOf(address(this));
        totalEarnedTokenDeposed = totalEarnedTokenDeposed.add(afterAmt).sub(beforeAmt);
    }
    /* +++
     * @notice It allows the admin to recover wrong tokens sent to the contract
     */
    function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner {
        uint256 reserved;
        if (_tokenAddress == stakingToken) {
            for (uint256 j = 0; j < lockups.length; j++) {
                Lockup storage lockup = lockups[j];
                reserved = reserved.add(lockup.totalStaked + lockup.totalEarned - lockup.totalCompounded - lockup.totalWithdrawn);
            }
        }
        if (reserved > 0) {
            uint256 tokenBal = IERC20(_tokenAddress).balanceOf(address(this));
            require(_tokenAmount <= tokenBal.sub(reserved), "Insufficient balance");
        }
        if (_tokenAddress == address(0x0)) {
            payable(msg.sender).transfer(_tokenAmount);
        } else {
            IERC20(_tokenAddress).safeTransfer(address(msg.sender), _tokenAmount);
        }
        emit AdminTokenRecovered(_tokenAddress, _tokenAmount);
    }
    /* +++ */
    function startReward() external onlyOwner {
        require(startBlock == 0, "Pool was already started");
        startBlock = _getSlot().add(1);
        bonusEndBlock = startBlock.add(duration.mul(DAY_LENGTH / slot));
        emit NewStartAndEndBlocks(startBlock, bonusEndBlock);
    }
    /* +++ */
    function stopReward() external onlyOwner {
        bonusEndBlock = _getSlot();
    }
    /* +++
     * @notice Update pool
     * @dev Only callable by owner.
     */
    function updatePoolLimitPerUser(bool _hasUserLimit, uint256 _poolLimitPerUser) external onlyOwner {
        hasUserLimit = _hasUserLimit;
        if (_hasUserLimit) {
            poolLimitPerUser = _poolLimitPerUser;
        } else {
            poolLimitPerUser = 0;
        }
        emit NewPoolLimit(hasUserLimit, poolLimitPerUser);
    }
    /* +++ */
    function updateLockup(uint8 _stakeType, uint256 _duration, uint256 _depositFee, uint256 _withdrawFee, uint256 _rate, bool _depositFeeReverse, bool _withdrawFeeReverse) external onlyOwner {
        require(_stakeType < lockups.length, "Lockup Not found");
        require(_depositFee < 2000, "Invalid deposit fee");
        require(_withdrawFee < 2000, "Invalid withdraw fee");
        Lockup storage _lockup = lockups[_stakeType];
        // require(_lockup.totalStaked == 0, "Lockup already staked");
        if(_lockup.totalStaked == 0){
            _lockup.duration = _duration;
            _lockup.rate = _rate;
        }
        
        _lockup.depositFee = _depositFee;
        _lockup.withdrawFee = _withdrawFee;        
        _lockup.depositFeeReverse = _depositFeeReverse;
        _lockup.withdrawFeeReverse = _withdrawFeeReverse;
        emit LockupUpdated(_stakeType, _lockup.duration, _depositFee, _withdrawFee, _lockup.rate, _depositFeeReverse, _withdrawFeeReverse);
    }
    /* +++ */
    function addLockup(uint256 _duration, uint256 _depositFee, uint256 _withdrawFee, uint256 _rate, bool _depositFeeReverse, bool _withdrawFeeReverse) external onlyOwner {
        require(_depositFee < 2000, "Invalid deposit fee");
        require(_withdrawFee < 2000, "Invalid withdraw fee");
        lockups.push();
        Lockup storage _lockup = lockups[lockups.length - 1];
        _lockup.duration = _duration;
        _lockup.depositFee = _depositFee;
        _lockup.withdrawFee = _withdrawFee;
        _lockup.rate = _rate;
        _lockup.depositFeeReverse = _depositFeeReverse;
        _lockup.withdrawFeeReverse = _withdrawFeeReverse;
        emit LockupUpdated(uint8(lockups.length - 1), _duration, _depositFee, _withdrawFee, _rate, _depositFeeReverse, _withdrawFeeReverse);
    }
    /* +++ */
    function setDuration(uint256 _duration) external onlyOwner {
        require(startBlock == 0, "Pool was already started");
        require(_duration >= 30, "lower limit reached");
        duration = _duration;
        emit DurationUpdated(_duration);
    }
    /* +++ */
    function setSettings(
        address _feeAddr
    ) external onlyOwner {
        require(_feeAddr != address(0x0), "Invalid Address");
        walletA = _feeAddr;
        emit SetSettings(_feeAddr);
    }
    /* +++
     * @notice Return reward rate per slot.
     */
    function _getRate(uint256 _rate)
    internal
    view
    returns (uint256)
    {
        uint256 rate = _rate.mul(10 ** 20).div(365).div(DAY_LENGTH / slot);
        return rate;
    }
    /* +++
     * @notice Return reward multiplier over the given _from to _to block.
     */
    function _getMultiplier(uint256 _from, uint256 _to)
    internal
    view
    returns (uint256)
    {
        if (_from >= bonusEndBlock) {
            return 0;
        } else if (_to <= bonusEndBlock) {
            return _to.sub(_from);
        } else {
            return bonusEndBlock.sub(_from);
        }
    }
    /* +++ */
    function _getSlot()
    internal
    view
    returns (uint256 _slot)
    {
        _slot = block.timestamp.div(slot);
    }
receive() external payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
 
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"depositFeeReverse","type":"bool"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"DurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rate","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_depositFeeReverse","type":"bool"},{"indexed":false,"internalType":"bool","name":"_withdrawFeeReverse","type":"bool"}],"name":"LockupUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"hasUserLimit","type":"bool"},{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","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":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_walletA","type":"address"}],"name":"SetSettings","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"depositFeeReverse","type":"bool"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawFee","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"bool","name":"_depositFeeReverse","type":"bool"},{"internalType":"bool","name":"_withdrawFeeReverse","type":"bool"}],"name":"addLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"claimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"compoundReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockups","outputs":[{"internalType":"uint8","name":"stakeType","type":"uint8"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"},{"internalType":"uint256","name":"withdrawFee","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalEarned","type":"uint256"},{"internalType":"uint256","name":"totalCompounded","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"},{"internalType":"bool","name":"depositFeeReverse","type":"bool"},{"internalType":"bool","name":"withdrawFeeReverse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"rewardPerStakeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddr","type":"address"}],"name":"setSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"},{"internalType":"uint256","name":"_withdrawFee","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"bool","name":"_depositFeeReverse","type":"bool"},{"internalType":"bool","name":"_withdrawFeeReverse","type":"bool"}],"name":"updateLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasUserLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_stakeType","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalEarned","type":"uint256"},{"internalType":"uint256","name":"totalCompounded","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userStakes","outputs":[{"internalType":"uint8","name":"stakeType","type":"uint8"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256","name":"compounded","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_stakeType","type":"uint8"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b506200001d3362000027565b6001805562000077565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613b8280620000876000396000f3fe6080604052600436106101fd5760003560e01c806378d57eea1161010d57806392e8990e116100a0578063b5d5b5fa1161006f578063b5d5b5fa14610628578063b77e7da014610687578063f2fde38b146106a7578063f6be71d1146106c7578063fbe32b35146106e757600080fd5b806392e8990e146105b95780639f94e272146105d3578063a01d3c2c146105e8578063a0b409051461060857600080fd5b80638da5cb5b116100dc5780638da5cb5b146104695780638e6f4fb71461049b5780638fa2ecf51461051c578063903d42961461059957600080fd5b806378d57eea146104015780637a1ac61e1461041457806380dc0672146104345780638bdf67f21461044957600080fd5b806348cd4cb111610190578063689f16231161015f578063689f1623146103695780636a277fb31461037c578063715018a61461039c578063746c8ae1146103b157806376fa17d2146103c657600080fd5b806348cd4cb11461030a57806353f7ffd214610320578063654cfdff1461033357806366fe9f8a1461035357600080fd5b80631aed6553116101cc5780631aed65531461028a5780632ee37d41146102a0578063392e53cd146102c05780633f138d4b146102ea57600080fd5b806302cffc0a146102095780630fb5a6b41461023c578063155622a4146102525780631a88bc661461027457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b506102296102243660046136f0565b610707565b6040519081526020015b60405180910390f35b34801561024857600080fd5b5061022960035481565b34801561025e57600080fd5b5061027261026d3660046136f0565b61074d565b005b34801561028057600080fd5b5061022960045481565b34801561029657600080fd5b5061022960085481565b3480156102ac57600080fd5b506102726102bb366004613719565b610a3e565b3480156102cc57600080fd5b506002546102da9060ff1681565b6040519015158152602001610233565b3480156102f657600080fd5b506102726103053660046137a0565b610c08565b34801561031657600080fd5b5061022960075481565b61027261032e3660046137ca565b610e10565b34801561033f57600080fd5b5061027261034e3660046137e6565b610eb2565b34801561035f57600080fd5b5061022960065481565b6102726103773660046136f0565b61126a565b34801561038857600080fd5b50610272610397366004613812565b61130d565b3480156103a857600080fd5b50610272611496565b3480156103bd57600080fd5b506102726114aa565b3480156103d257600080fd5b506103e66103e1366004613870565b611585565b60408051938452602084019290925290820152606001610233565b61027261040f3660046136f0565b611665565b34801561042057600080fd5b5061027261042f36600461389a565b6118d6565b34801561044057600080fd5b50610272612136565b34801561045557600080fd5b506102726104643660046138cd565b61214b565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610233565b3480156104a757600080fd5b506104bb6104b63660046138cd565b6122a0565b6040805160ff909d168d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501526101208401521515610140830152151561016082015261018001610233565b34801561052857600080fd5b506105716105373660046138e6565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610233565b3480156105a557600080fd5b506102726105b43660046137e6565b61231c565b3480156105c557600080fd5b506005546102da9060ff1681565b3480156105df57600080fd5b506102296126df565b3480156105f457600080fd5b50610272610603366004613910565b612774565b34801561061457600080fd5b5061027261062336600461392b565b612819565b34801561063457600080fd5b506106486106433660046137a0565b612897565b6040805160ff90991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610233565b34801561069357600080fd5b50600954610483906001600160a01b031681565b3480156106b357600080fd5b506102726106c2366004613910565b6128fd565b3480156106d357600080fd5b506102726106e23660046138cd565b612976565b3480156106f357600080fd5b506102296107023660046138e6565b612a45565b600c5460009060ff83161061071e57506000919050565b600c8260ff168154811061073457610734613949565b90600052602060002090600b0201600401549050919050565b6002600154036107785760405162461bcd60e51b815260040161076f9061395f565b60405180910390fd5b600260018190555460ff1661079f5760405162461bcd60e51b815260040161076f90613996565b6000600754116107c15760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106107e55760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061082557610825613949565b90600052602060002090600b0201905061083e84612bb3565b61084784612d17565b60008060008060005b865481101561096457600087828154811061086d5761086d613949565b60009182526020909120600890910201805490915060ff8b81169116146108945750610952565b80600401546000036108a65750610952565b80600201546108b3612e9e565b11156108bf5750610952565b6108e481600601546108de836004015489612eba90919063ffffffff16565b90612ecd565b95506108fd816004015486612eba90919063ffffffff16565b9450610916816006015485612eba90919063ffffffff16565b935061092f816005015484612eba90919063ffffffff16565b600060048301819055600583018190556007830181905560069092019190915591505b8061095c81613a2b565b915050610850565b5083156109fa57600685015461097a9084612ecd565b6006860155600785015461098e9082612ecd565b600786015560088501546109a29083612ecd565b600886015560018701546109b69084612ecd565b600188015560028701546109ca9082612ecd565b600288015560038701546109de9083612ecd565b6003880155600a546109fa906001600160a01b03163386612ed9565b60405184815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695906020015b60405180910390a2505060018055505050505050565b610a46612f41565b600c5460ff881610610a8d5760405162461bcd60e51b815260206004820152601060248201526f131bd8dadd5c08139bdd08199bdd5b9960821b604482015260640161076f565b6107d08510610ad45760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d08410610b1c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b6000600c8860ff1681548110610b3457610b34613949565b90600052602060002090600b020190508060060154600003610b5f5760018101879055600481018490555b6002810186905560038101859055600a81018054831515610100810261ff001987151590811661ffff199094169390931717909255600183015460048401546040805160ff8e168152602081019390935282018a905260608201899052608082015260a081019190915260c08101919091527ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19060e00160405180910390a15050505050505050565b610c10612f41565b600a546000906001600160a01b0390811690841603610caf5760005b600c54811015610cad576000600c8281548110610c4b57610c4b613949565b90600052602060002090600b02019050610c978160090154826008015483600701548460060154610c7c9190613a44565b610c869190613a57565b610c909190613a57565b8490612eba565b9250508080610ca590613a2b565b915050610c2c565b505b8015610d74576040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190613a6a565b9050610d2c8183612ecd565b831115610d725760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161076f565b505b6001600160a01b038316610db557604051339083156108fc029084906000818181858888f19350505050158015610daf573d6000803e3d6000fd5b50610dc9565b610dc96001600160a01b0384163384612ed9565b604080516001600160a01b0385168152602081018490527f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b910160405180910390a1505050565b600260015403610e325760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610e595760405162461bcd60e51b815260040161076f90613996565b600060075411610e7b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff831610610e9f5760405162461bcd60e51b815260040161076f906139e9565b610ea98282612f9b565b50506001805550565b600260015403610ed45760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610efb5760405162461bcd60e51b815260040161076f90613996565b600060075411610f1d5760405162461bcd60e51b815260040161076f906139bf565b60008211610f6d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161076f565b600c5460ff821610610f915760405162461bcd60e51b815260040161076f906139e9565b336000908152600e6020908152604080832060ff851680855292528220600c805491939290918110610fc557610fc5613949565b90600052602060002090600b02019050610fde83612bb3565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190613a6a565b600a54909150611066906001600160a01b03163330886132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d39190613a6a565b905060006110e18284612ecd565b60055490915060ff1615611150576006546001860154611102908390612eba565b11156111505760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161076f565b6002840154600090156111d45761118061271061117a8760020154856132ed90919063ffffffff16565b906132f9565b905080156111d457600a85015460ff1615156000036111c757600954600a546111b6916001600160a01b03918216911683612ed9565b6111c08282612ecd565b91506111d4565b6111d18282612eba565b91505b6111e48733876001015485613305565b60018601546111f39083612eba565b600187015560068501546112079083612eba565b60068601556002850154600a8601546040805160ff808c168252602082018790529181019390935216151560608201526080810182905233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a001610a28565b60026001540361128c5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166112b35760405162461bcd60e51b815260040161076f90613996565b6000600754116112d55760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106112f95760405162461bcd60e51b815260040161076f906139e9565b61130581600019612f9b565b505060018055565b611315612f41565b6107d0851061135c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d084106113a45760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b600c80546001908101808355600083815292916113c091613a57565b815481106113d0576113d0613949565b60009182526020909120600b909102016001818101899055600282018890556003820187905560048201869055600a8201805461ffff191686151561ff0019161761010086151502179055600c549192507ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19161144d9190613a57565b6040805160ff9092168252602082018a90528101889052606081018790526080810186905284151560a082015283151560c082015260e00160405180910390a150505050505050565b61149e612f41565b6114a860006133df565b565b6114b2612f41565b600754156114fd5760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b611510600161150a612e9e565b90612eba565b60075560045461153d906115349061152b9062015180613a83565b600354906132ed565b60075490612eba565b60088190556007546040517f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069261157b928252602082015260400190565b60405180910390a1565b6001600160a01b0381166000908152600d6020526040812081908190815b815481101561165c5760008282815481106115c0576115c0613949565b60009182526020909120600890910201805490915060ff8981169116146115e7575061164a565b80600401546000036115f9575061164a565b6004810154611609908790612eba565b95508060020154611618612e9e565b111561163557600481015461162e908690612eba565b9450611648565b6004810154611645908590612eba565b93505b505b8061165481613a2b565b9150506115a3565b50509250925092565b6002600154036116875760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166116ae5760405162461bcd60e51b815260040161076f90613996565b6000600754116116d05760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106116f45760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061173457611734613949565b90600052602060002090600b0201905061174d84612bb3565b61175684612d17565b6000805b835481101561181257600084828154811061177757611777613949565b60009182526020909120600890910201805490915060ff88811691161461179e5750611800565b60006117c382600701546108de84600601548560050154612ecd90919063ffffffff16565b90506117cf8482612eba565b60048301549094506117e19082612eba565b600483015560068201546117f59082612eba565b826006018190555050505b8061180a81613a2b565b91505061175a565b5080156118cb5760018401546118289082612eba565b6001850155600384015461183c9082612eba565b600385015560068201546118509082612eba565b600683015560088201546118649082612eba565b60088301556002820154600a8301546040805160ff808a168252602082018690529181019390935216151560608201526000608082015233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a00160405180910390a25b505060018055505050565b6118de612f41565b60025460ff16156119275760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161076f565b6001821015801561193b5750620151808211155b6119795760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b62015180826119888183613a83565b6119929190613aa5565b146119d15760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b60008111611a175760405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206475726174696f6e2160681b604482015260640161076f565b81600481905550806003819055506001600260006101000a81548160ff02191690831515021790555082600a60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555033600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c604051806101800160405280600060ff168152602001600081526020016000815260200160c881526020016105dc815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600160ff16815260200162278d00815260200160008152602001600081526020016109c4815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600260ff1681526020016276a70081526020016000815260200160008152602001610fa0815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600360ff16815260200162ed4e0081526020016000815260200160008152602001611388815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600460ff1681526020016301da9c0081526020016000815260200160008152602001611770815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050505050565b61213e612f41565b612146612e9e565b600855565b612153612f41565b6002600154036121755760405162461bcd60e51b815260040161076f9061395f565b60026001558061218457600080fd5b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190613a6a565b600a5490915061220c906001600160a01b03163330856132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122799190613a6a565b9050612294826108de83600b54612eba90919063ffffffff16565b600b5550506001805550565b600c81815481106122b057600080fd5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015460ff998a169b5097999698959794969395929491939092909180821691610100909104168c565b60026001540361233e5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166123655760405162461bcd60e51b815260040161076f90613996565b6000600754116123875760405162461bcd60e51b815260040161076f906139bf565b600082116123d75760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8216106123fb5760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061243b5761243b613949565b600091825260208220600b90910201915085906124588683612f9b565b905081811061246a5760009150612477565b6124748282612ecd565b91505b6000805b855481101561254857600086828154811061249857612498613949565b60009182526020909120600890910201805490915060ff8a81169116146124bf5750612536565b80600401546000036124d15750612536565b80600201546124de612e9e565b116124e95750612536565b846000036124f75750612548565b6004810154858111156125075750845b60048201546125169082612ecd565b60048301556125258682612ecd565b95506125318482612eba565b935050505b8061254081613a2b565b91505061247b565b5080156126d157806125586126df565b10156125a65760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b60068401546125b59082612ecd565b600685015560018601546125c99082612ecd565b6001870155600384015460009015612651576125f861271061117a8760030154856132ed90919063ffffffff16565b9050801561265157600a850154610100900460ff16151560000361264457600954600a54612633916001600160a01b03918216911683612ed9565b61263d8282612ecd565b9150612651565b61264e8282612eba565b91505b600a54612668906001600160a01b03163384612ed9565b6003850154600a8601546040805160ff808d168252602082018790529181019390935261010090910416151560608201526080810182905233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a2505b505060018055505050505050565b600a546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127509190613a6a565b90506000811561276b576127648282612ecd565b9250505090565b60009250505090565b61277c612f41565b6001600160a01b0381166127c45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015260640161076f565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f51e75be93503449807046766a7c53e9e4563efe11aff3833d7975190b5686d63906020015b60405180910390a150565b612821612f41565b6005805460ff19168315801591909117909155612842576006819055612848565b60006006555b6005546006546040517f6d8e269443e5f2ffc1c2f09adbc884cd839ef06bfaf781503a474d1df30074d89261288b9260ff90911615158252602082015260400190565b60405180910390a15050565b600d60205281600052604060002081815481106128b357600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015460ff90961698509396509194909391929188565b612905612f41565b6001600160a01b03811661296a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b612973816133df565b50565b61297e612f41565b600754156129c95760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b601e811015612a105760405162461bcd60e51b81526020600482015260136024820152721b1bddd95c881b1a5b5a5d081c995858da1959606a1b604482015260640161076f565b60038190556040518181527f91abcc2d6823e3a3f11d31b208dd3065d2c6a791f1c7c9fe96a42ce12897eac59060200161280e565b600c5460009060ff831610612a5c57506000612bad565b600754600003612a6e57506000612bad565b6001600160a01b0383166000908152600d60205260408120600c805491929160ff8616908110612aa057612aa0613949565b90600052602060002090600b020190508060060154600003612ac757600092505050612bad565b6000805b8354811015612ba7576000848281548110612ae857612ae8613949565b60009182526020909120600890910201805490915060ff888116911614612b0f5750612b95565b612b2b816007015482600601548360050154610c869190613a57565b92506000612b5a612b478360030154612b42612e9e565b61342f565b612b548760040154613469565b906132ed565b90506000612b8369d3c21bcecceda100000061117a8486600401546132ed90919063ffffffff16565b9050612b8f8582612eba565b94505050505b80612b9f81613a2b565b915050612acb565b50925050505b92915050565b60025460ff16612bd55760405162461bcd60e51b815260040161076f90613996565b600060075411612bf75760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612c1b5760405162461bcd60e51b815260040161076f906139e9565b6000600c8260ff1681548110612c3357612c33613949565b60009182526020808320338452600e8252604080852060ff88168652909252908320600b90920201925090612c66612e9e565b9050600080612c7c612b4786600501548561342f565b9150612ca369d3c21bcecceda100000061117a8488600601546132ed90919063ffffffff16565b9050808560070154612cb59190613a44565b6007860155600585018390558354612cd190612b47908561342f565b9150612cf869d3c21bcecceda100000061117a8487600101546132ed90919063ffffffff16565b9050808460020154612d0a9190613a44565b6002850155505090555050565b60025460ff16612d395760405162461bcd60e51b815260040161076f90613996565b600060075411612d5b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612d7f5760405162461bcd60e51b815260040161076f906139e9565b336000908152600d60205260408120600c805491929160ff8516908110612da857612da8613949565b90600052602060002090600b020190506000612dc2612e9e565b905060008060005b8554811015612e95576000868281548110612de757612de7613949565b60009182526020909120600890910201805490915060ff898116911614612e0e5750612e83565b8060040154600003612e205750612e83565b612e3e612e3182600301548761342f565b612b548860040154613469565b9350612e6569d3c21bcecceda100000061117a8684600401546132ed90919063ffffffff16565b6005820154909350612e779084612eba565b60058201556003018490555b80612e8d81613a2b565b915050612dca565b50505050505050565b6000612eb5600454426132f990919063ffffffff16565b905090565b6000612ec68284613a44565b9392505050565b6000612ec68284613a57565b6040516001600160a01b038316602482015260448101829052612f3c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613497565b505050565b6000546001600160a01b031633146114a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60025460009060ff16612fc05760405162461bcd60e51b815260040161076f90613996565b600060075411612fe25760405162461bcd60e51b815260040161076f906139bf565b600082116130325760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8416106130565760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8816808552908352818420948452600d9092528220600c80549193929091811061309657613096613949565b90600052602060002090600b020190506130af86612bb3565b6130b886612d17565b846000805b845481101561319d5760008582815481106130da576130da613949565b60009182526020909120600890910201805490915060ff8b8116911614613101575061318b565b806002015461310e612e9e565b11613119575061318b565b600061313e82600701546108de84600601548560050154612ecd90919063ffffffff16565b90508481111561314b5750835b6131558582612ecd565b94506131618482612eba565b93508082600701546131739190613a44565b6007830155600085900361318857505061319d565b50505b8061319581613a2b565b9150506130bd565b5080156132a457806131ad6126df565b10156131fb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b600a54613212906001600160a01b03163383612ed9565b8083600901546132229190613a44565b60098401556004850154613237908290613a44565b60048601556003830154600a8401546040805160ff808d168252602082018690529181019390935261010090910416151560608201526000608082015233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a25b979650505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526132e79085906323b872dd60e01b90608401612f05565b50505050565b6000612ec68284613aa5565b6000612ec68284613a83565b6001600160a01b0383166000908152600d602052604081206004549091906133319061117a4287612eba565b825490915061080081106133745760405162461bcd60e51b815260206004820152600a6024820152694d6178207374616b657360b01b604482015260640161076f565b825460010180845560008481529084908390811061339457613394613949565b60009182526020909120600890910201805460ff191660ff8a1617815560018101879055600281018490556004810186905590506133d0612e9e565b60039091015550505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600854831061344257506000612bad565b600854821161345c576134558284612ecd565b9050612bad565b6008546134559084612ecd565b600080612ec6600454620151806134809190613a83565b61117a61016d818768056bc75e2d631000006132ed565b60006134ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135699092919063ffffffff16565b805190915015612f3c578080602001905181019061350a9190613abc565b612f3c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161076f565b60606135788484600085613580565b949350505050565b6060824710156135e15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161076f565b6001600160a01b0385163b6136385760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076f565b600080866001600160a01b031685876040516136549190613afd565b60006040518083038185875af1925050503d8060008114613691576040519150601f19603f3d011682016040523d82523d6000602084013e613696565b606091505b50915091506132a4828286606083156136b0575081612ec6565b8251156136c05782518084602001fd5b8160405162461bcd60e51b815260040161076f9190613b19565b803560ff811681146136eb57600080fd5b919050565b60006020828403121561370257600080fd5b612ec6826136da565b801515811461297357600080fd5b600080600080600080600060e0888a03121561373457600080fd5b61373d886136da565b96506020880135955060408801359450606088013593506080880135925060a08801356137698161370b565b915060c08801356137798161370b565b8091505092959891949750929550565b80356001600160a01b03811681146136eb57600080fd5b600080604083850312156137b357600080fd5b6137bc83613789565b946020939093013593505050565b600080604083850312156137dd57600080fd5b6137bc836136da565b600080604083850312156137f957600080fd5b82359150613809602084016136da565b90509250929050565b60008060008060008060c0878903121561382b57600080fd5b8635955060208701359450604087013593506060870135925060808701356138528161370b565b915060a08701356138628161370b565b809150509295509295509295565b6000806040838503121561388357600080fd5b61388c836136da565b915061380960208401613789565b6000806000606084860312156138af57600080fd5b6138b884613789565b95602085013595506040909401359392505050565b6000602082840312156138df57600080fd5b5035919050565b600080604083850312156138f957600080fd5b61390283613789565b9150613809602084016136da565b60006020828403121561392257600080fd5b612ec682613789565b6000806040838503121561393e57600080fd5b82356137bc8161370b565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b60208082526010908201526f141bdbdb081b9bdd081cdd185c9d195960821b604082015260600190565b602080825260129082015271496e76616c6964207374616b65207479706560701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201613a3d57613a3d613a15565b5060010190565b80820180821115612bad57612bad613a15565b81810381811115612bad57612bad613a15565b600060208284031215613a7c57600080fd5b5051919050565b600082613aa057634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417612bad57612bad613a15565b600060208284031215613ace57600080fd5b8151612ec68161370b565b60005b83811015613af4578181015183820152602001613adc565b50506000910152565b60008251613b0f818460208701613ad9565b9190910192915050565b6020815260008251806020840152613b38816040850160208701613ad9565b601f01601f1916919091016040019291505056fea2646970667358221220e8b4a903c6f727e8613c18dab2da25cb165ea984372e49bb09265e653b31ce6a64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c806378d57eea1161010d57806392e8990e116100a0578063b5d5b5fa1161006f578063b5d5b5fa14610628578063b77e7da014610687578063f2fde38b146106a7578063f6be71d1146106c7578063fbe32b35146106e757600080fd5b806392e8990e146105b95780639f94e272146105d3578063a01d3c2c146105e8578063a0b409051461060857600080fd5b80638da5cb5b116100dc5780638da5cb5b146104695780638e6f4fb71461049b5780638fa2ecf51461051c578063903d42961461059957600080fd5b806378d57eea146104015780637a1ac61e1461041457806380dc0672146104345780638bdf67f21461044957600080fd5b806348cd4cb111610190578063689f16231161015f578063689f1623146103695780636a277fb31461037c578063715018a61461039c578063746c8ae1146103b157806376fa17d2146103c657600080fd5b806348cd4cb11461030a57806353f7ffd214610320578063654cfdff1461033357806366fe9f8a1461035357600080fd5b80631aed6553116101cc5780631aed65531461028a5780632ee37d41146102a0578063392e53cd146102c05780633f138d4b146102ea57600080fd5b806302cffc0a146102095780630fb5a6b41461023c578063155622a4146102525780631a88bc661461027457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b506102296102243660046136f0565b610707565b6040519081526020015b60405180910390f35b34801561024857600080fd5b5061022960035481565b34801561025e57600080fd5b5061027261026d3660046136f0565b61074d565b005b34801561028057600080fd5b5061022960045481565b34801561029657600080fd5b5061022960085481565b3480156102ac57600080fd5b506102726102bb366004613719565b610a3e565b3480156102cc57600080fd5b506002546102da9060ff1681565b6040519015158152602001610233565b3480156102f657600080fd5b506102726103053660046137a0565b610c08565b34801561031657600080fd5b5061022960075481565b61027261032e3660046137ca565b610e10565b34801561033f57600080fd5b5061027261034e3660046137e6565b610eb2565b34801561035f57600080fd5b5061022960065481565b6102726103773660046136f0565b61126a565b34801561038857600080fd5b50610272610397366004613812565b61130d565b3480156103a857600080fd5b50610272611496565b3480156103bd57600080fd5b506102726114aa565b3480156103d257600080fd5b506103e66103e1366004613870565b611585565b60408051938452602084019290925290820152606001610233565b61027261040f3660046136f0565b611665565b34801561042057600080fd5b5061027261042f36600461389a565b6118d6565b34801561044057600080fd5b50610272612136565b34801561045557600080fd5b506102726104643660046138cd565b61214b565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610233565b3480156104a757600080fd5b506104bb6104b63660046138cd565b6122a0565b6040805160ff909d168d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501526101208401521515610140830152151561016082015261018001610233565b34801561052857600080fd5b506105716105373660046138e6565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610233565b3480156105a557600080fd5b506102726105b43660046137e6565b61231c565b3480156105c557600080fd5b506005546102da9060ff1681565b3480156105df57600080fd5b506102296126df565b3480156105f457600080fd5b50610272610603366004613910565b612774565b34801561061457600080fd5b5061027261062336600461392b565b612819565b34801561063457600080fd5b506106486106433660046137a0565b612897565b6040805160ff90991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610233565b34801561069357600080fd5b50600954610483906001600160a01b031681565b3480156106b357600080fd5b506102726106c2366004613910565b6128fd565b3480156106d357600080fd5b506102726106e23660046138cd565b612976565b3480156106f357600080fd5b506102296107023660046138e6565b612a45565b600c5460009060ff83161061071e57506000919050565b600c8260ff168154811061073457610734613949565b90600052602060002090600b0201600401549050919050565b6002600154036107785760405162461bcd60e51b815260040161076f9061395f565b60405180910390fd5b600260018190555460ff1661079f5760405162461bcd60e51b815260040161076f90613996565b6000600754116107c15760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106107e55760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061082557610825613949565b90600052602060002090600b0201905061083e84612bb3565b61084784612d17565b60008060008060005b865481101561096457600087828154811061086d5761086d613949565b60009182526020909120600890910201805490915060ff8b81169116146108945750610952565b80600401546000036108a65750610952565b80600201546108b3612e9e565b11156108bf5750610952565b6108e481600601546108de836004015489612eba90919063ffffffff16565b90612ecd565b95506108fd816004015486612eba90919063ffffffff16565b9450610916816006015485612eba90919063ffffffff16565b935061092f816005015484612eba90919063ffffffff16565b600060048301819055600583018190556007830181905560069092019190915591505b8061095c81613a2b565b915050610850565b5083156109fa57600685015461097a9084612ecd565b6006860155600785015461098e9082612ecd565b600786015560088501546109a29083612ecd565b600886015560018701546109b69084612ecd565b600188015560028701546109ca9082612ecd565b600288015560038701546109de9083612ecd565b6003880155600a546109fa906001600160a01b03163386612ed9565b60405184815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695906020015b60405180910390a2505060018055505050505050565b610a46612f41565b600c5460ff881610610a8d5760405162461bcd60e51b815260206004820152601060248201526f131bd8dadd5c08139bdd08199bdd5b9960821b604482015260640161076f565b6107d08510610ad45760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d08410610b1c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b6000600c8860ff1681548110610b3457610b34613949565b90600052602060002090600b020190508060060154600003610b5f5760018101879055600481018490555b6002810186905560038101859055600a81018054831515610100810261ff001987151590811661ffff199094169390931717909255600183015460048401546040805160ff8e168152602081019390935282018a905260608201899052608082015260a081019190915260c08101919091527ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19060e00160405180910390a15050505050505050565b610c10612f41565b600a546000906001600160a01b0390811690841603610caf5760005b600c54811015610cad576000600c8281548110610c4b57610c4b613949565b90600052602060002090600b02019050610c978160090154826008015483600701548460060154610c7c9190613a44565b610c869190613a57565b610c909190613a57565b8490612eba565b9250508080610ca590613a2b565b915050610c2c565b505b8015610d74576040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190613a6a565b9050610d2c8183612ecd565b831115610d725760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161076f565b505b6001600160a01b038316610db557604051339083156108fc029084906000818181858888f19350505050158015610daf573d6000803e3d6000fd5b50610dc9565b610dc96001600160a01b0384163384612ed9565b604080516001600160a01b0385168152602081018490527f74f5dcd55c394cb1c6d3b9da22c2464bcc46c38cc3865bd629ed75823249b40b910160405180910390a1505050565b600260015403610e325760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610e595760405162461bcd60e51b815260040161076f90613996565b600060075411610e7b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff831610610e9f5760405162461bcd60e51b815260040161076f906139e9565b610ea98282612f9b565b50506001805550565b600260015403610ed45760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff16610efb5760405162461bcd60e51b815260040161076f90613996565b600060075411610f1d5760405162461bcd60e51b815260040161076f906139bf565b60008211610f6d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161076f565b600c5460ff821610610f915760405162461bcd60e51b815260040161076f906139e9565b336000908152600e6020908152604080832060ff851680855292528220600c805491939290918110610fc557610fc5613949565b90600052602060002090600b02019050610fde83612bb3565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190613a6a565b600a54909150611066906001600160a01b03163330886132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d39190613a6a565b905060006110e18284612ecd565b60055490915060ff1615611150576006546001860154611102908390612eba565b11156111505760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161076f565b6002840154600090156111d45761118061271061117a8760020154856132ed90919063ffffffff16565b906132f9565b905080156111d457600a85015460ff1615156000036111c757600954600a546111b6916001600160a01b03918216911683612ed9565b6111c08282612ecd565b91506111d4565b6111d18282612eba565b91505b6111e48733876001015485613305565b60018601546111f39083612eba565b600187015560068501546112079083612eba565b60068601556002850154600a8601546040805160ff808c168252602082018790529181019390935216151560608201526080810182905233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a001610a28565b60026001540361128c5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166112b35760405162461bcd60e51b815260040161076f90613996565b6000600754116112d55760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106112f95760405162461bcd60e51b815260040161076f906139e9565b61130581600019612f9b565b505060018055565b611315612f41565b6107d0851061135c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206465706f7369742066656560681b604482015260640161076f565b6107d084106113a45760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642077697468647261772066656560601b604482015260640161076f565b600c80546001908101808355600083815292916113c091613a57565b815481106113d0576113d0613949565b60009182526020909120600b909102016001818101899055600282018890556003820187905560048201869055600a8201805461ffff191686151561ff0019161761010086151502179055600c549192507ffed2bed01df3e3b626df9ce252cf51b567dd316bdf4d4551802dd0e619b3a9e19161144d9190613a57565b6040805160ff9092168252602082018a90528101889052606081018790526080810186905284151560a082015283151560c082015260e00160405180910390a150505050505050565b61149e612f41565b6114a860006133df565b565b6114b2612f41565b600754156114fd5760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b611510600161150a612e9e565b90612eba565b60075560045461153d906115349061152b9062015180613a83565b600354906132ed565b60075490612eba565b60088190556007546040517f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069261157b928252602082015260400190565b60405180910390a1565b6001600160a01b0381166000908152600d6020526040812081908190815b815481101561165c5760008282815481106115c0576115c0613949565b60009182526020909120600890910201805490915060ff8981169116146115e7575061164a565b80600401546000036115f9575061164a565b6004810154611609908790612eba565b95508060020154611618612e9e565b111561163557600481015461162e908690612eba565b9450611648565b6004810154611645908590612eba565b93505b505b8061165481613a2b565b9150506115a3565b50509250925092565b6002600154036116875760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166116ae5760405162461bcd60e51b815260040161076f90613996565b6000600754116116d05760405162461bcd60e51b815260040161076f906139bf565b600c5460ff8216106116f45760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061173457611734613949565b90600052602060002090600b0201905061174d84612bb3565b61175684612d17565b6000805b835481101561181257600084828154811061177757611777613949565b60009182526020909120600890910201805490915060ff88811691161461179e5750611800565b60006117c382600701546108de84600601548560050154612ecd90919063ffffffff16565b90506117cf8482612eba565b60048301549094506117e19082612eba565b600483015560068201546117f59082612eba565b826006018190555050505b8061180a81613a2b565b91505061175a565b5080156118cb5760018401546118289082612eba565b6001850155600384015461183c9082612eba565b600385015560068201546118509082612eba565b600683015560088201546118649082612eba565b60088301556002820154600a8301546040805160ff808a168252602082018690529181019390935216151560608201526000608082015233907fd8d55df1c6c8df43b677eb6bc8ab5fe3554d521c8acb973089382f50ade2bab59060a00160405180910390a25b505060018055505050565b6118de612f41565b60025460ff16156119275760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161076f565b6001821015801561193b5750620151808211155b6119795760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b62015180826119888183613a83565b6119929190613aa5565b146119d15760405162461bcd60e51b815260206004820152600f60248201526e496e636f727265637420736c6f742160881b604482015260640161076f565b60008111611a175760405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206475726174696f6e2160681b604482015260640161076f565b81600481905550806003819055506001600260006101000a81548160ff02191690831515021790555082600a60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555033600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c604051806101800160405280600060ff168152602001600081526020016000815260200160c881526020016105dc815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600160ff16815260200162278d00815260200160008152602001600081526020016109c4815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600260ff1681526020016276a70081526020016000815260200160008152602001610fa0815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600360ff16815260200162ed4e0081526020016000815260200160008152602001611388815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050600c604051806101800160405280600460ff1681526020016301da9c0081526020016000815260200160008152602001611770815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555061016082015181600a0160016101000a81548160ff0219169083151502179055505050505050565b61213e612f41565b612146612e9e565b600855565b612153612f41565b6002600154036121755760405162461bcd60e51b815260040161076f9061395f565b60026001558061218457600080fd5b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190613a6a565b600a5490915061220c906001600160a01b03163330856132af565b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122799190613a6a565b9050612294826108de83600b54612eba90919063ffffffff16565b600b5550506001805550565b600c81815481106122b057600080fd5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015460ff998a169b5097999698959794969395929491939092909180821691610100909104168c565b60026001540361233e5760405162461bcd60e51b815260040161076f9061395f565b600260018190555460ff166123655760405162461bcd60e51b815260040161076f90613996565b6000600754116123875760405162461bcd60e51b815260040161076f906139bf565b600082116123d75760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8216106123fb5760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8616808552908352818420948452600d9092528220600c80549193929091811061243b5761243b613949565b600091825260208220600b90910201915085906124588683612f9b565b905081811061246a5760009150612477565b6124748282612ecd565b91505b6000805b855481101561254857600086828154811061249857612498613949565b60009182526020909120600890910201805490915060ff8a81169116146124bf5750612536565b80600401546000036124d15750612536565b80600201546124de612e9e565b116124e95750612536565b846000036124f75750612548565b6004810154858111156125075750845b60048201546125169082612ecd565b60048301556125258682612ecd565b95506125318482612eba565b935050505b8061254081613a2b565b91505061247b565b5080156126d157806125586126df565b10156125a65760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b60068401546125b59082612ecd565b600685015560018601546125c99082612ecd565b6001870155600384015460009015612651576125f861271061117a8760030154856132ed90919063ffffffff16565b9050801561265157600a850154610100900460ff16151560000361264457600954600a54612633916001600160a01b03918216911683612ed9565b61263d8282612ecd565b9150612651565b61264e8282612eba565b91505b600a54612668906001600160a01b03163384612ed9565b6003850154600a8601546040805160ff808d168252602082018790529181019390935261010090910416151560608201526080810182905233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a2505b505060018055505050505050565b600a546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561272c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127509190613a6a565b90506000811561276b576127648282612ecd565b9250505090565b60009250505090565b61277c612f41565b6001600160a01b0381166127c45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015260640161076f565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f51e75be93503449807046766a7c53e9e4563efe11aff3833d7975190b5686d63906020015b60405180910390a150565b612821612f41565b6005805460ff19168315801591909117909155612842576006819055612848565b60006006555b6005546006546040517f6d8e269443e5f2ffc1c2f09adbc884cd839ef06bfaf781503a474d1df30074d89261288b9260ff90911615158252602082015260400190565b60405180910390a15050565b600d60205281600052604060002081815481106128b357600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015460ff90961698509396509194909391929188565b612905612f41565b6001600160a01b03811661296a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b612973816133df565b50565b61297e612f41565b600754156129c95760405162461bcd60e51b8152602060048201526018602482015277141bdbdb081dd85cc8185b1c9958591e481cdd185c9d195960421b604482015260640161076f565b601e811015612a105760405162461bcd60e51b81526020600482015260136024820152721b1bddd95c881b1a5b5a5d081c995858da1959606a1b604482015260640161076f565b60038190556040518181527f91abcc2d6823e3a3f11d31b208dd3065d2c6a791f1c7c9fe96a42ce12897eac59060200161280e565b600c5460009060ff831610612a5c57506000612bad565b600754600003612a6e57506000612bad565b6001600160a01b0383166000908152600d60205260408120600c805491929160ff8616908110612aa057612aa0613949565b90600052602060002090600b020190508060060154600003612ac757600092505050612bad565b6000805b8354811015612ba7576000848281548110612ae857612ae8613949565b60009182526020909120600890910201805490915060ff888116911614612b0f5750612b95565b612b2b816007015482600601548360050154610c869190613a57565b92506000612b5a612b478360030154612b42612e9e565b61342f565b612b548760040154613469565b906132ed565b90506000612b8369d3c21bcecceda100000061117a8486600401546132ed90919063ffffffff16565b9050612b8f8582612eba565b94505050505b80612b9f81613a2b565b915050612acb565b50925050505b92915050565b60025460ff16612bd55760405162461bcd60e51b815260040161076f90613996565b600060075411612bf75760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612c1b5760405162461bcd60e51b815260040161076f906139e9565b6000600c8260ff1681548110612c3357612c33613949565b60009182526020808320338452600e8252604080852060ff88168652909252908320600b90920201925090612c66612e9e565b9050600080612c7c612b4786600501548561342f565b9150612ca369d3c21bcecceda100000061117a8488600601546132ed90919063ffffffff16565b9050808560070154612cb59190613a44565b6007860155600585018390558354612cd190612b47908561342f565b9150612cf869d3c21bcecceda100000061117a8487600101546132ed90919063ffffffff16565b9050808460020154612d0a9190613a44565b6002850155505090555050565b60025460ff16612d395760405162461bcd60e51b815260040161076f90613996565b600060075411612d5b5760405162461bcd60e51b815260040161076f906139bf565b600c5460ff821610612d7f5760405162461bcd60e51b815260040161076f906139e9565b336000908152600d60205260408120600c805491929160ff8516908110612da857612da8613949565b90600052602060002090600b020190506000612dc2612e9e565b905060008060005b8554811015612e95576000868281548110612de757612de7613949565b60009182526020909120600890910201805490915060ff898116911614612e0e5750612e83565b8060040154600003612e205750612e83565b612e3e612e3182600301548761342f565b612b548860040154613469565b9350612e6569d3c21bcecceda100000061117a8684600401546132ed90919063ffffffff16565b6005820154909350612e779084612eba565b60058201556003018490555b80612e8d81613a2b565b915050612dca565b50505050505050565b6000612eb5600454426132f990919063ffffffff16565b905090565b6000612ec68284613a44565b9392505050565b6000612ec68284613a57565b6040516001600160a01b038316602482015260448101829052612f3c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613497565b505050565b6000546001600160a01b031633146114a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60025460009060ff16612fc05760405162461bcd60e51b815260040161076f90613996565b600060075411612fe25760405162461bcd60e51b815260040161076f906139bf565b600082116130325760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746f72207468616e203000604482015260640161076f565b600c5460ff8416106130565760405162461bcd60e51b815260040161076f906139e9565b336000818152600e6020908152604080832060ff8816808552908352818420948452600d9092528220600c80549193929091811061309657613096613949565b90600052602060002090600b020190506130af86612bb3565b6130b886612d17565b846000805b845481101561319d5760008582815481106130da576130da613949565b60009182526020909120600890910201805490915060ff8b8116911614613101575061318b565b806002015461310e612e9e565b11613119575061318b565b600061313e82600701546108de84600601548560050154612ecd90919063ffffffff16565b90508481111561314b5750835b6131558582612ecd565b94506131618482612eba565b93508082600701546131739190613a44565b6007830155600085900361318857505061319d565b50505b8061319581613a2b565b9150506130bd565b5080156132a457806131ad6126df565b10156131fb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604482015260640161076f565b600a54613212906001600160a01b03163383612ed9565b8083600901546132229190613a44565b60098401556004850154613237908290613a44565b60048601556003830154600a8401546040805160ff808d168252602082018690529181019390935261010090910416151560608201526000608082015233907f6fc339a1802fa2084c1e0ee155517a99c78b03e21a71582fe048f318a84599849060a00160405180910390a25b979650505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526132e79085906323b872dd60e01b90608401612f05565b50505050565b6000612ec68284613aa5565b6000612ec68284613a83565b6001600160a01b0383166000908152600d602052604081206004549091906133319061117a4287612eba565b825490915061080081106133745760405162461bcd60e51b815260206004820152600a6024820152694d6178207374616b657360b01b604482015260640161076f565b825460010180845560008481529084908390811061339457613394613949565b60009182526020909120600890910201805460ff191660ff8a1617815560018101879055600281018490556004810186905590506133d0612e9e565b60039091015550505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600854831061344257506000612bad565b600854821161345c576134558284612ecd565b9050612bad565b6008546134559084612ecd565b600080612ec6600454620151806134809190613a83565b61117a61016d818768056bc75e2d631000006132ed565b60006134ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135699092919063ffffffff16565b805190915015612f3c578080602001905181019061350a9190613abc565b612f3c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161076f565b60606135788484600085613580565b949350505050565b6060824710156135e15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161076f565b6001600160a01b0385163b6136385760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076f565b600080866001600160a01b031685876040516136549190613afd565b60006040518083038185875af1925050503d8060008114613691576040519150601f19603f3d011682016040523d82523d6000602084013e613696565b606091505b50915091506132a4828286606083156136b0575081612ec6565b8251156136c05782518084602001fd5b8160405162461bcd60e51b815260040161076f9190613b19565b803560ff811681146136eb57600080fd5b919050565b60006020828403121561370257600080fd5b612ec6826136da565b801515811461297357600080fd5b600080600080600080600060e0888a03121561373457600080fd5b61373d886136da565b96506020880135955060408801359450606088013593506080880135925060a08801356137698161370b565b915060c08801356137798161370b565b8091505092959891949750929550565b80356001600160a01b03811681146136eb57600080fd5b600080604083850312156137b357600080fd5b6137bc83613789565b946020939093013593505050565b600080604083850312156137dd57600080fd5b6137bc836136da565b600080604083850312156137f957600080fd5b82359150613809602084016136da565b90509250929050565b60008060008060008060c0878903121561382b57600080fd5b8635955060208701359450604087013593506060870135925060808701356138528161370b565b915060a08701356138628161370b565b809150509295509295509295565b6000806040838503121561388357600080fd5b61388c836136da565b915061380960208401613789565b6000806000606084860312156138af57600080fd5b6138b884613789565b95602085013595506040909401359392505050565b6000602082840312156138df57600080fd5b5035919050565b600080604083850312156138f957600080fd5b61390283613789565b9150613809602084016136da565b60006020828403121561392257600080fd5b612ec682613789565b6000806040838503121561393e57600080fd5b82356137bc8161370b565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b60208082526010908201526f141bdbdb081b9bdd081cdd185c9d195960821b604082015260600190565b602080825260129082015271496e76616c6964207374616b65207479706560701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201613a3d57613a3d613a15565b5060010190565b80820180821115612bad57612bad613a15565b81810381811115612bad57612bad613a15565b600060208284031215613a7c57600080fd5b5051919050565b600082613aa057634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417612bad57612bad613a15565b600060208284031215613ace57600080fd5b8151612ec68161370b565b60005b83811015613af4578181015183820152602001613adc565b50506000910152565b60008251613b0f818460208701613ad9565b9190910192915050565b6020815260008251806020840152613b38816040850160208701613ad9565b601f01601f1916919091016040019291505056fea2646970667358221220e8b4a903c6f727e8613c18dab2da25cb165ea984372e49bb09265e653b31ce6a64736f6c63430008110033
Deployed Bytecode Sourcemap
31755:25878:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49232:181;;;;;;;;;;-1:-1:-1;49232:181:0;;;;;:::i;:::-;;:::i;:::-;;;508:25:1;;;496:2;481:18;49232:181:0;;;;;;;;31943:23;;;;;;;;;;;;;;;;47146:2063;;;;;;;;;;-1:-1:-1;47146:2063:0;;;;;:::i;:::-;;:::i;:::-;;31975:19;;;;;;;;;;;;;;;;32272:28;;;;;;;;;;;;;;;;54375:1010;;;;;;;;;;-1:-1:-1;54375:1010:0;;;;;:::i;:::-;;:::i;31911:25::-;;;;;;;;;;-1:-1:-1;31911:25:0;;;;;;;;;;;1559:14:1;;1552:22;1534:41;;1522:2;1507:18;31911:25:0;1394:187:1;52543:938:0;;;;;;;;;;-1:-1:-1;52543:938:0;;;;;:::i;:::-;;:::i;32196:25::-;;;;;;;;;;;;;;;;43176:315;;;;;;:::i;:::-;;:::i;35803:1866::-;;;;;;;;;;-1:-1:-1;35803:1866:0;;;;;:::i;:::-;;:::i;32110:31::-;;;;;;;;;;;;;;;;42855:298;;;;;;:::i;:::-;;:::i;55408:808::-;;;;;;;;;;-1:-1:-1;55408:808:0;;;;;:::i;:::-;;:::i;5535:103::-;;;;;;;;;;;;;:::i;53504:295::-;;;;;;;;;;;;;:::i;50090:650::-;;;;;;;;;;-1:-1:-1;50090:650:0;;;;;:::i;:::-;;:::i;:::-;;;;3652:25:1;;;3708:2;3693:18;;3686:34;;;;3736:18;;;3729:34;3640:2;3625:18;50090:650:0;3450:319:1;43514:1530:0;;;;;;:::i;:::-;;:::i;34663:1073::-;;;;;;;;;;-1:-1:-1;34663:1073:0;;;;;:::i;:::-;;:::i;53822:86::-;;;;;;;;;;;;;:::i;51996:437::-;;;;;;;;;;-1:-1:-1;51996:437:0;;;;;:::i;:::-;;:::i;4887:87::-;;;;;;;;;;-1:-1:-1;4933:7:0;4960:6;-1:-1:-1;;;;;4960:6:0;4887:87;;;-1:-1:-1;;;;;4450:32:1;;;4432:51;;4420:2;4405:18;4887:87:0;4286:203:1;33537:23:0;;;;;;;;;;-1:-1:-1;33537:23:0;;;;;:::i;:::-;;:::i;:::-;;;;4965:4:1;4953:17;;;4935:36;;5002:2;4987:18;;4980:34;;;;5030:18;;;5023:34;;;;5088:2;5073:18;;5066:34;;;;5131:3;5116:19;;5109:35;;;;5175:3;5160:19;;5153:35;;;;5219:3;5204:19;;5197:35;5263:3;5248:19;;5241:35;5307:3;5292:19;;5285:35;5351:3;5336:19;;5329:35;5408:15;5401:23;5395:3;5380:19;;5373:52;5469:15;5462:23;5456:3;5441:19;;5434:52;4922:3;4907:19;33537:23:0;4494:998:1;33619:64:0;;;;;;;;;;-1:-1:-1;33619:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6017:25:1;;;6073:2;6058:18;;6051:34;;;;6101:18;;;6094:34;;;;6159:2;6144:18;;6137:34;6202:3;6187:19;;6180:35;6004:3;5989:19;33619:64:0;5758:463:1;38538:2350:0;;;;;;;;;;-1:-1:-1;38538:2350:0;;;;;:::i;:::-;;:::i;32044:24::-;;;;;;;;;;-1:-1:-1;32044:24:0;;;;;;;;49492:575;;;;;;;;;;;;;:::i;56525:213::-;;;;;;;;;;-1:-1:-1;56525:213:0;;;;;:::i;:::-;;:::i;54002:350::-;;;;;;;;;;-1:-1:-1;54002:350:0;;;;;:::i;:::-;;:::i;33567:45::-;;;;;;;;;;-1:-1:-1;33567:45:0;;;;;:::i;:::-;;:::i;:::-;;;;7100:4:1;7088:17;;;7070:36;;7137:2;7122:18;;7115:34;;;;7165:18;;;7158:34;;;;7223:2;7208:18;;7201:34;;;;7266:3;7251:19;;7244:35;7310:3;7295:19;;7288:35;7354:3;7339:19;;7332:35;7398:3;7383:19;;7376:35;7057:3;7042:19;33567:45:0;6731:686:1;32309:22:0;;;;;;;;;;-1:-1:-1;32309:22:0;;;;-1:-1:-1;;;;;32309:22:0;;;5793:201;;;;;;;;;;-1:-1:-1;5793:201:0;;;;;:::i;:::-;;:::i;56239:263::-;;;;;;;;;;-1:-1:-1;56239:263:0;;;;;:::i;:::-;;:::i;50917:939::-;;;;;;;;;;-1:-1:-1;50917:939:0;;;;;:::i;:::-;;:::i;49232:181::-;49337:7;:14;49299:7;;49323:28;;;;49319:42;;-1:-1:-1;49360:1:0;;49232:181;-1:-1:-1;49232:181:0:o;49319:42::-;49381:7;49389:10;49381:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;49374:31;;49232:181;;;:::o;47146:2063::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;47232:13;::::1;;47224:41;;;;-1:-1:-1::0;;;47224:41:0::1;;;;;;;:::i;:::-;47297:1;47284:10;;:14;47276:43;;;;-1:-1:-1::0;;;47276:43:0::1;;;;;;;:::i;:::-;47351:7;:14:::0;47338:27:::1;::::0;::::1;;47330:58;;;;-1:-1:-1::0;;;47330:58:0::1;;;;;;;:::i;:::-;47436:10;47401:21;47425:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;;;47495:22;;;:10:::1;:22:::0;;;;;47552:7:::1;:19:::0;;47495:22;;47401:21;47552:7;;:19;::::1;;;;;:::i;:::-;;;;;;;;;;;47528:43;;47623:33;47645:10;47623:21;:33::i;:::-;47696:28;47713:10;47696:16;:28::i;:::-;47737:24;47776:19:::0;47810:23:::1;47848:19:::0;47889:9:::1;47884:670;47908:13:::0;;47904:17;::::1;47884:670;;;47943:19;47965:6;47972:1;47965:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;47993:15:::0;;47965:9;;-1:-1:-1;47993:29:0::1;::::0;;::::1;:15:::0;::::1;:29;47989:43;;48024:8;;;47989:43;48051:5;:12;;;48067:1;48051:17:::0;48047:31:::1;;48070:8;;;48047:31;48110:5;:9;;;48097:10;:8;:10::i;:::-;:22;48093:36;;;48121:8;;;48093:36;48167:56;48206:5;:16;;;48167:34;48188:5;:12;;;48167:16;:20;;:34;;;;:::i;:::-;:38:::0;::::1;:56::i;:::-;48148:75;;48252:29;48268:5;:12;;;48252:11;:15;;:29;;;;:::i;:::-;48238:43;;48314:37;48334:5;:16;;;48314:15;:19;;:37;;;;:::i;:::-;48296:55;;48380:29;48396:5;:12;;;48380:11;:15;;:29;;;;:::i;:::-;48441:1;48426:12;::::0;::::1;:16:::0;;;48457:12:::1;::::0;::::1;:16:::0;;;48488:15:::1;::::0;::::1;:19:::0;;;48522:16:::1;::::0;;::::1;:20:::0;;;;48366:43;-1:-1:-1;47884:670:0::1;47923:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47884:670;;;-1:-1:-1::0;48570:20:0;;48566:571:::1;;48630:18;::::0;::::1;::::0;:35:::1;::::0;48653:11;48630:22:::1;:35::i;:::-;48609:18;::::0;::::1;:56:::0;48701:18:::1;::::0;::::1;::::0;:35:::1;::::0;48724:11;48701:22:::1;:35::i;:::-;48680:18;::::0;::::1;:56:::0;48776:22:::1;::::0;::::1;::::0;:43:::1;::::0;48803:15;48776:26:::1;:43::i;:::-;48751:22;::::0;::::1;:68:::0;48855:16:::1;::::0;::::1;::::0;:33:::1;::::0;48876:11;48855:20:::1;:33::i;:::-;48836:16;::::0;::::1;:52:::0;48922:16:::1;::::0;::::1;::::0;:33:::1;::::0;48943:11;48922:20:::1;:33::i;:::-;48903:16;::::0;::::1;:52:::0;48993:20:::1;::::0;::::1;::::0;:41:::1;::::0;49018:15;48993:24:::1;:41::i;:::-;48970:20;::::0;::::1;:64:::0;49058:12:::1;::::0;49051:72:::1;::::0;-1:-1:-1;;;;;49058:12:0::1;49093:10;49106:16:::0;49051:33:::1;:72::i;:::-;49154:47;::::0;508:25:1;;;49172:10:0::1;::::0;49154:47:::1;::::0;496:2:1;481:18;49154:47:0::1;;;;;;;;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;;;;47146:2063:0:o;54375:1010::-;4773:13;:11;:13::i;:::-;54594:7:::1;:14:::0;54581:27:::1;::::0;::::1;;54573:56;;;::::0;-1:-1:-1;;;54573:56:0;;9424:2:1;54573:56:0::1;::::0;::::1;9406:21:1::0;9463:2;9443:18;;;9436:30;-1:-1:-1;;;9482:18:1;;;9475:46;9538:18;;54573:56:0::1;9222:340:1::0;54573:56:0::1;54662:4;54648:11;:18;54640:50;;;::::0;-1:-1:-1;;;54640:50:0;;9769:2:1;54640:50:0::1;::::0;::::1;9751:21:1::0;9808:2;9788:18;;;9781:30;-1:-1:-1;;;9827:18:1;;;9820:49;9886:18;;54640:50:0::1;9567:343:1::0;54640:50:0::1;54724:4;54709:12;:19;54701:52;;;::::0;-1:-1:-1;;;54701:52:0;;10117:2:1;54701:52:0::1;::::0;::::1;10099:21:1::0;10156:2;10136:18;;;10129:30;-1:-1:-1;;;10175:18:1;;;10168:50;10235:18;;54701:52:0::1;9915:344:1::0;54701:52:0::1;54766:22;54791:7;54799:10;54791:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;54766:44;;54898:7;:19;;;54921:1;54898:24:::0;54895:118:::1;;54938:16;::::0;::::1;:28:::0;;;54981:12:::1;::::0;::::1;:20:::0;;;54895:118:::1;55033:18;::::0;::::1;:32:::0;;;55076:19:::1;::::0;::::1;:34:::0;;;55129:25:::1;::::0;::::1;:46:::0;;55186:48;::::1;;55129:46;55186:48:::0;::::1;-1:-1:-1::0;;55129:46:0;::::1;;55186:48:::0;;;-1:-1:-1;;55186:48:0;;;;;;;::::1;::::0;;;-1:-1:-1;55278:16:0;::::1;::::0;55323:12:::1;::::0;::::1;::::0;55252:125:::1;::::0;;10593:4:1;10581:17;;10563:36;;10630:2;10615:18;;10608:34;;;;10658:18;;10651:34;;;10716:2;10701:18;;10694:34;;;10759:3;10744:19;;10737:35;10803:3;10788:19;;10781:51;;;;10863:3;10848:19;;10841:51;;;;55252:125:0::1;::::0;10550:3:1;10535:19;55252:125:0::1;;;;;;;54562:823;54375:1010:::0;;;;;;;:::o;52543:938::-;4773:13;:11;:13::i;:::-;52696:12:::1;::::0;52646:16:::1;::::0;-1:-1:-1;;;;;52696:12:0;;::::1;52679:29:::0;;::::1;::::0;52675:307:::1;;52730:9;52725:246;52749:7;:14:::0;52745:18;::::1;52725:246;;;52789:21;52813:7;52821:1;52813:10;;;;;;;;:::i;:::-;;;;;;;;;;;52789:34;;52853:102;52933:6;:21;;;52908:6;:22;;;52887:6;:18;;;52866:6;:18;;;:39;;;;:::i;:::-;:64;;;;:::i;:::-;:88;;;;:::i;:::-;52853:8:::0;;:12:::1;:102::i;:::-;52842:113;;52770:201;52765:3;;;;;:::i;:::-;;;;52725:246;;;;52675:307;52998:12:::0;;52994:196:::1;;53046:46;::::0;-1:-1:-1;;;53046:46:0;;53086:4:::1;53046:46;::::0;::::1;4432:51:1::0;53027:16:0::1;::::0;-1:-1:-1;;;;;53046:31:0;::::1;::::0;::::1;::::0;4405:18:1;;53046:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53027:65:::0;-1:-1:-1;53131:22:0::1;53027:65:::0;53144:8;53131:12:::1;:22::i;:::-;53115:12;:38;;53107:71;;;::::0;-1:-1:-1;;;53107:71:0;;11557:2:1;53107:71:0::1;::::0;::::1;11539:21:1::0;11596:2;11576:18;;;11569:30;-1:-1:-1;;;11615:18:1;;;11608:50;11675:18;;53107:71:0::1;11355:344:1::0;53107:71:0::1;53012:178;52994:196;-1:-1:-1::0;;;;;53206:29:0;::::1;53202:206;;53252:42;::::0;53260:10:::1;::::0;53252:42;::::1;;;::::0;53281:12;;53252:42:::1;::::0;;;53281:12;53260:10;53252:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53202:206;;;53327:69;-1:-1:-1::0;;;;;53327:34:0;::::1;53370:10;53383:12:::0;53327:34:::1;:69::i;:::-;53425:48;::::0;;-1:-1:-1;;;;;11896:32:1;;11878:51;;11960:2;11945:18;;11938:34;;;53425:48:0::1;::::0;11851:18:1;53425:48:0::1;;;;;;;52635:846;52543:938:::0;;:::o;43176:315::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;43281:13;::::1;;43273:41;;;;-1:-1:-1::0;;;43273:41:0::1;;;;;;;:::i;:::-;43346:1;43333:10;;:14;43325:43;;;;-1:-1:-1::0;;;43325:43:0::1;;;;;;;:::i;:::-;43400:7;:14:::0;43387:27:::1;::::0;::::1;;43379:58;;;;-1:-1:-1::0;;;43379:58:0::1;;;;;;;:::i;:::-;43450:33;43463:10;43475:7;43450:12;:33::i;:::-;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;43176:315:0:o;35803:1866::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;35896:13;::::1;;35888:41;;;;-1:-1:-1::0;;;35888:41:0::1;;;;;;;:::i;:::-;35961:1;35948:10;;:14;35940:43;;;;-1:-1:-1::0;;;35940:43:0::1;;;;;;;:::i;:::-;36012:1;36002:7;:11;35994:55;;;::::0;-1:-1:-1;;;35994:55:0;;12185:2:1;35994:55:0::1;::::0;::::1;12167:21:1::0;12224:2;12204:18;;;12197:30;12263:33;12243:18;;;12236:61;12314:18;;35994:55:0::1;11983:355:1::0;35994:55:0::1;36081:7;:14:::0;36068:27:::1;::::0;::::1;;36060:58;;;;-1:-1:-1::0;;;36060:58:0::1;;;;;;;:::i;:::-;36166:10;36131:21;36155:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;36224:7:::1;:19:::0;;36155:34;;36131:21;36224:7;;:19;::::1;;;;;:::i;:::-;;;;;;;;;;;36200:43;;36295:33;36317:10;36295:21;:33::i;:::-;36371:12;::::0;36364:45:::1;::::0;-1:-1:-1;;;36364:45:0;;36403:4:::1;36364:45;::::0;::::1;4432:51:1::0;36341:20:0::1;::::0;-1:-1:-1;;;;;36371:12:0::1;::::0;36364:30:::1;::::0;4405:18:1;;36364:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36427:12;::::0;36341:68;;-1:-1:-1;36420:132:0::1;::::0;-1:-1:-1;;;;;36427:12:0::1;36480:10;36514:4;36534:7:::0;36420:37:::1;:132::i;:::-;36592:12;::::0;36585:45:::1;::::0;-1:-1:-1;;;36585:45:0;;36624:4:::1;36585:45;::::0;::::1;4432:51:1::0;36563:19:0::1;::::0;-1:-1:-1;;;;;36592:12:0::1;::::0;36585:30:::1;::::0;4405:18:1;;36585:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36563:67:::0;-1:-1:-1;36641:18:0::1;36662:29;36563:67:::0;36678:12;36662:15:::1;:29::i;:::-;36708:12;::::0;36641:50;;-1:-1:-1;36708:12:0::1;;36704:182;;;36799:16;::::0;36778::::1;::::0;::::1;::::0;36763:32:::1;::::0;:10;;:14:::1;:32::i;:::-;:52;;36737:137;;;::::0;-1:-1:-1;;;36737:137:0;;12545:2:1;36737:137:0::1;::::0;::::1;12527:21:1::0;12584:2;12564:18;;;12557:30;12623:25;12603:18;;;12596:53;12666:18;;36737:137:0::1;12343:347:1::0;36737:137:0::1;36922:17;::::0;::::1;::::0;36896:11:::1;::::0;36922:21;36918:428:::1;;36966:44;37004:5;36966:33;36981:6;:17;;;36966:10;:14;;:33;;;;:::i;:::-;:37:::0;::::1;:44::i;:::-;36960:50:::0;-1:-1:-1;37029:7:0;;37025:310:::1;;37060:24;::::0;::::1;::::0;::::1;;:33;;:24;:33:::0;37057:263:::1;;37151:7;::::0;37124:12:::1;::::0;37117:47:::1;::::0;-1:-1:-1;;;;;37124:12:0;;::::1;::::0;37151:7:::1;37160:3:::0;37117:33:::1;:47::i;:::-;37200:19;:10:::0;37215:3;37200:14:::1;:19::i;:::-;37187:32;;37057:263;;;37281:19;:10:::0;37296:3;37281:14:::1;:19::i;:::-;37268:32;;37057:263;37358:62;37368:10;37380;37392:6;:15;;;37409:10;37358:9;:62::i;:::-;37452:16;::::0;::::1;::::0;:32:::1;::::0;37473:10;37452:20:::1;:32::i;:::-;37433:16;::::0;::::1;:51:::0;37516:18:::1;::::0;::::1;::::0;:34:::1;::::0;37539:10;37516:22:::1;:34::i;:::-;37495:18;::::0;::::1;:55:::0;37612:17:::1;::::0;::::1;::::0;37631:24:::1;::::0;::::1;::::0;37568:93:::1;::::0;;37631:24:::1;12964:17:1::0;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;37631:24:0::1;13111:14:1::0;13104:22;13099:2;13084:18;;13077:50;13158:3;13143:19;;13136:35;;;37576:10:0::1;::::0;37568:93:::1;::::0;12933:3:1;12918:19;37568:93:0::1;12695:482:1::0;42855:298:0;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;42943:13;::::1;;42935:41;;;;-1:-1:-1::0;;;42935:41:0::1;;;;;;;:::i;:::-;43008:1;42995:10;;:14;42987:43;;;;-1:-1:-1::0;;;42987:43:0::1;;;;;;;:::i;:::-;43062:7;:14:::0;43049:27:::1;::::0;::::1;;43041:58;;;;-1:-1:-1::0;;;43041:58:0::1;;;;;;;:::i;:::-;43112:33;43125:10;-1:-1:-1::0;;43112:12:0::1;:33::i;:::-;-1:-1:-1::0;;1768:1:0;2722:22;;42855:298::o;55408:808::-;4773:13;:11;:13::i;:::-;55607:4:::1;55593:11;:18;55585:50;;;::::0;-1:-1:-1;;;55585:50:0;;9769:2:1;55585:50:0::1;::::0;::::1;9751:21:1::0;9808:2;9788:18;;;9781:30;-1:-1:-1;;;9827:18:1;;;9820:49;9886:18;;55585:50:0::1;9567:343:1::0;55585:50:0::1;55669:4;55654:12;:19;55646:52;;;::::0;-1:-1:-1;;;55646:52:0;;10117:2:1;55646:52:0::1;::::0;::::1;10099:21:1::0;10156:2;10136:18;;;10129:30;-1:-1:-1;;;10175:18:1;;;10168:50;10235:18;;55646:52:0::1;9915:344:1::0;55646:52:0::1;55711:7;:14:::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;55711:14:0;;;-1:-1:-1;55711:7:0;55771:18:::1;::::0;::::1;:::i;:::-;55763:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;55801:16;::::0;;::::1;:28:::0;;;55840:18:::1;::::0;::::1;:32:::0;;;55883:19:::1;::::0;::::1;:34:::0;;;55928:12:::1;::::0;::::1;:20:::0;;;55959:25:::1;::::0;::::1;:46:::0;;-1:-1:-1;;56016:48:0;55959:46;::::1;;-1:-1:-1::0;;56016:48:0;;55959:46:::1;56016:48:::0;::::1;;;;::::0;;56102:7:::1;:14:::0;55763:27;;-1:-1:-1;56082:126:0::1;::::0;56102:18:::1;::::0;55801:16;56102:18:::1;:::i;:::-;56082:126;::::0;;10593:4:1;10581:17;;;10563:36;;10630:2;10615:18;;10608:34;;;10658:18;;10651:34;;;10716:2;10701:18;;10694:34;;;10759:3;10744:19;;10737:35;;;10816:14;;10809:22;10803:3;10788:19;;10781:51;10876:14;;10869:22;10863:3;10848:19;;10841:51;10550:3;10535:19;56082:126:0::1;;;;;;;55574:642;55408:808:::0;;;;;;:::o;5535:103::-;4773:13;:11;:13::i;:::-;5600:30:::1;5627:1;5600:18;:30::i;:::-;5535:103::o:0;53504:295::-;4773:13;:11;:13::i;:::-;53565:10:::1;::::0;:15;53557:52:::1;;;::::0;-1:-1:-1;;;53557:52:0;;13384:2:1;53557:52:0::1;::::0;::::1;13366:21:1::0;13423:2;13403:18;;;13396:30;-1:-1:-1;;;13442:18:1;;;13435:54;13506:18;;53557:52:0::1;13182:348:1::0;53557:52:0::1;53635:17;53650:1;53635:10;:8;:10::i;:::-;:14:::0;::::1;:17::i;:::-;53622:10;:30:::0;53720:4:::1;::::0;53679:47:::1;::::0;53694:31:::1;::::0;53707:17:::1;::::0;32480:12:::1;53707:17;:::i;:::-;53694:8;::::0;;:12:::1;:31::i;:::-;53679:10;::::0;;:14:::1;:47::i;:::-;53663:13;:63:::0;;;53765:10:::1;::::0;53744:47:::1;::::0;::::1;::::0;::::1;::::0;13931:25:1;;13987:2;13972:18;;13965:34;13919:2;13904:18;;13757:248;53744:47:0::1;;;;;;;;53504:295::o:0;50090:650::-;-1:-1:-1;;;;;50252:20:0;;50165:14;50252:20;;;:10;:20;;;;;50165:14;;;;;50285:448;50309:13;;50305:17;;50285:448;;;50344:19;50366:6;50373:1;50366:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;50396:15;;50366:9;;-1:-1:-1;50396:29:0;;;;:15;;:29;50392:43;;50427:8;;;50392:43;50454:5;:12;;;50470:1;50454:17;50450:31;;50473:8;;;50450:31;50518:12;;;;50507:24;;:6;;:10;:24::i;:::-;50498:33;;50563:5;:9;;;50550:10;:8;:10::i;:::-;:22;50546:176;;;50619:12;;;;50605:27;;:9;;:13;:27::i;:::-;50593:39;;50546:176;;;50693:12;;;;50682:24;;:6;;:10;:24::i;:::-;50673:33;;50546:176;50329:404;50285:448;50324:3;;;;:::i;:::-;;;;50285:448;;;;50216:524;50090:650;;;;;:::o;43514:1530::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;43605:13;::::1;;43597:41;;;;-1:-1:-1::0;;;43597:41:0::1;;;;;;;:::i;:::-;43670:1;43657:10;;:14;43649:43;;;;-1:-1:-1::0;;;43649:43:0::1;;;;;;;:::i;:::-;43724:7;:14:::0;43711:27:::1;::::0;::::1;;43703:58;;;;-1:-1:-1::0;;;43703:58:0::1;;;;;;;:::i;:::-;43809:10;43774:21;43798:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;;;43868:22;;;:10:::1;:22:::0;;;;;43925:7:::1;:19:::0;;43868:22;;43774:21;43925:7;;:19;::::1;;;;;:::i;:::-;;;;;;;;;;;43901:43;;43996:33;44018:10;43996:21;:33::i;:::-;44069:28;44086:10;44069:16;:28::i;:::-;44110:15;44145:9:::0;44140:468:::1;44164:13:::0;;44160:17;::::1;44140:468;;;44199:19;44221:6;44228:1;44221:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;44249:15:::0;;44221:9;;-1:-1:-1;44249:29:0::1;::::0;;::::1;:15:::0;::::1;:29;44245:43;;44280:8;;;44245:43;44354:16;44373:55;44412:5;:15;;;44373:34;44390:5;:16;;;44373:5;:12;;;:16;;:34;;;;:::i;:55::-;44354:74:::0;-1:-1:-1;44453:21:0::1;:7:::0;44354:74;44453:11:::1;:21::i;:::-;44506:12;::::0;::::1;::::0;44443:31;;-1:-1:-1;44506:26:0::1;::::0;44523:8;44506:16:::1;:26::i;:::-;44491:12;::::0;::::1;:41:::0;44566:16:::1;::::0;::::1;::::0;:30:::1;::::0;44587:8;44566:20:::1;:30::i;:::-;44547:5;:16;;:49;;;;44184:424;;44140:468;44179:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44140:468;;;-1:-1:-1::0;44624:11:0;;44620:417:::1;;44673:16;::::0;::::1;::::0;:29:::1;::::0;44694:7;44673:20:::1;:29::i;:::-;44654:16;::::0;::::1;:48:::0;44740:20:::1;::::0;::::1;::::0;:33:::1;::::0;44765:7;44740:24:::1;:33::i;:::-;44717:20;::::0;::::1;:56:::0;44809:18:::1;::::0;::::1;::::0;:31:::1;::::0;44832:7;44809:22:::1;:31::i;:::-;44788:18;::::0;::::1;:52:::0;44880:22:::1;::::0;::::1;::::0;:35:::1;::::0;44907:7;44880:26:::1;:35::i;:::-;44855:22;::::0;::::1;:60:::0;44978:17:::1;::::0;::::1;::::0;44997:24:::1;::::0;::::1;::::0;44937:88:::1;::::0;;44997:24:::1;12964:17:1::0;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;44997:24:0::1;13111:14:1::0;13104:22;13099:2;13084:18;;13077:50;44997:24:0::1;13158:3:1::0;13143:19;;13136:35;44945:10:0::1;::::0;44937:88:::1;::::0;12933:3:1;12918:19;44937:88:0::1;;;;;;;44620:417;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;43514:1530:0:o;34663:1073::-;4773:13;:11;:13::i;:::-;34813::::1;::::0;::::1;;34812:14;34804:46;;;::::0;-1:-1:-1;;;34804:46:0;;14707:2:1;34804:46:0::1;::::0;::::1;14689:21:1::0;14746:2;14726:18;;;14719:30;-1:-1:-1;;;14765:18:1;;;14758:49;14824:18;;34804:46:0::1;14505:343:1::0;34804:46:0::1;32377:1;34869:5;:17;;:38;;;;;32422:12;34890:5;:17;;34869:38;34861:66;;;::::0;-1:-1:-1;;;34861:66:0;;15055:2:1;34861:66:0::1;::::0;::::1;15037:21:1::0;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:1;;;15106:45;15168:18;;34861:66:0::1;14853:339:1::0;34861:66:0::1;32480:12;34969:5:::0;34947:18:::1;34969:5:::0;32480:12;34947:18:::1;:::i;:::-;34946:28;;;;:::i;:::-;:42;34938:70;;;::::0;-1:-1:-1;;;34938:70:0;;15055:2:1;34938:70:0::1;::::0;::::1;15037:21:1::0;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:1;;;15106:45;15168:18;;34938:70:0::1;14853:339:1::0;34938:70:0::1;35039:1;35027:9;:13;35019:45;;;::::0;-1:-1:-1;;;35019:45:0;;15572:2:1;35019:45:0::1;::::0;::::1;15554:21:1::0;15611:2;15591:18;;;15584:30;-1:-1:-1;;;15630:18:1;;;15623:49;15689:18;;35019:45:0::1;15370:343:1::0;35019:45:0::1;35084:5;35077:4;:12;;;;35111:9;35100:8;:20;;;;35192:4;35176:13;;:20;;;;;;;;;;;;;;;;;;35222:13;35207:12;;:28;;;;;-1:-1:-1::0;;;;;35207:28:0::1;;;;;-1:-1:-1::0;;;;;35207:28:0::1;;;;;;35256:10;35246:7;;:20;;;;;-1:-1:-1::0;;;;;35246:20:0::1;;;;;-1:-1:-1::0;;;;;35246:20:0::1;;;;;;35279:7;35292:55;;;;;;;;35299:1;35292:55;;;;;;35302:1;35292:55;;;;35305:1;35292:55;;;;35308:3;35292:55;;;;35313:4;35292:55;;;;35319:1;35292:55;;;;35322:1;35292:55;;;;35325:1;35292:55;;;;35328:1;35292:55;;;;35331:1;35292:55;;;;35334:5;35292:55;;;;;;35341:5;35292:55;;;;::::0;35279:69:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35359:7;35372:69;;;;;;;;35379:1;35372:69;;;;;;35382:17;35372:69;;;;35401:1;35372:69;;;;35404:1;35372:69;;;;35407:4;35372:69;;;;35413:1;35372:69;;;;35416:1;35372:69;;;;35419:1;35372:69;;;;35422:1;35372:69;;;;35425:1;35372:69;;;;35428:5;35372:69;;;;;;35435:5;35372:69;;;;::::0;35359:83:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35453:7;35466:69;;;;;;;;35473:1;35466:69;;;;;;35476:17;35466:69;;;;35495:1;35466:69;;;;35498:1;35466:69;;;;35501:4;35466:69;;;;35507:1;35466:69;;;;35510:1;35466:69;;;;35513:1;35466:69;;;;35516:1;35466:69;;;;35519:1;35466:69;;;;35522:5;35466:69;;;;;;35529:5;35466:69;;;;::::0;35453:83:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35547:7;35560:70;;;;;;;;35567:1;35560:70;;;;;;35570:18;35560:70;;;;35590:1;35560:70;;;;35593:1;35560:70;;;;35596:4;35560:70;;;;35602:1;35560:70;;;;35605:1;35560:70;;;;35608:1;35560:70;;;;35611:1;35560:70;;;;35614:1;35560:70;;;;35617:5;35560:70;;;;;;35624:5;35560:70;;;;::::0;35547:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35642:7;35655:70;;;;;;;;35662:1;35655:70;;;;;;35665:18;35655:70;;;;35685:1;35655:70;;;;35688:1;35655:70;;;;35691:4;35655:70;;;;35697:1;35655:70;;;;35700:1;35655:70;;;;35703:1;35655:70;;;;35706:1;35655:70;;;;35709:1;35655:70;;;;35712:5;35655:70;;;;;;35719:5;35655:70;;;;::::0;35642:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34663:1073:::0;;;:::o;53822:86::-;4773:13;:11;:13::i;:::-;53890:10:::1;:8;:10::i;:::-;53874:13;:26:::0;53822:86::o;51996:437::-;4773:13;:11;:13::i;:::-;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;52085:11;52077:20:::2;;;::::0;::::2;;52137:12;::::0;52130:45:::2;::::0;-1:-1:-1;;;52130:45:0;;52169:4:::2;52130:45;::::0;::::2;4432:51:1::0;52110:17:0::2;::::0;-1:-1:-1;;;;;52137:12:0::2;::::0;52130:30:::2;::::0;4405:18:1;;52130:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52193:12;::::0;52110:65;;-1:-1:-1;52186:73:0::2;::::0;-1:-1:-1;;;;;52193:12:0::2;52224:10;52244:4;52251:7:::0;52186:37:::2;:73::i;:::-;52296:12;::::0;52289:45:::2;::::0;-1:-1:-1;;;52289:45:0;;52328:4:::2;52289:45;::::0;::::2;4432:51:1::0;52270:16:0::2;::::0;-1:-1:-1;;;;;52296:12:0::2;::::0;52289:30:::2;::::0;4405:18:1;;52289:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52270:64;;52373:52;52415:9;52373:37;52401:8;52373:23;;:27;;:37;;;;:::i;:52::-;52347:23;:78:::0;-1:-1:-1;;1768:1:0::1;2722:22:::0;;-1:-1:-1;51996:437:0:o;33537:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33537:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38538:2350::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;;;38632:13;::::1;;38624:41;;;;-1:-1:-1::0;;;38624:41:0::1;;;;;;;:::i;:::-;38697:1;38684:10;;:14;38676:43;;;;-1:-1:-1::0;;;38676:43:0::1;;;;;;;:::i;:::-;38748:1;38738:7;:11;38730:55;;;::::0;-1:-1:-1;;;38730:55:0;;15920:2:1;38730:55:0::1;::::0;::::1;15902:21:1::0;15959:2;15939:18;;;15932:30;15998:33;15978:18;;;15971:61;16049:18;;38730:55:0::1;15718:355:1::0;38730:55:0::1;38817:7;:14:::0;38804:27:::1;::::0;::::1;;38796:58;;;;-1:-1:-1::0;;;38796:58:0::1;;;;;;;:::i;:::-;38902:10;38867:21;38891:22:::0;;;:10:::1;:22;::::0;;;;;;;:34:::1;::::0;::::1;::::0;;;;;;;;;38961:22;;;:10:::1;:22:::0;;;;;39018:7:::1;:19:::0;;38961:22;;38867:21;39018:7;;:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;-1:-1:-1;39069:7:0;;39110:33:::1;39123:10:::0;39069:7;39110:12:::1;:33::i;:::-;39087:56;;39174:8;39158:12;:24;39154:139;;39210:1;39199:12;;39154:139;;;39255:26;:8:::0;39268:12;39255::::1;:26::i;:::-;39244:37;;39154:139;39305:15;39342:9:::0;39337:590:::1;39361:13:::0;;39357:17;::::1;39337:590;;;39396:19;39418:6;39425:1;39418:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;39446:15:::0;;39418:9;;-1:-1:-1;39446:29:0::1;::::0;;::::1;:15:::0;::::1;:29;39442:43;;39477:8;;;39442:43;39504:5;:12;;;39520:1;39504:17:::0;39500:31:::1;;39523:8;;;39500:31;39564:5;:9;;;39550:10;:8;:10::i;:::-;:23;39546:37;;39575:8;;;39546:37;39602:8;39614:1;39602:13:::0;39598:24:::1;;39617:5;;;39598:24;39658:12;::::0;::::1;::::0;39689:19;;::::1;39685:79;;;-1:-1:-1::0;39740:8:0;39685:79:::1;39795:12;::::0;::::1;::::0;:26:::1;::::0;39812:8;39795:16:::1;:26::i;:::-;39780:12;::::0;::::1;:41:::0;39847:22:::1;:8:::0;39860;39847:12:::1;:22::i;:::-;39836:33:::0;-1:-1:-1;39894:21:0::1;:7:::0;39906:8;39894:11:::1;:21::i;:::-;39884:31;;39381:546;;39337:590;39376:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39337:590;;;-1:-1:-1::0;39943:11:0;;39939:940:::1;;40006:7;39979:23;:21;:23::i;:::-;:34;;39971:73;;;::::0;-1:-1:-1;;;39971:73:0;;16280:2:1;39971:73:0::1;::::0;::::1;16262:21:1::0;16319:2;16299:18;;;16292:30;16358:28;16338:18;;;16331:56;16404:18;;39971:73:0::1;16078:350:1::0;39971:73:0::1;40082:18;::::0;::::1;::::0;:31:::1;::::0;40105:7;40082:22:::1;:31::i;:::-;40061:18;::::0;::::1;:52:::0;40147:16:::1;::::0;::::1;::::0;:29:::1;::::0;40168:7;40147:20:::1;:29::i;:::-;40128:16;::::0;::::1;:48:::0;40223:18:::1;::::0;::::1;::::0;40193:11:::1;::::0;40223:22;40219:454:::1;;40272:42;40308:5;40272:31;40284:6;:18;;;40272:7;:11;;:31;;;;:::i;:42::-;40266:48:::0;-1:-1:-1;40336:7:0;;40333:325:::1;;40370:25;::::0;::::1;::::0;::::1;::::0;::::1;;;:34;;40399:5;40370:34:::0;40367:272:::1;;40466:7;::::0;40439:12:::1;::::0;40432:47:::1;::::0;-1:-1:-1;;;;;40439:12:0;;::::1;::::0;40466:7:::1;40475:3:::0;40432:33:::1;:47::i;:::-;40516:16;:7:::0;40528:3;40516:11:::1;:16::i;:::-;40506:26;;40367:272;;;40599:16;:7:::0;40611:3;40599:11:::1;:16::i;:::-;40589:26;;40367:272;40696:12;::::0;40689:63:::1;::::0;-1:-1:-1;;;;;40696:12:0::1;40731:10;40744:7:::0;40689:33:::1;:63::i;:::-;40814:18;::::0;::::1;::::0;40834:25:::1;::::0;::::1;::::0;40772:93:::1;::::0;;40834:25:::1;12964:17:1::0;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;40834:25:0::1;::::0;;::::1;;13111:14:1::0;13104:22;13099:2;13084:18;;13077:50;13158:3;13143:19;;13136:35;;;40781:10:0::1;::::0;40772:93:::1;::::0;12933:3:1;12918:19;40772:93:0::1;;;;;;;39956:923;39939:940;-1:-1:-1::0;;1768:1:0;2722:22;;-1:-1:-1;;;;;;38538:2350:0:o;49492:575::-;49593:12;;49586:45;;-1:-1:-1;;;49586:45:0;;49625:4;49586:45;;;4432:51:1;49546:7:0;;;;-1:-1:-1;;;;;49593:12:0;;;;49586:30;;4405:18:1;;49586:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49568:63;-1:-1:-1;49644:16:0;49961:18;;49957:102;;50001:21;:7;50013:8;50001:11;:21::i;:::-;49994:28;;;;49492:575;:::o;49957:102::-;50058:1;50051:8;;;;49492:575;:::o;56525:213::-;4773:13;:11;:13::i;:::-;-1:-1:-1;;;;;56618:24:0;::::1;56610:52;;;::::0;-1:-1:-1;;;56610:52:0;;16635:2:1;56610:52:0::1;::::0;::::1;16617:21:1::0;16674:2;16654:18;;;16647:30;-1:-1:-1;;;16693:18:1;;;16686:45;16748:18;;56610:52:0::1;16433:339:1::0;56610:52:0::1;56673:7;:18:::0;;-1:-1:-1;;;;;;56673:18:0::1;-1:-1:-1::0;;;;;56673:18:0;::::1;::::0;;::::1;::::0;;;56709:21:::1;::::0;4432:51:1;;;56709:21:0::1;::::0;4420:2:1;4405:18;56709:21:0::1;;;;;;;;56525:213:::0;:::o;54002:350::-;4773:13;:11;:13::i;:::-;54111:12:::1;:28:::0;;-1:-1:-1;;54111:28:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;54150:135:::1;;54184:16;:36:::0;;;54150:135:::1;;;54272:1;54253:16;:20:::0;54150:135:::1;54313:12;::::0;54327:16:::1;::::0;54300:44:::1;::::0;::::1;::::0;::::1;::::0;54313:12:::1;::::0;;::::1;16970:14:1::0;16963:22;16945:41;;17017:2;17002:18;;16995:34;16933:2;16918:18;;16777:258;54300:44:0::1;;;;;;;;54002:350:::0;;:::o;33567:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33567:45:0;;-1:-1:-1;33567:45:0;;;;;;;;:::o;5793:201::-;4773:13;:11;:13::i;:::-;-1:-1:-1;;;;;5882:22:0;::::1;5874:73;;;::::0;-1:-1:-1;;;5874:73:0;;17242:2:1;5874:73:0::1;::::0;::::1;17224:21:1::0;17281:2;17261:18;;;17254:30;17320:34;17300:18;;;17293:62;-1:-1:-1;;;17371:18:1;;;17364:36;17417:19;;5874:73:0::1;17040:402:1::0;5874:73:0::1;5958:28;5977:8;5958:18;:28::i;:::-;5793:201:::0;:::o;56239:263::-;4773:13;:11;:13::i;:::-;56317:10:::1;::::0;:15;56309:52:::1;;;::::0;-1:-1:-1;;;56309:52:0;;13384:2:1;56309:52:0::1;::::0;::::1;13366:21:1::0;13423:2;13403:18;;;13396:30;-1:-1:-1;;;13442:18:1;;;13435:54;13506:18;;56309:52:0::1;13182:348:1::0;56309:52:0::1;56393:2;56380:9;:15;;56372:47;;;::::0;-1:-1:-1;;;56372:47:0;;17649:2:1;56372:47:0::1;::::0;::::1;17631:21:1::0;17688:2;17668:18;;;17661:30;-1:-1:-1;;;17707:18:1;;;17700:49;17766:18;;56372:47:0::1;17447:343:1::0;56372:47:0::1;56432:8;:20:::0;;;56468:26:::1;::::0;508:25:1;;;56468:26:0::1;::::0;496:2:1;481:18;56468:26:0::1;362:177:1::0;50917:939:0;51037:7;:14;50999:7;;51023:28;;;;51019:42;;-1:-1:-1;51060:1:0;51053:8;;51019:42;51076:10;;51090:1;51076:15;51072:29;;-1:-1:-1;51100:1:0;51093:8;;51072:29;-1:-1:-1;;;;;51139:20:0;;51114:22;51139:20;;;:10;:20;;;;;51194:7;:19;;51139:20;;51114:22;51194:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;51170:43;;51230:6;:18;;;51252:1;51230:23;51226:37;;51262:1;51255:8;;;;;;51226:37;51276:15;51311:9;51306:518;51330:13;;51326:17;;51306:518;;;51365:19;51387:6;51394:1;51387:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;51415:15;;51387:9;;-1:-1:-1;51415:29:0;;;;:15;;:29;51411:43;;51446:8;;;51411:43;51530:62;51576:5;:15;;;51557:5;:16;;;51542:5;:12;;;:31;;;;:::i;51530:62::-;51520:72;;51607:12;51622:76;51648:49;51663:5;:21;;;51686:10;:8;:10::i;:::-;51648:14;:49::i;:::-;51622:21;51631:6;:11;;;51622:8;:21::i;:::-;:25;;:76::i;:::-;51607:91;;51713:14;51730:36;51757:8;51730:22;51747:4;51730:5;:12;;;:16;;:22;;;;:::i;:36::-;51713:53;-1:-1:-1;51791:19:0;:7;51713:53;51791:11;:19::i;:::-;51781:29;;51350:474;;;51306:518;51345:3;;;;:::i;:::-;;;;51306:518;;;-1:-1:-1;51841:7:0;-1:-1:-1;;;50917:939:0;;;;;:::o;45067:986::-;45144:13;;;;45136:41;;;;-1:-1:-1;;;45136:41:0;;;;;;;:::i;:::-;45209:1;45196:10;;:14;45188:43;;;;-1:-1:-1;;;45188:43:0;;;;;;;:::i;:::-;45263:7;:14;45250:27;;;;45242:58;;;;-1:-1:-1;;;45242:58:0;;;;;;;:::i;:::-;45313:21;45337:7;45345:10;45337:19;;;;;;;;;;:::i;:::-;;;;;;;;;45402:10;45391:22;;:10;:22;;;;;;:34;;;;;;;;;;;45337:19;;;;;;-1:-1:-1;45391:34:0;45458:10;:8;:10::i;:::-;45436:32;;45479:12;45502:15;45537:78;45563:51;45578:6;:22;;;45602:11;45563:14;:51::i;45537:78::-;45530:85;;45636:42;45669:8;45636:28;45659:4;45636:6;:18;;;:22;;:28;;;;:::i;:42::-;45626:52;;45731:7;45710:6;:18;;;:28;;;;:::i;:::-;45689:18;;;:49;45749:22;;;:36;;;45846:20;;45805:76;;45831:49;;45774:11;45831:14;:49::i;45805:76::-;45798:83;;45902:40;45933:8;45902:26;45923:4;45902;:16;;;:20;;:26;;;;:::i;:40::-;45892:50;;45991:7;45972:4;:16;;;:26;;;;:::i;:::-;45953:16;;;:45;-1:-1:-1;;46009:34:0;;-1:-1:-1;;45067:986:0:o;46076:933::-;46148:13;;;;46140:41;;;;-1:-1:-1;;;46140:41:0;;;;;;;:::i;:::-;46213:1;46200:10;;:14;46192:43;;;;-1:-1:-1;;;46192:43:0;;;;;;;:::i;:::-;46267:7;:14;46254:27;;;;46246:58;;;;-1:-1:-1;;;46246:58:0;;;;;;;:::i;:::-;46353:10;46317:22;46342;;;:10;:22;;;;;46399:7;:19;;46342:22;;46317;46399:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;46375:43;;46431:19;46453:10;:8;:10::i;:::-;46431:32;;46474:12;46497:15;46530:9;46525:475;46549:13;;46545:17;;46525:475;;;46584:19;46606:6;46613:1;46606:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;46634:15;;46606:9;;-1:-1:-1;46634:29:0;;;;:15;;:29;46630:43;;46665:8;;;46630:43;46692:5;:12;;;46708:1;46692:17;46688:31;;46711:8;;;46688:31;46743:77;46769:50;46784:5;:21;;;46807:11;46769:14;:50::i;:::-;46743:21;46752:6;:11;;;46743:8;:21::i;:77::-;46736:84;;46847:36;46874:8;46847:22;46864:4;46847:5;:12;;;:16;;:22;;;;:::i;:36::-;46913:12;;;;46837:46;;-1:-1:-1;46913:25:0;;46837:46;46913:16;:25::i;:::-;46898:12;;;:40;46953:21;;:35;;;46525:475;46564:3;;;;:::i;:::-;;;;46525:475;;;;46129:880;;;;;46076:933;:::o;57465:130::-;57523:13;57562:25;57582:4;;57562:15;:19;;:25;;;;:::i;:::-;57554:33;;57465:130;:::o;9228:98::-;9286:7;9313:5;9317:1;9313;:5;:::i;:::-;9306:12;9228:98;-1:-1:-1;;;9228:98:0:o;9609:::-;9667:7;9694:5;9698:1;9694;:5;:::i;27904:211::-;28048:58;;-1:-1:-1;;;;;11896:32:1;;28048:58:0;;;11878:51:1;11945:18;;;11938:34;;;28021:86:0;;28041:5;;-1:-1:-1;;;28071:23:0;11851:18:1;;28048:58:0;;;;-1:-1:-1;;28048:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28048:58:0;-1:-1:-1;;;;;;28048:58:0;;;;;;;;;;28021:19;:86::i;:::-;27904:211;;;:::o;5052:132::-;4933:7;4960:6;-1:-1:-1;;;;;4960:6:0;3518:10;5116:23;5108:68;;;;-1:-1:-1;;;5108:68:0;;17997:2:1;5108:68:0;;;17979:21:1;;;18016:18;;;18009:30;18075:34;18055:18;;;18048:62;18127:18;;5108:68:0;17795:356:1;40913:1917:0;41015:13;;40988:7;;41015:13;;41007:41;;;;-1:-1:-1;;;41007:41:0;;;;;;;:::i;:::-;41080:1;41067:10;;:14;41059:43;;;;-1:-1:-1;;;41059:43:0;;;;;;;:::i;:::-;41131:1;41121:7;:11;41113:55;;;;-1:-1:-1;;;41113:55:0;;15920:2:1;41113:55:0;;;15902:21:1;15959:2;15939:18;;;15932:30;15998:33;15978:18;;;15971:61;16049:18;;41113:55:0;15718:355:1;41113:55:0;41200:7;:14;41187:27;;;;41179:58;;;;-1:-1:-1;;;41179:58:0;;;;;;;:::i;:::-;41285:10;41250:21;41274:22;;;:10;:22;;;;;;;;:34;;;;;;;;;;;;41344:22;;;:10;:22;;;;;41401:7;:19;;41344:22;;41250:21;41401:7;;:19;;;;;;:::i;:::-;;;;;;;;;;;41377:43;;41472:33;41494:10;41472:21;:33::i;:::-;41545:28;41562:10;41545:16;:28::i;:::-;41605:7;41586:16;;41655:681;41679:13;;41675:17;;41655:681;;;41714:19;41736:6;41743:1;41736:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;41764:15;;41736:9;;-1:-1:-1;41764:29:0;;;;:15;;:29;41760:43;;41795:8;;;41760:43;41885:5;:9;;;41871:10;:8;:10::i;:::-;:23;41867:37;;41896:8;;;41867:37;41921:16;41940:55;41979:5;:15;;;41940:34;41957:5;:16;;;41940:5;:12;;;:16;;:34;;;;:::i;:55::-;41921:74;;42027:8;42016;:19;42012:79;;;-1:-1:-1;42067:8:0;42012:79;42118:22;:8;42131;42118:12;:22::i;:::-;42107:33;-1:-1:-1;42167:21:0;:7;42179:8;42167:11;:21::i;:::-;42157:31;;42239:8;42221:5;:15;;;:26;;;;:::i;:::-;42203:15;;;:44;42280:1;42268:13;;;42264:59;;42302:5;;;;42264:59;41699:637;;41655:681;41694:3;;;;:::i;:::-;;;;41655:681;;;-1:-1:-1;42352:11:0;;42348:448;;42415:7;42388:23;:21;:23::i;:::-;:34;;42380:73;;;;-1:-1:-1;;;42380:73:0;;16280:2:1;42380:73:0;;;16262:21:1;16319:2;16299:18;;;16292:30;16358:28;16338:18;;;16331:56;16404:18;;42380:73:0;16078:350:1;42380:73:0;42475:12;;42468:63;;-1:-1:-1;;;;;42475:12:0;42510:10;42523:7;42468:33;:63::i;:::-;42596:7;42572:6;:21;;;:31;;;;:::i;:::-;42548:21;;;:55;42640:19;;;;:29;;42662:7;;42640:29;:::i;:::-;42618:19;;;:51;42733:18;;;;42753:25;;;;42691:91;;;42753:25;12964:17:1;;;12946:36;;13013:2;12998:18;;12991:34;;;13041:18;;;13034:34;;;;42753:25:0;;;;;13111:14:1;13104:22;13099:2;13084:18;;13077:50;42780:1:0;13158:3:1;13143:19;;13136:35;42700:10:0;;42691:91;;12933:3:1;12918:19;42691:91:0;;;;;;;42348:448;42815:7;40913:1917;-1:-1:-1;;;;;;;40913:1917:0:o;28123:248::-;28294:68;;-1:-1:-1;;;;;18414:15:1;;;28294:68:0;;;18396:34:1;18466:15;;18446:18;;;18439:43;18498:18;;;18491:34;;;28267:96:0;;28287:5;;-1:-1:-1;;;28317:27:0;18331:18:1;;28294:68:0;18156:375:1;28267:96:0;28123:248;;;;:::o;9966:98::-;10024:7;10051:5;10055:1;10051;:5;:::i;10365:98::-;10423:7;10450:5;10454:1;10450;:5;:::i;37692:692::-;-1:-1:-1;;;;;37828:20:0;;37803:22;37828:20;;;:10;:20;;;;;37986:4;;37828:20;;37803:22;37951:40;;:30;:15;37971:9;37951:19;:30::i;:40::-;38016:13;;37937:54;;-1:-1:-1;33524:4:0;38048:14;;38040:37;;;;-1:-1:-1;;;38040:37:0;;18738:2:1;38040:37:0;;;18720:21:1;18777:2;18757:18;;;18750:30;-1:-1:-1;;;18796:18:1;;;18789:40;18846:18;;38040:37:0;18536:334:1;38040:37:0;38090:13;;;;;;;-1:-1:-1;38090:13:0;;;-1:-1:-1;38090:6:0;;38177:1;;38170:9;;;;;;:::i;:::-;;;;;;;;;;;;;;38190:31;;-1:-1:-1;;38190:31:0;;;;;;;-1:-1:-1;38232:17:0;;:29;;;38272:12;;;:18;;;38301:15;;;:25;;;38170:9;-1:-1:-1;38364:10:0;:8;:10::i;:::-;38337:24;;;;:37;-1:-1:-1;;;;;;;37692:692:0:o;6154:191::-;6228:16;6247:6;;-1:-1:-1;;;;;6264:17:0;;;-1:-1:-1;;;;;;6264:17:0;;;;;;6297:40;;6247:6;;;;;;;6297:40;;6228:16;6297:40;6217:128;6154:191;:::o;57113:329::-;57203:7;57241:13;;57232:5;:22;57228:207;;-1:-1:-1;57278:1:0;57271:8;;57228:207;57308:13;;57301:3;:20;57297:138;;57345:14;:3;57353:5;57345:7;:14::i;:::-;57338:21;;;;57297:138;57399:13;;:24;;57417:5;57399:17;:24::i;56812:196::-;56883:7;56910:12;56925:51;56971:4;;32480:12;56958:17;;;;:::i;:::-;56925:28;56949:3;56925:28;:5;56935:8;56925:9;:19::i;30971:716::-;31395:23;31421:69;31449:4;31421:69;;;;;;;;;;;;;;;;;31429:5;-1:-1:-1;;;;;31421:27:0;;;:69;;;;;:::i;:::-;31505:17;;31395:95;;-1:-1:-1;31505:21:0;31501:179;;31602:10;31591:30;;;;;;;;;;;;:::i;:::-;31583:85;;;;-1:-1:-1;;;31583:85:0;;19327:2:1;31583:85:0;;;19309:21:1;19366:2;19346:18;;;19339:30;19405:34;19385:18;;;19378:62;-1:-1:-1;;;19456:18:1;;;19449:40;19506:19;;31583:85:0;19125:406:1;17371:229:0;17508:12;17540:52;17562:6;17570:4;17576:1;17579:12;17540:21;:52::i;:::-;17533:59;17371:229;-1:-1:-1;;;;17371:229:0:o;18491:510::-;18661:12;18719:5;18694:21;:30;;18686:81;;;;-1:-1:-1;;;18686:81:0;;19738:2:1;18686:81:0;;;19720:21:1;19777:2;19757:18;;;19750:30;19816:34;19796:18;;;19789:62;-1:-1:-1;;;19867:18:1;;;19860:36;19913:19;;18686:81:0;19536:402:1;18686:81:0;-1:-1:-1;;;;;14921:19:0;;;18778:60;;;;-1:-1:-1;;;18778:60:0;;20145:2:1;18778:60:0;;;20127:21:1;20184:2;20164:18;;;20157:30;20223:31;20203:18;;;20196:59;20272:18;;18778:60:0;19943:353:1;18778:60:0;18852:12;18866:23;18893:6;-1:-1:-1;;;;;18893:11:0;18912:5;18919:4;18893:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18851:73;;;;18942:51;18959:7;18968:10;18980:12;21327;21356:7;21352:580;;;-1:-1:-1;21387:10:0;21380:17;;21352:580;21501:17;;:21;21497:424;;21749:10;21743:17;21810:15;21797:10;21793:2;21789:19;21782:44;21497:424;21892:12;21885:20;;-1:-1:-1;;;21885:20:0;;;;;;;;:::i;14:156:1:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:182::-;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;324:27;341:9;324:27;:::i;544:118::-;630:5;623:13;616:21;609:5;606:32;596:60;;652:1;649;642:12;667:722;772:6;780;788;796;804;812;820;873:3;861:9;852:7;848:23;844:33;841:53;;;890:1;887;880:12;841:53;913:27;930:9;913:27;:::i;:::-;903:37;;987:2;976:9;972:18;959:32;949:42;;1038:2;1027:9;1023:18;1010:32;1000:42;;1089:2;1078:9;1074:18;1061:32;1051:42;;1140:3;1129:9;1125:19;1112:33;1102:43;;1195:3;1184:9;1180:19;1167:33;1209:28;1231:5;1209:28;:::i;:::-;1256:5;-1:-1:-1;1313:3:1;1298:19;;1285:33;1327:30;1285:33;1327:30;:::i;:::-;1376:7;1366:17;;;667:722;;;;;;;;;;:::o;1586:173::-;1654:20;;-1:-1:-1;;;;;1703:31:1;;1693:42;;1683:70;;1749:1;1746;1739:12;1764:254;1832:6;1840;1893:2;1881:9;1872:7;1868:23;1864:32;1861:52;;;1909:1;1906;1899:12;1861:52;1932:29;1951:9;1932:29;:::i;:::-;1922:39;2008:2;1993:18;;;;1980:32;;-1:-1:-1;;;1764:254:1:o;2023:250::-;2089:6;2097;2150:2;2138:9;2129:7;2125:23;2121:32;2118:52;;;2166:1;2163;2156:12;2118:52;2189:27;2206:9;2189:27;:::i;2278:250::-;2344:6;2352;2405:2;2393:9;2384:7;2380:23;2376:32;2373:52;;;2421:1;2418;2411:12;2373:52;2457:9;2444:23;2434:33;;2486:36;2518:2;2507:9;2503:18;2486:36;:::i;:::-;2476:46;;2278:250;;;;;:::o;2533:651::-;2631:6;2639;2647;2655;2663;2671;2724:3;2712:9;2703:7;2699:23;2695:33;2692:53;;;2741:1;2738;2731:12;2692:53;2777:9;2764:23;2754:33;;2834:2;2823:9;2819:18;2806:32;2796:42;;2885:2;2874:9;2870:18;2857:32;2847:42;;2936:2;2925:9;2921:18;2908:32;2898:42;;2990:3;2979:9;2975:19;2962:33;3004:28;3026:5;3004:28;:::i;:::-;3051:5;-1:-1:-1;3108:3:1;3093:19;;3080:33;3122:30;3080:33;3122:30;:::i;:::-;3171:7;3161:17;;;2533:651;;;;;;;;:::o;3189:256::-;3255:6;3263;3316:2;3304:9;3295:7;3291:23;3287:32;3284:52;;;3332:1;3329;3322:12;3284:52;3355:27;3372:9;3355:27;:::i;:::-;3345:37;;3401:38;3435:2;3424:9;3420:18;3401:38;:::i;3774:322::-;3851:6;3859;3867;3920:2;3908:9;3899:7;3895:23;3891:32;3888:52;;;3936:1;3933;3926:12;3888:52;3959:29;3978:9;3959:29;:::i;:::-;3949:39;4035:2;4020:18;;4007:32;;-1:-1:-1;4086:2:1;4071:18;;;4058:32;;3774:322;-1:-1:-1;;;3774:322:1:o;4101:180::-;4160:6;4213:2;4201:9;4192:7;4188:23;4184:32;4181:52;;;4229:1;4226;4219:12;4181:52;-1:-1:-1;4252:23:1;;4101:180;-1:-1:-1;4101:180:1:o;5497:256::-;5563:6;5571;5624:2;5612:9;5603:7;5599:23;5595:32;5592:52;;;5640:1;5637;5630:12;5592:52;5663:29;5682:9;5663:29;:::i;:::-;5653:39;;5711:36;5743:2;5732:9;5728:18;5711:36;:::i;6226:186::-;6285:6;6338:2;6326:9;6317:7;6313:23;6309:32;6306:52;;;6354:1;6351;6344:12;6306:52;6377:29;6396:9;6377:29;:::i;6417:309::-;6482:6;6490;6543:2;6531:9;6522:7;6518:23;6514:32;6511:52;;;6559:1;6556;6549:12;6511:52;6598:9;6585:23;6617:28;6639:5;6617:28;:::i;7422:127::-;7483:10;7478:3;7474:20;7471:1;7464:31;7514:4;7511:1;7504:15;7538:4;7535:1;7528:15;7554:355;7756:2;7738:21;;;7795:2;7775:18;;;7768:30;7834:33;7829:2;7814:18;;7807:61;7900:2;7885:18;;7554:355::o;7914:339::-;8116:2;8098:21;;;8155:2;8135:18;;;8128:30;-1:-1:-1;;;8189:2:1;8174:18;;8167:45;8244:2;8229:18;;7914:339::o;8258:340::-;8460:2;8442:21;;;8499:2;8479:18;;;8472:30;-1:-1:-1;;;8533:2:1;8518:18;;8511:46;8589:2;8574:18;;8258:340::o;8603:342::-;8805:2;8787:21;;;8844:2;8824:18;;;8817:30;-1:-1:-1;;;8878:2:1;8863:18;;8856:48;8936:2;8921:18;;8603:342::o;8950:127::-;9011:10;9006:3;9002:20;8999:1;8992:31;9042:4;9039:1;9032:15;9066:4;9063:1;9056:15;9082:135;9121:3;9142:17;;;9139:43;;9162:18;;:::i;:::-;-1:-1:-1;9209:1:1;9198:13;;9082:135::o;10903:125::-;10968:9;;;10989:10;;;10986:36;;;11002:18;;:::i;11033:128::-;11100:9;;;11121:11;;;11118:37;;;11135:18;;:::i;11166:184::-;11236:6;11289:2;11277:9;11268:7;11264:23;11260:32;11257:52;;;11305:1;11302;11295:12;11257:52;-1:-1:-1;11328:16:1;;11166:184;-1:-1:-1;11166:184:1:o;13535:217::-;13575:1;13601;13591:132;;13645:10;13640:3;13636:20;13633:1;13626:31;13680:4;13677:1;13670:15;13708:4;13705:1;13698:15;13591:132;-1:-1:-1;13737:9:1;;13535:217::o;15197:168::-;15270:9;;;15301;;15318:15;;;15312:22;;15298:37;15288:71;;15339:18;;:::i;18875:245::-;18942:6;18995:2;18983:9;18974:7;18970:23;18966:32;18963:52;;;19011:1;19008;19001:12;18963:52;19043:9;19037:16;19062:28;19084:5;19062:28;:::i;20301:250::-;20386:1;20396:113;20410:6;20407:1;20404:13;20396:113;;;20486:11;;;20480:18;20467:11;;;20460:39;20432:2;20425:10;20396:113;;;-1:-1:-1;;20543:1:1;20525:16;;20518:27;20301:250::o;20556:287::-;20685:3;20723:6;20717:13;20739:66;20798:6;20793:3;20786:4;20778:6;20774:17;20739:66;:::i;:::-;20821:16;;;;;20556:287;-1:-1:-1;;20556:287:1:o;20848:396::-;20997:2;20986:9;20979:21;20960:4;21029:6;21023:13;21072:6;21067:2;21056:9;21052:18;21045:34;21088:79;21160:6;21155:2;21144:9;21140:18;21135:2;21127:6;21123:15;21088:79;:::i;:::-;21228:2;21207:15;-1:-1:-1;;21203:29:1;21188:45;;;;21235:2;21184:54;;20848:396;-1:-1:-1;;20848:396:1:o
Swarm Source
ipfs://e8b4a903c6f727e8613c18dab2da25cb165ea984372e49bb09265e653b31ce6a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value | 
|---|---|---|---|---|---|
| ETH | 100.00% | $0.004013 | 6,936,815.753 | $27,840.1 | 
Loading...
Loading
Loading...
Loading
Loading...
Loading
            [ Download: CSV Export  ]
        
        
        A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.