ETH Price: $2,521.36 (-0.31%)

Token

eBORA (eBORA)
 

Overview

Max Total Supply

245,376.14994366439848662 eBORA

Holders

93 (0.00%)

Market

Price

$0.09 @ 0.000035 ETH (-2.53%)

Onchain Market Cap

$21,938.84

Circulating Supply Market Cap

$98,722,103.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.32266399220020167 eBORA

Value
$0.03 ( ~1.18983459624481E-05 Eth) [0.0001%]
0x7b4fde3bdf2fb0b7c51994e8525498f19d2c697f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

BORA will realize our vision to become the ecosystem to store, secure and grow your entertainment crypto assets.

Market

Volume (24H):$6,154,898.00
Market Capitalization:$98,722,103.00
Circulating Supply:1,099,750,000.00 eBORA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Bora20v2

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-22
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0)

pragma solidity 0.8.9;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    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 {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




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

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

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

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

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

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

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @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 // Deprecated in v4.8
    }

    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");
        }
    }

    /**
     * @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) {
        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.
            /// @solidity memory-safe-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 {
            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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 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 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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @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: @openzeppelin/contracts/utils/cryptography/EIP712.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @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;
    address private immutable _CACHED_THIS;

    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) {
        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 = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.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) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;






/**
 * @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 constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
     * However, to ensure consistency with the upgradeable transpiler, we will continue
     * to reserve a slot.
     * @custom:oz-renamed-from _PERMIT_TYPEHASH
     */
    // solhint-disable-next-line var-name-mixedcase
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @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: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/BoraV2ERC20-eBORA_flattened.sol


// OpenZeppelin Contracts (last updated v4.8.0)

pragma solidity 0.8.9;








interface IBoraV2FeeCalculate {
    // function calcAmount(uint256 amount) external view returns (uint256, uint256);
    // function calcAmount(uint256 amount, uint256 _feeRatio) external pure returns (uint256, uint256);
    function calcAmount(uint256 amount, address from, address to, bytes32 _feeInfo) external view returns (uint256, uint256, address, bool);
}

interface IBoraV2FeeDistributor {
    function distributeFees() external returns (bool);
}

contract LockedToken {
    using SafeERC20 for IERC20;
    IERC20 private _token;
    address public immutable donor;
    address public immutable beneficiary;
    uint256 public immutable releaseTime;
    bool public immutable revocable;
    address public immutable system;

    event Claim(address beneficiary, uint256 amount, uint256 releaseTime);
    event Revoke(address donor, uint256 amount);

    constructor(address pToken, address pDonor, address pBeneficiary, uint256 pReleaseTime, bool pRevocable, address pSystem) {
        // require(address(token) != address(0), "LockedToken: token is zero address");
        require(pDonor != address(0), "LockedToken: donor is zero address");
        require(pBeneficiary != address(0), "LockedToken: beneficiary is zero address");
        require(pSystem != address(0), "LockedToken: system is zero address");
        require(pReleaseTime > block.timestamp, "LockedToken: release time is before current time");

        _token = IERC20(pToken);
        donor = pDonor;
        beneficiary = pBeneficiary;
        releaseTime = pReleaseTime;
        revocable = pRevocable;
        system = pSystem;
    }

    function token() public view returns (IERC20) {
        return _token;
    }

    function balanceOf() public view returns (uint256) {
        return _token.balanceOf(address(this));
    }

    function getInfo() external view returns (address, address, uint256, bool, uint256, address) {
        return (donor, beneficiary, releaseTime, revocable, _token.balanceOf(address(this)), system);
    }

    function revoke() public {
        require(revocable, "LockedToken: tokens are not revocable");
        require((msg.sender == donor) || (msg.sender == system), "LockedToken: only donor|system can revoke");

        uint256 amount = _token.balanceOf(address(this));
        require(amount > 0, "LockedToken: no tokens to revoke");

        _token.safeTransfer(donor, amount);
        emit Revoke(donor, amount);
    }

    // claim is intended to be called by anyone after the release time, because the beneficiary is already claimed and cannot be changed.
    function claim() public {
        require(block.timestamp >= releaseTime, "LockedToken: current time is before release time");

        uint256 amount = _token.balanceOf(address(this));
        require(amount > 0, "LockedToken: no tokens to claim");

        _token.safeTransfer(beneficiary, amount);
        emit Claim(beneficiary, amount, releaseTime);
    }
}

contract Bora20v2 is ERC20, ERC20Burnable, AccessControl, Pausable, Ownable, ERC20Permit {
    using SafeERC20 for IERC20;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant SYSTEM_ROLE = keccak256("SYSTEM_ROLE");

    bytes32 public constant CALL_TRANS = keccak256("CALL_TRANS");
    bytes32 public constant CALL_MINT = keccak256("CALL_MINT");

    uint256 private _totalSupplyCap; // prevent a infinite mint : refer ERC20Capped.sol
    uint256 private _totalMintCap; // prevent a abuse mint : _totalMintCap <= _totalSupplyCap

    mapping(address => bool) private _blacklist;

    struct FeeStruct {
        bool isSet; // false : fee = 0, true : apply fee
        bool isInnerLogic; // Location a Fee Calculate logic : true=internal, false=external
        uint256 feeRatio; // for Internal (100% = 10000, 50% = 5000, 10% = 1000, 1% = 100, 0.1% = 10, 0.01% = 1)
        address feeCalcAddress; // for External : BoraV2FeeCalculate Smart Contract Address
        bytes32 feeCalcCallBytes; // for External : BoraV2FeeCalculate Call Command Bytes
        address feeReceiver; // Fee Receiver Address
        bool isFeeReceiverContract; // in case of the Fee Receiver Address is contract ( calls feeDistributor.distributeFees() )
        uint256 lastUpdated;
    }

    struct FeeDistStruct {
        uint256 amount;
        uint256 fee;
        address feeReceiver;
        bool isDistributor;
    }

    FeeStruct public transFeeInfo;
    FeeStruct public mintFeeInfo;

    struct TransferStruct {
        uint256 oneTimeMaxAmount; // max amount per transferation
        uint256 oneDayMaxAmount; // max transfer amount per day
        uint256 oneDayUnit; // 86400 = 1 day (for Test, 3600 = 1 hour)
        uint256 currentDay; // use block.timestamp.div(oneDayUnit) to check current day
        uint256 currentDayAmount; // transfer amount of current day
    }

    TransferStruct public transferInfo;
    TransferStruct public mintInfo;

    struct ContractInfo {
        uint256 BappNo;
        string BappName;
        string SCVersion;
    }

    ContractInfo public contractInfo;

    constructor(uint256 initialSupply, uint256 initialTotalSupplyCap, uint256 initialTotalMintCap, string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {
        _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); // Admin
        _grantRole(MINTER_ROLE, _msgSender()); // System + Mint + Burn
        _grantRole(SYSTEM_ROLE, _msgSender()); // System

        mintInfo.oneTimeMaxAmount = 9999999999 * 10 ** decimals(); // for initial minting
        mintInfo.oneDayMaxAmount = 9999999999 * 10 ** decimals(); // for initial minting
        mintInfo.oneDayUnit = 86400;

        transFeeInfo.isSet = false;
        mintFeeInfo.isSet = false;

        uint256 mintAmount = initialSupply * 10 ** decimals();
        _mint(_msgSender(), mintAmount);
        emit SupplyChanged("MINT", _msgSender(), mintAmount, totalSupply(), block.timestamp);
        _totalSupplyCap = initialTotalSupplyCap * 10 ** decimals(); // 1,205,750,000 + alpha = 2,000,000,000 = 2000000000
        _totalMintCap = initialTotalMintCap * 10 ** decimals();

        mintInfo.oneTimeMaxAmount = 250000 * 10 ** decimals();
        mintInfo.oneDayMaxAmount = 500000 * 10 ** decimals();
        mintInfo.currentDayAmount = 0;
        emit MintInfoChanged(_msgSender(), mintInfo.oneTimeMaxAmount, mintInfo.oneDayMaxAmount, mintInfo.oneDayUnit, block.timestamp);

        transferInfo.oneTimeMaxAmount = 250000 * 10 ** decimals();
        transferInfo.oneDayMaxAmount = 500000 * 10 ** decimals();
        transferInfo.oneDayUnit = 86400;
        transferInfo.currentDayAmount = 0;
        emit TransferInfoChanged(_msgSender(), transferInfo.oneTimeMaxAmount, transferInfo.oneDayMaxAmount, transferInfo.oneDayUnit, block.timestamp);

        contractInfo.BappNo = 1000;
        contractInfo.BappName = name;
        contractInfo.SCVersion = "2.2.0";

        // Setting Account For Test

        // addAdmin(0x507c5bAAE6DD008924b8754e4101510e131303b9);
        // addAdmin(0xf58451B68870f90DB17aCFB3954806DAe47058dE);

        // grantRole(MINTER_ROLE, 0x7080de4124d5119B6054bD35bE9749EbcCa0E577);        // System + Mint + Burn
        // grantRole(SYSTEM_ROLE, 0xF64D9d628ECcdb9381cC18d7C819F45FE0786F5D);        // System

        // transfer(0x507c5bAAE6DD008924b8754e4101510e131303b9, 100 * 10**18);
        // transfer(0xf58451B68870f90DB17aCFB3954806DAe47058dE, 100 * 10**18);
        // transfer(0x764a118Aa7857f56ddD272725539b65Aa04083cB, 100 * 10**18);
        // transfer(0x7080de4124d5119B6054bD35bE9749EbcCa0E577, 100 * 10**18);
        // transfer(0xF64D9d628ECcdb9381cC18d7C819F45FE0786F5D, 100 * 10**18);
        // transfer(0xA68a0b5b8F0521c8f9B39feC45FF1C39D3Be5259, 100 * 10**18);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    // Function : approve with check a blacklist
    //  . [X] Main Token, [X] wrapped Token, [O] Service Token
    //
    // function approve(address spender, uint256 amount) public virtual override checkBlacklisted(_msgSender()) returns (bool) {
    //     return super.approve(spender, amount);
    // }

    function transferInternal(address from, address to, uint256 amount) private whenNotPaused returns (bool) {
        if (!transFeeInfo.isSet) {
            // if transFeeInfo is not setted
            _transfer(from, to, amount);
        } else {
            FeeDistStruct memory _feeDist = _calcFeeDistribution(transFeeInfo, amount, from, to);
            _transfer(from, to, _feeDist.amount);

            if (_feeDist.fee > 0) {
                _transfer(from, _feeDist.feeReceiver, _feeDist.fee);
                // if (Address.isContract(transFeeInfo.feeReceiver)) {
                //     IBoraV2FeeDistributor(transFeeInfo.feeReceiver).distributeFees();
                // }
                if (_feeDist.isDistributor) {
                    require(IBoraV2FeeDistributor(_feeDist.feeReceiver).distributeFees(), "BORA: failed to distribute fees");
                }
            }
        }
        return true;
    }

    function transfer(address to, uint256 amount) public override whenNotPaused returns (bool) {
        return transferInternal(_msgSender(), to, amount);
    }

    function transferFrom(address from, address to, uint256 amount) public override whenNotPaused returns (bool) {
        _spendAllowance(from, _msgSender(), amount);
        return transferInternal(from, to, amount);
    }

    function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) checkBlacklisted(to) {
        require(totalSupply() + amount <= totalSupplyCap(), "BORA: totalSupplyCap exceeded"); // refer : ERC20Capped.sol
        require(totalSupply() + amount <= totalMintCap(), "BORA: totalMintCap exceeded");

        FeeDistStruct memory _feeDist;
        uint256 _nowDatetime = block.timestamp;

        if (!mintFeeInfo.isSet) {
            // if mintFeeInfo is not setted
            _feeDist.amount = amount;
            _mint(to, _feeDist.amount);
        } else {
            _feeDist = _calcFeeDistribution(mintFeeInfo, amount, _msgSender(), to);
            _mint(to, _feeDist.amount);

            if (_feeDist.fee > 0) {
                _mint(_feeDist.feeReceiver, _feeDist.fee);
                emit SupplyChanged("MINT", _feeDist.feeReceiver, _feeDist.fee, totalSupply(), _nowDatetime);
                if (_feeDist.isDistributor) {
                    IBoraV2FeeDistributor(_feeDist.feeReceiver).distributeFees();
                }
            }
        }
        emit SupplyChanged("MINT", to, _feeDist.amount, totalSupply(), _nowDatetime);
    }

    function burn(uint256 amount) public override onlyRole(MINTER_ROLE) {
        ERC20Burnable.burn(amount);
        emit SupplyChanged("BURN", _msgSender(), amount, totalSupply(), block.timestamp);
    }

    function burnFrom(address account, uint256 amount) public override onlyRole(MINTER_ROLE) {
        ERC20Burnable.burnFrom(account, amount);
        emit SupplyChanged("BURN.FROM", account, amount, totalSupply(), block.timestamp);
    }

    // Function : burnByAdmin
    //  . [X] Main Token, [X] wrapped Token, [O] Service Token
    //
    // function burnByAdmin(address account, uint256 amount) public onlyRole(MINTER_ROLE) {
    //     _burn(account, amount);
    //     emit SupplyChanged("BURN", account, amount, totalSupply(), block.timestamp);
    // }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes minting and burning. (+ transferFrom())
     *
     * Calling conditions:
     * - transfer : _beforeTokenTransfer(from, to, amount);  [when `from` and `to` are both non-zero]
     * - mint     : _beforeTokenTransfer(address(0), account, amount);
     * - burn     : _beforeTokenTransfer(account, address(0), amount);
     *
     * override : ERC20Pausable.sol
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override whenNotPaused checkBlacklisted(from) {
        super._beforeTokenTransfer(from, to, amount);

        if (to != address(0)) {
            TransferStruct storage _transferInfo = from != address(0) ? transferInfo : mintInfo;
            require(amount <= _transferInfo.oneTimeMaxAmount, "BORA: one time transfer limit exceeded");
            _checkDayMaxAmount(_transferInfo, amount);
            //"BORA: Can't transfer any more !! (oneDayMaxAmount)");
        }
    }

    /* ========== VIEWS ========== */
    function _calcFeeDistribution(FeeStruct memory feeInfo, uint256 amount, address from, address to) internal view returns (FeeDistStruct memory feeDist) {
        if (feeInfo.isSet) {
            if (feeInfo.isInnerLogic) {
                // (feeInfo.isSet=true && feeInfo.isInnerLogic=true) : use a internal logic
                (feeDist.amount, feeDist.fee) = _calcAmount(amount, feeInfo.feeRatio);
                feeDist.feeReceiver = feeInfo.feeReceiver;
                feeDist.isDistributor = feeInfo.isFeeReceiverContract;
            } else {
                // (feeInfo.isSet=true && feeInfo.isInnerLogic=false) : use a external logic
                (feeDist.amount, feeDist.fee, feeDist.feeReceiver, feeDist.isDistributor) = IBoraV2FeeCalculate(feeInfo.feeCalcAddress).calcAmount(amount, from, to, feeInfo.feeCalcCallBytes);
            }
        } else {
            feeDist.amount = amount;
        }

        return feeDist;
    }

    function _calcAmount(uint256 amount, uint256 feeRatio) internal pure returns (uint256, uint256) {
        uint256 _fee = (amount * feeRatio) / 10000;
        uint256 _amount = amount - _fee;
        return (_amount, _fee);
    }

    function _checkDayMaxAmount(TransferStruct storage _limit, uint256 amount) internal {
        uint256 nowDayTime = block.timestamp / _limit.oneDayUnit;
        if (_limit.currentDay != nowDayTime) {
            _limit.currentDay = nowDayTime;
            _limit.currentDayAmount = 0;
        }
        uint256 checkAmount = _limit.currentDayAmount + amount;
        require(checkAmount <= _limit.oneDayMaxAmount, "BORA: one day transfer limit exceeded");
        _limit.currentDayAmount = checkAmount;
    }

    function isBlacklisted(address account) public view returns (bool) {
        return _blacklist[account];
    }

    function totalSupplyCap() public view returns (uint256) {
        return _totalSupplyCap;
    }

    function totalMintCap() public view returns (uint256) {
        return _totalMintCap;
    }

    function utilDiffTime(uint256 _checkTimestamp) public view returns (uint256, uint256) {
        require(_checkTimestamp > block.timestamp, "BORA: checkTime is before current time");
        uint256 nowDayTime = block.timestamp;
        uint256 chkDayTime = _checkTimestamp;
        uint256 nowDay = nowDayTime / 86400;
        uint256 chkDay = chkDayTime / 86400;
        return (chkDay - nowDay, chkDayTime - nowDayTime);
    }

    function utilDiffTime2(uint256 _timestamp1, uint256 _timestamp2) external pure returns (uint256, uint256) {
        require(_timestamp2 >= _timestamp1, "BORA: _timestamp2 is before _timestamp1");
        uint256 chkDay1 = _timestamp1 / 86400;
        uint256 chkDay2 = _timestamp2 / 86400;
        return (chkDay2 - chkDay1, _timestamp2 - _timestamp1);
    }

    function utilUnitConvert(uint256 _value) external pure returns (uint256, uint256, uint256) {
        return (_value, _value * 10 ** 9, _value * 10 ** 18);
    }

    function tokenLockInfo(LockedToken _lockToken) external view returns (address, address, address, uint256, bool, uint256, uint256) {
        uint256 _diffDay;
        (_diffDay, ) = utilDiffTime(_lockToken.releaseTime());
        return (address(_lockToken.token()), _lockToken.donor(), _lockToken.beneficiary(), _lockToken.releaseTime(), _lockToken.revocable(), _lockToken.balanceOf(), _diffDay);
    }

    /* ========== FUNCTIONS ========== */

    function multiTransfers(address[] memory recipients, uint256[] memory amount) public returns (bool) {
        require(recipients.length == amount.length, "BORA: Input arrays must be the same length");
        for (uint256 i = 0; i < recipients.length; i++) {
            require(transfer(recipients[i], amount[i]), "BORA: failed to transfer");
        }
        return true;
    }

    function multiTransferFroms(address[] memory senders, address[] memory recipients, uint256[] memory amount) public returns (bool) {
        require(senders.length == recipients.length && recipients.length == amount.length, "BORA: Input arrays must be the same length");
        for (uint256 i = 0; i < senders.length; i++) {
            require(transferFrom(senders[i], recipients[i], amount[i]), "BORA: failed to transfer");
        }
        return true;
    }

    function tokenLock(address _donor, address _beneficiary, uint256 _amount, uint256 _duration, uint256 _durationUnit, bool _revocable) public onlyRole(SYSTEM_ROLE) returns (LockedToken) {
        uint256 releaseTime = block.timestamp + (_duration * _durationUnit);
        LockedToken lockedToken = new LockedToken(address(this), _donor, _beneficiary, releaseTime, _revocable, address(this));
        transferInternal(_msgSender(), address(lockedToken), _amount);
        emit TokenLock(address(lockedToken), _donor, _beneficiary, lockedToken.balanceOf(), releaseTime, _revocable, address(this), block.timestamp);
        return lockedToken;
    }

    function tokenLockClaim(LockedToken _lockToken) public {
        _lockToken.claim();
    }

    function multiTokenLockClaim(LockedToken[] memory _lockToken) external {
        for (uint256 i = 0; i < _lockToken.length; i++) {
            tokenLockClaim(_lockToken[i]);
        }
    }

    function tokenLockRevoke(LockedToken _lockToken) public onlyRole(SYSTEM_ROLE) {
        _lockToken.revoke();
    }

    function multiTokenLockRevoke(LockedToken[] memory _lockToken) external onlyRole(SYSTEM_ROLE) {
        for (uint256 i = 0; i < _lockToken.length; i++) {
            tokenLockRevoke(_lockToken[i]);
        }
    }

    /* ========== FUNCTIONS : Setting ========== */

    function setMintInfo(uint256 _oneTimeMaxAmount, uint256 _oneDayMaxAmount, uint256 _oneDayUnit) external onlyRole(SYSTEM_ROLE) returns (bool) {
        mintInfo.oneTimeMaxAmount = _oneTimeMaxAmount;
        mintInfo.oneDayMaxAmount = _oneDayMaxAmount;
        mintInfo.oneDayUnit = _oneDayUnit;
        emit MintInfoChanged(_msgSender(), _oneTimeMaxAmount, _oneDayMaxAmount, _oneDayUnit, block.timestamp);
        return true;
    }

    function setTransferInfo(uint256 _oneTimeMaxAmount, uint256 _oneDayMaxAmount, uint256 _oneDayUnit) external onlyRole(SYSTEM_ROLE) returns (bool) {
        transferInfo.oneTimeMaxAmount = _oneTimeMaxAmount;
        transferInfo.oneDayMaxAmount = _oneDayMaxAmount;
        transferInfo.oneDayUnit = _oneDayUnit;
        emit TransferInfoChanged(_msgSender(), _oneTimeMaxAmount, _oneDayMaxAmount, _oneDayUnit, block.timestamp);
        return true;
    }

    function setContractInfo(uint256 _bappNo, string calldata _bappName, string calldata _scVersion) external onlyRole(SYSTEM_ROLE) returns (bool) {
        contractInfo.BappNo = _bappNo;
        contractInfo.BappName = _bappName;
        contractInfo.SCVersion = _scVersion;
        return true;
    }

    function setBlacklist(address _account, bool _isBlacklist) external onlyRole(SYSTEM_ROLE) returns (bool) {
        _blacklist[_account] = _isBlacklist;
        emit BlacklistUpdated(_account, _isBlacklist, block.timestamp);
        return true;
    }

    // function setTotalSupplyCap(uint256 _supplyCap) external onlyOwner returns (bool) {
    //     require(_supplyCap >= _totalMintCap, "BORA: The totalSupplyCap must be greater than the totalMintCap");
    //     uint256 _beforeCap = _totalSupplyCap;
    //     _totalSupplyCap = _supplyCap;
    //     emit CapChanged("SupplyCap", _msgSender(), _supplyCap, _beforeCap, block.timestamp);
    //     return true;
    // }

    function setTotalMintCap(uint256 _supplyCap) external onlyRole(SYSTEM_ROLE) returns (bool) {
        require(_totalSupplyCap >= _supplyCap, "BORA: The totalSupplyCap must be greater than the totalMintCap");
        require(totalSupply() <= _supplyCap, "BORA: The totalSupplyCap must be greater than the totalSupply");
        uint256 _beforeCap = _totalMintCap;
        _totalMintCap = _supplyCap;
        emit CapChanged("MintCap", _msgSender(), _supplyCap, _beforeCap, block.timestamp);
        return true;
    }

    function setFeeInfoForTransfer(bool _isSet, bool _isInnerLogic, uint256 _feeRatio, address _feeCalcAddress, bytes32 _feeCalcCallBytes, address _feeReceiver, bool _isFeeReceiverContract) external onlyRole(SYSTEM_ROLE) returns (bool) {
        require(_feeRatio <= 5000, "BORA: Check a fee ratio (0~5000, 50%)");
        transFeeInfo.isSet = _isSet; // false : fee = 0, true : apply fee
        transFeeInfo.isInnerLogic = _isInnerLogic; // Location a Fee Calculate logic : true=internal, false=external
        transFeeInfo.feeRatio = _feeRatio; // for Internal (100% = 10000, 50% = 5000, 10% = 1000, 1% = 100, 0.1% = 10, 0.01% = 1)
        transFeeInfo.feeCalcAddress = _feeCalcAddress; // for External : BoraV2FeeCalculate Smart Contract Address
        transFeeInfo.feeCalcCallBytes = _feeCalcCallBytes; // for External : BoraV2FeeCalculate Call Command Bytes
        transFeeInfo.feeReceiver = _feeReceiver; // for Internal : Fee Receiver Address
        transFeeInfo.isFeeReceiverContract = _isFeeReceiverContract; // for Internal : in case of the Fee Receiver Address is contract ( calls feeDistributor.distributeFees() )
        transFeeInfo.lastUpdated = block.timestamp;
        emit FeeInfoChanged("FeeTrans", _isSet, _isInnerLogic, _feeRatio, _feeCalcAddress, _feeCalcCallBytes, _feeReceiver, _isFeeReceiverContract, block.timestamp);
        return true;
    }

    function setFeeInfoForMint(bool _isSet, bool _isInnerLogic, uint256 _feeRatio, address _feeCalcAddress, bytes32 _feeCalcCallBytes, address _feeReceiver, bool _isFeeReceiverContract) external onlyRole(SYSTEM_ROLE) returns (bool) {
        require(_feeRatio <= 5000, "BORA: Check a fee ratio (0~5000, 50%)");
        mintFeeInfo.isSet = _isSet; // false : fee = 0, true : apply fee
        mintFeeInfo.isInnerLogic = _isInnerLogic; // Location a Fee Calculate logic : true=internal, false=external
        mintFeeInfo.feeRatio = _feeRatio; // for Internal (100% = 10000, 50% = 5000, 10% = 1000, 1% = 100, 0.1% = 10, 0.01% = 1)
        mintFeeInfo.feeCalcAddress = _feeCalcAddress; // for External : BoraV2FeeCalculate Smart Contract Address
        mintFeeInfo.feeCalcCallBytes = _feeCalcCallBytes; // for External : BoraV2FeeCalculate Call Command Bytes
        mintFeeInfo.feeReceiver = _feeReceiver; // for Internal : Fee Receiver Address
        mintFeeInfo.isFeeReceiverContract = _isFeeReceiverContract; // for Internal : in case of the Fee Receiver Address is contract ( calls feeDistributor.distributeFees() )
        mintFeeInfo.lastUpdated = block.timestamp;
        emit FeeInfoChanged("FeeMint", _isSet, _isInnerLogic, _feeRatio, _feeCalcAddress, _feeCalcCallBytes, _feeReceiver, _isFeeReceiverContract, block.timestamp);
        return true;
    }

    /* ========== RESTRICTED FUNCTIONS ========== */

    function zRecoverTokenByAdmin(address _tokenAddress, uint256 _tokenAmount) public onlyOwner returns (bool) {
        IERC20(_tokenAddress).safeTransfer(owner(), _tokenAmount);
        emit RecoveredByAdmin(_tokenAddress, _msgSender(), _tokenAmount, block.timestamp);
        return true;
    }

    function zRecoverTokenALLByAdmin(address _tokenAddress) external onlyOwner returns (bool) {
        require(zRecoverTokenByAdmin(_tokenAddress, IERC20(_tokenAddress).balanceOf(address(this))), "BORA: Error zRecoverTokenByAdmin()");
        return true;
    }

    function addAdmin(address _account) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        require(_account != address(0), "BORA: add admin of the zero address");
        grantRole(DEFAULT_ADMIN_ROLE, _account); // Admin
        grantRole(MINTER_ROLE, _account); // System + Mint + Burn
        grantRole(SYSTEM_ROLE, _account); // System
        emit RoleChanged("addAdmin", _msgSender(), _account, block.timestamp);
        return true;
    }

    function renounceAdmin() public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        return revokeAdmin(_msgSender());
    }

    function revokeAdmin(address _account) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        require(_account != owner(), "BORA: Owner can't revoke AdminRole");
        revokeRole(MINTER_ROLE, _account); // System + Mint + Burn
        revokeRole(SYSTEM_ROLE, _account); // System
        revokeRole(DEFAULT_ADMIN_ROLE, _account); // Admin
        emit RoleChanged("revokeAdmin", _msgSender(), _account, block.timestamp);
        return true;
    }

    function transferOwnership(address _account) public override onlyOwner {
        addAdmin(_account);
        Ownable.transferOwnership(_account);
    }

    function renounceOwnership() public view override onlyOwner {
        revert("BORA: renounceOwnership is disabled");
    }

    /* ========== Modifier ======== */

    modifier checkBlacklisted(address _account) {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || !isBlacklisted(_account), "BORA: Address is a blacklisted address");
        _;
    }

    /* ========== EVENTS ========== */

    event TokenLock(address indexed token, address indexed donor, address indexed beneficiary, uint256 amount, uint256 releaseTime, bool _revocable, address _system, uint256 logTime);
    event SupplyChanged(string indexed cmdType, address indexed to, uint256 amount, uint256 afterTotalSupply, uint256 logTime);
    event RoleChanged(string indexed role, address indexed granter, address indexed grantee, uint256 logTime);
    event FeeInfoChanged(string indexed feeType, bool _isSet, bool _isInnerLogic, uint256 _feeRatio, address _feeCalcAddress, bytes32 _feeCalcCallBytes, address _feeReceiver, bool _isFeeReceiverContract, uint256 logTime);
    event MintInfoChanged(address indexed account, uint256 oneTimeMaxAmount, uint256 oneDayMaxAmount, uint256 oneDayUnit, uint256 logTime);
    event TransferInfoChanged(address indexed account, uint256 oneTimeMaxAmount, uint256 oneDayMaxAmount, uint256 oneDayUnit, uint256 logTime);
    event BlacklistUpdated(address indexed account, bool isBlacklist, uint256 logTime);
    event RecoveredByAdmin(address indexed token, address indexed receiver, uint256 amount, uint256 logTime);
    event CapChanged(string indexed capType, address indexed account, uint256 cap, uint256 beforeCap, uint256 logTime);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"initialTotalSupplyCap","type":"uint256"},{"internalType":"uint256","name":"initialTotalMintCap","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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":"isBlacklist","type":"bool"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"capType","type":"string"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beforeCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"CapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"feeType","type":"string"},{"indexed":false,"internalType":"bool","name":"_isSet","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isInnerLogic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_feeRatio","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feeCalcAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_feeCalcCallBytes","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_feeReceiver","type":"address"},{"indexed":false,"internalType":"bool","name":"_isFeeReceiverContract","type":"bool"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"FeeInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"MintInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"RecoveredByAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"role","type":"string"},{"indexed":true,"internalType":"address","name":"granter","type":"address"},{"indexed":true,"internalType":"address","name":"grantee","type":"address"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"RoleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"cmdType","type":"string"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"afterTotalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"SupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"donor","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_revocable","type":"bool"},{"indexed":false,"internalType":"address","name":"_system","type":"address"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"TokenLock","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"TransferInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CALL_MINT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CALL_TRANS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractInfo","outputs":[{"internalType":"uint256","name":"BappNo","type":"uint256"},{"internalType":"string","name":"BappName","type":"string"},{"internalType":"string","name":"SCVersion","type":"string"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFeeInfo","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"bool","name":"isInnerLogic","type":"bool"},{"internalType":"uint256","name":"feeRatio","type":"uint256"},{"internalType":"address","name":"feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"bool","name":"isFeeReceiverContract","type":"bool"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintInfo","outputs":[{"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"internalType":"uint256","name":"currentDay","type":"uint256"},{"internalType":"uint256","name":"currentDayAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract LockedToken[]","name":"_lockToken","type":"address[]"}],"name":"multiTokenLockClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LockedToken[]","name":"_lockToken","type":"address[]"}],"name":"multiTokenLockRevoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"senders","type":"address[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"multiTransferFroms","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"multiTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"renounceAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"revokeAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isBlacklist","type":"bool"}],"name":"setBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bappNo","type":"uint256"},{"internalType":"string","name":"_bappName","type":"string"},{"internalType":"string","name":"_scVersion","type":"string"}],"name":"setContractInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSet","type":"bool"},{"internalType":"bool","name":"_isInnerLogic","type":"bool"},{"internalType":"uint256","name":"_feeRatio","type":"uint256"},{"internalType":"address","name":"_feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"_feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"_feeReceiver","type":"address"},{"internalType":"bool","name":"_isFeeReceiverContract","type":"bool"}],"name":"setFeeInfoForMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSet","type":"bool"},{"internalType":"bool","name":"_isInnerLogic","type":"bool"},{"internalType":"uint256","name":"_feeRatio","type":"uint256"},{"internalType":"address","name":"_feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"_feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"_feeReceiver","type":"address"},{"internalType":"bool","name":"_isFeeReceiverContract","type":"bool"}],"name":"setFeeInfoForTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayUnit","type":"uint256"}],"name":"setMintInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"name":"setTotalMintCap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayUnit","type":"uint256"}],"name":"setTransferInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_donor","type":"address"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_durationUnit","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"}],"name":"tokenLock","outputs":[{"internalType":"contract LockedToken","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LockedToken","name":"_lockToken","type":"address"}],"name":"tokenLockClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LockedToken","name":"_lockToken","type":"address"}],"name":"tokenLockInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract LockedToken","name":"_lockToken","type":"address"}],"name":"tokenLockRevoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalMintCap","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":"totalSupplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transFeeInfo","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"bool","name":"isInnerLogic","type":"bool"},{"internalType":"uint256","name":"feeRatio","type":"uint256"},{"internalType":"address","name":"feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"bool","name":"isFeeReceiverContract","type":"bool"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferInfo","outputs":[{"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"internalType":"uint256","name":"currentDay","type":"uint256"},{"internalType":"uint256","name":"currentDayAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_checkTimestamp","type":"uint256"}],"name":"utilDiffTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp1","type":"uint256"},{"internalType":"uint256","name":"_timestamp2","type":"uint256"}],"name":"utilDiffTime2","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"utilUnitConvert","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"zRecoverTokenALLByAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"zRecoverTokenByAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040516200685238038062006852833981016040819052620000359162000a10565b8180604051806040016040528060018152602001603160f81b815250848481600390805190602001906200006b9291906200089d565b508051620000819060049060208401906200089d565b50506006805460ff1916905550620000993362000458565b815160209283012081519183019190912060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301969096526060810194909452608080850193909352308483018190528151808603909301835260c094850190915281519190950120905291909152610120525062000136600033620004b2565b620001627f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620004b2565b6200018e7f5719df9ef2c4678b547f89e4f5ae410dbf400fc51cf3ded434c55f6adea2c43f33620004b2565b6200019c6012600a62000bac565b620001ad906402540be3ff62000bc4565b601d55620001be6012600a62000bac565b620001cf906402540be3ff62000bc4565b601e5562015180601f55600c805460ff19908116909155601280549091168155600090620001ff90600a62000bac565b6200020b908762000bc4565b90506200021933826200053d565b604051631352539560e21b815233906004016040519081900390207f57d7aaba7c816a29cd10263482a5d2a41b847dfc3f44d5ae8dd46bf5d6dfac46836200026060025490565b604080519283526020830191909152429082015260600160405180910390a36200028d6012600a62000bac565b62000299908662000bc4565b600955620002aa6012600a62000bac565b620002b6908562000bc4565b600a556012620002c890600a62000bac565b620002d7906203d09062000bc4565b601d55620002e86012600a62000bac565b620002f7906207a12062000bc4565b601e55600060215533601d54601e54601f5460408051938452602084019290925282820152426060830152516001600160a01b0392909216917ffb4739cbf78270c890b5ad2f418812e621fd0063a955081e78f87e50ecb65d779181900360800190a2620003686012600a62000bac565b62000377906203d09062000bc4565b601855620003886012600a62000bac565b62000397906207a12062000bc4565b60195562015180601a556000601c5533601854601954601a5460408051938452602084019290925282820152426060830152516001600160a01b0392909216917fd8474aa6fa3fe9dd94aacda2d6c5ceb9ff8c562f516ba218dac052128137f32a9181900360800190a26103e860225582516200041c9060239060208601906200089d565b50604080518082019091526005808252640322e322e360dc1b60209092019182526200044b916024916200089d565b5050505050505062000c61565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004be828262000612565b620005395760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620004f83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b038216620005995760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620005a7600083836200063f565b8060026000828254620005bb919062000be6565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b620006496200079b565b826200065760003362000612565b806200067c57506001600160a01b0381166000908152600b602052604090205460ff16155b620006d95760405162461bcd60e51b815260206004820152602660248201527f424f52413a2041646472657373206973206120626c61636b6c6973746564206160448201526564647265737360d01b606482015260840162000590565b620006f18484846200079660201b620013d01760201c565b6001600160a01b03831615620007905760006001600160a01b0385166200071a57601d6200071d565b60185b8054909150831115620007825760405162461bcd60e51b815260206004820152602660248201527f424f52413a206f6e652074696d65207472616e73666572206c696d697420657860448201526518d95959195960d21b606482015260840162000590565b6200078e8184620007e5565b505b50505050565b505050565b60065460ff1615620007e35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000590565b565b6000826002015442620007f9919062000c01565b905080836003015414620008165760038301819055600060048401555b60008284600401546200082a919062000be6565b90508360010154811115620008905760405162461bcd60e51b815260206004820152602560248201527f424f52413a206f6e6520646179207472616e73666572206c696d697420657863604482015264195959195960da1b606482015260840162000590565b6004909301929092555050565b828054620008ab9062000c24565b90600052602060002090601f016020900481019282620008cf57600085556200091a565b82601f10620008ea57805160ff19168380011785556200091a565b828001600101855582156200091a579182015b828111156200091a578251825591602001919060010190620008fd565b50620009289291506200092c565b5090565b5b808211156200092857600081556001016200092d565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200096b57600080fd5b81516001600160401b038082111562000988576200098862000943565b604051601f8301601f19908116603f01168101908282118183101715620009b357620009b362000943565b81604052838152602092508683858801011115620009d057600080fd5b600091505b83821015620009f45785820183015181830184015290820190620009d5565b8382111562000a065760008385830101525b9695505050505050565b600080600080600060a0868803121562000a2957600080fd5b855160208701516040880151606089015192975090955093506001600160401b038082111562000a5857600080fd5b62000a6689838a0162000959565b9350608088015191508082111562000a7d57600080fd5b5062000a8c8882890162000959565b9150509295509295909350565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000af057816000190482111562000ad45762000ad462000a99565b8085161562000ae257918102915b93841c939080029062000ab4565b509250929050565b60008262000b095750600162000639565b8162000b185750600062000639565b816001811462000b31576002811462000b3c5762000b5c565b600191505062000639565b60ff84111562000b505762000b5062000a99565b50506001821b62000639565b5060208310610133831016604e8410600b841016171562000b81575081810a62000639565b62000b8d838362000aaf565b806000190482111562000ba45762000ba462000a99565b029392505050565b600062000bbd60ff84168362000af8565b9392505050565b600081600019048311821515161562000be15762000be162000a99565b500290565b6000821982111562000bfc5762000bfc62000a99565b500190565b60008262000c1f57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168062000c3957607f821691505b6020821081141562000c5b57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051615ba162000cb16000396000612dfd01526000612e4c01526000612e2701526000612d7e01526000612da901526000612dd40152615ba16000f3fe60806040523480156200001157600080fd5b50600436106200042d5760003560e01c806375071d2a1162000235578063abc8adae116200013d578063d539139311620000c7578063e2814de71162000092578063e2814de71462000aa5578063efdaffc51462000abc578063f2fde38b1462000ad3578063f9123b0b1462000aea578063fe575a871462000b0157600080fd5b8063d53913931462000a49578063d547741f1462000a60578063d71770f31462000a77578063dd62ed3e1462000a8e57600080fd5b8063c3da8a6b1162000108578063c3da8a6b14620009ed578063c96a679c1462000a04578063cc51f1bb1462000a1b578063d505accf1462000a3257600080fd5b8063abc8adae146200098a578063b662480114620009a5578063b9925e3514620009bc578063bb102aea14620009e457600080fd5b8063940fa2a711620001bf578063a3f2da7b116200018a578063a3f2da7b146200092e578063a457c2d71462000945578063a9059cbb146200095c578063aabfc36f146200097357600080fd5b8063940fa2a714620008ed57806395d89b411462000904578063a1dc12c9146200090e578063a217fddf146200092557600080fd5b80638456cb5911620002005780638456cb5914620008975780638bad0c0a14620008a15780638da5cb5b14620008ab57806391d1485414620008d657600080fd5b806375071d2a146200081f57806379cc679014620008365780637a9db9da146200084d5780637ecebe00146200088057600080fd5b8063313ce567116200033957806355fd58b611620002c35780636b7dbfd5116200028e5780636b7dbfd514620007aa5780637048027514620007d257806370a0823114620007e9578063715018a6146200081557600080fd5b806355fd58b614620007435780635c975abb14620007705780636177e0db146200077c57806361b746c3146200079357600080fd5b80633f4ba83a11620003045780633f4ba83a14620006f457806340c10f1914620006fe57806342966c681462000715578063455c1182146200072c57600080fd5b8063313ce56714620006ac5780633644e51514620006bc57806336568abe14620006c65780633950935114620006dd57600080fd5b80631ffa454d11620003bb5780632d34567011620003865780632d34567014620005d35780632eb164b814620005ea5780632f2ff15d146200064a5780632f645bf0146200066357600080fd5b80631ffa454d146200053b57806323b872dd1462000552578063248a9ca314620005695780632b291058146200058f57600080fd5b8063153b0d1e11620003fc578063153b0d1e14620004a157806315c43aaf14620004b857806318160ddd14620004d357806319e85a2414620004dc57600080fd5b806301ffc9a7146200043257806303ca49f1146200045e57806306fdde031462000471578063095ea7b3146200048a575b600080fd5b62000449620004433660046200403d565b62000b30565b60405190151581526020015b60405180910390f35b600a545b60405190815260200162000455565b6200047b62000b68565b604051620004559190620040c6565b620004496200049b366004620040f1565b62000c02565b62000449620004b23660046200412f565b62000c1c565b620004c262000ca6565b60405162000455939291906200416d565b60025462000462565b600c54600d54600e54600f54601054601154620005259560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b60405162000455989796959493929190620041a6565b620004496200054c3660046200433d565b62000ddb565b6200044962000563366004620043cf565b62000eef565b620004626200057a36600462004415565b60009081526005602052604090206001015490565b601d54601e54601f54602054602154620005aa949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00162000455565b62000449620005e43660046200442f565b62000f1d565b62000601620005fb3660046200442f565b62001048565b604080516001600160a01b0398891681529688166020880152949096169385019390935260608401919091521515608083015260a082015260c081019190915260e00162000455565b620006616200065b3660046200444f565b620013a7565b005b601254601354601454601554601654601754620005259560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b6040516012815260200162000455565b62000462620013d5565b62000661620006d73660046200444f565b620013e6565b62000449620006ee366004620040f1565b62001468565b6200066162001490565b620006616200070f366004620040f1565b620014a6565b620006616200072636600462004415565b62001836565b620004496200073d366004620040f1565b620018b4565b6200075a6200075436600462004477565b62001939565b6040805192835260208301919091520162000455565b60065460ff1662000449565b620006616200078d3660046200442f565b620019ea565b62000449620007a43660046200442f565b62001a42565b620004627fe2265147206eb604c72c9a0127bef10c07a637d0781673bf5613f37f85c4571e81565b62000449620007e33660046200442f565b62001b31565b62000462620007fa3660046200442f565b6001600160a01b031660009081526020819052604090205490565b6200066162001c0d565b6200046260008051602062005b0c83398151915281565b6200066162000847366004620040f1565b62001c6c565b620008646200085e36600462004415565b62001cfb565b6040805193845260208401929092529082015260600162000455565b62000462620008913660046200442f565b62001d31565b6200066162001d50565b6200044962001d64565b60065461010090046001600160a01b03165b6040516001600160a01b03909116815260200162000455565b62000449620008e73660046200444f565b62001d84565b620008bd620008fe3660046200449a565b62001daf565b6200047b62001f50565b620004496200091f36600462004508565b62001f61565b62000462600081565b620006616200093f36600462004535565b62001fe2565b6200044962000956366004620040f1565b62002046565b620004496200096d366004620040f1565b620020c7565b6200044962000984366004620045cf565b620020e7565b601854601954601a54601b54601c54620005aa949392919085565b62000661620009b636600462004535565b62002209565b620004627fb37907bf5c91ada2e95bfbf4a87b33b1f709ea40db7f36dbd83d32e1f5a0001b81565b60095462000462565b62000661620009fe3660046200442f565b62002252565b6200044962000a153660046200465e565b620022c6565b6200044962000a2c366004620045cf565b6200239b565b6200066162000a43366004620046c9565b62002463565b6200046260008051602062005b2c83398151915281565b6200066162000a713660046200444f565b620025d3565b6200075a62000a8836600462004415565b620025fc565b6200046262000a9f36600462004746565b620026ac565b6200044962000ab6366004620047be565b620026d7565b6200044962000acd36600462004415565b62002724565b6200066162000ae43660046200442f565b620028ab565b6200044962000afb36600462004508565b620028cf565b6200044962000b123660046200442f565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148062000b6257506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805462000b79906200483f565b80601f016020809104026020016040519081016040528092919081815260200182805462000ba7906200483f565b801562000bf85780601f1062000bcc5761010080835404028352916020019162000bf8565b820191906000526020600020905b81548152906001019060200180831162000bda57829003601f168201915b5050505050905090565b60003362000c1281858562002942565b5060019392505050565b600060008051602062005b0c83398151915262000c398162002a63565b6001600160a01b0384166000818152600b6020908152604091829020805460ff1916871515908117909155825190815242918101919091527fdb76f617e04ebf72dc17dbe8376979b98408ad67557ef09c5272f7156d8123e8910160405180910390a25060019392505050565b602280546023805491929162000cbc906200483f565b80601f016020809104026020016040519081016040528092919081815260200182805462000cea906200483f565b801562000d3b5780601f1062000d0f5761010080835404028352916020019162000d3b565b820191906000526020600020905b81548152906001019060200180831162000d1d57829003601f168201915b50505050509080600201805462000d52906200483f565b80601f016020809104026020016040519081016040528092919081815260200182805462000d80906200483f565b801562000dd15780601f1062000da55761010080835404028352916020019162000dd1565b820191906000526020600020905b81548152906001019060200180831162000db357829003601f168201915b5050505050905083565b60008251845114801562000df0575081518351145b62000e185760405162461bcd60e51b815260040162000e0f9062004876565b60405180910390fd5b60005b845181101562000ee45762000e8685828151811062000e3e5762000e3e620048c0565b602002602001015185838151811062000e5b5762000e5b620048c0565b602002602001015185848151811062000e785762000e78620048c0565b602002602001015162000eef565b62000ecf5760405162461bcd60e51b81526020600482015260186024820152772127a9209d103330b4b632b2103a37903a3930b739b332b960411b604482015260640162000e0f565b8062000edb81620048ec565b91505062000e1b565b506001949350505050565b600062000efb62002a6f565b62000f0884338462002ab7565b62000f1584848462002b38565b949350505050565b60008062000f2b8162002a63565b6006546001600160a01b0384811661010090920416141562000f9b5760405162461bcd60e51b815260206004820152602260248201527f424f52413a204f776e65722063616e2774207265766f6b652041646d696e526f6044820152616c6560f01b606482015260840162000e0f565b62000fb660008051602062005b2c83398151915284620025d3565b62000fd160008051602062005b0c83398151915284620025d3565b62000fde600084620025d3565b6040516a3932bb37b5b2a0b236b4b760a91b81526001600160a01b038416903390600b015b604051908190038120428252907f462b260bb7f1f6a55b13af8a2b24801cc187d85f27af3308bca5428016aa2ad79060200160405180910390a4600191505b50919050565b600080600080600080600080620010cd896001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200109257600080fd5b505afa158015620010a7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a8891906200490a565b5080915050886001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200110c57600080fd5b505afa15801562001121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001147919062004924565b896001600160a01b03166325223bd46040518163ffffffff1660e01b815260040160206040518083038186803b1580156200118157600080fd5b505afa15801562001196573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011bc919062004924565b8a6001600160a01b03166338af3eed6040518163ffffffff1660e01b815260040160206040518083038186803b158015620011f657600080fd5b505afa1580156200120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001231919062004924565b8b6001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200126b57600080fd5b505afa15801562001280573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a691906200490a565b8c6001600160a01b031663872a78106040518163ffffffff1660e01b815260040160206040518083038186803b158015620012e057600080fd5b505afa158015620012f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200131b919062004944565b8d6001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200135557600080fd5b505afa1580156200136a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200139091906200490a565b949e939d50919b5099509750909550909350915050565b600082815260056020526040902060010154620013c48162002a63565b620013d0838362002ce7565b505050565b6000620013e162002d71565b905090565b6001600160a01b0381163314620014585760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840162000e0f565b62001464828262002e9a565b5050565b60003362000c128185856200147e8383620026ac565b6200148a919062004964565b62002942565b6200149a62002f04565b620014a462002f66565b565b60008051602062005b2c833981519152620014c18162002a63565b82620014cf60003362001d84565b80620014f457506001600160a01b0381166000908152600b602052604090205460ff16155b620015135760405162461bcd60e51b815260040162000e0f906200497f565b600954836200152160025490565b6200152d919062004964565b11156200157d5760405162461bcd60e51b815260206004820152601d60248201527f424f52413a20746f74616c537570706c79436170206578636565646564000000604482015260640162000e0f565b600a54836200158b60025490565b62001597919062004964565b1115620015e75760405162461bcd60e51b815260206004820152601b60248201527f424f52413a20746f74616c4d696e744361702065786365656465640000000000604482015260640162000e0f565b604080516080810182526000808252602082018190529181018290526060810191909152601254429060ff166200162d5784825262001627868662002fba565b620017cd565b60408051610100808201835260125460ff80821615158452919004811615156020830152601354928201929092526014546001600160a01b039081166060830152601554608083015260165490811660a0830152600160a01b9004909116151560c082015260175460e0820152620016a8908633896200308b565b9150620016ba86836000015162002fba565b602082015115620017cd57620016d98260400151836020015162002fba565b81604001516001600160a01b0316604051620016ff90631352539560e21b815260040190565b604051809103902060008051602062005b4c83398151915284602001516200172660025490565b604080519283526020830191909152810185905260600160405180910390a3816060015115620017cd5781604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200179057600080fd5b505af1158015620017a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017cb919062004944565b505b604051631352539560e21b81526001600160a01b03871690600401604051809103902060008051602062005b4c83398151915284600001516200180f60025490565b604080519283526020830191909152810185905260600160405180910390a3505050505050565b60008051602062005b2c833981519152620018518162002a63565b6200185c82620031c9565b60405163212aa92760e11b81523390600401604051809103902060008051602062005b4c833981519152846200189160025490565b604080519283526020830191909152429082015260600160405180910390a35050565b6000620018c062002f04565b600654620018e89061010090046001600160a01b03166001600160a01b0385169084620031d5565b33604080518481524260208201526001600160a01b03928316928616917fca81413c83be0d2ac60c79c3d479764ee578f53cee6ab69fe49e123137679184910160405180910390a350600192915050565b600080838310156200199e5760405162461bcd60e51b815260206004820152602760248201527f424f52413a205f74696d657374616d7032206973206265666f7265205f74696d604482015266657374616d703160c81b606482015260840162000e0f565b6000620019af6201518086620049c5565b90506000620019c26201518086620049c5565b9050620019d08282620049e8565b620019dc8787620049e8565b9350935050505b9250929050565b806001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001a2657600080fd5b505af115801562001a3b573d6000803e3d6000fd5b5050505050565b600062001a4e62002f04565b6040516370a0823160e01b815230600482015262001ad09083906001600160a01b038216906370a082319060240160206040518083038186803b15801562001a9557600080fd5b505afa15801562001aaa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200073d91906200490a565b62001b295760405162461bcd60e51b815260206004820152602260248201527f424f52413a204572726f72207a5265636f766572546f6b656e427941646d696e604482015261282960f01b606482015260840162000e0f565b506001919050565b60008062001b3f8162002a63565b6001600160a01b03831662001ba35760405162461bcd60e51b815260206004820152602360248201527f424f52413a206164642061646d696e206f6620746865207a65726f206164647260448201526265737360e81b606482015260840162000e0f565b62001bb0600084620013a7565b62001bcb60008051602062005b2c83398151915284620013a7565b62001be660008051602062005b0c83398151915284620013a7565b6040516730b23220b236b4b760c11b81526001600160a01b03841690339060080162001003565b62001c1762002f04565b60405162461bcd60e51b815260206004820152602360248201527f424f52413a2072656e6f756e63654f776e6572736869702069732064697361626044820152621b195960ea1b606482015260840162000e0f565b60008051602062005b2c83398151915262001c878162002a63565b62001c93838362003229565b604051684255524e2e46524f4d60b81b81526001600160a01b03841690600901604051809103902060008051602062005b4c8339815191528462001cd660025490565b60408051928352602083019190915242908201526060015b60405180910390a3505050565b600080808362001d1081633b9aca0062004a02565b62001d2486670de0b6b3a764000062004a02565b9250925092509193909250565b6001600160a01b03811660009081526007602052604081205462000b62565b62001d5a62002f04565b620014a462003242565b60008062001d728162002a63565b62001d7d3362000f1d565b91505b5090565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600060008051602062005b0c83398151915262001dcc8162002a63565b600062001dda858762004a02565b62001de6904262004964565b90506000308a8a84883060405162001dfe9062003f93565b6001600160a01b0396871681529486166020860152928516604085015260608401919091521515608083015290911660a082015260c001604051809103906000f08015801562001e52573d6000803e3d6000fd5b50905062001e6233828a62002b38565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03167f024f9ed25691e6727f00b4c6c166398e2c933d5bd747f9433582f71f219d41ca846001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b15801562001edc57600080fd5b505afa15801562001ef1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f1791906200490a565b60408051918252602082018890528a15159082015230606082015242608082015260a00160405180910390a49998505050505050505050565b60606004805462000b79906200483f565b600060008051602062005b0c83398151915262001f7e8162002a63565b601d859055601e849055601f839055604080518681526020810186905290810184905242606082015233907ffb4739cbf78270c890b5ad2f418812e621fd0063a955081e78f87e50ecb65d77906080015b60405180910390a2506001949350505050565b60008051602062005b0c83398151915262001ffd8162002a63565b60005b8251811015620013d05762002031838281518110620020235762002023620048c0565b602002602001015162002252565b806200203d81620048ec565b91505062002000565b60003381620020568286620026ac565b905083811015620020b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000e0f565b62000ee4828686840362002942565b6000620020d362002a6f565b620020e033848462002b38565b9392505050565b600060008051602062005b0c833981519152620021048162002a63565b611388871115620021295760405162461bcd60e51b815260040162000e0f9062004a24565b600c805461ffff19168a151561ff001916176101008a151502179055600d879055600e80546001600160a01b0319166001600160a01b0388811691909117909155600f869055601080549186166001600160a81b031990921691909117600160a01b8515150217905542601155604051674665655472616e7360c01b81526008015b60405180910390207f0d2a3399263c99ba6a4f9d6d3adbfac6ed4fb0c99f9051245682d05e3166c7628a8a8a8a8a8a8a42604051620021f2989796959493929190620041a6565b60405180910390a250600198975050505050505050565b60005b815181101562001464576200223d8282815181106200222f576200222f620048c0565b6020026020010151620019ea565b806200224981620048ec565b9150506200220c565b60008051602062005b0c8339815191526200226d8162002a63565b816001600160a01b031663b6549f756040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620022a957600080fd5b505af1158015620022be573d6000803e3d6000fd5b505050505050565b60008151835114620022ec5760405162461bcd60e51b815260040162000e0f9062004876565b60005b835181101562000c12576200233d848281518110620023125762002312620048c0565b60200260200101518483815181106200232f576200232f620048c0565b6020026020010151620020c7565b620023865760405162461bcd60e51b81526020600482015260186024820152772127a9209d103330b4b632b2103a37903a3930b739b332b960411b604482015260640162000e0f565b806200239281620048ec565b915050620022ef565b600060008051602062005b0c833981519152620023b88162002a63565b611388871115620023dd5760405162461bcd60e51b815260040162000e0f9062004a24565b6012805461ffff19168a151561ff001916176101008a1515021790556013879055601480546001600160a01b0319166001600160a01b03888116919091179091556015869055601680549186166001600160a81b031990921691909117600160a01b851515021790554260175560405166119959535a5b9d60ca1b8152600701620021ab565b83421115620024b55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640162000e0f565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888620024e68c62003282565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006200254382620032a9565b905060006200255582878787620032fa565b9050896001600160a01b0316816001600160a01b031614620025ba5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640162000e0f565b620025c78a8a8a62002942565b50505050505050505050565b600082815260056020526040902060010154620025f08162002a63565b620013d0838362002e9a565b6000804283116200265f5760405162461bcd60e51b815260206004820152602660248201527f424f52413a20636865636b54696d65206973206265666f72652063757272656e604482015265742074696d6560d01b606482015260840162000e0f565b42836000620026726201518084620049c5565b90506000620026856201518084620049c5565b9050620026938282620049e8565b6200269f8585620049e8565b9550955050505050915091565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600060008051602062005b0c833981519152620026f48162002a63565b6022879055620027076023878762003fa1565b50620027166024858562003fa1565b506001979650505050505050565b600060008051602062005b0c833981519152620027418162002a63565b826009541015620027bb5760405162461bcd60e51b815260206004820152603e60248201527f424f52413a2054686520746f74616c537570706c79436170206d75737420626560448201527f2067726561746572207468616e2074686520746f74616c4d696e744361700000606482015260840162000e0f565b82620027c660025490565b11156200283c5760405162461bcd60e51b815260206004820152603d60248201527f424f52413a2054686520746f74616c537570706c79436170206d75737420626560448201527f2067726561746572207468616e2074686520746f74616c537570706c79000000606482015260840162000e0f565b600a8054908490556040516604d696e744361760cc1b8152339060070160408051918290038220878352602083018590524283830152905190917f23ef7e4139b396827aeefd39e91e3e909b18494e62782c16cfae15452872d544919081900360600190a35060019392505050565b620028b562002f04565b620028c08162001b31565b50620028cc8162003326565b50565b600060008051602062005b0c833981519152620028ec8162002a63565b60188590556019849055601a839055604080518681526020810186905290810184905242606082015233907fd8474aa6fa3fe9dd94aacda2d6c5ceb9ff8c562f516ba218dac052128137f32a9060800162001fcf565b6001600160a01b038316620029a65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000e0f565b6001600160a01b03821662002a095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000e0f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910162001cee565b620028cc8133620033a2565b60065460ff1615620014a45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000e0f565b600062002ac58484620026ac565b9050600019811462002b32578181101562002b235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640162000e0f565b62002b32848484840362002942565b50505050565b600062002b4462002a6f565b600c5460ff1662002b625762002b5c84848462003406565b62000c12565b604080516101008082018352600c5460ff80821615158452919004811615156020830152600d5492820192909252600e546001600160a01b039081166060830152600f54608083015260105490811660a0830152600160a01b9004909116151560c082015260115460e082015260009062002be0908487876200308b565b905062002bf38585836000015162003406565b60208101511562000ee45762002c13858260400151836020015162003406565b80606001511562000ee45780604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562002c5e57600080fd5b505af115801562002c73573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002c99919062004944565b62000ee45760405162461bcd60e51b815260206004820152601f60248201527f424f52413a206661696c656420746f2064697374726962757465206665657300604482015260640162000e0f565b62002cf3828262001d84565b620014645760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905562002d2d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801562002dcb57507f000000000000000000000000000000000000000000000000000000000000000046145b1562002df657507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b62002ea6828262001d84565b15620014645760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6006546001600160a01b03610100909104163314620014a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000e0f565b62002f70620035be565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216620030125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000e0f565b620030206000838362003609565b806002600082825462003034919062004964565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b604080516080810182526000808252602082018190529181018290526060810191909152845115620031be57846020015115620030fe57620030d284866040015162003702565b6020830152815260a08501516001600160a01b0316604082015260c08501511515606082015262000f15565b606085015160808601516040516341c7c70d60e11b8152600481018790526001600160a01b0386811660248301528581166044830152606482019290925291169063838f8e1a9060840160806040518083038186803b1580156200316157600080fd5b505afa15801562003176573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200319c919062004a69565b151560608501526001600160a01b031660408401526020830152815262000f15565b838152949350505050565b620028cc33826200373d565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620013d090849062003881565b6200323682338362002ab7565b6200146482826200373d565b6200324c62002a6f565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862002f9d3390565b6001600160a01b038116600090815260076020526040902080546001810182559062001042565b600062000b62620032b962002d71565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006200330d878787876200395a565b915091506200331c8162003a23565b5095945050505050565b6200333062002f04565b6001600160a01b038116620033975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000e0f565b620028cc8162003b84565b620033ae828262001d84565b6200146457620033be8162003bde565b620033cb83602062003bf1565b604051602001620033de92919062004ab9565b60408051601f198184030181529082905262461bcd60e51b825262000e0f91600401620040c6565b6001600160a01b0383166200346c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840162000e0f565b6001600160a01b038216620034d05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000e0f565b620034dd83838362003609565b6001600160a01b03831660009081526020819052604090205481811015620035575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000e0f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362002b32565b60065460ff16620014a45760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640162000e0f565b6200361362002a6f565b826200362160003362001d84565b806200364657506001600160a01b0381166000908152600b602052604090205460ff16155b620036655760405162461bcd60e51b815260040162000e0f906200497f565b6001600160a01b0383161562002b325760006001600160a01b0385166200368e57601d62003691565b60185b8054909150831115620036f65760405162461bcd60e51b815260206004820152602660248201527f424f52413a206f6e652074696d65207472616e73666572206c696d697420657860448201526518d95959195960d21b606482015260840162000e0f565b62001a3b818462003dab565b6000808061271062003715858762004a02565b620037219190620049c5565b90506000620037318287620049e8565b96919550909350505050565b6001600160a01b0382166200379f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840162000e0f565b620037ad8260008362003609565b6001600160a01b03821660009081526020819052604090205481811015620038235760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840162000e0f565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000620038d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662003e639092919063ffffffff16565b805190915015620013d05780806020019051810190620038f9919062004944565b620013d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000e0f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111562003993575060009050600362003a1a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015620039e8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662003a135760006001925092505062003a1a565b9150600090505b94509492505050565b600081600481111562003a3a5762003a3a62004b32565b141562003a445750565b600181600481111562003a5b5762003a5b62004b32565b141562003aab5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640162000e0f565b600281600481111562003ac25762003ac262004b32565b141562003b125760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000e0f565b600381600481111562003b295762003b2962004b32565b1415620028cc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000e0f565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606062000b626001600160a01b03831660145b6060600062003c0283600262004a02565b62003c0f90600262004964565b67ffffffffffffffff81111562003c2a5762003c2a620041ec565b6040519080825280601f01601f19166020018201604052801562003c55576020820181803683370190505b509050600360fc1b8160008151811062003c735762003c73620048c0565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062003ca55762003ca5620048c0565b60200101906001600160f81b031916908160001a905350600062003ccb84600262004a02565b62003cd890600162004964565b90505b600181111562003d5a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062003d105762003d10620048c0565b1a60f81b82828151811062003d295762003d29620048c0565b60200101906001600160f81b031916908160001a90535060049490941c9362003d528162004b48565b905062003cdb565b508315620020e05760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000e0f565b600082600201544262003dbf9190620049c5565b90508083600301541462003ddc5760038301819055600060048401555b600082846004015462003df0919062004964565b9050836001015481111562003e565760405162461bcd60e51b815260206004820152602560248201527f424f52413a206f6e6520646179207472616e73666572206c696d697420657863604482015264195959195960da1b606482015260840162000e0f565b6004909301929092555050565b606062000f15848460008585600080866001600160a01b0316858760405162003e8d919062004b62565b60006040518083038185875af1925050503d806000811462003ecc576040519150601f19603f3d011682016040523d82523d6000602084013e62003ed1565b606091505b509150915062003ee48783838762003eef565b979650505050505050565b6060831562003f6057825162003f58576001600160a01b0385163b62003f585760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000e0f565b508162000f15565b62000f15838381511562003f775781518083602001fd5b8060405162461bcd60e51b815260040162000e0f9190620040c6565b610f8b8062004b8183390190565b82805462003faf906200483f565b90600052602060002090601f01602090048101928262003fd357600085556200401e565b82601f1062003fee5782800160ff198235161785556200401e565b828001600101855582156200401e579182015b828111156200401e57823582559160200191906001019062004001565b5062001d809291505b8082111562001d80576000815560010162004027565b6000602082840312156200405057600080fd5b81356001600160e01b031981168114620020e057600080fd5b60005b83811015620040865781810151838201526020016200406c565b8381111562002b325750506000910152565b60008151808452620040b281602086016020860162004069565b601f01601f19169290920160200192915050565b602081526000620020e0602083018462004098565b6001600160a01b0381168114620028cc57600080fd5b600080604083850312156200410557600080fd5b82356200411281620040db565b946020939093013593505050565b8015158114620028cc57600080fd5b600080604083850312156200414357600080fd5b82356200415081620040db565b91506020830135620041628162004120565b809150509250929050565b83815260606020820152600062004188606083018562004098565b82810360408401526200419c818562004098565b9695505050505050565b9715158852951515602088015260408701949094526001600160a01b03928316606087015260808601919091521660a0840152151560c083015260e08201526101000190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156200422e576200422e620041ec565b604052919050565b600067ffffffffffffffff821115620042535762004253620041ec565b5060051b60200190565b600082601f8301126200426f57600080fd5b8135602062004288620042828362004236565b62004202565b82815260059290921b84018101918181019086841115620042a857600080fd5b8286015b84811015620042d0578035620042c281620040db565b8352918301918301620042ac565b509695505050505050565b600082601f830112620042ed57600080fd5b8135602062004300620042828362004236565b82815260059290921b840181019181810190868411156200432057600080fd5b8286015b84811015620042d0578035835291830191830162004324565b6000806000606084860312156200435357600080fd5b833567ffffffffffffffff808211156200436c57600080fd5b6200437a878388016200425d565b945060208601359150808211156200439157600080fd5b6200439f878388016200425d565b93506040860135915080821115620043b657600080fd5b50620043c586828701620042db565b9150509250925092565b600080600060608486031215620043e557600080fd5b8335620043f281620040db565b925060208401356200440481620040db565b929592945050506040919091013590565b6000602082840312156200442857600080fd5b5035919050565b6000602082840312156200444257600080fd5b8135620020e081620040db565b600080604083850312156200446357600080fd5b8235915060208301356200416281620040db565b600080604083850312156200448b57600080fd5b50508035926020909101359150565b60008060008060008060c08789031215620044b457600080fd5b8635620044c181620040db565b95506020870135620044d381620040db565b945060408701359350606087013592506080870135915060a0870135620044fa8162004120565b809150509295509295509295565b6000806000606084860312156200451e57600080fd5b505081359360208301359350604090920135919050565b600060208083850312156200454957600080fd5b823567ffffffffffffffff8111156200456157600080fd5b8301601f810185136200457357600080fd5b803562004584620042828262004236565b81815260059190911b82018301908381019087831115620045a457600080fd5b928401925b8284101562003ee4578335620045bf81620040db565b82529284019290840190620045a9565b600080600080600080600060e0888a031215620045eb57600080fd5b8735620045f88162004120565b965060208801356200460a8162004120565b95506040880135945060608801356200462381620040db565b93506080880135925060a08801356200463c81620040db565b915060c08801356200464e8162004120565b8091505092959891949750929550565b600080604083850312156200467257600080fd5b823567ffffffffffffffff808211156200468b57600080fd5b62004699868387016200425d565b93506020850135915080821115620046b057600080fd5b50620046bf85828601620042db565b9150509250929050565b600080600080600080600060e0888a031215620046e557600080fd5b8735620046f281620040db565b965060208801356200470481620040db565b95506040880135945060608801359350608088013560ff811681146200472957600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156200475a57600080fd5b82356200476781620040db565b915060208301356200416281620040db565b60008083601f8401126200478c57600080fd5b50813567ffffffffffffffff811115620047a557600080fd5b602083019150836020828501011115620019e357600080fd5b600080600080600060608688031215620047d757600080fd5b85359450602086013567ffffffffffffffff80821115620047f757600080fd5b6200480589838a0162004779565b909650945060408801359150808211156200481f57600080fd5b506200482e8882890162004779565b969995985093965092949392505050565b600181811c908216806200485457607f821691505b602082108114156200104257634e487b7160e01b600052602260045260246000fd5b6020808252602a908201527f424f52413a20496e70757420617272617973206d7573742062652074686520736040820152690c2daca40d8cadccee8d60b31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620049035762004903620048d6565b5060010190565b6000602082840312156200491d57600080fd5b5051919050565b6000602082840312156200493757600080fd5b8151620020e081620040db565b6000602082840312156200495757600080fd5b8151620020e08162004120565b600082198211156200497a576200497a620048d6565b500190565b60208082526026908201527f424f52413a2041646472657373206973206120626c61636b6c6973746564206160408201526564647265737360d01b606082015260800190565b600082620049e357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015620049fd57620049fd620048d6565b500390565b600081600019048311821515161562004a1f5762004a1f620048d6565b500290565b60208082526025908201527f424f52413a20436865636b20612066656520726174696f2028307e353030302c604082015264203530252960d81b606082015260800190565b6000806000806080858703121562004a8057600080fd5b8451935060208501519250604085015162004a9b81620040db565b606086015190925062004aae8162004120565b939692955090935050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835162004af381601785016020880162004069565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162004b2681602884016020880162004069565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b60008162004b5a5762004b5a620048d6565b506000190190565b6000825162004b7681846020870162004069565b919091019291505056fe6101206040523480156200001257600080fd5b5060405162000f8b38038062000f8b83398101604081905262000035916200022b565b6001600160a01b0385166200009c5760405162461bcd60e51b815260206004820152602260248201527f4c6f636b6564546f6b656e3a20646f6e6f72206973207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b038416620001055760405162461bcd60e51b815260206004820152602860248201527f4c6f636b6564546f6b656e3a2062656e6566696369617279206973207a65726f604482015267206164647265737360c01b606482015260840162000093565b6001600160a01b038116620001695760405162461bcd60e51b815260206004820152602360248201527f4c6f636b6564546f6b656e3a2073797374656d206973207a65726f206164647260448201526265737360e81b606482015260840162000093565b428311620001d35760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2072656c656173652074696d652069732062656660448201526f6f72652063757272656e742074696d6560801b606482015260840162000093565b600080546001600160a01b0319166001600160a01b0397881617905593851660805291841660a05260c052151560e0521661010052620002a9565b80516001600160a01b03811681146200022657600080fd5b919050565b60008060008060008060c087890312156200024557600080fd5b62000250876200020e565b955062000260602088016200020e565b945062000270604088016200020e565b935060608701519250608087015180151581146200028d57600080fd5b91506200029d60a088016200020e565b90509295509295509295565b60805160a05160c05160e05161010051610c3d6200034e600039600081816101ae0152818161054e01526106ac015260008181610177015281816104bc01526105f60152600081816101dd01528181610212015281816103dc015261049a01526000818160ec0152818161037e015281816103b1015261047801526000818160a8015281816104560152818161067a0152818161080c015261083f0152610c3d6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063872a781011610066578063872a78101461017257806395bf75fd146101a9578063b6549f75146101d0578063b91d4001146101d8578063fc0c546a146101ff57600080fd5b806325223bd4146100a357806338af3eed146100e75780634e71d92d1461010e5780635a9b0b8914610118578063722713f71461015c575b600080fd5b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b610116610210565b005b610120610433565b604080516001600160a01b03978816815295871660208701528501939093529015156060840152608083015290911660a082015260c0016100de565b610164610573565b6040519081526020016100de565b6101997f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016100de565b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b6101166105f4565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03166100ca565b7f000000000000000000000000000000000000000000000000000000000000000042101561029e5760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2063757272656e742074696d652069732062656660448201526f6f72652072656c656173652074696d6560801b60648201526084015b60405180910390fd5b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031a9190610b46565b90506000811161036c5760405162461bcd60e51b815260206004820152601f60248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f20636c61696d006044820152606401610295565b6000546103a3906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000083610890565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602081018390527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7906060015b60405180910390a150565b600080546040516370a0823160e01b8152306004820152829182918291829182917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b0316906370a082319060240160206040518083038186803b15801561050757600080fd5b505afa15801561051b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053f9190610b46565b939a92995090975095509093507f000000000000000000000000000000000000000000000000000000000000000092509050565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156105b757600080fd5b505afa1580156105cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ef9190610b46565b905090565b7f000000000000000000000000000000000000000000000000000000000000000061066f5760405162461bcd60e51b815260206004820152602560248201527f4c6f636b6564546f6b656e3a20746f6b656e7320617265206e6f74207265766f6044820152646361626c6560d81b6064820152608401610295565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806106ce5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61072c5760405162461bcd60e51b815260206004820152602960248201527f4c6f636b6564546f6b656e3a206f6e6c7920646f6e6f727c73797374656d2063604482015268616e207265766f6b6560b81b6064820152608401610295565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561077057600080fd5b505afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190610b46565b9050600081116107fa5760405162461bcd60e51b815260206004820181905260248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f207265766f6b656044820152606401610295565b600054610831906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000083610890565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602081018390527fec9ab91322523c899ede7830ec9bfc992b5981cdcc27b91162fb23de5791117b9101610428565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526108e29084906108e7565b505050565b600061093c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166109b99092919063ffffffff16565b8051909150156108e2578080602001905181019061095a9190610b5f565b6108e25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610295565b60606109c884846000856109d0565b949350505050565b606082471015610a315760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610295565b600080866001600160a01b03168587604051610a4d9190610bb8565b60006040518083038185875af1925050503d8060008114610a8a576040519150601f19603f3d011682016040523d82523d6000602084013e610a8f565b606091505b5091509150610aa087838387610aab565b979650505050505050565b60608315610b17578251610b10576001600160a01b0385163b610b105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610295565b50816109c8565b6109c88383815115610b2c5781518083602001fd5b8060405162461bcd60e51b81526004016102959190610bd4565b600060208284031215610b5857600080fd5b5051919050565b600060208284031215610b7157600080fd5b81518015158114610b8157600080fd5b9392505050565b60005b83811015610ba3578181015183820152602001610b8b565b83811115610bb2576000848401525b50505050565b60008251610bca818460208701610b88565b9190910192915050565b6020815260008251806020840152610bf3816040850160208701610b88565b601f01601f1916919091016040019291505056fea2646970667358221220de33ae19240ac22a4bf4e2b47e7d536b460907b4c5673b5f3c9a5511ba979dbc64736f6c634300080900335719df9ef2c4678b547f89e4f5ae410dbf400fc51cf3ded434c55f6adea2c43f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a657d7aaba7c816a29cd10263482a5d2a41b847dfc3f44d5ae8dd46bf5d6dfac46a2646970667358221220c23bfa35b6c369c0fb3208d2e9524c9b1a79c602a712847eeb755675609b671464736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047de48f000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000565424f5241000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000565424f5241000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040523480156200001157600080fd5b50600436106200042d5760003560e01c806375071d2a1162000235578063abc8adae116200013d578063d539139311620000c7578063e2814de71162000092578063e2814de71462000aa5578063efdaffc51462000abc578063f2fde38b1462000ad3578063f9123b0b1462000aea578063fe575a871462000b0157600080fd5b8063d53913931462000a49578063d547741f1462000a60578063d71770f31462000a77578063dd62ed3e1462000a8e57600080fd5b8063c3da8a6b1162000108578063c3da8a6b14620009ed578063c96a679c1462000a04578063cc51f1bb1462000a1b578063d505accf1462000a3257600080fd5b8063abc8adae146200098a578063b662480114620009a5578063b9925e3514620009bc578063bb102aea14620009e457600080fd5b8063940fa2a711620001bf578063a3f2da7b116200018a578063a3f2da7b146200092e578063a457c2d71462000945578063a9059cbb146200095c578063aabfc36f146200097357600080fd5b8063940fa2a714620008ed57806395d89b411462000904578063a1dc12c9146200090e578063a217fddf146200092557600080fd5b80638456cb5911620002005780638456cb5914620008975780638bad0c0a14620008a15780638da5cb5b14620008ab57806391d1485414620008d657600080fd5b806375071d2a146200081f57806379cc679014620008365780637a9db9da146200084d5780637ecebe00146200088057600080fd5b8063313ce567116200033957806355fd58b611620002c35780636b7dbfd5116200028e5780636b7dbfd514620007aa5780637048027514620007d257806370a0823114620007e9578063715018a6146200081557600080fd5b806355fd58b614620007435780635c975abb14620007705780636177e0db146200077c57806361b746c3146200079357600080fd5b80633f4ba83a11620003045780633f4ba83a14620006f457806340c10f1914620006fe57806342966c681462000715578063455c1182146200072c57600080fd5b8063313ce56714620006ac5780633644e51514620006bc57806336568abe14620006c65780633950935114620006dd57600080fd5b80631ffa454d11620003bb5780632d34567011620003865780632d34567014620005d35780632eb164b814620005ea5780632f2ff15d146200064a5780632f645bf0146200066357600080fd5b80631ffa454d146200053b57806323b872dd1462000552578063248a9ca314620005695780632b291058146200058f57600080fd5b8063153b0d1e11620003fc578063153b0d1e14620004a157806315c43aaf14620004b857806318160ddd14620004d357806319e85a2414620004dc57600080fd5b806301ffc9a7146200043257806303ca49f1146200045e57806306fdde031462000471578063095ea7b3146200048a575b600080fd5b62000449620004433660046200403d565b62000b30565b60405190151581526020015b60405180910390f35b600a545b60405190815260200162000455565b6200047b62000b68565b604051620004559190620040c6565b620004496200049b366004620040f1565b62000c02565b62000449620004b23660046200412f565b62000c1c565b620004c262000ca6565b60405162000455939291906200416d565b60025462000462565b600c54600d54600e54600f54601054601154620005259560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b60405162000455989796959493929190620041a6565b620004496200054c3660046200433d565b62000ddb565b6200044962000563366004620043cf565b62000eef565b620004626200057a36600462004415565b60009081526005602052604090206001015490565b601d54601e54601f54602054602154620005aa949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00162000455565b62000449620005e43660046200442f565b62000f1d565b62000601620005fb3660046200442f565b62001048565b604080516001600160a01b0398891681529688166020880152949096169385019390935260608401919091521515608083015260a082015260c081019190915260e00162000455565b620006616200065b3660046200444f565b620013a7565b005b601254601354601454601554601654601754620005259560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b6040516012815260200162000455565b62000462620013d5565b62000661620006d73660046200444f565b620013e6565b62000449620006ee366004620040f1565b62001468565b6200066162001490565b620006616200070f366004620040f1565b620014a6565b620006616200072636600462004415565b62001836565b620004496200073d366004620040f1565b620018b4565b6200075a6200075436600462004477565b62001939565b6040805192835260208301919091520162000455565b60065460ff1662000449565b620006616200078d3660046200442f565b620019ea565b62000449620007a43660046200442f565b62001a42565b620004627fe2265147206eb604c72c9a0127bef10c07a637d0781673bf5613f37f85c4571e81565b62000449620007e33660046200442f565b62001b31565b62000462620007fa3660046200442f565b6001600160a01b031660009081526020819052604090205490565b6200066162001c0d565b6200046260008051602062005b0c83398151915281565b6200066162000847366004620040f1565b62001c6c565b620008646200085e36600462004415565b62001cfb565b6040805193845260208401929092529082015260600162000455565b62000462620008913660046200442f565b62001d31565b6200066162001d50565b6200044962001d64565b60065461010090046001600160a01b03165b6040516001600160a01b03909116815260200162000455565b62000449620008e73660046200444f565b62001d84565b620008bd620008fe3660046200449a565b62001daf565b6200047b62001f50565b620004496200091f36600462004508565b62001f61565b62000462600081565b620006616200093f36600462004535565b62001fe2565b6200044962000956366004620040f1565b62002046565b620004496200096d366004620040f1565b620020c7565b6200044962000984366004620045cf565b620020e7565b601854601954601a54601b54601c54620005aa949392919085565b62000661620009b636600462004535565b62002209565b620004627fb37907bf5c91ada2e95bfbf4a87b33b1f709ea40db7f36dbd83d32e1f5a0001b81565b60095462000462565b62000661620009fe3660046200442f565b62002252565b6200044962000a153660046200465e565b620022c6565b6200044962000a2c366004620045cf565b6200239b565b6200066162000a43366004620046c9565b62002463565b6200046260008051602062005b2c83398151915281565b6200066162000a713660046200444f565b620025d3565b6200075a62000a8836600462004415565b620025fc565b6200046262000a9f36600462004746565b620026ac565b6200044962000ab6366004620047be565b620026d7565b6200044962000acd36600462004415565b62002724565b6200066162000ae43660046200442f565b620028ab565b6200044962000afb36600462004508565b620028cf565b6200044962000b123660046200442f565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148062000b6257506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805462000b79906200483f565b80601f016020809104026020016040519081016040528092919081815260200182805462000ba7906200483f565b801562000bf85780601f1062000bcc5761010080835404028352916020019162000bf8565b820191906000526020600020905b81548152906001019060200180831162000bda57829003601f168201915b5050505050905090565b60003362000c1281858562002942565b5060019392505050565b600060008051602062005b0c83398151915262000c398162002a63565b6001600160a01b0384166000818152600b6020908152604091829020805460ff1916871515908117909155825190815242918101919091527fdb76f617e04ebf72dc17dbe8376979b98408ad67557ef09c5272f7156d8123e8910160405180910390a25060019392505050565b602280546023805491929162000cbc906200483f565b80601f016020809104026020016040519081016040528092919081815260200182805462000cea906200483f565b801562000d3b5780601f1062000d0f5761010080835404028352916020019162000d3b565b820191906000526020600020905b81548152906001019060200180831162000d1d57829003601f168201915b50505050509080600201805462000d52906200483f565b80601f016020809104026020016040519081016040528092919081815260200182805462000d80906200483f565b801562000dd15780601f1062000da55761010080835404028352916020019162000dd1565b820191906000526020600020905b81548152906001019060200180831162000db357829003601f168201915b5050505050905083565b60008251845114801562000df0575081518351145b62000e185760405162461bcd60e51b815260040162000e0f9062004876565b60405180910390fd5b60005b845181101562000ee45762000e8685828151811062000e3e5762000e3e620048c0565b602002602001015185838151811062000e5b5762000e5b620048c0565b602002602001015185848151811062000e785762000e78620048c0565b602002602001015162000eef565b62000ecf5760405162461bcd60e51b81526020600482015260186024820152772127a9209d103330b4b632b2103a37903a3930b739b332b960411b604482015260640162000e0f565b8062000edb81620048ec565b91505062000e1b565b506001949350505050565b600062000efb62002a6f565b62000f0884338462002ab7565b62000f1584848462002b38565b949350505050565b60008062000f2b8162002a63565b6006546001600160a01b0384811661010090920416141562000f9b5760405162461bcd60e51b815260206004820152602260248201527f424f52413a204f776e65722063616e2774207265766f6b652041646d696e526f6044820152616c6560f01b606482015260840162000e0f565b62000fb660008051602062005b2c83398151915284620025d3565b62000fd160008051602062005b0c83398151915284620025d3565b62000fde600084620025d3565b6040516a3932bb37b5b2a0b236b4b760a91b81526001600160a01b038416903390600b015b604051908190038120428252907f462b260bb7f1f6a55b13af8a2b24801cc187d85f27af3308bca5428016aa2ad79060200160405180910390a4600191505b50919050565b600080600080600080600080620010cd896001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200109257600080fd5b505afa158015620010a7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a8891906200490a565b5080915050886001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200110c57600080fd5b505afa15801562001121573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001147919062004924565b896001600160a01b03166325223bd46040518163ffffffff1660e01b815260040160206040518083038186803b1580156200118157600080fd5b505afa15801562001196573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011bc919062004924565b8a6001600160a01b03166338af3eed6040518163ffffffff1660e01b815260040160206040518083038186803b158015620011f657600080fd5b505afa1580156200120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001231919062004924565b8b6001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200126b57600080fd5b505afa15801562001280573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a691906200490a565b8c6001600160a01b031663872a78106040518163ffffffff1660e01b815260040160206040518083038186803b158015620012e057600080fd5b505afa158015620012f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200131b919062004944565b8d6001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200135557600080fd5b505afa1580156200136a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200139091906200490a565b949e939d50919b5099509750909550909350915050565b600082815260056020526040902060010154620013c48162002a63565b620013d0838362002ce7565b505050565b6000620013e162002d71565b905090565b6001600160a01b0381163314620014585760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840162000e0f565b62001464828262002e9a565b5050565b60003362000c128185856200147e8383620026ac565b6200148a919062004964565b62002942565b6200149a62002f04565b620014a462002f66565b565b60008051602062005b2c833981519152620014c18162002a63565b82620014cf60003362001d84565b80620014f457506001600160a01b0381166000908152600b602052604090205460ff16155b620015135760405162461bcd60e51b815260040162000e0f906200497f565b600954836200152160025490565b6200152d919062004964565b11156200157d5760405162461bcd60e51b815260206004820152601d60248201527f424f52413a20746f74616c537570706c79436170206578636565646564000000604482015260640162000e0f565b600a54836200158b60025490565b62001597919062004964565b1115620015e75760405162461bcd60e51b815260206004820152601b60248201527f424f52413a20746f74616c4d696e744361702065786365656465640000000000604482015260640162000e0f565b604080516080810182526000808252602082018190529181018290526060810191909152601254429060ff166200162d5784825262001627868662002fba565b620017cd565b60408051610100808201835260125460ff80821615158452919004811615156020830152601354928201929092526014546001600160a01b039081166060830152601554608083015260165490811660a0830152600160a01b9004909116151560c082015260175460e0820152620016a8908633896200308b565b9150620016ba86836000015162002fba565b602082015115620017cd57620016d98260400151836020015162002fba565b81604001516001600160a01b0316604051620016ff90631352539560e21b815260040190565b604051809103902060008051602062005b4c83398151915284602001516200172660025490565b604080519283526020830191909152810185905260600160405180910390a3816060015115620017cd5781604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200179057600080fd5b505af1158015620017a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017cb919062004944565b505b604051631352539560e21b81526001600160a01b03871690600401604051809103902060008051602062005b4c83398151915284600001516200180f60025490565b604080519283526020830191909152810185905260600160405180910390a3505050505050565b60008051602062005b2c833981519152620018518162002a63565b6200185c82620031c9565b60405163212aa92760e11b81523390600401604051809103902060008051602062005b4c833981519152846200189160025490565b604080519283526020830191909152429082015260600160405180910390a35050565b6000620018c062002f04565b600654620018e89061010090046001600160a01b03166001600160a01b0385169084620031d5565b33604080518481524260208201526001600160a01b03928316928616917fca81413c83be0d2ac60c79c3d479764ee578f53cee6ab69fe49e123137679184910160405180910390a350600192915050565b600080838310156200199e5760405162461bcd60e51b815260206004820152602760248201527f424f52413a205f74696d657374616d7032206973206265666f7265205f74696d604482015266657374616d703160c81b606482015260840162000e0f565b6000620019af6201518086620049c5565b90506000620019c26201518086620049c5565b9050620019d08282620049e8565b620019dc8787620049e8565b9350935050505b9250929050565b806001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001a2657600080fd5b505af115801562001a3b573d6000803e3d6000fd5b5050505050565b600062001a4e62002f04565b6040516370a0823160e01b815230600482015262001ad09083906001600160a01b038216906370a082319060240160206040518083038186803b15801562001a9557600080fd5b505afa15801562001aaa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200073d91906200490a565b62001b295760405162461bcd60e51b815260206004820152602260248201527f424f52413a204572726f72207a5265636f766572546f6b656e427941646d696e604482015261282960f01b606482015260840162000e0f565b506001919050565b60008062001b3f8162002a63565b6001600160a01b03831662001ba35760405162461bcd60e51b815260206004820152602360248201527f424f52413a206164642061646d696e206f6620746865207a65726f206164647260448201526265737360e81b606482015260840162000e0f565b62001bb0600084620013a7565b62001bcb60008051602062005b2c83398151915284620013a7565b62001be660008051602062005b0c83398151915284620013a7565b6040516730b23220b236b4b760c11b81526001600160a01b03841690339060080162001003565b62001c1762002f04565b60405162461bcd60e51b815260206004820152602360248201527f424f52413a2072656e6f756e63654f776e6572736869702069732064697361626044820152621b195960ea1b606482015260840162000e0f565b60008051602062005b2c83398151915262001c878162002a63565b62001c93838362003229565b604051684255524e2e46524f4d60b81b81526001600160a01b03841690600901604051809103902060008051602062005b4c8339815191528462001cd660025490565b60408051928352602083019190915242908201526060015b60405180910390a3505050565b600080808362001d1081633b9aca0062004a02565b62001d2486670de0b6b3a764000062004a02565b9250925092509193909250565b6001600160a01b03811660009081526007602052604081205462000b62565b62001d5a62002f04565b620014a462003242565b60008062001d728162002a63565b62001d7d3362000f1d565b91505b5090565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600060008051602062005b0c83398151915262001dcc8162002a63565b600062001dda858762004a02565b62001de6904262004964565b90506000308a8a84883060405162001dfe9062003f93565b6001600160a01b0396871681529486166020860152928516604085015260608401919091521515608083015290911660a082015260c001604051809103906000f08015801562001e52573d6000803e3d6000fd5b50905062001e6233828a62002b38565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03167f024f9ed25691e6727f00b4c6c166398e2c933d5bd747f9433582f71f219d41ca846001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b15801562001edc57600080fd5b505afa15801562001ef1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f1791906200490a565b60408051918252602082018890528a15159082015230606082015242608082015260a00160405180910390a49998505050505050505050565b60606004805462000b79906200483f565b600060008051602062005b0c83398151915262001f7e8162002a63565b601d859055601e849055601f839055604080518681526020810186905290810184905242606082015233907ffb4739cbf78270c890b5ad2f418812e621fd0063a955081e78f87e50ecb65d77906080015b60405180910390a2506001949350505050565b60008051602062005b0c83398151915262001ffd8162002a63565b60005b8251811015620013d05762002031838281518110620020235762002023620048c0565b602002602001015162002252565b806200203d81620048ec565b91505062002000565b60003381620020568286620026ac565b905083811015620020b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000e0f565b62000ee4828686840362002942565b6000620020d362002a6f565b620020e033848462002b38565b9392505050565b600060008051602062005b0c833981519152620021048162002a63565b611388871115620021295760405162461bcd60e51b815260040162000e0f9062004a24565b600c805461ffff19168a151561ff001916176101008a151502179055600d879055600e80546001600160a01b0319166001600160a01b0388811691909117909155600f869055601080549186166001600160a81b031990921691909117600160a01b8515150217905542601155604051674665655472616e7360c01b81526008015b60405180910390207f0d2a3399263c99ba6a4f9d6d3adbfac6ed4fb0c99f9051245682d05e3166c7628a8a8a8a8a8a8a42604051620021f2989796959493929190620041a6565b60405180910390a250600198975050505050505050565b60005b815181101562001464576200223d8282815181106200222f576200222f620048c0565b6020026020010151620019ea565b806200224981620048ec565b9150506200220c565b60008051602062005b0c8339815191526200226d8162002a63565b816001600160a01b031663b6549f756040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620022a957600080fd5b505af1158015620022be573d6000803e3d6000fd5b505050505050565b60008151835114620022ec5760405162461bcd60e51b815260040162000e0f9062004876565b60005b835181101562000c12576200233d848281518110620023125762002312620048c0565b60200260200101518483815181106200232f576200232f620048c0565b6020026020010151620020c7565b620023865760405162461bcd60e51b81526020600482015260186024820152772127a9209d103330b4b632b2103a37903a3930b739b332b960411b604482015260640162000e0f565b806200239281620048ec565b915050620022ef565b600060008051602062005b0c833981519152620023b88162002a63565b611388871115620023dd5760405162461bcd60e51b815260040162000e0f9062004a24565b6012805461ffff19168a151561ff001916176101008a1515021790556013879055601480546001600160a01b0319166001600160a01b03888116919091179091556015869055601680549186166001600160a81b031990921691909117600160a01b851515021790554260175560405166119959535a5b9d60ca1b8152600701620021ab565b83421115620024b55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640162000e0f565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888620024e68c62003282565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006200254382620032a9565b905060006200255582878787620032fa565b9050896001600160a01b0316816001600160a01b031614620025ba5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640162000e0f565b620025c78a8a8a62002942565b50505050505050505050565b600082815260056020526040902060010154620025f08162002a63565b620013d0838362002e9a565b6000804283116200265f5760405162461bcd60e51b815260206004820152602660248201527f424f52413a20636865636b54696d65206973206265666f72652063757272656e604482015265742074696d6560d01b606482015260840162000e0f565b42836000620026726201518084620049c5565b90506000620026856201518084620049c5565b9050620026938282620049e8565b6200269f8585620049e8565b9550955050505050915091565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600060008051602062005b0c833981519152620026f48162002a63565b6022879055620027076023878762003fa1565b50620027166024858562003fa1565b506001979650505050505050565b600060008051602062005b0c833981519152620027418162002a63565b826009541015620027bb5760405162461bcd60e51b815260206004820152603e60248201527f424f52413a2054686520746f74616c537570706c79436170206d75737420626560448201527f2067726561746572207468616e2074686520746f74616c4d696e744361700000606482015260840162000e0f565b82620027c660025490565b11156200283c5760405162461bcd60e51b815260206004820152603d60248201527f424f52413a2054686520746f74616c537570706c79436170206d75737420626560448201527f2067726561746572207468616e2074686520746f74616c537570706c79000000606482015260840162000e0f565b600a8054908490556040516604d696e744361760cc1b8152339060070160408051918290038220878352602083018590524283830152905190917f23ef7e4139b396827aeefd39e91e3e909b18494e62782c16cfae15452872d544919081900360600190a35060019392505050565b620028b562002f04565b620028c08162001b31565b50620028cc8162003326565b50565b600060008051602062005b0c833981519152620028ec8162002a63565b60188590556019849055601a839055604080518681526020810186905290810184905242606082015233907fd8474aa6fa3fe9dd94aacda2d6c5ceb9ff8c562f516ba218dac052128137f32a9060800162001fcf565b6001600160a01b038316620029a65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000e0f565b6001600160a01b03821662002a095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000e0f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910162001cee565b620028cc8133620033a2565b60065460ff1615620014a45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000e0f565b600062002ac58484620026ac565b9050600019811462002b32578181101562002b235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640162000e0f565b62002b32848484840362002942565b50505050565b600062002b4462002a6f565b600c5460ff1662002b625762002b5c84848462003406565b62000c12565b604080516101008082018352600c5460ff80821615158452919004811615156020830152600d5492820192909252600e546001600160a01b039081166060830152600f54608083015260105490811660a0830152600160a01b9004909116151560c082015260115460e082015260009062002be0908487876200308b565b905062002bf38585836000015162003406565b60208101511562000ee45762002c13858260400151836020015162003406565b80606001511562000ee45780604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562002c5e57600080fd5b505af115801562002c73573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002c99919062004944565b62000ee45760405162461bcd60e51b815260206004820152601f60248201527f424f52413a206661696c656420746f2064697374726962757465206665657300604482015260640162000e0f565b62002cf3828262001d84565b620014645760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905562002d2d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000306001600160a01b037f00000000000000000000000094efe52d17983e6545180fa46d14f344372e180f1614801562002dcb57507f000000000000000000000000000000000000000000000000000000000000000146145b1562002df657507fe9f79403dcfbca56b2ac8cc8b0894367aad01053e683af6299edd5556e79fb7490565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f21a97734559f825e1d0bcdafb24c753ca0f4b2cf31e666d80951c55d7897b6c4828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b62002ea6828262001d84565b15620014645760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6006546001600160a01b03610100909104163314620014a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000e0f565b62002f70620035be565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216620030125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000e0f565b620030206000838362003609565b806002600082825462003034919062004964565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b604080516080810182526000808252602082018190529181018290526060810191909152845115620031be57846020015115620030fe57620030d284866040015162003702565b6020830152815260a08501516001600160a01b0316604082015260c08501511515606082015262000f15565b606085015160808601516040516341c7c70d60e11b8152600481018790526001600160a01b0386811660248301528581166044830152606482019290925291169063838f8e1a9060840160806040518083038186803b1580156200316157600080fd5b505afa15801562003176573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200319c919062004a69565b151560608501526001600160a01b031660408401526020830152815262000f15565b838152949350505050565b620028cc33826200373d565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620013d090849062003881565b6200323682338362002ab7565b6200146482826200373d565b6200324c62002a6f565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862002f9d3390565b6001600160a01b038116600090815260076020526040902080546001810182559062001042565b600062000b62620032b962002d71565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006200330d878787876200395a565b915091506200331c8162003a23565b5095945050505050565b6200333062002f04565b6001600160a01b038116620033975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000e0f565b620028cc8162003b84565b620033ae828262001d84565b6200146457620033be8162003bde565b620033cb83602062003bf1565b604051602001620033de92919062004ab9565b60408051601f198184030181529082905262461bcd60e51b825262000e0f91600401620040c6565b6001600160a01b0383166200346c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840162000e0f565b6001600160a01b038216620034d05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000e0f565b620034dd83838362003609565b6001600160a01b03831660009081526020819052604090205481811015620035575760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000e0f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362002b32565b60065460ff16620014a45760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640162000e0f565b6200361362002a6f565b826200362160003362001d84565b806200364657506001600160a01b0381166000908152600b602052604090205460ff16155b620036655760405162461bcd60e51b815260040162000e0f906200497f565b6001600160a01b0383161562002b325760006001600160a01b0385166200368e57601d62003691565b60185b8054909150831115620036f65760405162461bcd60e51b815260206004820152602660248201527f424f52413a206f6e652074696d65207472616e73666572206c696d697420657860448201526518d95959195960d21b606482015260840162000e0f565b62001a3b818462003dab565b6000808061271062003715858762004a02565b620037219190620049c5565b90506000620037318287620049e8565b96919550909350505050565b6001600160a01b0382166200379f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840162000e0f565b620037ad8260008362003609565b6001600160a01b03821660009081526020819052604090205481811015620038235760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840162000e0f565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000620038d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662003e639092919063ffffffff16565b805190915015620013d05780806020019051810190620038f9919062004944565b620013d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000e0f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111562003993575060009050600362003a1a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015620039e8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662003a135760006001925092505062003a1a565b9150600090505b94509492505050565b600081600481111562003a3a5762003a3a62004b32565b141562003a445750565b600181600481111562003a5b5762003a5b62004b32565b141562003aab5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640162000e0f565b600281600481111562003ac25762003ac262004b32565b141562003b125760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000e0f565b600381600481111562003b295762003b2962004b32565b1415620028cc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000e0f565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606062000b626001600160a01b03831660145b6060600062003c0283600262004a02565b62003c0f90600262004964565b67ffffffffffffffff81111562003c2a5762003c2a620041ec565b6040519080825280601f01601f19166020018201604052801562003c55576020820181803683370190505b509050600360fc1b8160008151811062003c735762003c73620048c0565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062003ca55762003ca5620048c0565b60200101906001600160f81b031916908160001a905350600062003ccb84600262004a02565b62003cd890600162004964565b90505b600181111562003d5a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062003d105762003d10620048c0565b1a60f81b82828151811062003d295762003d29620048c0565b60200101906001600160f81b031916908160001a90535060049490941c9362003d528162004b48565b905062003cdb565b508315620020e05760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000e0f565b600082600201544262003dbf9190620049c5565b90508083600301541462003ddc5760038301819055600060048401555b600082846004015462003df0919062004964565b9050836001015481111562003e565760405162461bcd60e51b815260206004820152602560248201527f424f52413a206f6e6520646179207472616e73666572206c696d697420657863604482015264195959195960da1b606482015260840162000e0f565b6004909301929092555050565b606062000f15848460008585600080866001600160a01b0316858760405162003e8d919062004b62565b60006040518083038185875af1925050503d806000811462003ecc576040519150601f19603f3d011682016040523d82523d6000602084013e62003ed1565b606091505b509150915062003ee48783838762003eef565b979650505050505050565b6060831562003f6057825162003f58576001600160a01b0385163b62003f585760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000e0f565b508162000f15565b62000f15838381511562003f775781518083602001fd5b8060405162461bcd60e51b815260040162000e0f9190620040c6565b610f8b8062004b8183390190565b82805462003faf906200483f565b90600052602060002090601f01602090048101928262003fd357600085556200401e565b82601f1062003fee5782800160ff198235161785556200401e565b828001600101855582156200401e579182015b828111156200401e57823582559160200191906001019062004001565b5062001d809291505b8082111562001d80576000815560010162004027565b6000602082840312156200405057600080fd5b81356001600160e01b031981168114620020e057600080fd5b60005b83811015620040865781810151838201526020016200406c565b8381111562002b325750506000910152565b60008151808452620040b281602086016020860162004069565b601f01601f19169290920160200192915050565b602081526000620020e0602083018462004098565b6001600160a01b0381168114620028cc57600080fd5b600080604083850312156200410557600080fd5b82356200411281620040db565b946020939093013593505050565b8015158114620028cc57600080fd5b600080604083850312156200414357600080fd5b82356200415081620040db565b91506020830135620041628162004120565b809150509250929050565b83815260606020820152600062004188606083018562004098565b82810360408401526200419c818562004098565b9695505050505050565b9715158852951515602088015260408701949094526001600160a01b03928316606087015260808601919091521660a0840152151560c083015260e08201526101000190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156200422e576200422e620041ec565b604052919050565b600067ffffffffffffffff821115620042535762004253620041ec565b5060051b60200190565b600082601f8301126200426f57600080fd5b8135602062004288620042828362004236565b62004202565b82815260059290921b84018101918181019086841115620042a857600080fd5b8286015b84811015620042d0578035620042c281620040db565b8352918301918301620042ac565b509695505050505050565b600082601f830112620042ed57600080fd5b8135602062004300620042828362004236565b82815260059290921b840181019181810190868411156200432057600080fd5b8286015b84811015620042d0578035835291830191830162004324565b6000806000606084860312156200435357600080fd5b833567ffffffffffffffff808211156200436c57600080fd5b6200437a878388016200425d565b945060208601359150808211156200439157600080fd5b6200439f878388016200425d565b93506040860135915080821115620043b657600080fd5b50620043c586828701620042db565b9150509250925092565b600080600060608486031215620043e557600080fd5b8335620043f281620040db565b925060208401356200440481620040db565b929592945050506040919091013590565b6000602082840312156200442857600080fd5b5035919050565b6000602082840312156200444257600080fd5b8135620020e081620040db565b600080604083850312156200446357600080fd5b8235915060208301356200416281620040db565b600080604083850312156200448b57600080fd5b50508035926020909101359150565b60008060008060008060c08789031215620044b457600080fd5b8635620044c181620040db565b95506020870135620044d381620040db565b945060408701359350606087013592506080870135915060a0870135620044fa8162004120565b809150509295509295509295565b6000806000606084860312156200451e57600080fd5b505081359360208301359350604090920135919050565b600060208083850312156200454957600080fd5b823567ffffffffffffffff8111156200456157600080fd5b8301601f810185136200457357600080fd5b803562004584620042828262004236565b81815260059190911b82018301908381019087831115620045a457600080fd5b928401925b8284101562003ee4578335620045bf81620040db565b82529284019290840190620045a9565b600080600080600080600060e0888a031215620045eb57600080fd5b8735620045f88162004120565b965060208801356200460a8162004120565b95506040880135945060608801356200462381620040db565b93506080880135925060a08801356200463c81620040db565b915060c08801356200464e8162004120565b8091505092959891949750929550565b600080604083850312156200467257600080fd5b823567ffffffffffffffff808211156200468b57600080fd5b62004699868387016200425d565b93506020850135915080821115620046b057600080fd5b50620046bf85828601620042db565b9150509250929050565b600080600080600080600060e0888a031215620046e557600080fd5b8735620046f281620040db565b965060208801356200470481620040db565b95506040880135945060608801359350608088013560ff811681146200472957600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156200475a57600080fd5b82356200476781620040db565b915060208301356200416281620040db565b60008083601f8401126200478c57600080fd5b50813567ffffffffffffffff811115620047a557600080fd5b602083019150836020828501011115620019e357600080fd5b600080600080600060608688031215620047d757600080fd5b85359450602086013567ffffffffffffffff80821115620047f757600080fd5b6200480589838a0162004779565b909650945060408801359150808211156200481f57600080fd5b506200482e8882890162004779565b969995985093965092949392505050565b600181811c908216806200485457607f821691505b602082108114156200104257634e487b7160e01b600052602260045260246000fd5b6020808252602a908201527f424f52413a20496e70757420617272617973206d7573742062652074686520736040820152690c2daca40d8cadccee8d60b31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620049035762004903620048d6565b5060010190565b6000602082840312156200491d57600080fd5b5051919050565b6000602082840312156200493757600080fd5b8151620020e081620040db565b6000602082840312156200495757600080fd5b8151620020e08162004120565b600082198211156200497a576200497a620048d6565b500190565b60208082526026908201527f424f52413a2041646472657373206973206120626c61636b6c6973746564206160408201526564647265737360d01b606082015260800190565b600082620049e357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015620049fd57620049fd620048d6565b500390565b600081600019048311821515161562004a1f5762004a1f620048d6565b500290565b60208082526025908201527f424f52413a20436865636b20612066656520726174696f2028307e353030302c604082015264203530252960d81b606082015260800190565b6000806000806080858703121562004a8057600080fd5b8451935060208501519250604085015162004a9b81620040db565b606086015190925062004aae8162004120565b939692955090935050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835162004af381601785016020880162004069565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162004b2681602884016020880162004069565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b60008162004b5a5762004b5a620048d6565b506000190190565b6000825162004b7681846020870162004069565b919091019291505056fe6101206040523480156200001257600080fd5b5060405162000f8b38038062000f8b83398101604081905262000035916200022b565b6001600160a01b0385166200009c5760405162461bcd60e51b815260206004820152602260248201527f4c6f636b6564546f6b656e3a20646f6e6f72206973207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b038416620001055760405162461bcd60e51b815260206004820152602860248201527f4c6f636b6564546f6b656e3a2062656e6566696369617279206973207a65726f604482015267206164647265737360c01b606482015260840162000093565b6001600160a01b038116620001695760405162461bcd60e51b815260206004820152602360248201527f4c6f636b6564546f6b656e3a2073797374656d206973207a65726f206164647260448201526265737360e81b606482015260840162000093565b428311620001d35760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2072656c656173652074696d652069732062656660448201526f6f72652063757272656e742074696d6560801b606482015260840162000093565b600080546001600160a01b0319166001600160a01b0397881617905593851660805291841660a05260c052151560e0521661010052620002a9565b80516001600160a01b03811681146200022657600080fd5b919050565b60008060008060008060c087890312156200024557600080fd5b62000250876200020e565b955062000260602088016200020e565b945062000270604088016200020e565b935060608701519250608087015180151581146200028d57600080fd5b91506200029d60a088016200020e565b90509295509295509295565b60805160a05160c05160e05161010051610c3d6200034e600039600081816101ae0152818161054e01526106ac015260008181610177015281816104bc01526105f60152600081816101dd01528181610212015281816103dc015261049a01526000818160ec0152818161037e015281816103b1015261047801526000818160a8015281816104560152818161067a0152818161080c015261083f0152610c3d6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063872a781011610066578063872a78101461017257806395bf75fd146101a9578063b6549f75146101d0578063b91d4001146101d8578063fc0c546a146101ff57600080fd5b806325223bd4146100a357806338af3eed146100e75780634e71d92d1461010e5780635a9b0b8914610118578063722713f71461015c575b600080fd5b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b610116610210565b005b610120610433565b604080516001600160a01b03978816815295871660208701528501939093529015156060840152608083015290911660a082015260c0016100de565b610164610573565b6040519081526020016100de565b6101997f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016100de565b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b6101166105f4565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03166100ca565b7f000000000000000000000000000000000000000000000000000000000000000042101561029e5760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2063757272656e742074696d652069732062656660448201526f6f72652072656c656173652074696d6560801b60648201526084015b60405180910390fd5b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156102e257600080fd5b505afa1580156102f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031a9190610b46565b90506000811161036c5760405162461bcd60e51b815260206004820152601f60248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f20636c61696d006044820152606401610295565b6000546103a3906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000083610890565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602081018390527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7906060015b60405180910390a150565b600080546040516370a0823160e01b8152306004820152829182918291829182917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b0316906370a082319060240160206040518083038186803b15801561050757600080fd5b505afa15801561051b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053f9190610b46565b939a92995090975095509093507f000000000000000000000000000000000000000000000000000000000000000092509050565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156105b757600080fd5b505afa1580156105cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ef9190610b46565b905090565b7f000000000000000000000000000000000000000000000000000000000000000061066f5760405162461bcd60e51b815260206004820152602560248201527f4c6f636b6564546f6b656e3a20746f6b656e7320617265206e6f74207265766f6044820152646361626c6560d81b6064820152608401610295565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806106ce5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61072c5760405162461bcd60e51b815260206004820152602960248201527f4c6f636b6564546f6b656e3a206f6e6c7920646f6e6f727c73797374656d2063604482015268616e207265766f6b6560b81b6064820152608401610295565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561077057600080fd5b505afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190610b46565b9050600081116107fa5760405162461bcd60e51b815260206004820181905260248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f207265766f6b656044820152606401610295565b600054610831906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000083610890565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602081018390527fec9ab91322523c899ede7830ec9bfc992b5981cdcc27b91162fb23de5791117b9101610428565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526108e29084906108e7565b505050565b600061093c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166109b99092919063ffffffff16565b8051909150156108e2578080602001905181019061095a9190610b5f565b6108e25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610295565b60606109c884846000856109d0565b949350505050565b606082471015610a315760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610295565b600080866001600160a01b03168587604051610a4d9190610bb8565b60006040518083038185875af1925050503d8060008114610a8a576040519150601f19603f3d011682016040523d82523d6000602084013e610a8f565b606091505b5091509150610aa087838387610aab565b979650505050505050565b60608315610b17578251610b10576001600160a01b0385163b610b105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610295565b50816109c8565b6109c88383815115610b2c5781518083602001fd5b8060405162461bcd60e51b81526004016102959190610bd4565b600060208284031215610b5857600080fd5b5051919050565b600060208284031215610b7157600080fd5b81518015158114610b8157600080fd5b9392505050565b60005b83811015610ba3578181015183820152602001610b8b565b83811115610bb2576000848401525b50505050565b60008251610bca818460208701610b88565b9190910192915050565b6020815260008251806020840152610bf3816040850160208701610b88565b601f01601f1916919091016040019291505056fea2646970667358221220de33ae19240ac22a4bf4e2b47e7d536b460907b4c5673b5f3c9a5511ba979dbc64736f6c634300080900335719df9ef2c4678b547f89e4f5ae410dbf400fc51cf3ded434c55f6adea2c43f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a657d7aaba7c816a29cd10263482a5d2a41b847dfc3f44d5ae8dd46bf5d6dfac46a2646970667358221220c23bfa35b6c369c0fb3208d2e9524c9b1a79c602a712847eeb755675609b671464736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047de48f000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000565424f5241000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000565424f5241000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 0
Arg [1] : initialTotalSupplyCap (uint256): 1205750000
Arg [2] : initialTotalMintCap (uint256): 2500000
Arg [3] : name (string): eBORA
Arg [4] : symbol (string): eBORA

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000047de48f0
Arg [2] : 00000000000000000000000000000000000000000000000000000000002625a0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 65424f5241000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 65424f5241000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

90334:24271:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81499:204;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;81499:204:0;;;;;;;;102080:93;102152:13;;102080:93;;;643:25:1;;;631:2;616:18;102080:93:0;497:177:1;54888:100:0;;;:::i;:::-;;;;;;;:::i;57239:201::-;;;;;;:::i;:::-;;:::i;107079:254::-;;;;;;:::i;:::-;;:::i;92484:32::-;;;:::i;:::-;;;;;;;;;:::i;56008:108::-;56096:12;;56008:108;;91817:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;91817:29:0;;;;;;;;;;-1:-1:-1;;;91817:29:0;;;;;;;;;;;;;;;;;;;;;;;:::i;104018:468::-;;;;;;:::i;:::-;;:::i;96834:223::-;;;;;;:::i;:::-;;:::i;83322:131::-;;;;;;:::i;:::-;83396:7;83423:12;;;:6;:12;;;;;:22;;;;83322:131;92331:30;;;;;;;;;;;;;;;;;;;;;;;7547:25:1;;;7603:2;7588:18;;7581:34;;;;7631:18;;;7624:34;;;;7689:2;7674:18;;7667:34;7732:3;7717:19;;7710:35;7534:3;7519:19;92331:30:0;7288:463:1;112303:462:0;;;;;;:::i;:::-;;:::i;103165:406::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8645:15:1;;;8627:34;;8697:15;;;8692:2;8677:18;;8670:43;8749:15;;;;8729:18;;;8722:43;;;;8796:2;8781:18;;8774:34;;;;8852:14;8845:22;8839:3;8824:19;;8817:51;8607:3;8884:19;;8877:35;8943:3;8928:19;;8921:35;;;;8576:3;8561:19;103165:406:0;8280:682:1;83763:147:0;;;;;;:::i;:::-;;:::i;:::-;;91853:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;91853:28:0;;;;;;;;;;-1:-1:-1;;;91853:28:0;;;;;;;;;55850:93;;;55933:2;9429:36:1;;9417:2;9402:18;55850:93:0;9287:184:1;68895:115:0;;;:::i;84907:218::-;;;;;;:::i;:::-;;:::i;58724:238::-;;;;;;:::i;:::-;;:::i;95332:65::-;;;:::i;97065:1181::-;;;;;;:::i;:::-;;:::i;98254:204::-;;;;;;:::i;:::-;;:::i;111129:297::-;;;;;;:::i;:::-;;:::i;102624:363::-;;;;;;:::i;:::-;;:::i;:::-;;;;10088:25:1;;;10144:2;10129:18;;10122:34;;;;10061:18;102624:363:0;9914:248:1;72199:86:0;72270:7;;;;72199:86;;105153:92;;;;;;:::i;:::-;;:::i;111434:261::-;;;;;;:::i;:::-;;:::i;90672:58::-;;90708:22;90672:58;;111703:457;;;;;;:::i;:::-;;:::i;56179:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;56280:18:0;56253:7;56280:18;;;;;;;;;;;;56179:127;112935:124;;;:::i;90534:62::-;;-1:-1:-1;;;;;;;;;;;90534:62:0;;98466:238;;;;;;:::i;:::-;;:::i;102995:162::-;;;;;;:::i;:::-;;:::i;:::-;;;;10369:25:1;;;10425:2;10410:18;;10403:34;;;;10453:18;;;10446:34;10357:2;10342:18;102995:162:0;10167:319:1;68637:128:0;;;;;;:::i;:::-;;:::i;95263:61::-;;;:::i;112168:127::-;;;:::i;74416:87::-;74489:6;;;;;-1:-1:-1;;;;;74489:6:0;74416:87;;;-1:-1:-1;;;;;10655:32:1;;;10637:51;;10625:2;10610:18;74416:87:0;10491:203:1;81795:147:0;;;;;;:::i;:::-;;:::i;104494:651::-;;;;;;:::i;:::-;;:::i;55107:104::-;;;:::i;105858:437::-;;;;;;:::i;:::-;;:::i;80900:49::-;;80945:4;80900:49;;105578:217;;;;;;:::i;:::-;;:::i;59465:436::-;;;;;;:::i;:::-;;:::i;96667:159::-;;;;;;:::i;:::-;;:::i;108304:1383::-;;;;;;:::i;:::-;;:::i;92290:34::-;;;;;;;;;;;;;;;;;;;105253:193;;;;;;:::i;:::-;;:::i;90605:60::-;;90642:23;90605:60;;101975:97;102049:15;;101975:97;;105454:116;;;;;;:::i;:::-;;:::i;103624:386::-;;;;;;:::i;:::-;;:::i;109695:1370::-;;;;;;:::i;:::-;;:::i;67926:645::-;;;;;;:::i;:::-;;:::i;90465:62::-;;-1:-1:-1;;;;;;;;;;;90465:62:0;;84203:149;;;;;;:::i;:::-;;:::i;102181:435::-;;;;;;:::i;:::-;;:::i;56768:151::-;;;;;;:::i;:::-;;:::i;106768:303::-;;;;;;:::i;:::-;;:::i;107774:522::-;;;;;;:::i;:::-;;:::i;112773:154::-;;;;;;:::i;:::-;;:::i;106303:457::-;;;;;;:::i;:::-;;:::i;101855:112::-;;;;;;:::i;:::-;-1:-1:-1;;;;;101940:19:0;101916:4;101940:19;;;:10;:19;;;;;;;;;101855:112;81499:204;81584:4;-1:-1:-1;;;;;;81608:47:0;;-1:-1:-1;;;81608:47:0;;:87;;-1:-1:-1;;;;;;;;;;23202:40:0;;;81659:36;81601:94;81499:204;-1:-1:-1;;81499:204:0:o;54888:100::-;54942:13;54975:5;54968:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54888:100;:::o;57239:201::-;57322:4;52610:10;57378:32;52610:10;57394:7;57403:6;57378:8;:32::i;:::-;-1:-1:-1;57428:4:0;;57239:201;-1:-1:-1;;;57239:201:0:o;107079:254::-;107178:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;-1:-1:-1;;;;;107195:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;;:35;;-1:-1:-1;;107195:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;107246:57;;17439:41:1;;;107287:15:0::1;17496:18:1::0;;;17489:34;;;;107246:57:0::1;::::0;17412:18:1;107246:57:0::1;;;;;;;-1:-1:-1::0;107321:4:0::1;::::0;107079:254;-1:-1:-1;;;107079:254:0:o;92484:32::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;104018:468::-;104142:4;104185:10;:17;104167:7;:14;:35;:73;;;;;104227:6;:13;104206:10;:17;:34;104167:73;104159:128;;;;-1:-1:-1;;;104159:128:0;;;;;;;:::i;:::-;;;;;;;;;104303:9;104298:159;104322:7;:14;104318:1;:18;104298:159;;;104366:50;104379:7;104387:1;104379:10;;;;;;;;:::i;:::-;;;;;;;104391;104402:1;104391:13;;;;;;;;:::i;:::-;;;;;;;104406:6;104413:1;104406:9;;;;;;;;:::i;:::-;;;;;;;104366:12;:50::i;:::-;104358:87;;;;-1:-1:-1;;;104358:87:0;;18279:2:1;104358:87:0;;;18261:21:1;18318:2;18298:18;;;18291:30;-1:-1:-1;;;18337:18:1;;;18330:54;18401:18;;104358:87:0;18077:348:1;104358:87:0;104338:3;;;;:::i;:::-;;;;104298:159;;;-1:-1:-1;104474:4:0;;104018:468;-1:-1:-1;;;;104018:468:0:o;96834:223::-;96937:4;71804:19;:17;:19::i;:::-;96954:43:::1;96970:4:::0;52610:10;96990:6:::1;96954:15;:43::i;:::-;97015:34;97032:4;97038:2;97042:6;97015:16;:34::i;:::-;97008:41:::0;96834:223;-1:-1:-1;;;;96834:223:0:o;112303:462::-;112387:4;;81391:16;112387:4;81391:10;:16::i;:::-;74489:6;;-1:-1:-1;;;;;112412:19:0;;::::1;74489:6:::0;;;;;112412:19:::1;;112404:66;;;::::0;-1:-1:-1;;;112404:66:0;;18904:2:1;112404:66:0::1;::::0;::::1;18886:21:1::0;18943:2;18923:18;;;18916:30;18982:34;18962:18;;;18955:62;-1:-1:-1;;;19033:18:1;;;19026:32;19075:19;;112404:66:0::1;18702:398:1::0;112404:66:0::1;112481:33;-1:-1:-1::0;;;;;;;;;;;112505:8:0::1;112481:10;:33::i;:::-;112549;-1:-1:-1::0;;;;;;;;;;;112573:8:0::1;112549:10;:33::i;:::-;112603:40;80945:4;112634:8:::0;112603:10:::1;:40::i;:::-;112668:67;::::0;-1:-1:-1;;;19307:26:1;;-1:-1:-1;;;;;112668:67:0;::::1;::::0;52610:10;;19358:2:1;19349:12;112668:67:0::1;;::::0;;;;::::1;::::0;;112719:15:::1;643:25:1::0;;112668:67:0;::::1;::::0;631:2:1;616:18;112668:67:0::1;;;;;;;112753:4;112746:11;;81418:1;112303:462:::0;;;;:::o;103165:406::-;103235:7;103244;103253;103262;103271:4;103277:7;103286;103306:16;103348:38;103361:10;-1:-1:-1;;;;;103361:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;103348:38::-;103333:53;;;;;103413:10;-1:-1:-1;;;;;103413:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;103434:10;-1:-1:-1;;;;;103434:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;103454:10;-1:-1:-1;;;;;103454:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;103480:10;-1:-1:-1;;;;;103480:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;103506:10;-1:-1:-1;;;;;103506:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;103530:10;-1:-1:-1;;;;;103530:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;103397:166;;;;-1:-1:-1;103397:166:0;;-1:-1:-1;103397:166:0;-1:-1:-1;103397:166:0;-1:-1:-1;103397:166:0;;-1:-1:-1;103554:8:0;;-1:-1:-1;103165:406:0;-1:-1:-1;;103165:406:0:o;83763:147::-;83396:7;83423:12;;;:6;:12;;;;;:22;;;81391:16;81402:4;81391:10;:16::i;:::-;83877:25:::1;83888:4;83894:7;83877:10;:25::i;:::-;83763:147:::0;;;:::o;68895:115::-;68955:7;68982:20;:18;:20::i;:::-;68975:27;;68895:115;:::o;84907:218::-;-1:-1:-1;;;;;85003:23:0;;52610:10;85003:23;84995:83;;;;-1:-1:-1;;;84995:83:0;;20539:2:1;84995:83:0;;;20521:21:1;20578:2;20558:18;;;20551:30;20617:34;20597:18;;;20590:62;-1:-1:-1;;;20668:18:1;;;20661:45;20723:19;;84995:83:0;20337:411:1;84995:83:0;85091:26;85103:4;85109:7;85091:11;:26::i;:::-;84907:218;;:::o;58724:238::-;58812:4;52610:10;58868:64;52610:10;58884:7;58921:10;58893:25;52610:10;58884:7;58893:9;:25::i;:::-;:38;;;;:::i;:::-;58868:8;:64::i;95332:65::-;74302:13;:11;:13::i;:::-;95379:10:::1;:8;:10::i;:::-;95332:65::o:0;97065:1181::-;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;97153:2;113172:39:::1;80945:4;113200:10;113172:7;:39::i;:::-;:67;;;-1:-1:-1::0;;;;;;101940:19:0;;101916:4;101940:19;;;:10;:19;;;;;;;;113215:24:::1;113172:67;113164:118;;;;-1:-1:-1::0;;;113164:118:0::1;;;;;;;:::i;:::-;102049:15:::0;;97192:6:::2;97176:13;56096:12:::0;;;56008:108;97176:13:::2;:22;;;;:::i;:::-;:42;;97168:84;;;::::0;-1:-1:-1;;;97168:84:0;;21495:2:1;97168:84:0::2;::::0;::::2;21477:21:1::0;21534:2;21514:18;;;21507:30;21573:31;21553:18;;;21546:59;21622:18;;97168:84:0::2;21293:353:1::0;97168:84:0::2;102152:13:::0;;97314:6:::2;97298:13;56096:12:::0;;;56008:108;97298:13:::2;:22;;;;:::i;:::-;:40;;97290:80;;;::::0;-1:-1:-1;;;97290:80:0;;21853:2:1;97290:80:0::2;::::0;::::2;21835:21:1::0;21892:2;21872:18;;;21865:30;21931:29;21911:18;;;21904:57;21978:18;;97290:80:0::2;21651:351:1::0;97290:80:0::2;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97479:11:0::2;:17:::0;97446:15:::2;::::0;97479:17:::2;;97474:678;;97558:24:::0;;;97597:26:::2;97603:2:::0;97576:6;97597:5:::2;:26::i;:::-;97474:678;;;97667:59;::::0;;::::2;::::0;;::::2;::::0;;97688:11:::2;97667:59:::0;::::2;::::0;;::::2;;;::::0;;;;::::2;::::0;::::2;;;;::::0;::::2;::::0;;;;;;;;;;;;-1:-1:-1;;;;;97667:59:0;;::::2;::::0;;;;;;;;;;;;;;::::2;::::0;;;;-1:-1:-1;;;97667:59:0;::::2;::::0;;::::2;;;::::0;;;;;;;;;;::::2;::::0;97701:6;52610:10;97723:2:::2;97667:20;:59::i;:::-;97656:70;;97741:26;97747:2;97751:8;:15;;;97741:5;:26::i;:::-;97788:12;::::0;::::2;::::0;:16;97784:357:::2;;97825:41;97831:8;:20;;;97853:8;:12;;;97825:5;:41::i;:::-;97912:8;:20;;;-1:-1:-1::0;;;;;97890:86:0::2;;;;;-1:-1:-1::0;;;22209:19:1;;22253:1;22244:11;;22007:254;97890:86:0::2;;;;;;;;-1:-1:-1::0;;;;;;;;;;;97934:8:0::2;:12;;;97948:13;56096:12:::0;;;56008:108;97948:13:::2;97890:86;::::0;;10369:25:1;;;10425:2;10410:18;;10403:34;;;;10453:18;;10446:34;;;10357:2;10342:18;97890:86:0::2;;;;;;;97999:8;:22;;;97995:131;;;98068:8;:20;;;-1:-1:-1::0;;;;;98046:58:0::2;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;97995:131;98167:71;::::0;-1:-1:-1;;;22209:19:1;;-1:-1:-1;;;;;98167:71:0;::::2;::::0;22253:1:1;22244:11;98167:71:0::2;;;;;;;-1:-1:-1::0;;;;;;;;;;;98193:8:0::2;:15;;;98210:13;56096:12:::0;;;56008:108;98210:13:::2;98167:71;::::0;;10369:25:1;;;10425:2;10410:18;;10403:34;;;;10453:18;;10446:34;;;10357:2;10342:18;98167:71:0::2;;;;;;;97157:1089;;81418:1:::1;97065:1181:::0;;;:::o;98254:204::-;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;98333:26:::1;98352:6;98333:18;:26::i;:::-;98375:75;::::0;-1:-1:-1;;;22468:19:1;;52610:10:0;;22512:1:1;22503:11;98375:75:0::1;;;;;;;-1:-1:-1::0;;;;;;;;;;;98411:6:0::1;98419:13;56096:12:::0;;;56008:108;98419:13:::1;98375:75;::::0;;10369:25:1;;;10425:2;10410:18;;10403:34;;;;98434:15:0::1;10453:18:1::0;;;10446:34;10357:2;10342:18;98375:75:0::1;;;;;;;98254:204:::0;;:::o;111129:297::-;111230:4;74302:13;:11;:13::i;:::-;74489:6;;111247:57:::1;::::0;74489:6;;;-1:-1:-1;;;;;74489:6:0;-1:-1:-1;;;;;111247:34:0;::::1;::::0;111291:12;111247:34:::1;:57::i;:::-;52610:10:::0;111320:76:::1;::::0;;10088:25:1;;;111380:15:0::1;10144:2:1::0;10129:18;;10122:34;-1:-1:-1;;;;;111320:76:0;;::::1;::::0;;::::1;::::0;::::1;::::0;10061:18:1;111320:76:0::1;;;;;;;-1:-1:-1::0;111414:4:0::1;111129:297:::0;;;;:::o;102624:363::-;102712:7;102721;102764:11;102749;:26;;102741:78;;;;-1:-1:-1;;;102741:78:0;;22727:2:1;102741:78:0;;;22709:21:1;22766:2;22746:18;;;22739:30;22805:34;22785:18;;;22778:62;-1:-1:-1;;;22856:18:1;;;22849:37;22903:19;;102741:78:0;22525:403:1;102741:78:0;102830:15;102848:19;102862:5;102848:11;:19;:::i;:::-;102830:37;-1:-1:-1;102878:15:0;102896:19;102910:5;102896:11;:19;:::i;:::-;102878:37;-1:-1:-1;102934:17:0;102944:7;102878:37;102934:17;:::i;:::-;102953:25;102967:11;102953;:25;:::i;:::-;102926:53;;;;;;102624:363;;;;;;:::o;105153:92::-;105219:10;-1:-1:-1;;;;;105219:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105153:92;:::o;111434:261::-;111518:4;74302:13;:11;:13::i;:::-;111579:46:::1;::::0;-1:-1:-1;;;111579:46:0;;111619:4:::1;111579:46;::::0;::::1;10637:51:1::0;111543:83:0::1;::::0;111564:13;;-1:-1:-1;;;;;111579:31:0;::::1;::::0;::::1;::::0;10610:18:1;;111579:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;111543:83::-;111535:130;;;::::0;-1:-1:-1;;;111535:130:0;;23487:2:1;111535:130:0::1;::::0;::::1;23469:21:1::0;23526:2;23506:18;;;23499:30;23565:34;23545:18;;;23538:62;-1:-1:-1;;;23616:18:1;;;23609:32;23658:19;;111535:130:0::1;23285:398:1::0;111535:130:0::1;-1:-1:-1::0;111683:4:0::1;111434:261:::0;;;:::o;111703:457::-;111784:4;;81391:16;111784:4;81391:10;:16::i;:::-;-1:-1:-1;;;;;111809:22:0;::::1;111801:70;;;::::0;-1:-1:-1;;;111801:70:0;;23890:2:1;111801:70:0::1;::::0;::::1;23872:21:1::0;23929:2;23909:18;;;23902:30;23968:34;23948:18;;;23941:62;-1:-1:-1;;;24019:18:1;;;24012:33;24062:19;;111801:70:0::1;23688:399:1::0;111801:70:0::1;111882:39;80945:4;111912:8:::0;111882:9:::1;:39::i;:::-;111941:32;-1:-1:-1::0;;;;;;;;;;;111964:8:0::1;111941:9;:32::i;:::-;112008;-1:-1:-1::0;;;;;;;;;;;112031:8:0::1;112008:9;:32::i;:::-;112066:64;::::0;-1:-1:-1;;;24294:23:1;;-1:-1:-1;;;;;112066:64:0;::::1;::::0;52610:10;;24342:1:1;24333:11;112066:64:0::1;24092:258:1::0;112935:124:0;74302:13;:11;:13::i;:::-;113006:45:::1;::::0;-1:-1:-1;;;113006:45:0;;24557:2:1;113006:45:0::1;::::0;::::1;24539:21:1::0;24596:2;24576:18;;;24569:30;24635:34;24615:18;;;24608:62;-1:-1:-1;;;24686:18:1;;;24679:33;24729:19;;113006:45:0::1;24355:399:1::0;98466:238:0;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;98566:39:::1;98589:7;98598:6;98566:22;:39::i;:::-;98621:75;::::0;-1:-1:-1;;;24961:24:1;;-1:-1:-1;;;;;98621:75:0;::::1;::::0;25010:1:1;25001:11;98621:75:0::1;;;;;;;-1:-1:-1::0;;;;;;;;;;;98657:6:0::1;98665:13;56096:12:::0;;;56008:108;98665:13:::1;98621:75;::::0;;10369:25:1;;;10425:2;10410:18;;10403:34;;;;98680:15:0::1;10453:18:1::0;;;10446:34;10357:2;10342:18;98621:75:0::1;;;;;;;;98466:238:::0;;;:::o;102995:162::-;103059:7;;;103105:6;103113:16;103105:6;103122:7;103113:16;:::i;:::-;103131:17;:6;103140:8;103131:17;:::i;:::-;103097:52;;;;;;102995:162;;;;;:::o;68637:128::-;-1:-1:-1;;;;;68733:14:0;;68706:7;68733:14;;;:7;:14;;;;;933;68733:24;841:114;95263:61;74302:13;:11;:13::i;:::-;95308:8:::1;:6;:8::i;112168:127::-:0;112238:4;;81391:16;112238:4;81391:10;:16::i;:::-;112262:25:::1;52610:10:::0;112303:462;:::i;112262:25::-:1;112255:32;;81418:1;112168:127:::0;;:::o;81795:147::-;81881:4;81905:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;81905:29:0;;;;;;;;;;;;;;;81795:147::o;104494:651::-;104665:11;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;104689:19:::1;104730:25;104742:13:::0;104730:9;:25:::1;:::i;:::-;104711:45;::::0;:15:::1;:45;:::i;:::-;104689:67;;104767:23;104817:4;104824:6;104832:12;104846:11;104859:10;104879:4;104793:92;;;;;:::i;:::-;-1:-1:-1::0;;;;;25533:15:1;;;25515:34;;25585:15;;;25580:2;25565:18;;25558:43;25637:15;;;25632:2;25617:18;;25610:43;25684:2;25669:18;;25662:34;;;;25740:14;25733:22;25727:3;25712:19;;25705:51;25793:15;;;25495:3;25772:19;;25765:44;25464:3;25449:19;104793:92:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;104767:118:0;-1:-1:-1;104896:61:0::1;52610:10:::0;104935:11:::1;104949:7;104896:16;:61::i;:::-;;105013:12;-1:-1:-1::0;;;;;104973:135:0::1;105005:6;-1:-1:-1::0;;;;;104973:135:0::1;104991:11;-1:-1:-1::0;;;;;104973:135:0::1;;105027:11;-1:-1:-1::0;;;;;105027:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104973:135;::::0;;26073:25:1;;;26129:2;26114:18;;26107:34;;;26184:14;;26177:22;26157:18;;;26150:50;105085:4:0::1;26231:2:1::0;26216:18;;26209:60;105092:15:0::1;26300:3:1::0;26285:19;;26278:35;26060:3;26045:19;104973:135:0::1;;;;;;;105126:11:::0;104494:651;-1:-1:-1;;;;;;;;;104494:651:0:o;55107:104::-;55163:13;55196:7;55189:14;;;;;:::i;105858:437::-;105993:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;106010:8:::1;:45:::0;;;106066:24;:43;;;106120:19;:33;;;106169:96:::1;::::0;;26555:25:1;;;26611:2;26596:18;;26589:34;;;26639:18;;;26632:34;;;106249:15:0::1;26697:2:1::0;26682:18;;26675:34;52610:10:0;;106169:96:::1;::::0;26542:3:1;26527:19;106169:96:0::1;;;;;;;;-1:-1:-1::0;106283:4:0::1;::::0;105858:437;-1:-1:-1;;;;105858:437:0:o;105578:217::-;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;105688:9:::1;105683:105;105707:10;:17;105703:1;:21;105683:105;;;105746:30;105762:10;105773:1;105762:13;;;;;;;;:::i;:::-;;;;;;;105746:15;:30::i;:::-;105726:3:::0;::::1;::::0;::::1;:::i;:::-;;;;105683:105;;59465:436:::0;59558:4;52610:10;59558:4;59641:25;52610:10;59658:7;59641:9;:25::i;:::-;59614:52;;59705:15;59685:16;:35;;59677:85;;;;-1:-1:-1;;;59677:85:0;;26922:2:1;59677:85:0;;;26904:21:1;26961:2;26941:18;;;26934:30;27000:34;26980:18;;;26973:62;-1:-1:-1;;;27051:18:1;;;27044:35;27096:19;;59677:85:0;26720:401:1;59677:85:0;59798:60;59807:5;59814:7;59842:15;59823:16;:34;59798:8;:60::i;96667:159::-;96752:4;71804:19;:17;:19::i;:::-;96776:42:::1;52610:10:::0;96807:2:::1;96811:6;96776:16;:42::i;:::-;96769:49:::0;96667:159;-1:-1:-1;;;96667:159:0:o;108304:1383::-;108530:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;108568:4:::1;108555:9;:17;;108547:67;;;;-1:-1:-1::0;;;108547:67:0::1;;;;;;;:::i;:::-;108625:12;:27:::0;;-1:-1:-1;;108700:41:0;108625:27;::::1;;-1:-1:-1::0;;108700:41:0;;108625:27:::1;108700:41:::0;::::1;;;;::::0;;108818:21;:33;;;108949:27;:45;;-1:-1:-1;;;;;;108949:45:0::1;-1:-1:-1::0;;;;;108949:45:0;;::::1;::::0;;;::::1;::::0;;;109065:29;:49;;;109181:24;:39;;;;::::1;-1:-1:-1::0;;;;;;109270:59:0;;;;;;;-1:-1:-1;;;109270:59:0;::::1;;;;::::0;;109475:15:::1;109448:24:::0;:42;109506:151:::1;::::0;-1:-1:-1;;;27734:23:1;;27782:1;27773:11;109506:151:0::1;;;;;;;;;109533:6;109541:13;109556:9;109567:15;109584:17;109603:12;109617:22;109641:15;109506:151;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;109675:4:0::1;::::0;108304:1383;-1:-1:-1;;;;;;;;108304:1383:0:o;105253:193::-;105340:9;105335:104;105359:10;:17;105355:1;:21;105335:104;;;105398:29;105413:10;105424:1;105413:13;;;;;;;;:::i;:::-;;;;;;;105398:14;:29::i;:::-;105378:3;;;;:::i;:::-;;;;105335:104;;105454:116;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;105543:10:::1;-1:-1:-1::0;;;;;105543:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;105454:116:::0;;:::o;103624:386::-;103718:4;103764:6;:13;103743:10;:17;:34;103735:89;;;;-1:-1:-1;;;103735:89:0;;;;;;;:::i;:::-;103840:9;103835:146;103859:10;:17;103855:1;:21;103835:146;;;103906:34;103915:10;103926:1;103915:13;;;;;;;;:::i;:::-;;;;;;;103930:6;103937:1;103930:9;;;;;;;;:::i;:::-;;;;;;;103906:8;:34::i;:::-;103898:71;;;;-1:-1:-1;;;103898:71:0;;18279:2:1;103898:71:0;;;18261:21:1;18318:2;18298:18;;;18291:30;-1:-1:-1;;;18337:18:1;;;18330:54;18401:18;;103898:71:0;18077:348:1;103898:71:0;103878:3;;;;:::i;:::-;;;;103835:146;;109695:1370;109917:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;109955:4:::1;109942:9;:17;;109934:67;;;;-1:-1:-1::0;;;109934:67:0::1;;;;;;;:::i;:::-;110012:11;:26:::0;;-1:-1:-1;;110086:40:0;110012:26;::::1;;-1:-1:-1::0;;110086:40:0;;110012:26:::1;110086:40:::0;::::1;;;;::::0;;110203:20;:32;;;110333:26;:44;;-1:-1:-1;;;;;;110333:44:0::1;-1:-1:-1::0;;;;;110333:44:0;;::::1;::::0;;;::::1;::::0;;;110448:28;:48;;;110563:23;:38;;;;::::1;-1:-1:-1::0;;;;;;110651:58:0;;;;;;;-1:-1:-1;;;110651:58:0;::::1;;;;::::0;;110854:15:::1;110828:23:::0;:41;110885:150:::1;::::0;-1:-1:-1;;;27997:22:1;;28044:1;28035:11;110885:150:0::1;27795:257:1::0;67926:645:0;68170:8;68151:15;:27;;68143:69;;;;-1:-1:-1;;;68143:69:0;;28259:2:1;68143:69:0;;;28241:21:1;28298:2;28278:18;;;28271:30;28337:31;28317:18;;;28310:59;28386:18;;68143:69:0;28057:353:1;68143:69:0;68225:18;67101:95;68285:5;68292:7;68301:5;68308:16;68318:5;68308:9;:16::i;:::-;68256:79;;;;;;28702:25:1;;;;-1:-1:-1;;;;;28801:15:1;;;28781:18;;;28774:43;28853:15;;;;28833:18;;;28826:43;28885:18;;;28878:34;28928:19;;;28921:35;28972:19;;;28965:35;;;28674:19;;68256:79:0;;;;;;;;;;;;68246:90;;;;;;68225:111;;68349:12;68364:28;68381:10;68364:16;:28::i;:::-;68349:43;;68405:14;68422:28;68436:4;68442:1;68445;68448;68422:13;:28::i;:::-;68405:45;;68479:5;-1:-1:-1;;;;;68469:15:0;:6;-1:-1:-1;;;;;68469:15:0;;68461:58;;;;-1:-1:-1;;;68461:58:0;;29213:2:1;68461:58:0;;;29195:21:1;29252:2;29232:18;;;29225:30;29291:32;29271:18;;;29264:60;29341:18;;68461:58:0;29011:354:1;68461:58:0;68532:31;68541:5;68548:7;68557:5;68532:8;:31::i;:::-;68132:439;;;67926:645;;;;;;;:::o;84203:149::-;83396:7;83423:12;;;:6;:12;;;;;:22;;;81391:16;81402:4;81391:10;:16::i;:::-;84318:26:::1;84330:4;84336:7;84318:11;:26::i;102181:435::-:0;102249:7;102258;102304:15;102286;:33;102278:84;;;;-1:-1:-1;;;102278:84:0;;29572:2:1;102278:84:0;;;29554:21:1;29611:2;29591:18;;;29584:30;29650:34;29630:18;;;29623:62;-1:-1:-1;;;29701:18:1;;;29694:36;29747:19;;102278:84:0;29370:402:1;102278:84:0;102394:15;102441;102373:18;102484;102497:5;102394:15;102484:18;:::i;:::-;102467:35;-1:-1:-1;102513:14:0;102530:18;102543:5;102530:10;:18;:::i;:::-;102513:35;-1:-1:-1;102567:15:0;102576:6;102513:35;102567:15;:::i;:::-;102584:23;102597:10;102584;:23;:::i;:::-;102559:49;;;;;;;;102181:435;;;:::o;56768:151::-;-1:-1:-1;;;;;56884:18:0;;;56857:7;56884:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;56768:151::o;106768:303::-;106905:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;106922:12:::1;:29:::0;;;106962:33:::1;:21:::0;106986:9;;106962:33:::1;:::i;:::-;-1:-1:-1::0;107006:35:0::1;:22:::0;107031:10;;107006:35:::1;:::i;:::-;-1:-1:-1::0;107059:4:0::1;::::0;106768:303;-1:-1:-1;;;;;;;106768:303:0:o;107774:522::-;107859:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;107903:10:::1;107884:15;;:29;;107876:104;;;::::0;-1:-1:-1;;;107876:104:0;;29979:2:1;107876:104:0::1;::::0;::::1;29961:21:1::0;30018:2;29998:18;;;29991:30;30057:34;30037:18;;;30030:62;30128:32;30108:18;;;30101:60;30178:19;;107876:104:0::1;29777:426:1::0;107876:104:0::1;108016:10;107999:13;56096:12:::0;;;56008:108;107999:13:::1;:27;;107991:101;;;::::0;-1:-1:-1;;;107991:101:0;;30410:2:1;107991:101:0::1;::::0;::::1;30392:21:1::0;30449:2;30429:18;;;30422:30;30488:34;30468:18;;;30461:62;30559:31;30539:18;;;30532:59;30608:19;;107991:101:0::1;30208:425:1::0;107991:101:0::1;108124:13;::::0;;108148:26;;;;108190:76:::1;::::0;-1:-1:-1;;;30840:22:1;;52610:10:0;;30887:1:1;30878:11;108190:76:0::1;::::0;;;;;::::1;::::0;;10369:25:1;;;10425:2;10410:18;;10403:34;;;108250:15:0::1;10453:18:1::0;;;10446:34;108190:76:0;;;;::::1;::::0;;;;;10357:2:1;108190:76:0;;::::1;-1:-1:-1::0;108284:4:0::1;::::0;107774:522;-1:-1:-1;;;107774:522:0:o;112773:154::-;74302:13;:11;:13::i;:::-;112855:18:::1;112864:8;112855;:18::i;:::-;;112884:35;112910:8;112884:25;:35::i;:::-;112773:154:::0;:::o;106303:457::-;106442:4;-1:-1:-1;;;;;;;;;;;81391:16:0;81402:4;81391:10;:16::i;:::-;106459:12:::1;:49:::0;;;106519:28;:47;;;106577:23;:37;;;106630:100:::1;::::0;;26555:25:1;;;26611:2;26596:18;;26589:34;;;26639:18;;;26632:34;;;106714:15:0::1;26697:2:1::0;26682:18;;26675:34;52610:10:0;;106630:100:::1;::::0;26542:3:1;26527:19;106630:100:0::1;26324:391:1::0;63492:380:0;-1:-1:-1;;;;;63628:19:0;;63620:68;;;;-1:-1:-1;;;63620:68:0;;31102:2:1;63620:68:0;;;31084:21:1;31141:2;31121:18;;;31114:30;31180:34;31160:18;;;31153:62;-1:-1:-1;;;31231:18:1;;;31224:34;31275:19;;63620:68:0;30900:400:1;63620:68:0;-1:-1:-1;;;;;63707:21:0;;63699:68;;;;-1:-1:-1;;;63699:68:0;;31507:2:1;63699:68:0;;;31489:21:1;31546:2;31526:18;;;31519:30;31585:34;31565:18;;;31558:62;-1:-1:-1;;;31636:18:1;;;31629:32;31678:19;;63699:68:0;31305:398:1;63699:68:0;-1:-1:-1;;;;;63780:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;63832:32;;643:25:1;;;63832:32:0;;616:18:1;63832:32:0;497:177:1;82246:105:0;82313:30;82324:4;52610:10;82313;:30::i;72358:108::-;72270:7;;;;72428:9;72420:38;;;;-1:-1:-1;;;72420:38:0;;31910:2:1;72420:38:0;;;31892:21:1;31949:2;31929:18;;;31922:30;-1:-1:-1;;;31968:18:1;;;31961:46;32024:18;;72420:38:0;31708:340:1;64163:453:0;64298:24;64325:25;64335:5;64342:7;64325:9;:25::i;:::-;64298:52;;-1:-1:-1;;64365:16:0;:37;64361:248;;64447:6;64427:16;:26;;64419:68;;;;-1:-1:-1;;;64419:68:0;;32255:2:1;64419:68:0;;;32237:21:1;32294:2;32274:18;;;32267:30;32333:31;32313:18;;;32306:59;32382:18;;64419:68:0;32053:353:1;64419:68:0;64531:51;64540:5;64547:7;64575:6;64556:16;:25;64531:8;:51::i;:::-;64287:329;64163:453;;;:::o;95720:939::-;95819:4;71804:19;:17;:19::i;:::-;95841:12:::1;:18:::0;::::1;;95836:794;;95922:27;95932:4;95938:2;95942:6;95922:9;:27::i;:::-;95836:794;;;96014:52;::::0;;::::1;::::0;;::::1;::::0;;96035:12:::1;96014:52:::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;;;;::::0;::::1;::::0;;;;;;;;;;;;-1:-1:-1;;;;;96014:52:0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;;;-1:-1:-1;;;96014:52:0;::::1;::::0;;::::1;;;::::0;;;;;;;;;;95982:29:::1;::::0;96014:52:::1;::::0;96049:6;96057:4;96063:2;96014:20:::1;:52::i;:::-;95982:84;;96081:36;96091:4;96097:2;96101:8;:15;;;96081:9;:36::i;:::-;96138:12;::::0;::::1;::::0;:16;96134:485:::1;;96175:51;96185:4;96191:8;:20;;;96213:8;:12;;;96175:9;:51::i;:::-;96433:8;:22;;;96429:175;;;96510:8;:20;;;-1:-1:-1::0;;;;;96488:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96480:104;;;::::0;-1:-1:-1;;;96480:104:0;;32613:2:1;96480:104:0::1;::::0;::::1;32595:21:1::0;32652:2;32632:18;;;32625:30;32691:33;32671:18;;;32664:61;32742:18;;96480:104:0::1;32411:355:1::0;86504:238:0;86588:22;86596:4;86602:7;86588;:22::i;:::-;86583:152;;86627:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;86627:29:0;;;;;;;;;:36;;-1:-1:-1;;86627:36:0;86659:4;86627:36;;;86710:12;52610:10;;52530:98;86710:12;-1:-1:-1;;;;;86683:40:0;86701:7;-1:-1:-1;;;;;86683:40:0;86695:4;86683:40;;;;;;;;;;86504:238;;:::o;50450:314::-;50503:7;50535:4;-1:-1:-1;;;;;50544:12:0;50527:29;;:66;;;;;50577:16;50560:13;:33;50527:66;50523:234;;;-1:-1:-1;50617:24:0;;50450:314::o;50523:234::-;-1:-1:-1;50953:73:0;;;50703:10;50953:73;;;;37404:25:1;;;;50715:12:0;37445:18:1;;;37438:34;50729:15:0;37488:18:1;;;37481:34;50997:13:0;37531:18:1;;;37524:34;51020:4:0;37574:19:1;;;;37567:61;;;;50953:73:0;;;;;;;;;;37376:19:1;;;;50953:73:0;;;50943:84;;;;;;68895:115::o;86922:239::-;87006:22;87014:4;87020:7;87006;:22::i;:::-;87002:152;;;87077:5;87045:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;87045:29:0;;;;;;;;;;:37;;-1:-1:-1;;87045:37:0;;;87102:40;52610:10;;87045:12;;87102:40;;87077:5;87102:40;86922:239;;:::o;74581:132::-;74489:6;;-1:-1:-1;;;;;74489:6:0;;;;;52610:10;74645:23;74637:68;;;;-1:-1:-1;;;74637:68:0;;32973:2:1;74637:68:0;;;32955:21:1;;;32992:18;;;32985:30;33051:34;33031:18;;;33024:62;33103:18;;74637:68:0;32771:356:1;73054:120:0;72063:16;:14;:16::i;:::-;73113:7:::1;:15:::0;;-1:-1:-1;;73113:15:0::1;::::0;;73144:22:::1;52610:10:::0;73153:12:::1;73144:22;::::0;-1:-1:-1;;;;;10655:32:1;;;10637:51;;10625:2;10610:18;73144:22:0::1;;;;;;;73054:120::o:0;61498:548::-;-1:-1:-1;;;;;61582:21:0;;61574:65;;;;-1:-1:-1;;;61574:65:0;;33334:2:1;61574:65:0;;;33316:21:1;33373:2;33353:18;;;33346:30;33412:33;33392:18;;;33385:61;33463:18;;61574:65:0;33132:355:1;61574:65:0;61652:49;61681:1;61685:7;61694:6;61652:20;:49::i;:::-;61730:6;61714:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;61885:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;61940:37;643:25:1;;;61940:37:0;;616:18:1;61940:37:0;;;;;;;84907:218;;:::o;100122:961::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100288:13:0;;100284:765;;;100322:7;:20;;;100318:664;;;100488:37;100500:6;100508:7;:16;;;100488:11;:37::i;:::-;100473:11;;;100456:69;;;100566:19;;;;-1:-1:-1;;;;;100544:41:0;:19;;;:41;100628:29;;;;100604:53;;-1:-1:-1;100604:21:0;;:53;100284:765;;100318:664;100888:22;;;;100941:24;;;;100868:98;;-1:-1:-1;;;100868:98:0;;;;;33723:25:1;;;-1:-1:-1;;;;;33822:15:1;;;33802:18;;;33795:43;33874:15;;;33854:18;;;33847:43;33906:18;;;33899:34;;;;100868:54:0;;;;;33695:19:1;;100868:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100792:174;;100843:21;;;100792:174;-1:-1:-1;;;;;100792:174:0;100822:19;;;100792:174;100809:11;;;100792:174;;;100284:765;;;101014:23;;;100122:961;;;;;;:::o;69945:91::-;70001:27;52610:10;70021:6;70001:5;:27::i;16786:211::-;16930:58;;;-1:-1:-1;;;;;34643:32:1;;16930:58:0;;;34625:51:1;34692:18;;;;34685:34;;;16930:58:0;;;;;;;;;;34598:18:1;;;;16930:58:0;;;;;;;;-1:-1:-1;;;;;16930:58:0;-1:-1:-1;;;16930:58:0;;;16903:86;;16923:5;;16903:19;:86::i;70355:164::-;70432:46;70448:7;52610:10;70471:6;70432:15;:46::i;:::-;70489:22;70495:7;70504:6;70489:5;:22::i;72795:118::-;71804:19;:17;:19::i;:::-;72855:7:::1;:14:::0;;-1:-1:-1;;72855:14:0::1;72865:4;72855:14;::::0;;72885:20:::1;72892:12;52610:10:::0;;52530:98;69148:207;-1:-1:-1;;;;;69269:14:0;;69208:15;69269:14;;;:7;:14;;;;;933;;1070:1;1052:19;;;;933:14;69330:17;963:127;51677:167;51754:7;51781:55;51803:20;:18;:20::i;:::-;51825:10;47144:57;;-1:-1:-1;;;47144:57:0;;;39869:27:1;39912:11;;;39905:27;;;39948:12;;;39941:28;;;47107:7:0;;39985:12:1;;47144:57:0;;;;;;;;;;;;47134:68;;;;;;47127:75;;47014:196;;;;;45323:279;45451:7;45472:17;45491:18;45513:25;45524:4;45530:1;45533;45536;45513:10;:25::i;:::-;45471:67;;;;45549:18;45561:5;45549:11;:18::i;:::-;-1:-1:-1;45585:9:0;45323:279;-1:-1:-1;;;;;45323:279:0:o;75322:201::-;74302:13;:11;:13::i;:::-;-1:-1:-1;;;;;75411:22:0;::::1;75403:73;;;::::0;-1:-1:-1;;;75403:73:0;;34932:2:1;75403:73:0::1;::::0;::::1;34914:21:1::0;34971:2;34951:18;;;34944:30;35010:34;34990:18;;;34983:62;-1:-1:-1;;;35061:18:1;;;35054:36;35107:19;;75403:73:0::1;34730:402:1::0;75403:73:0::1;75487:28;75506:8;75487:18;:28::i;82641:492::-:0;82730:22;82738:4;82744:7;82730;:22::i;:::-;82725:401;;82918:28;82938:7;82918:19;:28::i;:::-;83019:38;83047:4;83054:2;83019:19;:38::i;:::-;82823:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;82823:257:0;;;;;;;;;;-1:-1:-1;;;82769:345:0;;;;;;;:::i;60371:840::-;-1:-1:-1;;;;;60502:18:0;;60494:68;;;;-1:-1:-1;;;60494:68:0;;36130:2:1;60494:68:0;;;36112:21:1;36169:2;36149:18;;;36142:30;36208:34;36188:18;;;36181:62;-1:-1:-1;;;36259:18:1;;;36252:35;36304:19;;60494:68:0;35928:401:1;60494:68:0;-1:-1:-1;;;;;60581:16:0;;60573:64;;;;-1:-1:-1;;;60573:64:0;;36536:2:1;60573:64:0;;;36518:21:1;36575:2;36555:18;;;36548:30;36614:34;36594:18;;;36587:62;-1:-1:-1;;;36665:18:1;;;36658:33;36708:19;;60573:64:0;36334:399:1;60573:64:0;60650:38;60671:4;60677:2;60681:6;60650:20;:38::i;:::-;-1:-1:-1;;;;;60723:15:0;;60701:19;60723:15;;;;;;;;;;;60757:21;;;;60749:72;;;;-1:-1:-1;;;60749:72:0;;36940:2:1;60749:72:0;;;36922:21:1;36979:2;36959:18;;;36952:30;37018:34;36998:18;;;36991:62;-1:-1:-1;;;37069:18:1;;;37062:36;37115:19;;60749:72:0;36738:402:1;60749:72:0;-1:-1:-1;;;;;60857:15:0;;;:9;:15;;;;;;;;;;;60875:20;;;60857:38;;61075:13;;;;;;;;;;:23;;;;;;61127:26;;643:25:1;;;61075:13:0;;61127:26;;616:18:1;61127:26:0;;;;;;;61166:37;83763:147;72543:108;72270:7;;;;72602:41;;;;-1:-1:-1;;;72602:41:0;;37841:2:1;72602:41:0;;;37823:21:1;37880:2;37860:18;;;37853:30;-1:-1:-1;;;37899:18:1;;;37892:50;37959:18;;72602:41:0;37639:344:1;99509:566:0;71804:19;:17;:19::i;:::-;99630:4;113172:39:::1;80945:4;113200:10;113172:7;:39::i;:::-;:67;;;-1:-1:-1::0;;;;;;101940:19:0;;101916:4;101940:19;;;:10;:19;;;;;;;;113215:24:::1;113172:67;113164:118;;;;-1:-1:-1::0;;;113164:118:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;99708:16:0;::::2;::::0;99704:364:::2;;99741:36;-1:-1:-1::0;;;;;99780:18:0;::::2;:44;;99816:8;99780:44;;;99801:12;99780:44;99857:30:::0;;99741:83;;-1:-1:-1;99847:40:0;::::2;;99839:91;;;::::0;-1:-1:-1;;;99839:91:0;;38190:2:1;99839:91:0::2;::::0;::::2;38172:21:1::0;38229:2;38209:18;;;38202:30;38268:34;38248:18;;;38241:62;-1:-1:-1;;;38319:18:1;;;38312:36;38365:19;;99839:91:0::2;37988:402:1::0;99839:91:0::2;99945:41;99964:13;99979:6;99945:18;:41::i;101091:232::-:0;101169:7;;;101235:5;101214:17;101223:8;101214:6;:17;:::i;:::-;101213:27;;;;:::i;:::-;101198:42;-1:-1:-1;101251:15:0;101269:13;101198:42;101269:6;:13;:::i;:::-;101251:31;101310:4;;-1:-1:-1;101091:232:0;;-1:-1:-1;;;;101091:232:0:o;62379:675::-;-1:-1:-1;;;;;62463:21:0;;62455:67;;;;-1:-1:-1;;;62455:67:0;;38597:2:1;62455:67:0;;;38579:21:1;38636:2;38616:18;;;38609:30;38675:34;38655:18;;;38648:62;-1:-1:-1;;;38726:18:1;;;38719:31;38767:19;;62455:67:0;38395:397:1;62455:67:0;62535:49;62556:7;62573:1;62577:6;62535:20;:49::i;:::-;-1:-1:-1;;;;;62622:18:0;;62597:22;62622:18;;;;;;;;;;;62659:24;;;;62651:71;;;;-1:-1:-1;;;62651:71:0;;38999:2:1;62651:71:0;;;38981:21:1;39038:2;39018:18;;;39011:30;39077:34;39057:18;;;39050:62;-1:-1:-1;;;39128:18:1;;;39121:32;39170:19;;62651:71:0;38797:398:1;62651:71:0;-1:-1:-1;;;;;62758:18:0;;:9;:18;;;;;;;;;;;62779:23;;;62758:44;;62897:12;:22;;;;;;;62948:37;643:25:1;;;62758:9:0;;:18;62948:37;;616:18:1;62948:37:0;;;;;;;83763:147;;;:::o;19853:716::-;20277:23;20303:69;20331:4;20303:69;;;;;;;;;;;;;;;;;20311:5;-1:-1:-1;;;;;20303:27:0;;;:69;;;;;:::i;:::-;20387:17;;20277:95;;-1:-1:-1;20387:21:0;20383:179;;20484:10;20473:30;;;;;;;;;;;;:::i;:::-;20465:85;;;;-1:-1:-1;;;20465:85:0;;39402:2:1;20465:85:0;;;39384:21:1;39441:2;39421:18;;;39414:30;39480:34;39460:18;;;39453:62;-1:-1:-1;;;39531:18:1;;;39524:40;39581:19;;20465:85:0;39200:406:1;43664:1520:0;43795:7;;44729:66;44716:79;;44712:163;;;-1:-1:-1;44828:1:0;;-1:-1:-1;44832:30:0;44812:51;;44712:163;44989:24;;;44972:14;44989:24;;;;;;;;;40235:25:1;;;40308:4;40296:17;;40276:18;;;40269:45;;;;40330:18;;;40323:34;;;40373:18;;;40366:34;;;44989:24:0;;40207:19:1;;44989:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44989:24:0;;-1:-1:-1;;44989:24:0;;;-1:-1:-1;;;;;;;45028:20:0;;45024:103;;45081:1;45085:29;45065:50;;;;;;;45024:103;45147:6;-1:-1:-1;45155:20:0;;-1:-1:-1;43664:1520:0;;;;;;;;:::o;39056:521::-;39134:20;39125:5;:29;;;;;;;;:::i;:::-;;39121:449;;;39056:521;:::o;39121:449::-;39232:29;39223:5;:38;;;;;;;;:::i;:::-;;39219:351;;;39278:34;;-1:-1:-1;;;39278:34:0;;40745:2:1;39278:34:0;;;40727:21:1;40784:2;40764:18;;;40757:30;40823:26;40803:18;;;40796:54;40867:18;;39278:34:0;40543:348:1;39219:351:0;39343:35;39334:5;:44;;;;;;;;:::i;:::-;;39330:240;;;39395:41;;-1:-1:-1;;;39395:41:0;;41098:2:1;39395:41:0;;;41080:21:1;41137:2;41117:18;;;41110:30;41176:33;41156:18;;;41149:61;41227:18;;39395:41:0;40896:355:1;39330:240:0;39467:30;39458:5;:39;;;;;;;;:::i;:::-;;39454:116;;;39514:44;;-1:-1:-1;;;39514:44:0;;41458:2:1;39514:44:0;;;41440:21:1;41497:2;41477:18;;;41470:30;41536:34;41516:18;;;41509:62;-1:-1:-1;;;41587:18:1;;;41580:32;41629:19;;39514:44:0;41256:398:1;75683:191:0;75776:6;;;-1:-1:-1;;;;;75793:17:0;;;75776:6;75793:17;;;-1:-1:-1;;;;;;75793:17:0;;;;;;75826:40;;75776:6;;;;;;;;75826:40;;75757:16;;75826:40;75746:128;75683:191;:::o;38298:151::-;38356:13;38389:52;-1:-1:-1;;;;;38401:22:0;;36453:2;37694:447;37769:13;37795:19;37827:10;37831:6;37827:1;:10;:::i;:::-;:14;;37840:1;37827:14;:::i;:::-;37817:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37817:25:0;;37795:47;;-1:-1:-1;;;37853:6:0;37860:1;37853:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;37853:15:0;;;;;;;;;-1:-1:-1;;;37879:6:0;37886:1;37879:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;37879:15:0;;;;;;;;-1:-1:-1;37910:9:0;37922:10;37926:6;37922:1;:10;:::i;:::-;:14;;37935:1;37922:14;:::i;:::-;37910:26;;37905:131;37942:1;37938;:5;37905:131;;;-1:-1:-1;;;37986:5:0;37994:3;37986:11;37977:21;;;;;;;:::i;:::-;;;;37965:6;37972:1;37965:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;37965:33:0;;;;;;;;-1:-1:-1;38023:1:0;38013:11;;;;;37945:3;;;:::i;:::-;;;37905:131;;;-1:-1:-1;38054:10:0;;38046:55;;;;-1:-1:-1;;;38046:55:0;;42002:2:1;38046:55:0;;;41984:21:1;;;42021:18;;;42014:30;42080:34;42060:18;;;42053:62;42132:18;;38046:55:0;41800:356:1;101331:516:0;101426:18;101465:6;:17;;;101447:15;:35;;;;:::i;:::-;101426:56;;101518:10;101497:6;:17;;;:31;101493:136;;101545:17;;;:30;;;101616:1;101590:23;;;:27;101493:136;101639:19;101687:6;101661;:23;;;:32;;;;:::i;:::-;101639:54;;101727:6;:22;;;101712:11;:37;;101704:87;;;;-1:-1:-1;;;101704:87:0;;42363:2:1;101704:87:0;;;42345:21:1;42402:2;42382:18;;;42375:30;42441:34;42421:18;;;42414:62;-1:-1:-1;;;42492:18:1;;;42485:35;42537:19;;101704:87:0;42161:401:1;101704:87:0;101802:23;;;;:37;;;;-1:-1:-1;;101331:516:0:o;5424:229::-;5561:12;5593:52;5615:6;5623:4;5629:1;5632:12;5561;6832;6846:23;6873:6;-1:-1:-1;;;;;6873:11:0;6892:5;6899:4;6873:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6831:73;;;;6922:69;6949:6;6957:7;6966:10;6978:12;6922:26;:69::i;:::-;6915:76;6544:455;-1:-1:-1;;;;;;;6544:455:0:o;9117:644::-;9302:12;9331:7;9327:427;;;9359:17;;9355:290;;-1:-1:-1;;;;;2962:19:0;;;9569:60;;;;-1:-1:-1;;;9569:60:0;;43455:2:1;9569:60:0;;;43437:21:1;43494:2;43474:18;;;43467:30;43533:31;43513:18;;;43506:59;43582:18;;9569:60:0;43253:353:1;9569:60:0;-1:-1:-1;9666:10:0;9659:17;;9327:427;9709:33;9717:10;9729:12;10464:17;;:21;10460:388;;10696:10;10690:17;10753:15;10740:10;10736:2;10732:19;10725:44;10460:388;10823:12;10816:20;;-1:-1:-1;;;10816:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:286:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;679:258;751:1;761:113;775:6;772:1;769:13;761:113;;;851:11;;;845:18;832:11;;;825:39;797:2;790:10;761:113;;;892:6;889:1;886:13;883:48;;;-1:-1:-1;;927:1:1;909:16;;902:27;679:258::o;942:::-;984:3;1022:5;1016:12;1049:6;1044:3;1037:19;1065:63;1121:6;1114:4;1109:3;1105:14;1098:4;1091:5;1087:16;1065:63;:::i;:::-;1182:2;1161:15;-1:-1:-1;;1157:29:1;1148:39;;;;1189:4;1144:50;;942:258;-1:-1:-1;;942:258:1:o;1205:220::-;1354:2;1343:9;1336:21;1317:4;1374:45;1415:2;1404:9;1400:18;1392:6;1374:45;:::i;1430:131::-;-1:-1:-1;;;;;1505:31:1;;1495:42;;1485:70;;1551:1;1548;1541:12;1566:315;1634:6;1642;1695:2;1683:9;1674:7;1670:23;1666:32;1663:52;;;1711:1;1708;1701:12;1663:52;1750:9;1737:23;1769:31;1794:5;1769:31;:::i;:::-;1819:5;1871:2;1856:18;;;;1843:32;;-1:-1:-1;;;1566:315:1:o;1886:118::-;1972:5;1965:13;1958:21;1951:5;1948:32;1938:60;;1994:1;1991;1984:12;2009:382;2074:6;2082;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;2190:9;2177:23;2209:31;2234:5;2209:31;:::i;:::-;2259:5;-1:-1:-1;2316:2:1;2301:18;;2288:32;2329:30;2288:32;2329:30;:::i;:::-;2378:7;2368:17;;;2009:382;;;;;:::o;2396:454::-;2621:6;2610:9;2603:25;2664:2;2659;2648:9;2644:18;2637:30;2584:4;2690:45;2731:2;2720:9;2716:18;2708:6;2690:45;:::i;:::-;2783:9;2775:6;2771:22;2766:2;2755:9;2751:18;2744:50;2811:33;2837:6;2829;2811:33;:::i;:::-;2803:41;2396:454;-1:-1:-1;;;;;;2396:454:1:o;2855:765::-;3205:14;;3198:22;3180:41;;3264:14;;3257:22;3252:2;3237:18;;3230:50;3311:2;3296:18;;3289:34;;;;-1:-1:-1;;;;;3397:15:1;;;3392:2;3377:18;;3370:43;3444:3;3429:19;;3422:35;;;;3494:15;3350:3;3473:19;;3466:44;3554:14;3547:22;3541:3;3526:19;;3519:51;3601:3;3586:19;;3579:35;3167:3;3152:19;;2855:765::o;3625:127::-;3686:10;3681:3;3677:20;3674:1;3667:31;3717:4;3714:1;3707:15;3741:4;3738:1;3731:15;3757:275;3828:2;3822:9;3893:2;3874:13;;-1:-1:-1;;3870:27:1;3858:40;;3928:18;3913:34;;3949:22;;;3910:62;3907:88;;;3975:18;;:::i;:::-;4011:2;4004:22;3757:275;;-1:-1:-1;3757:275:1:o;4037:183::-;4097:4;4130:18;4122:6;4119:30;4116:56;;;4152:18;;:::i;:::-;-1:-1:-1;4197:1:1;4193:14;4209:4;4189:25;;4037:183::o;4225:737::-;4279:5;4332:3;4325:4;4317:6;4313:17;4309:27;4299:55;;4350:1;4347;4340:12;4299:55;4386:6;4373:20;4412:4;4436:60;4452:43;4492:2;4452:43;:::i;:::-;4436:60;:::i;:::-;4530:15;;;4616:1;4612:10;;;;4600:23;;4596:32;;;4561:12;;;;4640:15;;;4637:35;;;4668:1;4665;4658:12;4637:35;4704:2;4696:6;4692:15;4716:217;4732:6;4727:3;4724:15;4716:217;;;4812:3;4799:17;4829:31;4854:5;4829:31;:::i;:::-;4873:18;;4911:12;;;;4749;;4716:217;;;-1:-1:-1;4951:5:1;4225:737;-1:-1:-1;;;;;;4225:737:1:o;4967:662::-;5021:5;5074:3;5067:4;5059:6;5055:17;5051:27;5041:55;;5092:1;5089;5082:12;5041:55;5128:6;5115:20;5154:4;5178:60;5194:43;5234:2;5194:43;:::i;5178:60::-;5272:15;;;5358:1;5354:10;;;;5342:23;;5338:32;;;5303:12;;;;5382:15;;;5379:35;;;5410:1;5407;5400:12;5379:35;5446:2;5438:6;5434:15;5458:142;5474:6;5469:3;5466:15;5458:142;;;5540:17;;5528:30;;5578:12;;;;5491;;5458:142;;5634:821;5786:6;5794;5802;5855:2;5843:9;5834:7;5830:23;5826:32;5823:52;;;5871:1;5868;5861:12;5823:52;5911:9;5898:23;5940:18;5981:2;5973:6;5970:14;5967:34;;;5997:1;5994;5987:12;5967:34;6020:61;6073:7;6064:6;6053:9;6049:22;6020:61;:::i;:::-;6010:71;;6134:2;6123:9;6119:18;6106:32;6090:48;;6163:2;6153:8;6150:16;6147:36;;;6179:1;6176;6169:12;6147:36;6202:63;6257:7;6246:8;6235:9;6231:24;6202:63;:::i;:::-;6192:73;;6318:2;6307:9;6303:18;6290:32;6274:48;;6347:2;6337:8;6334:16;6331:36;;;6363:1;6360;6353:12;6331:36;;6386:63;6441:7;6430:8;6419:9;6415:24;6386:63;:::i;:::-;6376:73;;;5634:821;;;;;:::o;6460:456::-;6537:6;6545;6553;6606:2;6594:9;6585:7;6581:23;6577:32;6574:52;;;6622:1;6619;6612:12;6574:52;6661:9;6648:23;6680:31;6705:5;6680:31;:::i;:::-;6730:5;-1:-1:-1;6787:2:1;6772:18;;6759:32;6800:33;6759:32;6800:33;:::i;:::-;6460:456;;6852:7;;-1:-1:-1;;;6906:2:1;6891:18;;;;6878:32;;6460:456::o;6921:180::-;6980:6;7033:2;7021:9;7012:7;7008:23;7004:32;7001:52;;;7049:1;7046;7039:12;7001:52;-1:-1:-1;7072:23:1;;6921:180;-1:-1:-1;6921:180:1:o;7756:247::-;7815:6;7868:2;7856:9;7847:7;7843:23;7839:32;7836:52;;;7884:1;7881;7874:12;7836:52;7923:9;7910:23;7942:31;7967:5;7942:31;:::i;8967:315::-;9035:6;9043;9096:2;9084:9;9075:7;9071:23;9067:32;9064:52;;;9112:1;9109;9102:12;9064:52;9148:9;9135:23;9125:33;;9208:2;9197:9;9193:18;9180:32;9221:31;9246:5;9221:31;:::i;9661:248::-;9729:6;9737;9790:2;9778:9;9769:7;9765:23;9761:32;9758:52;;;9806:1;9803;9796:12;9758:52;-1:-1:-1;;9829:23:1;;;9899:2;9884:18;;;9871:32;;-1:-1:-1;9661:248:1:o;10699:730::-;10800:6;10808;10816;10824;10832;10840;10893:3;10881:9;10872:7;10868:23;10864:33;10861:53;;;10910:1;10907;10900:12;10861:53;10949:9;10936:23;10968:31;10993:5;10968:31;:::i;:::-;11018:5;-1:-1:-1;11075:2:1;11060:18;;11047:32;11088:33;11047:32;11088:33;:::i;:::-;11140:7;-1:-1:-1;11194:2:1;11179:18;;11166:32;;-1:-1:-1;11245:2:1;11230:18;;11217:32;;-1:-1:-1;11296:3:1;11281:19;;11268:33;;-1:-1:-1;11353:3:1;11338:19;;11325:33;11367:30;11325:33;11367:30;:::i;:::-;11416:7;11406:17;;;10699:730;;;;;;;;:::o;11662:316::-;11739:6;11747;11755;11808:2;11796:9;11787:7;11783:23;11779:32;11776:52;;;11824:1;11821;11814:12;11776:52;-1:-1:-1;;11847:23:1;;;11917:2;11902:18;;11889:32;;-1:-1:-1;11968:2:1;11953:18;;;11940:32;;11662:316;-1:-1:-1;11662:316:1:o;11983:986::-;12087:6;12118:2;12161;12149:9;12140:7;12136:23;12132:32;12129:52;;;12177:1;12174;12167:12;12129:52;12217:9;12204:23;12250:18;12242:6;12239:30;12236:50;;;12282:1;12279;12272:12;12236:50;12305:22;;12358:4;12350:13;;12346:27;-1:-1:-1;12336:55:1;;12387:1;12384;12377:12;12336:55;12423:2;12410:16;12446:60;12462:43;12502:2;12462:43;:::i;12446:60::-;12540:15;;;12622:1;12618:10;;;;12610:19;;12606:28;;;12571:12;;;;12646:19;;;12643:39;;;12678:1;12675;12668:12;12643:39;12702:11;;;;12722:217;12738:6;12733:3;12730:15;12722:217;;;12818:3;12805:17;12835:31;12860:5;12835:31;:::i;:::-;12879:18;;12755:12;;;;12917;;;;12722:217;;12974:933;13078:6;13086;13094;13102;13110;13118;13126;13179:3;13167:9;13158:7;13154:23;13150:33;13147:53;;;13196:1;13193;13186:12;13147:53;13235:9;13222:23;13254:28;13276:5;13254:28;:::i;:::-;13301:5;-1:-1:-1;13358:2:1;13343:18;;13330:32;13371:30;13330:32;13371:30;:::i;:::-;13420:7;-1:-1:-1;13474:2:1;13459:18;;13446:32;;-1:-1:-1;13530:2:1;13515:18;;13502:32;13543:33;13502:32;13543:33;:::i;:::-;13595:7;-1:-1:-1;13649:3:1;13634:19;;13621:33;;-1:-1:-1;13706:3:1;13691:19;;13678:33;13720;13678;13720;:::i;:::-;13772:7;-1:-1:-1;13831:3:1;13816:19;;13803:33;13845:30;13803:33;13845:30;:::i;:::-;13894:7;13884:17;;;12974:933;;;;;;;;;;:::o;13912:595::-;14030:6;14038;14091:2;14079:9;14070:7;14066:23;14062:32;14059:52;;;14107:1;14104;14097:12;14059:52;14147:9;14134:23;14176:18;14217:2;14209:6;14206:14;14203:34;;;14233:1;14230;14223:12;14203:34;14256:61;14309:7;14300:6;14289:9;14285:22;14256:61;:::i;:::-;14246:71;;14370:2;14359:9;14355:18;14342:32;14326:48;;14399:2;14389:8;14386:16;14383:36;;;14415:1;14412;14405:12;14383:36;;14438:63;14493:7;14482:8;14471:9;14467:24;14438:63;:::i;:::-;14428:73;;;13912:595;;;;;:::o;14512:829::-;14623:6;14631;14639;14647;14655;14663;14671;14724:3;14712:9;14703:7;14699:23;14695:33;14692:53;;;14741:1;14738;14731:12;14692:53;14780:9;14767:23;14799:31;14824:5;14799:31;:::i;:::-;14849:5;-1:-1:-1;14906:2:1;14891:18;;14878:32;14919:33;14878:32;14919:33;:::i;:::-;14971:7;-1:-1:-1;15025:2:1;15010:18;;14997:32;;-1:-1:-1;15076:2:1;15061:18;;15048:32;;-1:-1:-1;15132:3:1;15117:19;;15104:33;15181:4;15168:18;;15156:31;;15146:59;;15201:1;15198;15191:12;15146:59;14512:829;;;;-1:-1:-1;14512:829:1;;;;15224:7;15278:3;15263:19;;15250:33;;-1:-1:-1;15330:3:1;15315:19;;;15302:33;;14512:829;-1:-1:-1;;14512:829:1:o;15346:388::-;15414:6;15422;15475:2;15463:9;15454:7;15450:23;15446:32;15443:52;;;15491:1;15488;15481:12;15443:52;15530:9;15517:23;15549:31;15574:5;15549:31;:::i;:::-;15599:5;-1:-1:-1;15656:2:1;15641:18;;15628:32;15669:33;15628:32;15669:33;:::i;15739:348::-;15791:8;15801:6;15855:3;15848:4;15840:6;15836:17;15832:27;15822:55;;15873:1;15870;15863:12;15822:55;-1:-1:-1;15896:20:1;;15939:18;15928:30;;15925:50;;;15971:1;15968;15961:12;15925:50;16008:4;16000:6;15996:17;15984:29;;16060:3;16053:4;16044:6;16036;16032:19;16028:30;16025:39;16022:59;;;16077:1;16074;16067:12;16092:789;16193:6;16201;16209;16217;16225;16278:2;16266:9;16257:7;16253:23;16249:32;16246:52;;;16294:1;16291;16284:12;16246:52;16330:9;16317:23;16307:33;;16391:2;16380:9;16376:18;16363:32;16414:18;16455:2;16447:6;16444:14;16441:34;;;16471:1;16468;16461:12;16441:34;16510:59;16561:7;16552:6;16541:9;16537:22;16510:59;:::i;:::-;16588:8;;-1:-1:-1;16484:85:1;-1:-1:-1;16676:2:1;16661:18;;16648:32;;-1:-1:-1;16692:16:1;;;16689:36;;;16721:1;16718;16711:12;16689:36;;16760:61;16813:7;16802:8;16791:9;16787:24;16760:61;:::i;:::-;16092:789;;;;-1:-1:-1;16092:789:1;;-1:-1:-1;16840:8:1;;16734:87;16092:789;-1:-1:-1;;;16092:789:1:o;16886:380::-;16965:1;16961:12;;;;17008;;;17029:61;;17083:4;17075:6;17071:17;17061:27;;17029:61;17136:2;17128:6;17125:14;17105:18;17102:38;17099:161;;;17182:10;17177:3;17173:20;17170:1;17163:31;17217:4;17214:1;17207:15;17245:4;17242:1;17235:15;17534:406;17736:2;17718:21;;;17775:2;17755:18;;;17748:30;17814:34;17809:2;17794:18;;17787:62;-1:-1:-1;;;17880:2:1;17865:18;;17858:40;17930:3;17915:19;;17534:406::o;17945:127::-;18006:10;18001:3;17997:20;17994:1;17987:31;18037:4;18034:1;18027:15;18061:4;18058:1;18051:15;18430:127;18491:10;18486:3;18482:20;18479:1;18472:31;18522:4;18519:1;18512:15;18546:4;18543:1;18536:15;18562:135;18601:3;-1:-1:-1;;18622:17:1;;18619:43;;;18642:18;;:::i;:::-;-1:-1:-1;18689:1:1;18678:13;;18562:135::o;19372:184::-;19442:6;19495:2;19483:9;19474:7;19470:23;19466:32;19463:52;;;19511:1;19508;19501:12;19463:52;-1:-1:-1;19534:16:1;;19372:184;-1:-1:-1;19372:184:1:o;19561:265::-;19645:6;19698:2;19686:9;19677:7;19673:23;19669:32;19666:52;;;19714:1;19711;19704:12;19666:52;19746:9;19740:16;19765:31;19790:5;19765:31;:::i;20087:245::-;20154:6;20207:2;20195:9;20186:7;20182:23;20178:32;20175:52;;;20223:1;20220;20213:12;20175:52;20255:9;20249:16;20274:28;20296:5;20274:28;:::i;20753:128::-;20793:3;20824:1;20820:6;20817:1;20814:13;20811:39;;;20830:18;;:::i;:::-;-1:-1:-1;20866:9:1;;20753:128::o;20886:402::-;21088:2;21070:21;;;21127:2;21107:18;;;21100:30;21166:34;21161:2;21146:18;;21139:62;-1:-1:-1;;;21232:2:1;21217:18;;21210:36;21278:3;21263:19;;20886:402::o;22933:217::-;22973:1;22999;22989:132;;23043:10;23038:3;23034:20;23031:1;23024:31;23078:4;23075:1;23068:15;23106:4;23103:1;23096:15;22989:132;-1:-1:-1;23135:9:1;;22933:217::o;23155:125::-;23195:4;23223:1;23220;23217:8;23214:34;;;23228:18;;:::i;:::-;-1:-1:-1;23265:9:1;;23155:125::o;25023:168::-;25063:7;25129:1;25125;25121:6;25117:14;25114:1;25111:21;25106:1;25099:9;25092:17;25088:45;25085:71;;;25136:18;;:::i;:::-;-1:-1:-1;25176:9:1;;25023:168::o;27126:401::-;27328:2;27310:21;;;27367:2;27347:18;;;27340:30;27406:34;27401:2;27386:18;;27379:62;-1:-1:-1;;;27472:2:1;27457:18;;27450:35;27517:3;27502:19;;27126:401::o;33944:502::-;34038:6;34046;34054;34062;34115:3;34103:9;34094:7;34090:23;34086:33;34083:53;;;34132:1;34129;34122:12;34083:53;34161:9;34155:16;34145:26;;34211:2;34200:9;34196:18;34190:25;34180:35;;34258:2;34247:9;34243:18;34237:25;34271:31;34296:5;34271:31;:::i;:::-;34371:2;34356:18;;34350:25;34321:5;;-1:-1:-1;34384:30:1;34350:25;34384:30;:::i;:::-;33944:502;;;;-1:-1:-1;33944:502:1;;-1:-1:-1;;33944:502:1:o;35137:786::-;35548:25;35543:3;35536:38;35518:3;35603:6;35597:13;35619:62;35674:6;35669:2;35664:3;35660:12;35653:4;35645:6;35641:17;35619:62;:::i;:::-;-1:-1:-1;;;35740:2:1;35700:16;;;35732:11;;;35725:40;35790:13;;35812:63;35790:13;35861:2;35853:11;;35846:4;35834:17;;35812:63;:::i;:::-;35895:17;35914:2;35891:26;;35137:786;-1:-1:-1;;;;35137:786:1:o;40411:127::-;40472:10;40467:3;40463:20;40460:1;40453:31;40503:4;40500:1;40493:15;40527:4;40524:1;40517:15;41659:136;41698:3;41726:5;41716:39;;41735:18;;:::i;:::-;-1:-1:-1;;;41771:18:1;;41659:136::o;42974:274::-;43103:3;43141:6;43135:13;43157:53;43203:6;43198:3;43191:4;43183:6;43179:17;43157:53;:::i;:::-;43226:16;;;;;42974:274;-1:-1:-1;;42974:274:1:o

Swarm Source

ipfs://c23bfa35b6c369c0fb3208d2e9524c9b1a79c602a712847eeb755675609b6714
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.