ETH Price: $2,634.62 (+0.92%)

Token

Genesis (GNSS)
 

Overview

Max Total Supply

1,000,000 GNSS

Holders

124

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
51.438234149 GNSS

Value
$0.00
0x6cdd2b7297b60cb5297872678304c88439c4c590
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenesisERC20Token

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

// SPDX-License-Identifier: AGPL-3.0-or-later

// Designed by @crypt0xa

pragma solidity >=0.7.5;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = chainID;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        if (chainID == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        return keccak256(abi.encode(typeHash, nameHash, versionHash, chainID, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}
// File: interfaces/IERC20Permit.sol


pragma solidity >=0.7.5;

/**
 * @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 th xe 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: interfaces/IERC20.sol


pragma solidity >=0.7.5;

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

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

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

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

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

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

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

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

// File: interfaces/ISIN.sol


pragma solidity >=0.7.5;


pragma solidity >=0.7.5;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: libraries/SafeMath.sol

pragma solidity >=0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}
// File: libraries/Counters.sol

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

pragma solidity >=0.7.5;


library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}
// File: types/ERC20.sol


pragma solidity >=0.7.5;


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


pragma solidity >=0.7.5;

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


abstract contract ERC20 is Context, IERC20{

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
    mapping (address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string internal _name;
    
    string internal _symbol;
    
    uint8 internal immutable _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

// File: types/ERC20Permit.sol


pragma solidity >=0.7.5;






/**
 * @dev Implementation 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.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: GenesisERC20.sol


pragma solidity >=0.7.5;



interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}




contract GenesisERC20Token is ERC20Permit, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    address public marketingWallet;
    address public treasuryWallet;

    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool private swapping;
    uint256 public enableBlock = 0;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyBurnFee;
    uint256 public buyTreasuryFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellBurnFee;
    uint256 public sellTreasuryFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForBurn;
    uint256 public tokensForTreasury;

    bool public limitsInEffect = true;
    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

     // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint256 public initialSupply;
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public launchMarketMaker;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event treasuryWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor(address _marketingWallet, address _treasuryWallet) 
    ERC20("Genesis", "GNSS", 9) 
    ERC20Permit("Genesis") 
    {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        initialSupply = 1000000*1e9;
        maxTransactionAmount = initialSupply * 399/1000000; // 0.0399% maxTransactionAmountTxn
        maxWallet = initialSupply * 3 / 1000; // 0.3% maxWallet
        _mint(owner(), initialSupply);
        
        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 2;
        uint256 _buyBurnFee = 0;
        uint256 _buyTreasuryFee = 2;

        uint256 _sellMarketingFee = 10;
        uint256 _sellLiquidityFee = 8;
        uint256 _sellBurnFee = 0;
        uint256 _sellTreasuryFee = 2;
        
    
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyBurnFee = _buyBurnFee;
        buyTreasuryFee = _buyTreasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyTreasuryFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellBurnFee = _sellBurnFee;
        sellTreasuryFee = _sellTreasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellTreasuryFee;
        
        marketingWallet = address(_marketingWallet);
        treasuryWallet = address(_treasuryWallet);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
    }

    receive() external payable {

  	}

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }


    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e9, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**9);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**9);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }



    // once enabled, can never be turned off
    function initialize() external onlyOwner returns (bool) {
        require(!tradingActive);
        tradingActive = true;
        swapEnabled = true;
        enableBlock = block.number;

        return true;
    }

    function pauseTrading() external onlyOwner {
    	// Can only be done when limits are in place
        tradingActive = false;
    }

    function setLaunchMarketMaker(address _add, bool _isTrue) external onlyOwner{
    	if (_isTrue){
		// Can only be done when limits are in place
		require(limitsInEffect);
	}
        launchMarketMaker[_add] = _isTrue;
    }

    function resumeTrading() external onlyOwner {
        tradingActive = true;
    }


    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner{
        swapEnabled = enabled;
    }

    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _treasuryFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyBurnFee = _burnFee;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyTreasuryFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _treasuryFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellBurnFee = _burnFee;
        sellTreasuryFee = _treasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellTreasuryFee;
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updatetreasuryWallet(address newtreasuryWallet) external onlyOwner {
        emit treasuryWalletUpdated(newtreasuryWallet, treasuryWallet);
        treasuryWallet = newtreasuryWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        require(!launchMarketMaker[from], "See you in hell!");
        require(!launchMarketMaker[to], "See you in hell!");

        uint256 fees = 0;

        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }


                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }

                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                // Add to marketmakers for launch
                if (automatedMarketMakerPairs[from] && enableBlock != 0 && block.number <= enableBlock+1){
                    launchMarketMaker[to] = true;
                }
            }
        }

        if( 
            swapEnabled &&
            !swapping &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            !automatedMarketMakerPairs[from]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        tokensForBurn = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForBurn = fees * sellBurnFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForBurn = fees * buyBurnFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees-tokensForBurn > 0){    
                super._transfer(from, address(this), fees.sub(tokensForBurn));
            }
            if (tokensForBurn > 0){
                super._transfer(from, deadAddress, tokensForBurn);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }


    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }


    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForTreasury;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        if(contractBalance > totalSupply() * 5 / 10000 * 20){
          contractBalance = totalSupply() * 5 / 10000 * 20;
        }
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForTreasury = ethBalance.mul(tokensForTreasury).div(totalTokensToSwap);
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForTreasury;

        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForTreasury = 0;
        
        (success,) = address(treasuryWallet).call{value: ethForTreasury}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }

    function withdrawEthPool() external onlyOwner() {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

// Designed by @crypt0xa
// DISCLAIMER: I'm just the author of this code, I'm not and will not be accountable for anything anyone does with this code. Crypto is a wild space
// and people always fork stuff. Always DYOR.
// Goated Dev :)
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_treasuryWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"launchMarketMaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bool","name":"_isTrue","type":"bool"}],"name":"setLaunchMarketMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newtreasuryWallet","type":"address"}],"name":"updatetreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEthPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140908152506000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506000600b556001601a60006101000a81548160ff0219169083151502179055506001601c60006101000a81548160ff021916908315150217905550348015620000ab57600080fd5b5060405162006cde38038062006cde83398181016040526040811015620000d157600080fd5b8101908080519060200190929190805190602001909291905050506040518060400160405280600781526020017f47656e6573697300000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f47656e65736973000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474e53530000000000000000000000000000000000000000000000000000000081525060098260039080519060200190620001df92919062000cf1565b508160049080519060200190620001f892919062000cf1565b508060ff1660808160ff1660f81b81525050505050600046905060008380519060200120905060008380519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250508360c081815250506200027b818484620007c760201b60201c565b60a08181525050806101208181525050505050505050506000620002a46200083460201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e457600080fd5b505afa158015620003f9573d6000803e3d6000fd5b505050506040513d60208110156200041057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620004a657600080fd5b505afa158015620004bb573d6000803e3d6000fd5b505050506040513d6020811015620004d257600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156200054d57600080fd5b505af115801562000562573d6000803e3d6000fd5b505050506040513d60208110156200057957600080fd5b8101908080519060200190929190505050600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620005ff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200083c60201b60201c565b66038d7ea4c68000602181905550620f424061018f60215402816200062057fe5b04601f819055506103e8600360215402816200063857fe5b046020819055506200066262000653620008dd60201b60201c565b6021546200090760201b60201c565b600060029050600060029050600080600290506000600a90506000600890506000806002905087600d8190555086600e8190555085600f8190555084601081905550601054600f54600e54600d54010101600c81905550836012819055508260138190555081601481905550806015819055506015546014546013546012540101016011819055508a600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200078e62000780620008dd60201b60201c565b600162000ae560201b60201c565b620007a130600162000ae560201b60201c565b620007b661dead600162000ae560201b60201c565b505050505050505050505062000da7565b6000804690508484848330604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050604051602081830303815290604052805190602001209150509392505050565b600033905090565b80602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620009bf6000838362000c6360201b60201c565b620009db8160025462000c6860201b6200371e1790919060201c565b60028190555062000a39816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000c6860201b6200371e1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b62000af56200083460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000bb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b505050565b60008082840190508381101562000ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000d29576000855562000d75565b82601f1062000d4457805160ff191683800117855562000d75565b8280016001018555821562000d75579182015b8281111562000d7457825182559160200191906001019062000d57565b5b50905062000d84919062000d88565b5090565b5b8082111562000da357600081600090555060010162000d89565b5090565b60805160f81c60a05160c05160e051610100516101205161014051615ee062000dfe60003980613069525080614a63525080614aa5525080614a84525080614a0f525080614a37525080611ea65250615ee06000f3fe6080604052600436106103d25760003560e01c806375f0a874116101fd578063c18bc19511610118578063d85ba063116100ab578063e884f2601161007a578063e884f26014611458578063f11a24d314611485578063f2fde38b146114b0578063f637434214611501578063f8b45b051461152c576103d9565b8063d85ba06314611324578063dd62ed3e1461134f578063e71dc3f5146113d4578063e7ad9fcd146113ff576103d9565b8063cc2ffe7c116100e7578063cc2ffe7c146111c1578063cfd05e83146111ec578063d505accf14611217578063d709dce1146112bd576103d9565b8063c18bc195146110d1578063c2a4bcc31461110c578063c876d0b914611169578063c8c8ebe414611196576103d9565b80639a7a23d611610190578063adb873bd1161015f578063adb873bd14610fb5578063b62496f514610fe0578063bbc0c74214611047578063c024666814611074576103d9565b80639a7a23d614610e25578063a457c2d714610e82578063a9059cbb14610ef3578063aacebbe314610f64576103d9565b80638da5cb5b116101cc5780638da5cb5b14610cec5780639213691314610d2d578063924de9b714610d5857806395d89b4114610d95576103d9565b806375f0a87414610bee5780637bce5a0414610c2f5780637ecebe0014610c5a5780638129fc1c14610cbf576103d9565b8063313ce567116102ed5780635c068a8c1161028057806370a082311161024f57806370a0823114610ae8578063715018a614610b4d578063751039fc14610b645780637571336a14610b91576103d9565b80635c068a8c14610a3a5780636a486a8e14610a655780636b2fb12414610a905780636ddd171314610abb576103d9565b80634626402b116102bc5780634626402b1461092457806349bd5a5e146109655780634a62bb65146109a65780634fbee193146109d3576103d9565b8063313ce5671461082f5780633644e5151461085d578063378dc3dc1461088857806339509351146108b3576103d9565b80631a8145bb1161036557806323b872dd1161033457806323b872dd146106b357806327c8f835146107445780632955ede6146107855780632e6ed7ef146107d6576103d9565b80631a8145bb146105f75780631d777856146106225780631f3fed8f1461064d578063203e727e14610678576103d9565b80631031e36e116103a15780631031e36e1461050d57806310d5de53146105245780631694505e1461058b57806318160ddd146105cc576103d9565b80630694db1e146103de57806306fdde03146103f5578063095ea7b3146104855780630e3d57eb146104f6576103d9565b366103d957005b600080fd5b3480156103ea57600080fd5b506103f3611557565b005b34801561040157600080fd5b5061040a61163e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561044a57808201518184015260208101905061042f565b50505050905090810190601f1680156104775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049157600080fd5b506104de600480360360408110156104a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116e0565b60405180821515815260200191505060405180910390f35b34801561050257600080fd5b5061050b6116f7565b005b34801561051957600080fd5b5061052261182f565b005b34801561053057600080fd5b506105736004803603602081101561054757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611916565b60405180821515815260200191505060405180910390f35b34801561059757600080fd5b506105a0611936565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105d857600080fd5b506105e161195c565b6040518082815260200191505060405180910390f35b34801561060357600080fd5b5061060c611966565b6040518082815260200191505060405180910390f35b34801561062e57600080fd5b5061063761196c565b6040518082815260200191505060405180910390f35b34801561065957600080fd5b50610662611972565b6040518082815260200191505060405180910390f35b34801561068457600080fd5b506106b16004803603602081101561069b57600080fd5b8101908080359060200190929190505050611978565b005b3480156106bf57600080fd5b5061072c600480360360608110156106d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611acd565b60405180821515815260200191505060405180910390f35b34801561075057600080fd5b50610759611b98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079157600080fd5b506107d4600480360360208110156107a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b9e565b005b3480156107e257600080fd5b5061082d600480360360808110156107f957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611d28565b005b34801561083b57600080fd5b50610844611ea2565b604051808260ff16815260200191505060405180910390f35b34801561086957600080fd5b50610872611eca565b6040518082815260200191505060405180910390f35b34801561089457600080fd5b5061089d611ed9565b6040518082815260200191505060405180910390f35b3480156108bf57600080fd5b5061090c600480360360408110156108d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611edf565b60405180821515815260200191505060405180910390f35b34801561093057600080fd5b50610939611f84565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561097157600080fd5b5061097a611faa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109b257600080fd5b506109bb611fd0565b60405180821515815260200191505060405180910390f35b3480156109df57600080fd5b50610a22600480360360208110156109f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fe3565b60405180821515815260200191505060405180910390f35b348015610a4657600080fd5b50610a4f612039565b6040518082815260200191505060405180910390f35b348015610a7157600080fd5b50610a7a61203f565b6040518082815260200191505060405180910390f35b348015610a9c57600080fd5b50610aa5612045565b6040518082815260200191505060405180910390f35b348015610ac757600080fd5b50610ad061204b565b60405180821515815260200191505060405180910390f35b348015610af457600080fd5b50610b3760048036036020811015610b0b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061205e565b6040518082815260200191505060405180910390f35b348015610b5957600080fd5b50610b626120a6565b005b348015610b7057600080fd5b50610b79612231565b60405180821515815260200191505060405180910390f35b348015610b9d57600080fd5b50610bec60048036036040811015610bb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061231f565b005b348015610bfa57600080fd5b50610c03612444565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c3b57600080fd5b50610c4461246a565b6040518082815260200191505060405180910390f35b348015610c6657600080fd5b50610ca960048036036020811015610c7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612470565b6040518082815260200191505060405180910390f35b348015610ccb57600080fd5b50610cd46124c0565b60405180821515815260200191505060405180910390f35b348015610cf857600080fd5b50610d016125ea565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d3957600080fd5b50610d42612614565b6040518082815260200191505060405180910390f35b348015610d6457600080fd5b50610d9360048036036020811015610d7b57600080fd5b8101908080351515906020019092919050505061261a565b005b348015610da157600080fd5b50610daa612701565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dea578082015181840152602081019050610dcf565b50505050905090810190601f168015610e175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e3157600080fd5b50610e8060048036036040811015610e4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506127a3565b005b348015610e8e57600080fd5b50610edb60048036036040811015610ea557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612922565b60405180821515815260200191505060405180910390f35b348015610eff57600080fd5b50610f4c60048036036040811015610f1657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129e1565b60405180821515815260200191505060405180910390f35b348015610f7057600080fd5b50610fb360048036036020811015610f8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129f8565b005b348015610fc157600080fd5b50610fca612b82565b6040518082815260200191505060405180910390f35b348015610fec57600080fd5b5061102f6004803603602081101561100357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b88565b60405180821515815260200191505060405180910390f35b34801561105357600080fd5b5061105c612ba8565b60405180821515815260200191505060405180910390f35b34801561108057600080fd5b506110cf6004803603604081101561109757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612bbb565b005b3480156110dd57600080fd5b5061110a600480360360208110156110f457600080fd5b8101908080359060200190929190505050612d30565b005b34801561111857600080fd5b506111676004803603604081101561112f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e85565b005b34801561117557600080fd5b5061117e612fca565b60405180821515815260200191505060405180910390f35b3480156111a257600080fd5b506111ab612fdd565b6040518082815260200191505060405180910390f35b3480156111cd57600080fd5b506111d6612fe3565b6040518082815260200191505060405180910390f35b3480156111f857600080fd5b50611201612fe9565b6040518082815260200191505060405180910390f35b34801561122357600080fd5b506112bb600480360360e081101561123a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612fef565b005b3480156112c957600080fd5b5061130c600480360360208110156112e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131e1565b60405180821515815260200191505060405180910390f35b34801561133057600080fd5b50611339613201565b6040518082815260200191505060405180910390f35b34801561135b57600080fd5b506113be6004803603604081101561137257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613207565b6040518082815260200191505060405180910390f35b3480156113e057600080fd5b506113e961328e565b6040518082815260200191505060405180910390f35b34801561140b57600080fd5b506114566004803603608081101561142257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613294565b005b34801561146457600080fd5b5061146d61340e565b60405180821515815260200191505060405180910390f35b34801561149157600080fd5b5061149a6134fc565b6040518082815260200191505060405180910390f35b3480156114bc57600080fd5b506114ff600480360360208110156114d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613502565b005b34801561150d57600080fd5b50611516613712565b6040518082815260200191505060405180910390f35b34801561153857600080fd5b50611541613718565b6040518082815260200191505060405180910390f35b61155f6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116d65780601f106116ab576101008083540402835291602001916116d6565b820191906000526020600020905b8154815290600101906020018083116116b957829003601f168201915b5050505050905090565b60006116ed3384846137ae565b6001905092915050565b6116ff6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114611821576040519150601f19603f3d011682016040523d82523d6000602084013e611826565b606091505b50508091505050565b6118376137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b601e6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60175481565b60185481565b60165481565b6119806137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b633b9aca006103e86001611a5461195c565b0281611a5c57fe5b0481611a6457fe5b04811015611abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615e7c602f913960400191505060405180910390fd5b633b9aca008102601f8190555050565b6000611ada8484846139a5565b611b8d8433611b8885604051806060016040528060288152602001615de660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546149479092919063ffffffff16565b6137ae565b600190509392505050565b61dead81565b611ba66137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63560405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d306137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b83600d8190555082600e8190555081600f8190555080601081905550601054600f54600e54600d54010101600c819055506019600c541115611e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d757374206b656570206665657320617420323525206f72206c65737300000081525060200191505060405180910390fd5b50505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6000611ed4614a07565b905090565b60215481565b6000611f7a3384611f7585600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461371e90919063ffffffff16565b6137ae565b6001905092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601a60009054906101000a900460ff1681565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60105481565b60115481565b60155481565b600a60159054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6120ae6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061223b6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601a60006101000a81548160ff0219169083151502179055506001905090565b6123276137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b60006124b9600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614ad0565b9050919050565b60006124ca6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461258c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a60149054906101000a900460ff16156125a657600080fd5b6001600a60146101000a81548160ff0219169083151502179055506001600a60156101000a81548160ff02191690831515021790555043600b819055506001905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6126226137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127995780601f1061276e57610100808354040283529160200191612799565b820191906000526020600020905b81548152906001019060200180831161277c57829003601f168201915b5050505050905090565b6127ab6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461286d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612914576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180615c6e6039913960400191505060405180910390fd5b61291e8282614ade565b5050565b60006129d733846129d285604051806060016040528060258152602001615e5760259139600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546149479092919063ffffffff16565b6137ae565b6001905092915050565b60006129ee3384846139a5565b6001905092915050565b612a006137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ac2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b60226020528060005260406000206000915054906101000a900460ff1681565b600a60149054906101000a900460ff1681565b612bc36137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b612d386137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dfa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b633b9aca006103e86005612e0c61195c565b0281612e1457fe5b0481612e1c57fe5b04811015612e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c4a6024913960400191505060405180910390fd5b633b9aca00810260208190555050565b612e8d6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015612f6f57601a60009054906101000a900460ff16612f6e57600080fd5b5b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601c60009054906101000a900460ff1681565b601f5481565b60195481565b600b5481565b83421115613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f45524332305065726d69743a206578706972656420646561646c696e6500000081525060200191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008888886130948c614b7f565b89604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019650505050505050604051602081830303815290604052805190602001209050600061311782614bdd565b9050600061312782878787614bf7565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f45524332305065726d69743a20696e76616c6964207369676e6174757265000081525060200191505060405180910390fd5b6131d58a8a8a6137ae565b50505050505050505050565b60236020528060005260406000206000915054906101000a900460ff1681565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600f5481565b61329c6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461335e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8360128190555082601381905550816014819055508060158190555060155460145460135460125401010160118190555060196011541115613408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d757374206b656570206665657320617420323525206f72206c65737300000081525060200191505060405180910390fd5b50505050565b60006134186137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146134da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601c60006101000a81548160ff0219169083151502179055506001905090565b600e5481565b61350a6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146135cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c026026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60135481565b60205481565b60008082840190508381101561379c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613834576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e336024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c286022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615e0e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615bdf6023913960400191505060405180910390fd5b6000811415613acb57613ac683836000614c22565b614942565b602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613b8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f53656520796f7520696e2068656c6c210000000000000000000000000000000081525060200191505060405180910390fd5b602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613c4b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f53656520796f7520696e2068656c6c210000000000000000000000000000000081525060200191505060405180910390fd5b6000601a60009054906101000a900460ff16156144a857613c6a6125ea565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015613cd85750613ca86125ea565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613d115750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613d4b575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613d645750600a60169054906101000a900460ff16155b156144a757600a60149054906101000a900460ff16613e9157601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613e1e5750601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613e90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f54726164696e67206973206e6f74206163746976652e0000000000000000000081525060200191505060405180910390fd5b5b601c60009054906101000a900460ff161561407357613eae6125ea565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613f375750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613f915750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156140725743601b60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061402d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526049815260200180615d5a6049913960600191505060405180910390fd5b43601b60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156141165750601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156141fd57601f54821115614176576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615d256035913960400191505060405180910390fd5b6020546141828461205e565b830111156141f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d61782077616c6c65742065786365656465640000000000000000000000000081525060200191505060405180910390fd5b6143db565b602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156142a05750601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561430557601f54821115614300576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615ccd6036913960400191505060405180910390fd5b6143da565b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166143d9576020546143628461205e565b830111156143d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d61782077616c6c65742065786365656465640000000000000000000000000081525060200191505060405180910390fd5b5b5b5b602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561443757506000600b5414155b801561444857506001600b54014311155b156144a6576001602360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5b600a60159054906101000a900460ff1680156144d15750600a60169054906101000a900460ff16155b80156145275750601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561457d5750601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156145d35750602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15614617576001600a60166101000a81548160ff0219169083151502179055506145fb614ee3565b6000600a60166101000a81548160ff0219169083151502179055505b6000600a60169054906101000a900460ff16159050601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806146cd5750601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156146d757600090505b6000601881905550801561493457602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561474057506000601154115b156147e75761476d606461475f601154866151b390919063ffffffff16565b61523990919063ffffffff16565b915060115460135483028161477e57fe5b0460176000828254019250508190555060115460145483028161479d57fe5b046018819055506011546015548302816147b357fe5b046019600082825401925050819055506011546012548302816147d257fe5b046016600082825401925050819055506148e6565b602260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561484257506000600c54115b156148e55761486f6064614861600c54866151b390919063ffffffff16565b61523990919063ffffffff16565b9150600c54600e5483028161488057fe5b04601760008282540192505081905550600c54600f5483028161489f57fe5b04601881905550600c546010548302816148b557fe5b04601960008282540192505081905550600c54600d548302816148d457fe5b046016600082825401925050819055505b5b60006018548303111561491357614912853061490d6018548661528390919063ffffffff16565b614c22565b5b6000601854111561492e5761492d8561dead601854614c22565b5b81830392505b61493f858585614c22565b50505b505050565b60008383111582906149f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156149b957808201518184015260208101905061499e565b50505050905090810190601f1680156149e65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000804690507f0000000000000000000000000000000000000000000000000000000000000000811415614a5e577f0000000000000000000000000000000000000000000000000000000000000000915050614acd565b614ac97f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006152cd565b9150505b90565b600081600001549050919050565b80602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050614bcc81614ad0565b9150614bd78161533a565b50919050565b6000614bf0614bea614a07565b83615350565b9050919050565b6000806000614c08878787876153b1565b91509150614c15816154d3565b8192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615e0e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615bdf6023913960400191505060405180910390fd5b614d398383836156f4565b614da481604051806060016040528060268152602001615ca7602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546149479092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614e37816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461371e90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000614eee3061205e565b9050600060195460165460175401019050600080831480614f0f5750600082145b15614f1c575050506151b1565b60146127106005614f2b61195c565b0281614f3357fe5b0402831115614f585760146127106005614f4b61195c565b0281614f5357fe5b040292505b6000600283601754860281614f6957fe5b0481614f7157fe5b0490506000614f89828661528390919063ffffffff16565b90506000479050614f99826156f9565b6000614fae824761528390919063ffffffff16565b90506000614fd987614fcb601654856151b390919063ffffffff16565b61523990919063ffffffff16565b9050600061500488614ff6601954866151b390919063ffffffff16565b61523990919063ffffffff16565b9050600081838503039050600060178190555060006016819055506000601981905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d80600081146150a7576040519150601f19603f3d011682016040523d82523d6000602084013e6150ac565b606091505b5050809850506000871180156150c25750600081115b1561511b576150d187826159ad565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561868260175460405180848152602001838152602001828152602001935050505060405180910390a15b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d806000811461519b576040519150601f19603f3d011682016040523d82523d6000602084013e6151a0565b606091505b505080985050505050505050505050505b565b6000808314156151c65760009050615233565b60008284029050828482816151d757fe5b041461522e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615dc56021913960400191505060405180910390fd5b809150505b92915050565b600061527b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615b02565b905092915050565b60006152c583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614947565b905092915050565b6000804690508484848330604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050604051602081830303815290604052805190602001209150509392505050565b6001816000016000828254019250508190555050565b6000828260405160200180807f19010000000000000000000000000000000000000000000000000000000000008152506002018381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156153ec5760006003915091506154ca565b601b8560ff16141580156154045750601c8560ff1614155b156154165760006004915091506154ca565b600060018787878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015615472573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156154c1576000600192509250506154ca565b80600092509250505b94509492505050565b600060048111156154e057fe5b8160048111156154ec57fe5b14156154f7576156f1565b6001600481111561550457fe5b81600481111561551057fe5b1415615584576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b6002600481111561559157fe5b81600481111561559d57fe5b1415615611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b6003600481111561561e57fe5b81600481111561562a57fe5b1415615681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d036022913960400191505060405180910390fd5b60048081111561568d57fe5b81600481111561569957fe5b14156156f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615da36022913960400191505060405180910390fd5b5b50565b505050565b6060600267ffffffffffffffff8111801561571357600080fd5b506040519080825280602002602001820160405280156157425781602001602082028036833780820191505090505b509050308160008151811061575357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156157f557600080fd5b505afa158015615809573d6000803e3d6000fd5b505050506040513d602081101561581f57600080fd5b81019080805190602001909291905050508160018151811061583d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506158a430600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846137ae565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561596857808201518184015260208101905061594d565b505050509050019650505050505050600060405180830381600087803b15801561599157600080fd5b505af11580156159a5573d6000803e3d6000fd5b505050505050565b6159da30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846137ae565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080615a266125ea565b426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b158015615aab57600080fd5b505af1158015615abf573d6000803e3d6000fd5b50505050506040513d6060811015615ad657600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505050565b60008083118290615bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615b73578082015181840152602081019050615b58565b50505050905090810190601f168015615ba05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581615bba57fe5b049050838581615bc657fe5b06818502018514615bd357fe5b80915050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737343616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20302e352554686520706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572506169727345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636553656c6c207472616e7366657220616d6f756e74206578636565647320746865206d61785472616e73616374696f6e416d6f756e742e45434453413a20696e76616c6964207369676e6174757265202773272076616c7565427579207472616e7366657220616d6f756e74206578636565647320746865206d61785472616e73616374696f6e416d6f756e742e5f7472616e736665723a3a205472616e736665722044656c617920656e61626c65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b20616c6c6f7765642e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74206c6f776572207468616e20302e3125a26469706673582212206f94fcda6e8f04ceaa6537b8f86cce7ce39a2c3688f60ba6e3851d82c01527d664736f6c63430007050033000000000000000000000000db0e06e7fb1f8da4dc3835d432bca239acd65033000000000000000000000000d5ab4c5beec235a6408514d7e234235b54c3a852

Deployed Bytecode

0x6080604052600436106103d25760003560e01c806375f0a874116101fd578063c18bc19511610118578063d85ba063116100ab578063e884f2601161007a578063e884f26014611458578063f11a24d314611485578063f2fde38b146114b0578063f637434214611501578063f8b45b051461152c576103d9565b8063d85ba06314611324578063dd62ed3e1461134f578063e71dc3f5146113d4578063e7ad9fcd146113ff576103d9565b8063cc2ffe7c116100e7578063cc2ffe7c146111c1578063cfd05e83146111ec578063d505accf14611217578063d709dce1146112bd576103d9565b8063c18bc195146110d1578063c2a4bcc31461110c578063c876d0b914611169578063c8c8ebe414611196576103d9565b80639a7a23d611610190578063adb873bd1161015f578063adb873bd14610fb5578063b62496f514610fe0578063bbc0c74214611047578063c024666814611074576103d9565b80639a7a23d614610e25578063a457c2d714610e82578063a9059cbb14610ef3578063aacebbe314610f64576103d9565b80638da5cb5b116101cc5780638da5cb5b14610cec5780639213691314610d2d578063924de9b714610d5857806395d89b4114610d95576103d9565b806375f0a87414610bee5780637bce5a0414610c2f5780637ecebe0014610c5a5780638129fc1c14610cbf576103d9565b8063313ce567116102ed5780635c068a8c1161028057806370a082311161024f57806370a0823114610ae8578063715018a614610b4d578063751039fc14610b645780637571336a14610b91576103d9565b80635c068a8c14610a3a5780636a486a8e14610a655780636b2fb12414610a905780636ddd171314610abb576103d9565b80634626402b116102bc5780634626402b1461092457806349bd5a5e146109655780634a62bb65146109a65780634fbee193146109d3576103d9565b8063313ce5671461082f5780633644e5151461085d578063378dc3dc1461088857806339509351146108b3576103d9565b80631a8145bb1161036557806323b872dd1161033457806323b872dd146106b357806327c8f835146107445780632955ede6146107855780632e6ed7ef146107d6576103d9565b80631a8145bb146105f75780631d777856146106225780631f3fed8f1461064d578063203e727e14610678576103d9565b80631031e36e116103a15780631031e36e1461050d57806310d5de53146105245780631694505e1461058b57806318160ddd146105cc576103d9565b80630694db1e146103de57806306fdde03146103f5578063095ea7b3146104855780630e3d57eb146104f6576103d9565b366103d957005b600080fd5b3480156103ea57600080fd5b506103f3611557565b005b34801561040157600080fd5b5061040a61163e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561044a57808201518184015260208101905061042f565b50505050905090810190601f1680156104775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049157600080fd5b506104de600480360360408110156104a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116e0565b60405180821515815260200191505060405180910390f35b34801561050257600080fd5b5061050b6116f7565b005b34801561051957600080fd5b5061052261182f565b005b34801561053057600080fd5b506105736004803603602081101561054757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611916565b60405180821515815260200191505060405180910390f35b34801561059757600080fd5b506105a0611936565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105d857600080fd5b506105e161195c565b6040518082815260200191505060405180910390f35b34801561060357600080fd5b5061060c611966565b6040518082815260200191505060405180910390f35b34801561062e57600080fd5b5061063761196c565b6040518082815260200191505060405180910390f35b34801561065957600080fd5b50610662611972565b6040518082815260200191505060405180910390f35b34801561068457600080fd5b506106b16004803603602081101561069b57600080fd5b8101908080359060200190929190505050611978565b005b3480156106bf57600080fd5b5061072c600480360360608110156106d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611acd565b60405180821515815260200191505060405180910390f35b34801561075057600080fd5b50610759611b98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079157600080fd5b506107d4600480360360208110156107a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b9e565b005b3480156107e257600080fd5b5061082d600480360360808110156107f957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611d28565b005b34801561083b57600080fd5b50610844611ea2565b604051808260ff16815260200191505060405180910390f35b34801561086957600080fd5b50610872611eca565b6040518082815260200191505060405180910390f35b34801561089457600080fd5b5061089d611ed9565b6040518082815260200191505060405180910390f35b3480156108bf57600080fd5b5061090c600480360360408110156108d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611edf565b60405180821515815260200191505060405180910390f35b34801561093057600080fd5b50610939611f84565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561097157600080fd5b5061097a611faa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109b257600080fd5b506109bb611fd0565b60405180821515815260200191505060405180910390f35b3480156109df57600080fd5b50610a22600480360360208110156109f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fe3565b60405180821515815260200191505060405180910390f35b348015610a4657600080fd5b50610a4f612039565b6040518082815260200191505060405180910390f35b348015610a7157600080fd5b50610a7a61203f565b6040518082815260200191505060405180910390f35b348015610a9c57600080fd5b50610aa5612045565b6040518082815260200191505060405180910390f35b348015610ac757600080fd5b50610ad061204b565b60405180821515815260200191505060405180910390f35b348015610af457600080fd5b50610b3760048036036020811015610b0b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061205e565b6040518082815260200191505060405180910390f35b348015610b5957600080fd5b50610b626120a6565b005b348015610b7057600080fd5b50610b79612231565b60405180821515815260200191505060405180910390f35b348015610b9d57600080fd5b50610bec60048036036040811015610bb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061231f565b005b348015610bfa57600080fd5b50610c03612444565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c3b57600080fd5b50610c4461246a565b6040518082815260200191505060405180910390f35b348015610c6657600080fd5b50610ca960048036036020811015610c7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612470565b6040518082815260200191505060405180910390f35b348015610ccb57600080fd5b50610cd46124c0565b60405180821515815260200191505060405180910390f35b348015610cf857600080fd5b50610d016125ea565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d3957600080fd5b50610d42612614565b6040518082815260200191505060405180910390f35b348015610d6457600080fd5b50610d9360048036036020811015610d7b57600080fd5b8101908080351515906020019092919050505061261a565b005b348015610da157600080fd5b50610daa612701565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dea578082015181840152602081019050610dcf565b50505050905090810190601f168015610e175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e3157600080fd5b50610e8060048036036040811015610e4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506127a3565b005b348015610e8e57600080fd5b50610edb60048036036040811015610ea557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612922565b60405180821515815260200191505060405180910390f35b348015610eff57600080fd5b50610f4c60048036036040811015610f1657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129e1565b60405180821515815260200191505060405180910390f35b348015610f7057600080fd5b50610fb360048036036020811015610f8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129f8565b005b348015610fc157600080fd5b50610fca612b82565b6040518082815260200191505060405180910390f35b348015610fec57600080fd5b5061102f6004803603602081101561100357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b88565b60405180821515815260200191505060405180910390f35b34801561105357600080fd5b5061105c612ba8565b60405180821515815260200191505060405180910390f35b34801561108057600080fd5b506110cf6004803603604081101561109757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612bbb565b005b3480156110dd57600080fd5b5061110a600480360360208110156110f457600080fd5b8101908080359060200190929190505050612d30565b005b34801561111857600080fd5b506111676004803603604081101561112f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e85565b005b34801561117557600080fd5b5061117e612fca565b60405180821515815260200191505060405180910390f35b3480156111a257600080fd5b506111ab612fdd565b6040518082815260200191505060405180910390f35b3480156111cd57600080fd5b506111d6612fe3565b6040518082815260200191505060405180910390f35b3480156111f857600080fd5b50611201612fe9565b6040518082815260200191505060405180910390f35b34801561122357600080fd5b506112bb600480360360e081101561123a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612fef565b005b3480156112c957600080fd5b5061130c600480360360208110156112e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131e1565b60405180821515815260200191505060405180910390f35b34801561133057600080fd5b50611339613201565b6040518082815260200191505060405180910390f35b34801561135b57600080fd5b506113be6004803603604081101561137257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613207565b6040518082815260200191505060405180910390f35b3480156113e057600080fd5b506113e961328e565b6040518082815260200191505060405180910390f35b34801561140b57600080fd5b506114566004803603608081101561142257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613294565b005b34801561146457600080fd5b5061146d61340e565b60405180821515815260200191505060405180910390f35b34801561149157600080fd5b5061149a6134fc565b6040518082815260200191505060405180910390f35b3480156114bc57600080fd5b506114ff600480360360208110156114d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613502565b005b34801561150d57600080fd5b50611516613712565b6040518082815260200191505060405180910390f35b34801561153857600080fd5b50611541613718565b6040518082815260200191505060405180910390f35b61155f6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116d65780601f106116ab576101008083540402835291602001916116d6565b820191906000526020600020905b8154815290600101906020018083116116b957829003601f168201915b5050505050905090565b60006116ed3384846137ae565b6001905092915050565b6116ff6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114611821576040519150601f19603f3d011682016040523d82523d6000602084013e611826565b606091505b50508091505050565b6118376137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b601e6020528060005260406000206000915054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60175481565b60185481565b60165481565b6119806137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b633b9aca006103e86001611a5461195c565b0281611a5c57fe5b0481611a6457fe5b04811015611abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615e7c602f913960400191505060405180910390fd5b633b9aca008102601f8190555050565b6000611ada8484846139a5565b611b8d8433611b8885604051806060016040528060288152602001615de660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546149479092919063ffffffff16565b6137ae565b600190509392505050565b61dead81565b611ba66137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63560405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d306137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b83600d8190555082600e8190555081600f8190555080601081905550601054600f54600e54600d54010101600c819055506019600c541115611e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d757374206b656570206665657320617420323525206f72206c65737300000081525060200191505060405180910390fd5b50505050565b60007f0000000000000000000000000000000000000000000000000000000000000009905090565b6000611ed4614a07565b905090565b60215481565b6000611f7a3384611f7585600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461371e90919063ffffffff16565b6137ae565b6001905092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601a60009054906101000a900460ff1681565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60105481565b60115481565b60155481565b600a60159054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6120ae6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061223b6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601a60006101000a81548160ff0219169083151502179055506001905090565b6123276137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b60006124b9600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614ad0565b9050919050565b60006124ca6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461258c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a60149054906101000a900460ff16156125a657600080fd5b6001600a60146101000a81548160ff0219169083151502179055506001600a60156101000a81548160ff02191690831515021790555043600b819055506001905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6126226137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127995780601f1061276e57610100808354040283529160200191612799565b820191906000526020600020905b81548152906001019060200180831161277c57829003601f168201915b5050505050905090565b6127ab6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461286d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612914576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180615c6e6039913960400191505060405180910390fd5b61291e8282614ade565b5050565b60006129d733846129d285604051806060016040528060258152602001615e5760259139600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546149479092919063ffffffff16565b6137ae565b6001905092915050565b60006129ee3384846139a5565b6001905092915050565b612a006137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ac2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b60226020528060005260406000206000915054906101000a900460ff1681565b600a60149054906101000a900460ff1681565b612bc36137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b612d386137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dfa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b633b9aca006103e86005612e0c61195c565b0281612e1457fe5b0481612e1c57fe5b04811015612e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c4a6024913960400191505060405180910390fd5b633b9aca00810260208190555050565b612e8d6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015612f6f57601a60009054906101000a900460ff16612f6e57600080fd5b5b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601c60009054906101000a900460ff1681565b601f5481565b60195481565b600b5481565b83421115613065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f45524332305065726d69743a206578706972656420646561646c696e6500000081525060200191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886130948c614b7f565b89604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019650505050505050604051602081830303815290604052805190602001209050600061311782614bdd565b9050600061312782878787614bf7565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f45524332305065726d69743a20696e76616c6964207369676e6174757265000081525060200191505060405180910390fd5b6131d58a8a8a6137ae565b50505050505050505050565b60236020528060005260406000206000915054906101000a900460ff1681565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600f5481565b61329c6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461335e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8360128190555082601381905550816014819055508060158190555060155460145460135460125401010160118190555060196011541115613408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d757374206b656570206665657320617420323525206f72206c65737300000081525060200191505060405180910390fd5b50505050565b60006134186137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146134da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601c60006101000a81548160ff0219169083151502179055506001905090565b600e5481565b61350a6137a6565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146135cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c026026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60135481565b60205481565b60008082840190508381101561379c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613834576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e336024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c286022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615e0e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615bdf6023913960400191505060405180910390fd5b6000811415613acb57613ac683836000614c22565b614942565b602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613b8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f53656520796f7520696e2068656c6c210000000000000000000000000000000081525060200191505060405180910390fd5b602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613c4b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f53656520796f7520696e2068656c6c210000000000000000000000000000000081525060200191505060405180910390fd5b6000601a60009054906101000a900460ff16156144a857613c6a6125ea565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015613cd85750613ca86125ea565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613d115750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613d4b575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613d645750600a60169054906101000a900460ff16155b156144a757600a60149054906101000a900460ff16613e9157601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613e1e5750601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613e90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f54726164696e67206973206e6f74206163746976652e0000000000000000000081525060200191505060405180910390fd5b5b601c60009054906101000a900460ff161561407357613eae6125ea565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613f375750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613f915750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156140725743601b60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061402d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526049815260200180615d5a6049913960600191505060405180910390fd5b43601b60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156141165750601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156141fd57601f54821115614176576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615d256035913960400191505060405180910390fd5b6020546141828461205e565b830111156141f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d61782077616c6c65742065786365656465640000000000000000000000000081525060200191505060405180910390fd5b6143db565b602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156142a05750601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561430557601f54821115614300576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615ccd6036913960400191505060405180910390fd5b6143da565b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166143d9576020546143628461205e565b830111156143d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d61782077616c6c65742065786365656465640000000000000000000000000081525060200191505060405180910390fd5b5b5b5b602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561443757506000600b5414155b801561444857506001600b54014311155b156144a6576001602360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5b600a60159054906101000a900460ff1680156144d15750600a60169054906101000a900460ff16155b80156145275750601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561457d5750601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156145d35750602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15614617576001600a60166101000a81548160ff0219169083151502179055506145fb614ee3565b6000600a60166101000a81548160ff0219169083151502179055505b6000600a60169054906101000a900460ff16159050601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806146cd5750601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156146d757600090505b6000601881905550801561493457602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561474057506000601154115b156147e75761476d606461475f601154866151b390919063ffffffff16565b61523990919063ffffffff16565b915060115460135483028161477e57fe5b0460176000828254019250508190555060115460145483028161479d57fe5b046018819055506011546015548302816147b357fe5b046019600082825401925050819055506011546012548302816147d257fe5b046016600082825401925050819055506148e6565b602260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561484257506000600c54115b156148e55761486f6064614861600c54866151b390919063ffffffff16565b61523990919063ffffffff16565b9150600c54600e5483028161488057fe5b04601760008282540192505081905550600c54600f5483028161489f57fe5b04601881905550600c546010548302816148b557fe5b04601960008282540192505081905550600c54600d548302816148d457fe5b046016600082825401925050819055505b5b60006018548303111561491357614912853061490d6018548661528390919063ffffffff16565b614c22565b5b6000601854111561492e5761492d8561dead601854614c22565b5b81830392505b61493f858585614c22565b50505b505050565b60008383111582906149f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156149b957808201518184015260208101905061499e565b50505050905090810190601f1680156149e65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000804690507f0000000000000000000000000000000000000000000000000000000000000001811415614a5e577fb90008c4e4800f4891f2d945e52d57c7adfca49da38702a3f805881dc4f49f0e915050614acd565b614ac97f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f9103a025a75bb477d2f904b04fe1e406135b6e6df32cf6c67912903b3f4407a57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66152cd565b9150505b90565b600081600001549050919050565b80602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050614bcc81614ad0565b9150614bd78161533a565b50919050565b6000614bf0614bea614a07565b83615350565b9050919050565b6000806000614c08878787876153b1565b91509150614c15816154d3565b8192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615e0e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615bdf6023913960400191505060405180910390fd5b614d398383836156f4565b614da481604051806060016040528060268152602001615ca7602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546149479092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614e37816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461371e90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000614eee3061205e565b9050600060195460165460175401019050600080831480614f0f5750600082145b15614f1c575050506151b1565b60146127106005614f2b61195c565b0281614f3357fe5b0402831115614f585760146127106005614f4b61195c565b0281614f5357fe5b040292505b6000600283601754860281614f6957fe5b0481614f7157fe5b0490506000614f89828661528390919063ffffffff16565b90506000479050614f99826156f9565b6000614fae824761528390919063ffffffff16565b90506000614fd987614fcb601654856151b390919063ffffffff16565b61523990919063ffffffff16565b9050600061500488614ff6601954866151b390919063ffffffff16565b61523990919063ffffffff16565b9050600081838503039050600060178190555060006016819055506000601981905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d80600081146150a7576040519150601f19603f3d011682016040523d82523d6000602084013e6150ac565b606091505b5050809850506000871180156150c25750600081115b1561511b576150d187826159ad565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561868260175460405180848152602001838152602001828152602001935050505060405180910390a15b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d806000811461519b576040519150601f19603f3d011682016040523d82523d6000602084013e6151a0565b606091505b505080985050505050505050505050505b565b6000808314156151c65760009050615233565b60008284029050828482816151d757fe5b041461522e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615dc56021913960400191505060405180910390fd5b809150505b92915050565b600061527b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615b02565b905092915050565b60006152c583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614947565b905092915050565b6000804690508484848330604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050604051602081830303815290604052805190602001209150509392505050565b6001816000016000828254019250508190555050565b6000828260405160200180807f19010000000000000000000000000000000000000000000000000000000000008152506002018381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156153ec5760006003915091506154ca565b601b8560ff16141580156154045750601c8560ff1614155b156154165760006004915091506154ca565b600060018787878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015615472573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156154c1576000600192509250506154ca565b80600092509250505b94509492505050565b600060048111156154e057fe5b8160048111156154ec57fe5b14156154f7576156f1565b6001600481111561550457fe5b81600481111561551057fe5b1415615584576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b6002600481111561559157fe5b81600481111561559d57fe5b1415615611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b6003600481111561561e57fe5b81600481111561562a57fe5b1415615681576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d036022913960400191505060405180910390fd5b60048081111561568d57fe5b81600481111561569957fe5b14156156f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615da36022913960400191505060405180910390fd5b5b50565b505050565b6060600267ffffffffffffffff8111801561571357600080fd5b506040519080825280602002602001820160405280156157425781602001602082028036833780820191505090505b509050308160008151811061575357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156157f557600080fd5b505afa158015615809573d6000803e3d6000fd5b505050506040513d602081101561581f57600080fd5b81019080805190602001909291905050508160018151811061583d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506158a430600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846137ae565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561596857808201518184015260208101905061594d565b505050509050019650505050505050600060405180830381600087803b15801561599157600080fd5b505af11580156159a5573d6000803e3d6000fd5b505050505050565b6159da30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846137ae565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080615a266125ea565b426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b158015615aab57600080fd5b505af1158015615abf573d6000803e3d6000fd5b50505050506040513d6060811015615ad657600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505050565b60008083118290615bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615b73578082015181840152602081019050615b58565b50505050905090810190601f168015615ba05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581615bba57fe5b049050838581615bc657fe5b06818502018514615bd357fe5b80915050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737343616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20302e352554686520706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572506169727345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636553656c6c207472616e7366657220616d6f756e74206578636565647320746865206d61785472616e73616374696f6e416d6f756e742e45434453413a20696e76616c6964207369676e6174757265202773272076616c7565427579207472616e7366657220616d6f756e74206578636565647320746865206d61785472616e73616374696f6e416d6f756e742e5f7472616e736665723a3a205472616e736665722044656c617920656e61626c65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b20616c6c6f7765642e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74206c6f776572207468616e20302e3125a26469706673582212206f94fcda6e8f04ceaa6537b8f86cce7ce39a2c3688f60ba6e3851d82c01527d664736f6c63430007050033

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

000000000000000000000000db0e06e7fb1f8da4dc3835d432bca239acd65033000000000000000000000000d5ab4c5beec235a6408514d7e234235b54c3a852

-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0xDb0e06e7Fb1f8DA4dC3835D432bCa239acD65033
Arg [1] : _treasuryWallet (address): 0xD5Ab4c5BeEC235A6408514d7e234235B54c3a852

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000db0e06e7fb1f8da4dc3835d432bca239acd65033
Arg [1] : 000000000000000000000000d5ab4c5beec235a6408514d7e234235b54c3a852


Deployed Bytecode Sourcemap

40506:16282:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46502:83;;;;;;;;;;;;;:::i;:::-;;30900;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31768:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56381:161;;;;;;;;;;;;;:::i;:::-;;46124:134;;;;;;;;;;;;;:::i;:::-;;41865:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40599:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31185:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41369:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41409:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41329:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45035:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31943:317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40682:53;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48581:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47430:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31086:91;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36868:115;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42009:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32268:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40781:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40647:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41485:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48790:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41104:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41146:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41290:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40859:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31293:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29661:148;;;;;;;;;;;;;:::i;:::-;;44905:120;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45496:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40744:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40998;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36610:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45897:219;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29019:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41181:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47323:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30991:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46595:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32490:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31428:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48365:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41257:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42193:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40819:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47045:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45275:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46266:228;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41703:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41936:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41444:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40925:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35899:645;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42258:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40964:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31609:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41072:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47894:463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45705:134;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41035:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29964:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41219:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41978:24;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46502:83;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46573:4:::1;46557:13;;:20;;;;;;;;;;;;;;;;;;46502:83::o:0;30900:::-;30937:13;30970:5;30963:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30900:83;:::o;31768:167::-;31851:4;31868:37;31877:10;31889:7;31898:6;31868:8;:37::i;:::-;31923:4;31916:11;;31768:167;;;;:::o;56381:161::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56440:12:::1;56484:10;56476:24;;56508:21;56476:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56463:71;;;;;29301:1;56381:161::o:0;46124:134::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46245:5:::1;46229:13;;:21;;;;;;;;;;;;;;;;;;46124:134::o:0;41865:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;40599:41::-;;;;;;;;;;;;;:::o;31185:100::-;31238:7;31265:12;;31258:19;;31185:100;:::o;41369:33::-;;;;:::o;41409:28::-;;;;:::o;41329:33::-;;;;:::o;45035:232::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45154:3:::1;45148:4;45144:1;45128:13;:11;:13::i;:::-;:17;:24;;;;;;45127:30;;;;;;45117:6;:40;;45109:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45253:5;45243:6;:16;45220:20;:39;;;;45035:232:::0;:::o;31943:317::-;32049:4;32066:36;32076:6;32084:9;32095:6;32066:9;:36::i;:::-;32113:117;32122:6;32130:10;32142:87;32178:6;32142:87;;;;;;;;;;;;;;;;;:11;:19;32154:6;32142:19;;;;;;;;;;;;;;;:31;32162:10;32142:31;;;;;;;;;;;;;;;;:35;;:87;;;;;:::i;:::-;32113:8;:117::i;:::-;32248:4;32241:11;;31943:317;;;;;:::o;40682:53::-;40728:6;40682:53;:::o;48581:201::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48714:14:::1;;;;;;;;;;;48673:56;;48695:17;48673:56;;;;;;;;;;;;48757:17;48740:14;;:34;;;;;;;;;;;;;;;;;;48581:201:::0;:::o;47430:452::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47587:13:::1;47569:15;:31;;;;47629:13;47611:15;:31;;;;47666:8;47653:10;:21;;;;47702:12;47685:14;:29;;;;47789:14;;47776:10;;47758:15;;47740;;:33;:46;:63;47725:12;:78;;;;47838:2;47822:12;;:18;;47814:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;47430:452:::0;;;;:::o;31086:91::-;31135:5;31160:9;31153:16;;31086:91;:::o;36868:115::-;36928:7;36955:20;:18;:20::i;:::-;36948:27;;36868:115;:::o;42009:28::-;;;;:::o;32268:214::-;32356:4;32373:79;32382:10;32394:7;32403:48;32440:10;32403:11;:23;32415:10;32403:23;;;;;;;;;;;;;;;:32;32427:7;32403:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;32373:8;:79::i;:::-;32470:4;32463:11;;32268:214;;;;:::o;40781:29::-;;;;;;;;;;;;;:::o;40647:28::-;;;;;;;;;;;;;:::o;41485:33::-;;;;;;;;;;;;;:::o;48790:125::-;48855:4;48879:19;:28;48899:7;48879:28;;;;;;;;;;;;;;;;;;;;;;;;;48872:35;;48790:125;;;:::o;41104:29::-;;;;:::o;41146:28::-;;;;:::o;41290:30::-;;;;:::o;40859:31::-;;;;;;;;;;;;;:::o;31293:127::-;31367:7;31394:9;:18;31404:7;31394:18;;;;;;;;;;;;;;;;31387:25;;31293:127;;;:::o;29661:148::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29768:1:::1;29731:40;;29752:6;;;;;;;;;;;29731:40;;;;;;;;;;;;29799:1;29782:6;;:19;;;;;;;;;;;;;;;;;;29661:148::o:0;44905:120::-;44957:4;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44990:5:::1;44973:14;;:22;;;;;;;;;;;;;;;;;;45013:4;45006:11;;44905:120:::0;:::o;45496:144::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45628:4:::1;45586:31;:39;45618:6;45586:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45496:144:::0;;:::o;40744:30::-;;;;;;;;;;;;;:::o;40998:::-;;;;:::o;36610:128::-;36679:7;36706:24;:7;:14;36714:5;36706:14;;;;;;;;;;;;;;;:22;:24::i;:::-;36699:31;;36610:128;;;:::o;45897:219::-;45947:4;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45973:13:::1;;;;;;;;;;;45972:14;45964:23;;;::::0;::::1;;46014:4;45998:13;;:20;;;;;;;;;;;;;;;;;;46043:4;46029:11;;:18;;;;;;;;;;;;;;;;;;46072:12;46058:11;:26;;;;46104:4;46097:11;;45897:219:::0;:::o;29019:79::-;29057:7;29084:6;;;;;;;;;;;29077:13;;29019:79;:::o;41181:31::-;;;;:::o;47323:99::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47407:7:::1;47393:11;;:21;;;;;;;;;;;;;;;;;;47323:99:::0;:::o;30991:87::-;31030:13;31063:7;31056:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30991:87;:::o;46595:244::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46702:13:::1;;;;;;;;;;;46694:21;;:4;:21;;;;46686:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46790:41;46819:4;46825:5;46790:28;:41::i;:::-;46595:244:::0;;:::o;32490:265::-;32583:4;32600:125;32609:10;32621:7;32630:94;32667:15;32630:94;;;;;;;;;;;;;;;;;:11;:23;32642:10;32630:23;;;;;;;;;;;;;;;:32;32654:7;32630:32;;;;;;;;;;;;;;;;:36;;:94;;;;;:::i;:::-;32600:8;:125::i;:::-;32743:4;32736:11;;32490:265;;;;:::o;31428:173::-;31514:4;31531:40;31541:10;31553:9;31564:6;31531:9;:40::i;:::-;31589:4;31582:11;;31428:173;;;;:::o;48365:208::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48502:15:::1;;;;;;;;;;;48459:59;;48482:18;48459:59;;;;;;;;;;;;48547:18;48529:15;;:36;;;;;;;;;;;;;;;;;;48365:208:::0;:::o;41257:26::-;;;;:::o;42193:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;40819:33::-;;;;;;;;;;;;;:::o;47045:182::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47161:8:::1;47130:19;:28;47150:7;47130:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;47201:7;47185:34;;;47210:8;47185:34;;;;;;;;;;;;;;;;;;;;47045:182:::0;;:::o;45275:213::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45397:3:::1;45391:4;45387:1;45371:13;:11;:13::i;:::-;:17;:24;;;;;;45370:30;;;;;;45360:6;:40;;45352:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45474:5;45464:6;:16;45452:9;:28;;;;45275:213:::0;:::o;46266:228::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46354:7:::1;46350:93;;;46423:14;;;;;;;;;;;46415:23;;;::::0;::::1;;46350:93;46479:7;46453:17;:23;46471:4;46453:23;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;46266:228:::0;;:::o;41703:39::-;;;;;;;;;;;;;:::o;41936:35::-;;;;:::o;41444:32::-;;;;:::o;40925:30::-;;;;:::o;35899:645::-;36143:8;36124:15;:27;;36116:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36198:18;36240:16;36258:5;36265:7;36274:5;36281:16;36291:5;36281:9;:16::i;:::-;36299:8;36229:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36219:90;;;;;;36198:111;;36322:12;36337:28;36354:10;36337:16;:28::i;:::-;36322:43;;36378:14;36395:28;36409:4;36415:1;36418;36421;36395:13;:28::i;:::-;36378:45;;36452:5;36442:15;;:6;:15;;;36434:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36505:31;36514:5;36521:7;36530:5;36505:8;:31::i;:::-;35899:645;;;;;;;;;;:::o;42258:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;40964:27::-;;;;:::o;31609:151::-;31698:7;31725:11;:18;31737:5;31725:18;;;;;;;;;;;;;;;:27;31744:7;31725:27;;;;;;;;;;;;;;;;31718:34;;31609:151;;;;:::o;41072:25::-;;;;:::o;47894:463::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48053:13:::1;48034:16;:32;;;;48096:13;48077:16;:32;;;;48134:8;48120:11;:22;;;;48171:12;48153:15;:30;;;;48262:15;;48248:11;;48229:16;;48210;;:35;:49;:67;48194:13;:83;;;;48313:2;48296:13;;:19;;48288:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;47894:463:::0;;;;:::o;45705:134::-;45765:4;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45804:5:::1;45781:20;;:28;;;;;;;;;;;;;;;;;;45827:4;45820:11;;45705:134:::0;:::o;41035:30::-;;;;:::o;29964:244::-;29241:12;:10;:12::i;:::-;29231:22;;:6;;;;;;;;;;;:22;;;29223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30073:1:::1;30053:22;;:8;:22;;;;30045:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30163:8;30134:38;;30155:6;;;;;;;;;;;30134:38;;;;;;;;;;;;30192:8;30183:6;;:17;;;;;;;;;;;;;;;;;;29964:244:::0;:::o;41219:31::-;;;;:::o;41978:24::-;;;;:::o;18692:181::-;18750:7;18770:9;18786:1;18782;:5;18770:17;;18811:1;18806;:6;;18798:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18864:1;18857:8;;;18692:181;;;;:::o;28145:98::-;28198:7;28225:10;28218:17;;28145:98;:::o;34118:346::-;34237:1;34220:19;;:5;:19;;;;34212:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34318:1;34299:21;;:7;:21;;;;34291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34402:6;34372:11;:18;34384:5;34372:18;;;;;;;;;;;;;;;:27;34391:7;34372:27;;;;;;;;;;;;;;;:36;;;;34440:7;34424:32;;34433:5;34424:32;;;34449:6;34424:32;;;;;;;;;;;;;;;;;;34118:346;;;:::o;48923:4609::-;49071:1;49055:18;;:4;:18;;;;49047:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49148:1;49134:16;;:2;:16;;;;49126:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49225:1;49215:6;:11;49212:92;;;49243:28;49259:4;49265:2;49269:1;49243:15;:28::i;:::-;49286:7;;49212:92;49325:17;:23;49343:4;49325:23;;;;;;;;;;;;;;;;;;;;;;;;;49324:24;49316:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49389:17;:21;49407:2;49389:21;;;;;;;;;;;;;;;;;;;;;;;;;49388:22;49380:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49444:12;49476:14;;;;;;;;;;;49473:2039;;;49536:7;:5;:7::i;:::-;49528:15;;:4;:15;;;;:49;;;;;49570:7;:5;:7::i;:::-;49564:13;;:2;:13;;;;49528:49;:86;;;;;49612:1;49598:16;;:2;:16;;;;49528:86;:128;;;;;49649:6;49635:21;;:2;:21;;;;49528:128;:158;;;;;49678:8;;;;;;;;;;;49677:9;49528:158;49506:1995;;;49724:13;;;;;;;;;;;49720:148;;49769:19;:25;49789:4;49769:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;49798:19;:23;49818:2;49798:23;;;;;;;;;;;;;;;;;;;;;;;;;49769:52;49761:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49720:148;50026:20;;;;;;;;;;;50022:423;;;50080:7;:5;:7::i;:::-;50074:13;;:2;:13;;;;:47;;;;;50105:15;;;;;;;;;;;50091:30;;:2;:30;;;;50074:47;:79;;;;;50139:13;;;;;;;;;;;50125:28;;:2;:28;;;;50074:79;50070:356;;;50231:12;50189:28;:39;50218:9;50189:39;;;;;;;;;;;;;;;;:54;50181:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50390:12;50348:28;:39;50377:9;50348:39;;;;;;;;;;;;;;;:54;;;;50070:356;50022:423;50499:25;:31;50525:4;50499:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;50535:31;:35;50567:2;50535:35;;;;;;;;;;;;;;;;;;;;;;;;;50534:36;50499:71;50495:762;;;50617:20;;50607:6;:30;;50599:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50756:9;;50739:13;50749:2;50739:9;:13::i;:::-;50730:6;:22;:35;;50722:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50495:762;;;50867:25;:29;50893:2;50867:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;50901:31;:37;50933:4;50901:37;;;;;;;;;;;;;;;;;;;;;;;;;50900:38;50867:71;50863:394;;;50985:20;;50975:6;:30;;50967:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50863:394;;;51111:31;:35;51143:2;51111:35;;;;;;;;;;;;;;;;;;;;;;;;;51107:150;;51204:9;;51187:13;51197:2;51187:9;:13::i;:::-;51178:6;:22;:35;;51170:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51107:150;50863:394;50495:762;51330:25;:31;51356:4;51330:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;51380:1;51365:11;;:16;;51330:51;:84;;;;;51413:1;51401:11;;:13;51385:12;:29;;51330:84;51326:160;;;51462:4;51438:17;:21;51456:2;51438:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;51326:160;49506:1995;49473:2039;51542:11;;;;;;;;;;;:37;;;;;51571:8;;;;;;;;;;;51570:9;51542:37;:80;;;;;51597:19;:25;51617:4;51597:25;;;;;;;;;;;;;;;;;;;;;;;;;51596:26;51542:80;:121;;;;;51640:19;:23;51660:2;51640:23;;;;;;;;;;;;;;;;;;;;;;;;;51639:24;51542:121;:170;;;;;51681:25;:31;51707:4;51681:31;;;;;;;;;;;;;;;;;;;;;;;;;51680:32;51542:170;51524:314;;;51750:4;51739:8;;:15;;;;;;;;;;;;;;;;;;51783:10;:8;:10::i;:::-;51821:5;51810:8;;:16;;;;;;;;;;;;;;;;;;51524:314;51860:12;51876:8;;;;;;;;;;;51875:9;51860:24;;51985:19;:25;52005:4;51985:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;52014:19;:23;52034:2;52014:23;;;;;;;;;;;;;;;;;;;;;;;;;51985:52;51982:99;;;52064:5;52054:15;;51982:99;52117:1;52101:13;:17;;;;52206:7;52203:1276;;;52257:25;:29;52283:2;52257:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;52306:1;52290:13;;:17;52257:50;52253:904;;;52334:34;52364:3;52334:25;52345:13;;52334:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;52327:41;;52435:13;;52416:16;;52409:4;:23;:39;;;;;;52387:18;;:61;;;;;;;;;;;52504:13;;52490:11;;52483:4;:18;:34;;;;;;52467:13;:50;;;;52582:13;;52564:15;;52557:4;:22;:38;;;;;;52536:17;;:59;;;;;;;;;;;52662:13;;52643:16;;52636:4;:23;:39;;;;;;52614:18;;:61;;;;;;;;;;;52253:904;;;52736:25;:31;52762:4;52736:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;52786:1;52771:12;;:16;52736:51;52733:424;;;52812:33;52841:3;52812:24;52823:12;;52812:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;52805:40;;52908:12;;52890:15;;52883:4;:22;:37;;;;;;52861:18;;:59;;;;;;;;;;;52975:12;;52962:10;;52955:4;:17;:32;;;;;;52939:13;:48;;;;53051:12;;53034:14;;53027:4;:21;:36;;;;;;53006:17;;:57;;;;;;;;;;;53129:12;;53111:15;;53104:4;:22;:37;;;;;;53082:18;;:59;;;;;;;;;;;52733:424;52253:904;53209:1;53193:13;;53188:4;:18;:22;53185:126;;;53234:61;53250:4;53264;53271:23;53280:13;;53271:4;:8;;:23;;;;:::i;:::-;53234:15;:61::i;:::-;53185:126;53345:1;53329:13;;:17;53325:106;;;53366:49;53382:4;40728:6;53401:13;;53366:15;:49::i;:::-;53325:106;53463:4;53453:14;;;;52203:1276;53491:33;53507:4;53513:2;53517:6;53491:15;:33::i;:::-;48923:4609;;;;;;:::o;19025:192::-;19111:7;19144:1;19139;:6;;19147:12;19131:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19171:9;19187:1;19183;:5;19171:17;;19208:1;19201:8;;;19025:192;;;;;:::o;3163:370::-;3216:7;3238:15;3299:9;3288:20;;3346:16;3335:7;:27;3331:195;;;3386:24;3379:31;;;;;3331:195;3450:64;3472:10;3484:12;3498:15;3450:21;:64::i;:::-;3443:71;;;3163:370;;:::o;27626:114::-;27691:7;27718;:14;;;27711:21;;27626:114;;;:::o;46847:188::-;46964:5;46930:25;:31;46956:4;46930:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;47021:5;46987:40;;47015:4;46987:40;;;;;;;;;;;;46847:188;;:::o;37121:207::-;37181:15;37209:30;37242:7;:14;37250:5;37242:14;;;;;;;;;;;;;;;37209:47;;37277:15;:5;:13;:15::i;:::-;37267:25;;37303:17;:5;:15;:17::i;:::-;37121:207;;;;:::o;4533:167::-;4610:7;4637:55;4659:20;:18;:20::i;:::-;4681:10;4637:21;:55::i;:::-;4630:62;;4533:167;;;:::o;17129:279::-;17257:7;17278:17;17297:18;17319:25;17330:4;17336:1;17339;17342;17319:10;:25::i;:::-;17277:67;;;;17355:18;17367:5;17355:11;:18::i;:::-;17391:9;17384:16;;;;17129:279;;;;;;:::o;32763:539::-;32887:1;32869:20;;:6;:20;;;;32861:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32971:1;32950:23;;:9;:23;;;;32942:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33026:47;33047:6;33055:9;33066:6;33026:20;:47::i;:::-;33106:71;33128:6;33106:71;;;;;;;;;;;;;;;;;:9;:17;33116:6;33106:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;33086:9;:17;33096:6;33086:17;;;;;;;;;;;;;;;:91;;;;33211:32;33236:6;33211:9;:20;33221:9;33211:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;33188:9;:20;33198:9;33188:20;;;;;;;;;;;;;;;:55;;;;33276:9;33259:35;;33268:6;33259:35;;;33287:6;33259:35;;;;;;;;;;;;;;;;;;32763:539;;;:::o;54674:1699::-;54713:23;54739:24;54757:4;54739:9;:24::i;:::-;54713:50;;54774:25;54844:17;;54823:18;;54802;;:39;:59;54774:87;;54872:12;54927:1;54908:15;:20;:46;;;;54953:1;54932:17;:22;54908:46;54905:60;;;54957:7;;;;;54905:60;55034:2;55026:5;55022:1;55006:13;:11;:13::i;:::-;:17;:25;;;;;;:30;54988:15;:48;54985:125;;;55096:2;55088:5;55084:1;55068:13;:11;:13::i;:::-;:17;:25;;;;;;:30;55050:48;;54985:125;55169:23;55254:1;55234:17;55213:18;;55195:15;:36;:56;;;;;;:60;;;;;;55169:86;;55266:26;55295:36;55315:15;55295;:19;;:36;;;;:::i;:::-;55266:65;;55352:25;55380:21;55352:49;;55414:36;55431:18;55414:16;:36::i;:::-;55474:18;55495:44;55521:17;55495:21;:25;;:44;;;;:::i;:::-;55474:65;;55562:23;55588:57;55627:17;55588:34;55603:18;;55588:10;:14;;:34;;;;:::i;:::-;:38;;:57;;;;:::i;:::-;55562:83;;55656:22;55681:56;55719:17;55681:33;55696:17;;55681:10;:14;;:33;;;;:::i;:::-;:37;;:56;;;;:::i;:::-;55656:81;;55758:23;55815:14;55797:15;55784:10;:28;:45;55758:71;;55873:1;55852:18;:22;;;;55906:1;55885:18;:22;;;;55938:1;55918:17;:21;;;;55981:14;;;;;;;;;;;55973:28;;56009:14;55973:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55960:68;;;;;56070:1;56052:15;:19;:42;;;;;56093:1;56075:15;:19;56052:42;56049:210;;;56110:46;56123:15;56140;56110:12;:46::i;:::-;56176:71;56191:18;56211:15;56228:18;;56176:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56049:210;56310:15;;;;;;;;;;;56302:29;;56339:21;56302:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56289:76;;;;;54674:1699;;;;;;;;;;;:::o;19225:250::-;19283:7;19312:1;19307;:6;19303:47;;;19337:1;19330:8;;;;19303:47;19362:9;19378:1;19374;:5;19362:17;;19407:1;19402;19398;:5;;;;;;:10;19390:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19466:1;19459:8;;;19225:250;;;;;:::o;19483:132::-;19541:7;19568:39;19572:1;19575;19568:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;19561:46;;19483:132;;;;:::o;18881:136::-;18939:7;18966:43;18970:1;18973;18966:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;18959:50;;18881:136;;;;:::o;3541:350::-;3685:7;3705:15;3766:9;3755:20;;3826:8;3836;3846:11;3859:7;3876:4;3815:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3805:78;;;;;;3798:85;;;3541:350;;;;;:::o;27748:181::-;27920:1;27902:7;:14;;;:19;;;;;;;;;;;27748:181;:::o;18327:196::-;18420:7;18486:15;18503:10;18457:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18447:68;;;;;;18440:75;;18327:196;;;;:::o;15358:1632::-;15489:7;15498:12;16423:66;16418:1;16410:10;;:79;16406:163;;;16522:1;16526:30;16506:51;;;;;;16406:163;16588:2;16583:1;:7;;;;:18;;;;;16599:2;16594:1;:7;;;;16583:18;16579:102;;;16634:1;16638:30;16618:51;;;;;;16579:102;16778:14;16795:24;16805:4;16811:1;16814;16817;16795:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16778:41;;16852:1;16834:20;;:6;:20;;;16830:103;;;16887:1;16891:29;16871:50;;;;;;;16830:103;16953:6;16961:20;16945:37;;;;;15358:1632;;;;;;;;:::o;10020:643::-;10098:20;10089:29;;;;;;;;:5;:29;;;;;;;;;10085:571;;;10135:7;;10085:571;10196:29;10187:38;;;;;;;;:5;:38;;;;;;;;;10183:473;;;10242:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10183:473;10307:35;10298:44;;;;;;;;:5;:44;;;;;;;;;10294:362;;;10359:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10294:362;10431:30;10422:39;;;;;;;;:5;:39;;;;;;;;;10418:238;;;10478:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10418:238;10553:30;10544:39;;;;;;;;:5;:39;;;;;;;;;10540:116;;;10600:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10540:116;10020:643;;:::o;34470:97::-;;;;:::o;53540:601::-;53668:21;53706:1;53692:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53668:40;;53737:4;53719;53724:1;53719:7;;;;;;;;;;;;;:23;;;;;;;;;;;53763:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53753:4;53758:1;53753:7;;;;;;;;;;;;;:32;;;;;;;;;;;53798:62;53815:4;53830:15;;;;;;;;;;;53848:11;53798:8;:62::i;:::-;53899:15;;;;;;;;;;;:66;;;53980:11;54006:1;54050:4;54077;54097:15;53899:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53540:601;;:::o;54151:513::-;54299:62;54316:4;54331:15;;;;;;;;;;;54349:11;54299:8;:62::i;:::-;54404:15;;;;;;;;;;;:31;;;54443:9;54476:4;54496:11;54522:1;54565;54608:7;:5;:7::i;:::-;54630:15;54404:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54151:513;;:::o;19623:275::-;19709:7;19741:1;19737;:5;19744:12;19729:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19768:9;19784:1;19780;:5;;;;;;19768:17;;19820:1;19816;:5;;;;;;19812:1;19808;:5;:13;19803:1;:18;19796:26;;;;19889:1;19882:8;;;19623:275;;;;;:::o

Swarm Source

ipfs://6f94fcda6e8f04ceaa6537b8f86cce7ce39a2c3688f60ba6e3851d82c01527d6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.