Token AICODE

MEME 
 

Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
1,025,569.669477 AICODE

Holders:
9,843 addresses
Contract:
0x7C8a1A80FDd00C9Cccd6EbD573E9EcB49BFa2a590x7C8a1A80FDd00C9Cccd6EbD573E9EcB49BFa2a59

Decimals:
18

Official Site:

Social Profiles:

Balance
503.710161158758916096 AICODE

Value
$0.00
0x039ac6fbcebf02b54259bc690e13540693d9eb8d
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

#ArbDogeAI is created by #AI. 100% of the tokens belong to the community. Never consider #AIDOGE as a MEME.


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

Contract Source Code Verified (Exact Match)

Contract Name:
AICode

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-04-11
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/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/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/ERC20Capped.sol

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

pragma solidity ^0.8.0;

/**
 * @dev Extension of {ERC20} that adds a cap to the supply of tokens.
 */
abstract contract ERC20Capped is ERC20 {
    uint256 private immutable _cap;

    /**
     * @dev Sets the value of the `cap`. This value is immutable, it can only be
     * set once during construction.
     */
    constructor(uint256 cap_) {
        require(cap_ > 0, "ERC20Capped: cap is 0");
        _cap = cap_;
    }

    /**
     * @dev Returns the cap on the token's total supply.
     */
    function cap() public view virtual returns (uint256) {
        return _cap;
    }

    /**
     * @dev See {ERC20-_mint}.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded");
        super._mint(account, amount);
    }
}

// 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/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/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/access/Ownable.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/interfaces/ICamelotFactory.sol


pragma solidity >=0.5.0;

interface ICamelotFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function owner() external view returns (address);

    function feePercentOwner() external view returns (address);

    function setStableOwner() external view returns (address);

    function feeTo() external view returns (address);

    function ownerFeeShare() external view returns (uint256);

    function referrersFeeShare(address) external view returns (uint256);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function feeInfo()
        external
        view
        returns (uint _ownerFeeShare, address _feeTo);
}

// File: contracts/interfaces/IUniswapV2Router01.sol


pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

// File: contracts/interfaces/ICamelotRouter.sol


pragma solidity >=0.6.2;

interface ICamelotRouter is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        address referrer,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        address referrer,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        address referrer,
        uint deadline
    ) external;

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

// File: contracts/interfaces/IWETH.sol


pragma solidity >=0.5.0;

interface IWETH {
    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

// File: contracts/token/AICode.sol


pragma solidity =0.8.19;









contract AICode is ERC20Capped, Ownable {
    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;

    uint256 constant public MAX_CAP = 21_000_000 * 1e18;

    event Trade(address user, address pair, uint256 amount, uint side, uint256 circulatingSupply, uint timestamp);

    mapping(address => bool) public canAddLiquidityBeforeLaunch;
    EnumerableSet.AddressSet private _minters;

    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;
    bool private initialized;

    ICamelotFactory private immutable factory;
    ICamelotRouter private immutable swapRouter;
    IWETH private immutable WETH;

    EnumerableSet.AddressSet private _pairs;

    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;


    constructor(
        address _factory,
        address _swapRouter,
        address _weth
    ) ERC20Capped(MAX_CAP) ERC20("AICODE", "AICODE") {
        canAddLiquidityBeforeLaunch[_msgSender()] = true;
        canAddLiquidityBeforeLaunch[address(this)] = true;
        factory = ICamelotFactory(_factory);
        swapRouter = ICamelotRouter(_swapRouter);
        WETH = IWETH(_weth);
    }

    function mint(address to, uint256 amount) external onlyMinter {
        _mint(to, amount);
    }

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

    function initializePair() external onlyOwner {
        require(!initialized, "Already initialized");
        address pair = factory.createPair(address(WETH), address(this));
        _pairs.add(pair);
        initialized = true;
    }

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

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _dogTransfer(sender, recipient, amount);
    }

    function _dogTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        if (!canAddLiquidityBeforeLaunch[sender]) {
            require(launched(), "Trading not open yet");
        }
        _transfer(sender, recipient, amount);

        uint side = 0;
        address user_ = sender;
        address pair_ = recipient;
        // Set Fees
        if (isPair(sender)) {
            side = 1;
            user_ = recipient;
            pair_ = sender;
        } else if (isPair(recipient)) {
            side = 2;
        }

        if (side > 0) {
            emit Trade(user_, pair_, amount, side, getCirculatingSupply(), block.timestamp);
        }

        return true;
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function rescueToken(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).safeTransfer(msg.sender,IERC20(tokenAddress).balanceOf(address(this)));
    }

    function clearStuckEthBalance() external onlyOwner {
        uint256 amountETH = address(this).balance;
        (bool success, ) = payable(_msgSender()).call{value: amountETH}(new bytes(0));
        require(success, 'AICODE: ETH_TRANSFER_FAILED');
    }

    function getCirculatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /*** ADMIN FUNCTIONS ***/
    function launch() public onlyOwner {
        require(launchedAt == 0, "Already launched");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function isPair(address account) public view returns (bool) {
        return _pairs.contains(account);
    }

    function addPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AICODE: pair is the zero address");
        return _pairs.add(pair);
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AICODE: pair is the zero address");
        return _pairs.remove(pair);
    }

    function addMinter(address minter) public onlyOwner returns (bool) {
        require(minter != address(0), "Token: minter is the zero address");
        return _minters.add(minter);
    }

    function delMinter(address minter) public onlyOwner returns (bool) {
        require(minter != address(0), "Token: minter is the zero address");
        return _minters.remove(minter);
    }

    function getMinterLength() public view returns (uint256) {
        return _minters.length();
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.contains(account);
    }

    function getMinter(uint256 index) public view returns (address) {
        require(index <= getMinterLength() - 1, "Token: index out of bounds");
        return _minters.at(index);
    }

    // modifier for mint function
    modifier onlyMinter() {
        require(isMinter(msg.sender), "caller is not the minter");
        _;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","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"},{"inputs":[],"name":"MAX_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","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":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","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":"address","name":"minter","type":"address"}],"name":"delMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040523480156200001257600080fd5b5060405162003c7638038062003c768339818101604052810190620000389190620003e1565b6a115eec47f6cf7e350000006040518060400160405280600681526020017f4149434f444500000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4149434f444500000000000000000000000000000000000000000000000000008152508160039081620000c19190620006b7565b508060049081620000d39190620006b7565b505050600081116200011c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200011390620007ff565b60405180910390fd5b8060808181525050506200014562000139620002a960201b60201c565b620002b160201b60201c565b6001600660006200015b620002a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050505062000821565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003a9826200037c565b9050919050565b620003bb816200039c565b8114620003c757600080fd5b50565b600081519050620003db81620003b0565b92915050565b600080600060608486031215620003fd57620003fc62000377565b5b60006200040d86828701620003ca565b93505060206200042086828701620003ca565b92505060406200043386828701620003ca565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004bf57607f821691505b602082108103620004d557620004d462000477565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200053f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000500565b6200054b868362000500565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000598620005926200058c8462000563565b6200056d565b62000563565b9050919050565b6000819050919050565b620005b48362000577565b620005cc620005c3826200059f565b8484546200050d565b825550505050565b600090565b620005e3620005d4565b620005f0818484620005a9565b505050565b5b8181101562000618576200060c600082620005d9565b600181019050620005f6565b5050565b601f82111562000667576200063181620004db565b6200063c84620004f0565b810160208510156200064c578190505b620006646200065b85620004f0565b830182620005f5565b50505b505050565b600082821c905092915050565b60006200068c600019846008026200066c565b1980831691505092915050565b6000620006a7838362000679565b9150826002028217905092915050565b620006c2826200043d565b67ffffffffffffffff811115620006de57620006dd62000448565b5b620006ea8254620004a6565b620006f78282856200061c565b600060209050601f8311600181146200072f57600084156200071a578287015190505b62000726858262000699565b86555062000796565b601f1984166200073f86620004db565b60005b82811015620007695784890151825560018201915060208501945060208101905062000742565b8683101562000789578489015162000785601f89168262000679565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332304361707065643a2063617020697320300000000000000000000000600082015250565b6000620007e76015836200079e565b9150620007f482620007af565b602082019050919050565b600060208201905081810360008301526200081a81620007d8565b9050919050565b60805160a05160c05160e05161341e620008586000396000610c6c0152600050506000610c3001526000610a74015261341e6000f3fe6080604052600436106101f25760003560e01c8063715018a61161010d578063aa271e1a116100a0578063c6d2577d1161006f578063c6d2577d14610748578063d669e1d414610773578063dd62ed3e1461079e578063e5e31b13146107db578063f2fde38b14610818576101f9565b8063aa271e1a1461068c578063bf56b371146106c9578063bfa382b5146106f4578063c2b7bbb61461070b576101f9565b8063983b2d56116100dc578063983b2d5614610598578063a457c2d7146105d5578063a5bc508514610612578063a9059cbb1461064f576101f9565b8063715018a6146104ee5780638072250b146105055780638da5cb5b1461054257806395d89b411461056d576101f9565b8063313ce567116101855780634460d3cf116101545780634460d3cf146104345780634fab9e4c1461045d5780635b7121f81461047457806370a08231146104b1576101f9565b8063313ce56714610378578063355274ea146103a357806339509351146103ce57806340c10f191461040b576101f9565b806318160ddd116101c157806318160ddd146102a857806323338b88146102d357806323b872dd146103105780632b112e491461034d576101f9565b806301339c21146101fe5780630323aac71461021557806306fdde0314610240578063095ea7b31461026b576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610213610841565b005b34801561022157600080fd5b5061022a61089e565b6040516102379190612292565b60405180910390f35b34801561024c57600080fd5b506102556108af565b604051610262919061233d565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d91906123ee565b610941565b60405161029f9190612449565b60405180910390f35b3480156102b457600080fd5b506102bd610964565b6040516102ca9190612292565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612464565b61096e565b6040516103079190612449565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612491565b610a02565b6040516103449190612449565b60405180910390f35b34801561035957600080fd5b50610362610a2f565b60405161036f9190612292565b60405180910390f35b34801561038457600080fd5b5061038d610a67565b60405161039a9190612500565b60405180910390f35b3480156103af57600080fd5b506103b8610a70565b6040516103c59190612292565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906123ee565b610a98565b6040516104029190612449565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d91906123ee565b610acf565b005b34801561044057600080fd5b5061045b60048036038101906104569190612464565b610b25565b005b34801561046957600080fd5b50610472610bd4565b005b34801561048057600080fd5b5061049b6004803603810190610496919061251b565b610d21565b6040516104a89190612557565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612464565b610d94565b6040516104e59190612292565b60405180910390f35b3480156104fa57600080fd5b50610503610ddc565b005b34801561051157600080fd5b5061052c60048036038101906105279190612464565b610df0565b6040516105399190612449565b60405180910390f35b34801561054e57600080fd5b50610557610e10565b6040516105649190612557565b60405180910390f35b34801561057957600080fd5b50610582610e3a565b60405161058f919061233d565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190612464565b610ecc565b6040516105cc9190612449565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906123ee565b610f60565b6040516106099190612449565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612464565b610fd7565b6040516106469190612449565b60405180910390f35b34801561065b57600080fd5b50610676600480360381019061067191906123ee565b61106b565b6040516106839190612449565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190612464565b611087565b6040516106c09190612449565b60405180910390f35b3480156106d557600080fd5b506106de6110a4565b6040516106eb9190612292565b60405180910390f35b34801561070057600080fd5b506107096110aa565b005b34801561071757600080fd5b50610732600480360381019061072d9190612464565b6111bd565b60405161073f9190612449565b60405180910390f35b34801561075457600080fd5b5061075d611251565b60405161076a9190612292565b60405180910390f35b34801561077f57600080fd5b50610788611257565b6040516107959190612292565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190612572565b611266565b6040516107d29190612292565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd9190612464565b6112ed565b60405161080f9190612449565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190612464565b61130a565b005b61084961138d565b60006009541461088e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610885906125fe565b60405180910390fd5b4360098190555042600a81905550565b60006108aa600761140b565b905090565b6060600380546108be9061264d565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea9061264d565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b60008061094c611420565b9050610959818585611428565b600191505092915050565b6000600254905090565b600061097861138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de906126f0565b60405180910390fd5b6109fb8260076115f190919063ffffffff16565b9050919050565b600080610a0d611420565b9050610a1a858285611621565b610a258585856116ad565b9150509392505050565b6000610a3b6000610d94565b610a4661dead610d94565b610a4e610964565b610a58919061273f565b610a62919061273f565b905090565b60006012905090565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b600080610aa3611420565b9050610ac4818585610ab58589611266565b610abf9190612773565b611428565b600191505092915050565b610ad833611087565b610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e906127f3565b60405180910390fd5b610b2182826117ef565b5050565b610b2d61138d565b610bd1338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b6a9190612557565b602060405180830381865afa158015610b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab9190612828565b8373ffffffffffffffffffffffffffffffffffffffff166118599092919063ffffffff16565b50565b610bdc61138d565b600b60009054906101000a900460ff1615610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c23906128a1565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b8152600401610ca99291906128c1565b6020604051808303816000875af1158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec91906128ff565b9050610d0281600c6118df90919063ffffffff16565b506001600b60006101000a81548160ff02191690831515021790555050565b60006001610d2d61089e565b610d37919061273f565b821115610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7090612978565b60405180910390fd5b610d8d82600761190f90919063ffffffff16565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610de461138d565b610dee6000611929565b565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e499061264d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e759061264d565b8015610ec25780601f10610e9757610100808354040283529160200191610ec2565b820191906000526020600020905b815481529060010190602001808311610ea557829003601f168201915b5050505050905090565b6000610ed661138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c906126f0565b60405180910390fd5b610f598260076118df90919063ffffffff16565b9050919050565b600080610f6b611420565b90506000610f798286611266565b905083811015610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590612a0a565b60405180910390fd5b610fcb8286868403611428565b60019250505092915050565b6000610fe161138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790612a76565b60405180910390fd5b61106482600c6115f190919063ffffffff16565b9050919050565b600061107f611078611420565b84846116ad565b905092915050565b600061109d8260076119ef90919063ffffffff16565b9050919050565b60095481565b6110b261138d565b600047905060006110c1611420565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156110f3576110f2612a96565b5b6040519080825280601f01601f1916602001820160405280156111255781602001600182028036833780820191505090505b506040516111339190612b0c565b60006040518083038185875af1925050503d8060008114611170576040519150601f19603f3d011682016040523d82523d6000602084013e611175565b606091505b50509050806111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090612b6f565b60405180910390fd5b5050565b60006111c761138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90612a76565b60405180910390fd5b61124a82600c6118df90919063ffffffff16565b9050919050565b600a5481565b6a115eec47f6cf7e3500000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061130382600c6119ef90919063ffffffff16565b9050919050565b61131261138d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137890612c01565b60405180910390fd5b61138a81611929565b50565b611395611420565b73ffffffffffffffffffffffffffffffffffffffff166113b3610e10565b73ffffffffffffffffffffffffffffffffffffffff1614611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090612c6d565b60405180910390fd5b565b600061141982600001611a1f565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90612cff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90612d91565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115e49190612292565b60405180910390a3505050565b6000611619836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611a30565b905092915050565b600061162d8484611266565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116a75781811015611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090612dfd565b60405180910390fd5b6116a68484848403611428565b5b50505050565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661174857611708611b44565b611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90612e69565b60405180910390fd5b5b611753848484611b51565b6000808590506000859050611767876112ed565b1561177b576001925085915086905061178f565b611784866112ed565b1561178e57600292505b5b60008311156117e1577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754828287866117c5610a2f565b426040516117d896959493929190612e89565b60405180910390a15b600193505050509392505050565b6117f7610a70565b81611800610964565b61180a9190612773565b111561184b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184290612f36565b60405180910390fd5b6118558282611dc7565b5050565b6118da8363a9059cbb60e01b8484604051602401611878929190612f56565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f1d565b505050565b6000611907836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611fe4565b905092915050565b600061191e8360000183612054565b60001c905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611a17836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61207f565b905092915050565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114611b38576000600182611a62919061273f565b9050600060018660000180549050611a7a919061273f565b9050818114611ae9576000866000018281548110611a9b57611a9a612f7f565b5b9060005260206000200154905080876000018481548110611abf57611abe612f7f565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611afd57611afc612fae565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611b3e565b60009150505b92915050565b6000806009541415905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061304f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c26906130e1565b60405180910390fd5b611c3a8383836120a2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790613173565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dae9190612292565b60405180910390a3611dc18484846120a7565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d906131df565b60405180910390fd5b611e42600083836120a2565b8060026000828254611e549190612773565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f059190612292565b60405180910390a3611f19600083836120a7565b5050565b6000611f7f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166120ac9092919063ffffffff16565b9050600081511115611fdf5780806020019051810190611f9f919061322b565b611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd5906132ca565b60405180910390fd5b5b505050565b6000611ff0838361207f565b61204957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061204e565b600090505b92915050565b600082600001828154811061206c5761206b612f7f565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b60606120bb84846000856120c4565b90509392505050565b606082471015612109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121009061335c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121329190612b0c565b60006040518083038185875af1925050503d806000811461216f576040519150601f19603f3d011682016040523d82523d6000602084013e612174565b606091505b509150915061218587838387612191565b92505050949350505050565b606083156121f35760008351036121eb576121ab85612206565b6121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e1906133c8565b60405180910390fd5b5b8290506121fe565b6121fd8383612229565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008251111561223c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612270919061233d565b60405180910390fd5b6000819050919050565b61228c81612279565b82525050565b60006020820190506122a76000830184612283565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122e75780820151818401526020810190506122cc565b60008484015250505050565b6000601f19601f8301169050919050565b600061230f826122ad565b61231981856122b8565b93506123298185602086016122c9565b612332816122f3565b840191505092915050565b600060208201905081810360008301526123578184612304565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061238f82612364565b9050919050565b61239f81612384565b81146123aa57600080fd5b50565b6000813590506123bc81612396565b92915050565b6123cb81612279565b81146123d657600080fd5b50565b6000813590506123e8816123c2565b92915050565b600080604083850312156124055761240461235f565b5b6000612413858286016123ad565b9250506020612424858286016123d9565b9150509250929050565b60008115159050919050565b6124438161242e565b82525050565b600060208201905061245e600083018461243a565b92915050565b60006020828403121561247a5761247961235f565b5b6000612488848285016123ad565b91505092915050565b6000806000606084860312156124aa576124a961235f565b5b60006124b8868287016123ad565b93505060206124c9868287016123ad565b92505060406124da868287016123d9565b9150509250925092565b600060ff82169050919050565b6124fa816124e4565b82525050565b600060208201905061251560008301846124f1565b92915050565b6000602082840312156125315761253061235f565b5b600061253f848285016123d9565b91505092915050565b61255181612384565b82525050565b600060208201905061256c6000830184612548565b92915050565b600080604083850312156125895761258861235f565b5b6000612597858286016123ad565b92505060206125a8858286016123ad565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006125e86010836122b8565b91506125f3826125b2565b602082019050919050565b60006020820190508181036000830152612617816125db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061266557607f821691505b6020821081036126785761267761261e565b5b50919050565b7f546f6b656e3a206d696e74657220697320746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006126da6021836122b8565b91506126e58261267e565b604082019050919050565b60006020820190508181036000830152612709816126cd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061274a82612279565b915061275583612279565b925082820390508181111561276d5761276c612710565b5b92915050565b600061277e82612279565b915061278983612279565b92508282019050808211156127a1576127a0612710565b5b92915050565b7f63616c6c6572206973206e6f7420746865206d696e7465720000000000000000600082015250565b60006127dd6018836122b8565b91506127e8826127a7565b602082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b600081519050612822816123c2565b92915050565b60006020828403121561283e5761283d61235f565b5b600061284c84828501612813565b91505092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b600061288b6013836122b8565b915061289682612855565b602082019050919050565b600060208201905081810360008301526128ba8161287e565b9050919050565b60006040820190506128d66000830185612548565b6128e36020830184612548565b9392505050565b6000815190506128f981612396565b92915050565b6000602082840312156129155761291461235f565b5b6000612923848285016128ea565b91505092915050565b7f546f6b656e3a20696e646578206f7574206f6620626f756e6473000000000000600082015250565b6000612962601a836122b8565b915061296d8261292c565b602082019050919050565b6000602082019050818103600083015261299181612955565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006129f46025836122b8565b91506129ff82612998565b604082019050919050565b60006020820190508181036000830152612a23816129e7565b9050919050565b7f4149434f44453a207061697220697320746865207a65726f2061646472657373600082015250565b6000612a606020836122b8565b9150612a6b82612a2a565b602082019050919050565b60006020820190508181036000830152612a8f81612a53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b6000612ae682612ac5565b612af08185612ad0565b9350612b008185602086016122c9565b80840191505092915050565b6000612b188284612adb565b915081905092915050565b7f4149434f44453a204554485f5452414e534645525f4641494c45440000000000600082015250565b6000612b59601b836122b8565b9150612b6482612b23565b602082019050919050565b60006020820190508181036000830152612b8881612b4c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612beb6026836122b8565b9150612bf682612b8f565b604082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c576020836122b8565b9150612c6282612c21565b602082019050919050565b60006020820190508181036000830152612c8681612c4a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612ce96024836122b8565b9150612cf482612c8d565b604082019050919050565b60006020820190508181036000830152612d1881612cdc565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d7b6022836122b8565b9150612d8682612d1f565b604082019050919050565b60006020820190508181036000830152612daa81612d6e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612de7601d836122b8565b9150612df282612db1565b602082019050919050565b60006020820190508181036000830152612e1681612dda565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000612e536014836122b8565b9150612e5e82612e1d565b602082019050919050565b60006020820190508181036000830152612e8281612e46565b9050919050565b600060c082019050612e9e6000830189612548565b612eab6020830188612548565b612eb86040830187612283565b612ec56060830186612283565b612ed26080830185612283565b612edf60a0830184612283565b979650505050505050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b6000612f206019836122b8565b9150612f2b82612eea565b602082019050919050565b60006020820190508181036000830152612f4f81612f13565b9050919050565b6000604082019050612f6b6000830185612548565b612f786020830184612283565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006130396025836122b8565b915061304482612fdd565b604082019050919050565b600060208201905081810360008301526130688161302c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006130cb6023836122b8565b91506130d68261306f565b604082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061315d6026836122b8565b915061316882613101565b604082019050919050565b6000602082019050818103600083015261318c81613150565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131c9601f836122b8565b91506131d482613193565b602082019050919050565b600060208201905081810360008301526131f8816131bc565b9050919050565b6132088161242e565b811461321357600080fd5b50565b600081519050613225816131ff565b92915050565b6000602082840312156132415761324061235f565b5b600061324f84828501613216565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006132b4602a836122b8565b91506132bf82613258565b604082019050919050565b600060208201905081810360008301526132e3816132a7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006133466026836122b8565b9150613351826132ea565b604082019050919050565b6000602082019050818103600083015261337581613339565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006133b2601d836122b8565b91506133bd8261337c565b602082019050919050565b600060208201905081810360008301526133e1816133a5565b905091905056fea2646970667358221220c64e7e070871bce2d206a209e6281a06135cd2d76acc714a9a8a6a2cc15d50e764736f6c634300081300330000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

Deployed Bytecode

0x6080604052600436106101f25760003560e01c8063715018a61161010d578063aa271e1a116100a0578063c6d2577d1161006f578063c6d2577d14610748578063d669e1d414610773578063dd62ed3e1461079e578063e5e31b13146107db578063f2fde38b14610818576101f9565b8063aa271e1a1461068c578063bf56b371146106c9578063bfa382b5146106f4578063c2b7bbb61461070b576101f9565b8063983b2d56116100dc578063983b2d5614610598578063a457c2d7146105d5578063a5bc508514610612578063a9059cbb1461064f576101f9565b8063715018a6146104ee5780638072250b146105055780638da5cb5b1461054257806395d89b411461056d576101f9565b8063313ce567116101855780634460d3cf116101545780634460d3cf146104345780634fab9e4c1461045d5780635b7121f81461047457806370a08231146104b1576101f9565b8063313ce56714610378578063355274ea146103a357806339509351146103ce57806340c10f191461040b576101f9565b806318160ddd116101c157806318160ddd146102a857806323338b88146102d357806323b872dd146103105780632b112e491461034d576101f9565b806301339c21146101fe5780630323aac71461021557806306fdde0314610240578063095ea7b31461026b576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610213610841565b005b34801561022157600080fd5b5061022a61089e565b6040516102379190612292565b60405180910390f35b34801561024c57600080fd5b506102556108af565b604051610262919061233d565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d91906123ee565b610941565b60405161029f9190612449565b60405180910390f35b3480156102b457600080fd5b506102bd610964565b6040516102ca9190612292565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612464565b61096e565b6040516103079190612449565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612491565b610a02565b6040516103449190612449565b60405180910390f35b34801561035957600080fd5b50610362610a2f565b60405161036f9190612292565b60405180910390f35b34801561038457600080fd5b5061038d610a67565b60405161039a9190612500565b60405180910390f35b3480156103af57600080fd5b506103b8610a70565b6040516103c59190612292565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906123ee565b610a98565b6040516104029190612449565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d91906123ee565b610acf565b005b34801561044057600080fd5b5061045b60048036038101906104569190612464565b610b25565b005b34801561046957600080fd5b50610472610bd4565b005b34801561048057600080fd5b5061049b6004803603810190610496919061251b565b610d21565b6040516104a89190612557565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612464565b610d94565b6040516104e59190612292565b60405180910390f35b3480156104fa57600080fd5b50610503610ddc565b005b34801561051157600080fd5b5061052c60048036038101906105279190612464565b610df0565b6040516105399190612449565b60405180910390f35b34801561054e57600080fd5b50610557610e10565b6040516105649190612557565b60405180910390f35b34801561057957600080fd5b50610582610e3a565b60405161058f919061233d565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190612464565b610ecc565b6040516105cc9190612449565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906123ee565b610f60565b6040516106099190612449565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612464565b610fd7565b6040516106469190612449565b60405180910390f35b34801561065b57600080fd5b50610676600480360381019061067191906123ee565b61106b565b6040516106839190612449565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190612464565b611087565b6040516106c09190612449565b60405180910390f35b3480156106d557600080fd5b506106de6110a4565b6040516106eb9190612292565b60405180910390f35b34801561070057600080fd5b506107096110aa565b005b34801561071757600080fd5b50610732600480360381019061072d9190612464565b6111bd565b60405161073f9190612449565b60405180910390f35b34801561075457600080fd5b5061075d611251565b60405161076a9190612292565b60405180910390f35b34801561077f57600080fd5b50610788611257565b6040516107959190612292565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190612572565b611266565b6040516107d29190612292565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd9190612464565b6112ed565b60405161080f9190612449565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190612464565b61130a565b005b61084961138d565b60006009541461088e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610885906125fe565b60405180910390fd5b4360098190555042600a81905550565b60006108aa600761140b565b905090565b6060600380546108be9061264d565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea9061264d565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b60008061094c611420565b9050610959818585611428565b600191505092915050565b6000600254905090565b600061097861138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de906126f0565b60405180910390fd5b6109fb8260076115f190919063ffffffff16565b9050919050565b600080610a0d611420565b9050610a1a858285611621565b610a258585856116ad565b9150509392505050565b6000610a3b6000610d94565b610a4661dead610d94565b610a4e610964565b610a58919061273f565b610a62919061273f565b905090565b60006012905090565b60007f000000000000000000000000000000000000000000115eec47f6cf7e35000000905090565b600080610aa3611420565b9050610ac4818585610ab58589611266565b610abf9190612773565b611428565b600191505092915050565b610ad833611087565b610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e906127f3565b60405180910390fd5b610b2182826117ef565b5050565b610b2d61138d565b610bd1338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b6a9190612557565b602060405180830381865afa158015610b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab9190612828565b8373ffffffffffffffffffffffffffffffffffffffff166118599092919063ffffffff16565b50565b610bdc61138d565b600b60009054906101000a900460ff1615610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c23906128a1565b60405180910390fd5b60007f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65273ffffffffffffffffffffffffffffffffffffffff1663c9c653967f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1306040518363ffffffff1660e01b8152600401610ca99291906128c1565b6020604051808303816000875af1158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec91906128ff565b9050610d0281600c6118df90919063ffffffff16565b506001600b60006101000a81548160ff02191690831515021790555050565b60006001610d2d61089e565b610d37919061273f565b821115610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7090612978565b60405180910390fd5b610d8d82600761190f90919063ffffffff16565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610de461138d565b610dee6000611929565b565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e499061264d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e759061264d565b8015610ec25780601f10610e9757610100808354040283529160200191610ec2565b820191906000526020600020905b815481529060010190602001808311610ea557829003601f168201915b5050505050905090565b6000610ed661138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c906126f0565b60405180910390fd5b610f598260076118df90919063ffffffff16565b9050919050565b600080610f6b611420565b90506000610f798286611266565b905083811015610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590612a0a565b60405180910390fd5b610fcb8286868403611428565b60019250505092915050565b6000610fe161138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790612a76565b60405180910390fd5b61106482600c6115f190919063ffffffff16565b9050919050565b600061107f611078611420565b84846116ad565b905092915050565b600061109d8260076119ef90919063ffffffff16565b9050919050565b60095481565b6110b261138d565b600047905060006110c1611420565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156110f3576110f2612a96565b5b6040519080825280601f01601f1916602001820160405280156111255781602001600182028036833780820191505090505b506040516111339190612b0c565b60006040518083038185875af1925050503d8060008114611170576040519150601f19603f3d011682016040523d82523d6000602084013e611175565b606091505b50509050806111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090612b6f565b60405180910390fd5b5050565b60006111c761138d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90612a76565b60405180910390fd5b61124a82600c6118df90919063ffffffff16565b9050919050565b600a5481565b6a115eec47f6cf7e3500000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061130382600c6119ef90919063ffffffff16565b9050919050565b61131261138d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137890612c01565b60405180910390fd5b61138a81611929565b50565b611395611420565b73ffffffffffffffffffffffffffffffffffffffff166113b3610e10565b73ffffffffffffffffffffffffffffffffffffffff1614611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090612c6d565b60405180910390fd5b565b600061141982600001611a1f565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148e90612cff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90612d91565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115e49190612292565b60405180910390a3505050565b6000611619836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611a30565b905092915050565b600061162d8484611266565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116a75781811015611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090612dfd565b60405180910390fd5b6116a68484848403611428565b5b50505050565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661174857611708611b44565b611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90612e69565b60405180910390fd5b5b611753848484611b51565b6000808590506000859050611767876112ed565b1561177b576001925085915086905061178f565b611784866112ed565b1561178e57600292505b5b60008311156117e1577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754828287866117c5610a2f565b426040516117d896959493929190612e89565b60405180910390a15b600193505050509392505050565b6117f7610a70565b81611800610964565b61180a9190612773565b111561184b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184290612f36565b60405180910390fd5b6118558282611dc7565b5050565b6118da8363a9059cbb60e01b8484604051602401611878929190612f56565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f1d565b505050565b6000611907836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611fe4565b905092915050565b600061191e8360000183612054565b60001c905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611a17836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61207f565b905092915050565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114611b38576000600182611a62919061273f565b9050600060018660000180549050611a7a919061273f565b9050818114611ae9576000866000018281548110611a9b57611a9a612f7f565b5b9060005260206000200154905080876000018481548110611abf57611abe612f7f565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611afd57611afc612fae565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611b3e565b60009150505b92915050565b6000806009541415905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061304f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c26906130e1565b60405180910390fd5b611c3a8383836120a2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790613173565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dae9190612292565b60405180910390a3611dc18484846120a7565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d906131df565b60405180910390fd5b611e42600083836120a2565b8060026000828254611e549190612773565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f059190612292565b60405180910390a3611f19600083836120a7565b5050565b6000611f7f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166120ac9092919063ffffffff16565b9050600081511115611fdf5780806020019051810190611f9f919061322b565b611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd5906132ca565b60405180910390fd5b5b505050565b6000611ff0838361207f565b61204957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061204e565b600090505b92915050565b600082600001828154811061206c5761206b612f7f565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b60606120bb84846000856120c4565b90509392505050565b606082471015612109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121009061335c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121329190612b0c565b60006040518083038185875af1925050503d806000811461216f576040519150601f19603f3d011682016040523d82523d6000602084013e612174565b606091505b509150915061218587838387612191565b92505050949350505050565b606083156121f35760008351036121eb576121ab85612206565b6121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e1906133c8565b60405180910390fd5b5b8290506121fe565b6121fd8383612229565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008251111561223c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612270919061233d565b60405180910390fd5b6000819050919050565b61228c81612279565b82525050565b60006020820190506122a76000830184612283565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122e75780820151818401526020810190506122cc565b60008484015250505050565b6000601f19601f8301169050919050565b600061230f826122ad565b61231981856122b8565b93506123298185602086016122c9565b612332816122f3565b840191505092915050565b600060208201905081810360008301526123578184612304565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061238f82612364565b9050919050565b61239f81612384565b81146123aa57600080fd5b50565b6000813590506123bc81612396565b92915050565b6123cb81612279565b81146123d657600080fd5b50565b6000813590506123e8816123c2565b92915050565b600080604083850312156124055761240461235f565b5b6000612413858286016123ad565b9250506020612424858286016123d9565b9150509250929050565b60008115159050919050565b6124438161242e565b82525050565b600060208201905061245e600083018461243a565b92915050565b60006020828403121561247a5761247961235f565b5b6000612488848285016123ad565b91505092915050565b6000806000606084860312156124aa576124a961235f565b5b60006124b8868287016123ad565b93505060206124c9868287016123ad565b92505060406124da868287016123d9565b9150509250925092565b600060ff82169050919050565b6124fa816124e4565b82525050565b600060208201905061251560008301846124f1565b92915050565b6000602082840312156125315761253061235f565b5b600061253f848285016123d9565b91505092915050565b61255181612384565b82525050565b600060208201905061256c6000830184612548565b92915050565b600080604083850312156125895761258861235f565b5b6000612597858286016123ad565b92505060206125a8858286016123ad565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006125e86010836122b8565b91506125f3826125b2565b602082019050919050565b60006020820190508181036000830152612617816125db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061266557607f821691505b6020821081036126785761267761261e565b5b50919050565b7f546f6b656e3a206d696e74657220697320746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006126da6021836122b8565b91506126e58261267e565b604082019050919050565b60006020820190508181036000830152612709816126cd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061274a82612279565b915061275583612279565b925082820390508181111561276d5761276c612710565b5b92915050565b600061277e82612279565b915061278983612279565b92508282019050808211156127a1576127a0612710565b5b92915050565b7f63616c6c6572206973206e6f7420746865206d696e7465720000000000000000600082015250565b60006127dd6018836122b8565b91506127e8826127a7565b602082019050919050565b6000602082019050818103600083015261280c816127d0565b9050919050565b600081519050612822816123c2565b92915050565b60006020828403121561283e5761283d61235f565b5b600061284c84828501612813565b91505092915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b600061288b6013836122b8565b915061289682612855565b602082019050919050565b600060208201905081810360008301526128ba8161287e565b9050919050565b60006040820190506128d66000830185612548565b6128e36020830184612548565b9392505050565b6000815190506128f981612396565b92915050565b6000602082840312156129155761291461235f565b5b6000612923848285016128ea565b91505092915050565b7f546f6b656e3a20696e646578206f7574206f6620626f756e6473000000000000600082015250565b6000612962601a836122b8565b915061296d8261292c565b602082019050919050565b6000602082019050818103600083015261299181612955565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006129f46025836122b8565b91506129ff82612998565b604082019050919050565b60006020820190508181036000830152612a23816129e7565b9050919050565b7f4149434f44453a207061697220697320746865207a65726f2061646472657373600082015250565b6000612a606020836122b8565b9150612a6b82612a2a565b602082019050919050565b60006020820190508181036000830152612a8f81612a53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b6000612ae682612ac5565b612af08185612ad0565b9350612b008185602086016122c9565b80840191505092915050565b6000612b188284612adb565b915081905092915050565b7f4149434f44453a204554485f5452414e534645525f4641494c45440000000000600082015250565b6000612b59601b836122b8565b9150612b6482612b23565b602082019050919050565b60006020820190508181036000830152612b8881612b4c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612beb6026836122b8565b9150612bf682612b8f565b604082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c576020836122b8565b9150612c6282612c21565b602082019050919050565b60006020820190508181036000830152612c8681612c4a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612ce96024836122b8565b9150612cf482612c8d565b604082019050919050565b60006020820190508181036000830152612d1881612cdc565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d7b6022836122b8565b9150612d8682612d1f565b604082019050919050565b60006020820190508181036000830152612daa81612d6e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612de7601d836122b8565b9150612df282612db1565b602082019050919050565b60006020820190508181036000830152612e1681612dda565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000612e536014836122b8565b9150612e5e82612e1d565b602082019050919050565b60006020820190508181036000830152612e8281612e46565b9050919050565b600060c082019050612e9e6000830189612548565b612eab6020830188612548565b612eb86040830187612283565b612ec56060830186612283565b612ed26080830185612283565b612edf60a0830184612283565b979650505050505050565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b6000612f206019836122b8565b9150612f2b82612eea565b602082019050919050565b60006020820190508181036000830152612f4f81612f13565b9050919050565b6000604082019050612f6b6000830185612548565b612f786020830184612283565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006130396025836122b8565b915061304482612fdd565b604082019050919050565b600060208201905081810360008301526130688161302c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006130cb6023836122b8565b91506130d68261306f565b604082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061315d6026836122b8565b915061316882613101565b604082019050919050565b6000602082019050818103600083015261318c81613150565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131c9601f836122b8565b91506131d482613193565b602082019050919050565b600060208201905081810360008301526131f8816131bc565b9050919050565b6132088161242e565b811461321357600080fd5b50565b600081519050613225816131ff565b92915050565b6000602082840312156132415761324061235f565b5b600061324f84828501613216565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006132b4602a836122b8565b91506132bf82613258565b604082019050919050565b600060208201905081810360008301526132e3816132a7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006133466026836122b8565b9150613351826132ea565b604082019050919050565b6000602082019050818103600083015261337581613339565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006133b2601d836122b8565b91506133bd8261337c565b602082019050919050565b600060208201905081810360008301526133e1816133a5565b905091905056fea2646970667358221220c64e7e070871bce2d206a209e6281a06135cd2d76acc714a9a8a6a2cc15d50e764736f6c63430008130033

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

0000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _factory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [1] : _swapRouter (address): 0xc873fEcbd354f5A56E00E710B90EF4201db2448d
Arg [2] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [1] : 000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d
Arg [2] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed ByteCode Sourcemap

57299:5340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60944:182;;;;;;;;;;;;;:::i;:::-;;62028:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6672;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9023:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7792:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61827:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59204:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60768:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58700:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18536:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10508:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58594:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60323:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58801:238;;;;;;;;;;;;;:::i;:::-;;62258:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7963:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37059:103;;;;;;;;;;;;;:::i;:::-;;57614:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36411:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6891:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61629:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11249:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61439:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59047:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62136:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57730:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60503:257;;;;;;;;;;;;;:::i;:::-;;61252:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57762:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57436:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61134:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37317:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60944:182;36297:13;:11;:13::i;:::-;61012:1:::1;60998:10;;:15;60990:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;61058:12;61045:10;:25;;;;61103:15;61081:19;:37;;;;60944:182::o:0;62028:100::-;62076:7;62103:17;:8;:15;:17::i;:::-;62096:24;;62028:100;:::o;6672:::-;6726:13;6759:5;6752:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6672:100;:::o;9023:201::-;9106:4;9123:13;9139:12;:10;:12::i;:::-;9123:28;;9162:32;9171:5;9178:7;9187:6;9162:8;:32::i;:::-;9212:4;9205:11;;;9023:201;;;;:::o;7792:108::-;7853:7;7880:12;;7873:19;;7792:108;:::o;61827:193::-;61888:4;36297:13;:11;:13::i;:::-;61931:1:::1;61913:20;;:6;:20;;::::0;61905:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;61989:23;62005:6;61989:8;:15;;:23;;;;:::i;:::-;61982:30;;61827:193:::0;;;:::o;59204:269::-;59310:4;59327:15;59345:12;:10;:12::i;:::-;59327:30;;59368:40;59384:6;59392:7;59401:6;59368:15;:40::i;:::-;59426:39;59439:6;59447:9;59458:6;59426:12;:39::i;:::-;59419:46;;;59204:269;;;;;:::o;60768:137::-;60821:7;60882:15;58132:42;60882:9;:15::i;:::-;60864;58051:42;60864:9;:15::i;:::-;60848:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;60841:56;;60768:137;:::o;58700:93::-;58758:5;58783:2;58776:9;;58700:93;:::o;18536:83::-;18580:7;18607:4;18600:11;;18536:83;:::o;10508:238::-;10596:4;10613:13;10629:12;:10;:12::i;:::-;10613:28;;10652:64;10661:5;10668:7;10705:10;10677:25;10687:5;10694:7;10677:9;:25::i;:::-;:38;;;;:::i;:::-;10652:8;:64::i;:::-;10734:4;10727:11;;;10508:238;;;;:::o;58594:98::-;62530:20;62539:10;62530:8;:20::i;:::-;62522:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58667:17:::1;58673:2;58677:6;58667:5;:17::i;:::-;58594:98:::0;;:::o;60323:172::-;36297:13;:11;:13::i;:::-;60396:91:::1;60430:10;60448:12;60441:30;;;60480:4;60441:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60403:12;60396:33;;;;:91;;;;;:::i;:::-;60323:172:::0;:::o;58801:238::-;36297:13;:11;:13::i;:::-;58866:11:::1;;;;;;;;;;;58865:12;58857:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;58912:12;58927:7;:18;;;58954:4;58969;58927:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58912:63;;58986:16;58997:4;58986:6;:10;;:16;;;;:::i;:::-;;59027:4;59013:11;;:18;;;;;;;;;;;;;;;;;;58846:193;58801:238::o:0;62258:188::-;62313:7;62370:1;62350:17;:15;:17::i;:::-;:21;;;;:::i;:::-;62341:5;:30;;62333:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62420:18;62432:5;62420:8;:11;;:18;;;;:::i;:::-;62413:25;;62258:188;;;:::o;7963:127::-;8037:7;8064:9;:18;8074:7;8064:18;;;;;;;;;;;;;;;;8057:25;;7963:127;;;:::o;37059:103::-;36297:13;:11;:13::i;:::-;37124:30:::1;37151:1;37124:18;:30::i;:::-;37059:103::o:0;57614:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;36411:87::-;36457:7;36484:6;;;;;;;;;;;36477:13;;36411:87;:::o;6891:104::-;6947:13;6980:7;6973:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6891:104;:::o;61629:190::-;61690:4;36297:13;:11;:13::i;:::-;61733:1:::1;61715:20;;:6;:20;;::::0;61707:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;61791:20;61804:6;61791:8;:12;;:20;;;;:::i;:::-;61784:27;;61629:190:::0;;;:::o;11249:436::-;11342:4;11359:13;11375:12;:10;:12::i;:::-;11359:28;;11398:24;11425:25;11435:5;11442:7;11425:9;:25::i;:::-;11398:52;;11489:15;11469:16;:35;;11461:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11582:60;11591:5;11598:7;11626:15;11607:16;:34;11582:8;:60::i;:::-;11673:4;11666:11;;;;11249:436;;;;:::o;61439:182::-;61496:4;36297:13;:11;:13::i;:::-;61537:1:::1;61521:18;;:4;:18;;::::0;61513:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;61594:19;61608:4;61594:6;:13;;:19;;;;:::i;:::-;61587:26;;61439:182:::0;;;:::o;59047:149::-;59126:4;59150:38;59163:12;:10;:12::i;:::-;59177:2;59181:6;59150:12;:38::i;:::-;59143:45;;59047:149;;;;:::o;62136:114::-;62192:4;62216:26;62234:7;62216:8;:17;;:26;;;;:::i;:::-;62209:33;;62136:114;;;:::o;57730:25::-;;;;:::o;60503:257::-;36297:13;:11;:13::i;:::-;60565:17:::1;60585:21;60565:41;;60618:12;60644;:10;:12::i;:::-;60636:26;;60670:9;60691:1;60681:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60636:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60617:77;;;60713:7;60705:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60554:206;;60503:257::o:0;61252:179::-;61309:4;36297:13;:11;:13::i;:::-;61350:1:::1;61334:18;;:4;:18;;::::0;61326:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;61407:16;61418:4;61407:6;:10;;:16;;;;:::i;:::-;61400:23;;61252:179:::0;;;:::o;57762:34::-;;;;:::o;57436:51::-;57470:17;57436:51;:::o;8552:151::-;8641:7;8668:11;:18;8680:5;8668:18;;;;;;;;;;;;;;;:27;8687:7;8668:27;;;;;;;;;;;;;;;;8661:34;;8552:151;;;;:::o;61134:110::-;61188:4;61212:24;61228:7;61212:6;:15;;:24;;;;:::i;:::-;61205:31;;61134:110;;;:::o;37317:201::-;36297:13;:11;:13::i;:::-;37426:1:::1;37406:22;;:8;:22;;::::0;37398:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37482:28;37501:8;37482:18;:28::i;:::-;37317:201:::0;:::o;36576:132::-;36651:12;:10;:12::i;:::-;36640:23;;:7;:5;:7::i;:::-;:23;;;36632:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36576:132::o;47275:117::-;47338:7;47365:19;47373:3;:10;;47365:7;:19::i;:::-;47358:26;;47275:117;;;:::o;4318:98::-;4371:7;4398:10;4391:17;;4318:98;:::o;15276:380::-;15429:1;15412:19;;:5;:19;;;15404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:1;15491:21;;:7;:21;;;15483:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15594:6;15564:11;:18;15576:5;15564:18;;;;;;;;;;;;;;;:27;15583:7;15564:27;;;;;;;;;;;;;;;:36;;;;15632:7;15616:32;;15625:5;15616:32;;;15641:6;15616:32;;;;;;:::i;:::-;;;;;;;;15276:380;;;:::o;46778:158::-;46851:4;46875:53;46883:3;:10;;46919:5;46903:23;;46895:32;;46875:7;:53::i;:::-;46868:60;;46778:158;;;;:::o;15947:453::-;16082:24;16109:25;16119:5;16126:7;16109:9;:25::i;:::-;16082:52;;16169:17;16149:16;:37;16145:248;;16231:6;16211:16;:26;;16203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16315:51;16324:5;16331:7;16359:6;16340:16;:25;16315:8;:51::i;:::-;16145:248;16071:329;15947:453;;;:::o;59481:736::-;59572:4;59594:27;:35;59622:6;59594:35;;;;;;;;;;;;;;;;;;;;;;;;;59589:112;;59654:10;:8;:10::i;:::-;59646:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59589:112;59711:36;59721:6;59729:9;59740:6;59711:9;:36::i;:::-;59760:9;59784:13;59800:6;59784:22;;59817:13;59833:9;59817:25;;59878:14;59885:6;59878;:14::i;:::-;59874:180;;;59916:1;59909:8;;59940:9;59932:17;;59972:6;59964:14;;59874:180;;;60000:17;60007:9;60000:6;:17::i;:::-;59996:58;;;60041:1;60034:8;;59996:58;59874:180;60077:1;60070:4;:8;60066:120;;;60100:74;60106:5;60113;60120:6;60128:4;60134:22;:20;:22::i;:::-;60158:15;60100:74;;;;;;;;;;;:::i;:::-;;;;;;;;60066:120;60205:4;60198:11;;;;;59481:736;;;;;:::o;18677:207::-;18802:5;:3;:5::i;:::-;18792:6;18770:19;:17;:19::i;:::-;:28;;;;:::i;:::-;:37;;18762:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;18848:28;18860:7;18869:6;18848:11;:28::i;:::-;18677:207;;:::o;31390:211::-;31507:86;31527:5;31557:23;;;31582:2;31586:5;31534:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31507:19;:86::i;:::-;31390:211;;;:::o;46450:152::-;46520:4;46544:50;46549:3;:10;;46585:5;46569:23;;46561:32;;46544:4;:50::i;:::-;46537:57;;46450:152;;;;:::o;47746:158::-;47820:7;47871:22;47875:3;:10;;47887:5;47871:3;:22::i;:::-;47863:31;;47840:56;;47746:158;;;;:::o;37678:191::-;37752:16;37771:6;;;;;;;;;;;37752:25;;37797:8;37788:6;;:17;;;;;;;;;;;;;;;;;;37852:8;37821:40;;37842:8;37821:40;;;;;;;;;;;;37741:128;37678:191;:::o;47022:167::-;47102:4;47126:55;47136:3;:10;;47172:5;47156:23;;47148:32;;47126:9;:55::i;:::-;47119:62;;47022:167;;;;:::o;42492:109::-;42548:7;42575:3;:11;;:18;;;;42568:25;;42492:109;;;:::o;40771:1420::-;40837:4;40955:18;40976:3;:12;;:19;40989:5;40976:19;;;;;;;;;;;;40955:40;;41026:1;41012:10;:15;41008:1176;;41387:21;41424:1;41411:10;:14;;;;:::i;:::-;41387:38;;41440:17;41481:1;41460:3;:11;;:18;;;;:22;;;;:::i;:::-;41440:42;;41516:13;41503:9;:26;41499:405;;41550:17;41570:3;:11;;41582:9;41570:22;;;;;;;;:::i;:::-;;;;;;;;;;41550:42;;41724:9;41695:3;:11;;41707:13;41695:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;41835:10;41809:3;:12;;:23;41822:9;41809:23;;;;;;;;;;;:36;;;;41531:373;41499:405;41985:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42080:3;:12;;:19;42093:5;42080:19;;;;;;;;;;;42073:26;;;42123:4;42116:11;;;;;;;41008:1176;42167:5;42160:12;;;40771:1420;;;;;:::o;60225:90::-;60268:4;60306:1;60292:10;;:15;;60285:22;;60225:90;:::o;12155:840::-;12302:1;12286:18;;:4;:18;;;12278:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12379:1;12365:16;;:2;:16;;;12357:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12434:38;12455:4;12461:2;12465:6;12434:20;:38::i;:::-;12485:19;12507:9;:15;12517:4;12507:15;;;;;;;;;;;;;;;;12485:37;;12556:6;12541:11;:21;;12533:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12673:6;12659:11;:20;12641:9;:15;12651:4;12641:15;;;;;;;;;;;;;;;:38;;;;12876:6;12859:9;:13;12869:2;12859:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12926:2;12911:26;;12920:4;12911:26;;;12930:6;12911:26;;;;;;:::i;:::-;;;;;;;;12950:37;12970:4;12976:2;12980:6;12950:19;:37::i;:::-;12267:728;12155:840;;;:::o;13282:548::-;13385:1;13366:21;;:7;:21;;;13358:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13436:49;13465:1;13469:7;13478:6;13436:20;:49::i;:::-;13514:6;13498:12;;:22;;;;;;;:::i;:::-;;;;;;;;13691:6;13669:9;:18;13679:7;13669:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;13745:7;13724:37;;13741:1;13724:37;;;13754:6;13724:37;;;;;;:::i;:::-;;;;;;;;13774:48;13802:1;13806:7;13815:6;13774:19;:48::i;:::-;13282:548;;:::o;34457:716::-;34881:23;34907:69;34935:4;34907:69;;;;;;;;;;;;;;;;;34915:5;34907:27;;;;:69;;;;;:::i;:::-;34881:95;;35011:1;34991:10;:17;:21;34987:179;;;35088:10;35077:30;;;;;;;;;;;;:::i;:::-;35069:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34987:179;34527:646;34457:716;;:::o;40181:414::-;40244:4;40266:21;40276:3;40281:5;40266:9;:21::i;:::-;40261:327;;40304:3;:11;;40321:5;40304:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40487:3;:11;;:18;;;;40465:3;:12;;:19;40478:5;40465:19;;;;;;;;;;;:40;;;;40527:4;40520:11;;;;40261:327;40571:5;40564:12;;40181:414;;;;;:::o;42955:120::-;43022:7;43049:3;:11;;43061:5;43049:18;;;;;;;;:::i;:::-;;;;;;;;;;43042:25;;42955:120;;;;:::o;42277:129::-;42350:4;42397:1;42374:3;:12;;:19;42387:5;42374:19;;;;;;;;;;;;:24;;42367:31;;42277:129;;;;:::o;17000:125::-;;;;:::o;17729:124::-;;;;:::o;25242:229::-;25379:12;25411:52;25433:6;25441:4;25447:1;25450:12;25411:21;:52::i;:::-;25404:59;;25242:229;;;;;:::o;26362:455::-;26532:12;26590:5;26565:21;:30;;26557:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26650:12;26664:23;26691:6;:11;;26710:5;26717:4;26691:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26649:73;;;;26740:69;26767:6;26775:7;26784:10;26796:12;26740:26;:69::i;:::-;26733:76;;;;26362:455;;;;;;:::o;28935:644::-;29120:12;29149:7;29145:427;;;29198:1;29177:10;:17;:22;29173:290;;29395:18;29406:6;29395:10;:18::i;:::-;29387:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;29173:290;29484:10;29477:17;;;;29145:427;29527:33;29535:10;29547:12;29527:7;:33::i;:::-;28935:644;;;;;;;:::o;22485:326::-;22545:4;22802:1;22780:7;:19;;;:23;22773:30;;22485:326;;;:::o;30121:552::-;30302:1;30282:10;:17;:21;30278:388;;;30514:10;30508:17;30571:15;30558:10;30554:2;30550:19;30543:44;30278:388;30641:12;30634:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:329::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:222::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5791:71;5859:1;5848:9;5844:17;5835:6;5791:71;:::i;:::-;5647:222;;;;:::o;5875:474::-;5943:6;5951;6000:2;5988:9;5979:7;5975:23;5971:32;5968:119;;;6006:79;;:::i;:::-;5968:119;6126:1;6151:53;6196:7;6187:6;6176:9;6172:22;6151:53;:::i;:::-;6141:63;;6097:117;6253:2;6279:53;6324:7;6315:6;6304:9;6300:22;6279:53;:::i;:::-;6269:63;;6224:118;5875:474;;;;;:::o;6355:166::-;6495:18;6491:1;6483:6;6479:14;6472:42;6355:166;:::o;6527:366::-;6669:3;6690:67;6754:2;6749:3;6690:67;:::i;:::-;6683:74;;6766:93;6855:3;6766:93;:::i;:::-;6884:2;6879:3;6875:12;6868:19;;6527:366;;;:::o;6899:419::-;7065:4;7103:2;7092:9;7088:18;7080:26;;7152:9;7146:4;7142:20;7138:1;7127:9;7123:17;7116:47;7180:131;7306:4;7180:131;:::i;:::-;7172:139;;6899:419;;;:::o;7324:180::-;7372:77;7369:1;7362:88;7469:4;7466:1;7459:15;7493:4;7490:1;7483:15;7510:320;7554:6;7591:1;7585:4;7581:12;7571:22;;7638:1;7632:4;7628:12;7659:18;7649:81;;7715:4;7707:6;7703:17;7693:27;;7649:81;7777:2;7769:6;7766:14;7746:18;7743:38;7740:84;;7796:18;;:::i;:::-;7740:84;7561:269;7510:320;;;:::o;7836:220::-;7976:34;7972:1;7964:6;7960:14;7953:58;8045:3;8040:2;8032:6;8028:15;8021:28;7836:220;:::o;8062:366::-;8204:3;8225:67;8289:2;8284:3;8225:67;:::i;:::-;8218:74;;8301:93;8390:3;8301:93;:::i;:::-;8419:2;8414:3;8410:12;8403:19;;8062:366;;;:::o;8434:419::-;8600:4;8638:2;8627:9;8623:18;8615:26;;8687:9;8681:4;8677:20;8673:1;8662:9;8658:17;8651:47;8715:131;8841:4;8715:131;:::i;:::-;8707:139;;8434:419;;;:::o;8859:180::-;8907:77;8904:1;8897:88;9004:4;9001:1;8994:15;9028:4;9025:1;9018:15;9045:194;9085:4;9105:20;9123:1;9105:20;:::i;:::-;9100:25;;9139:20;9157:1;9139:20;:::i;:::-;9134:25;;9183:1;9180;9176:9;9168:17;;9207:1;9201:4;9198:11;9195:37;;;9212:18;;:::i;:::-;9195:37;9045:194;;;;:::o;9245:191::-;9285:3;9304:20;9322:1;9304:20;:::i;:::-;9299:25;;9338:20;9356:1;9338:20;:::i;:::-;9333:25;;9381:1;9378;9374:9;9367:16;;9402:3;9399:1;9396:10;9393:36;;;9409:18;;:::i;:::-;9393:36;9245:191;;;;:::o;9442:174::-;9582:26;9578:1;9570:6;9566:14;9559:50;9442:174;:::o;9622:366::-;9764:3;9785:67;9849:2;9844:3;9785:67;:::i;:::-;9778:74;;9861:93;9950:3;9861:93;:::i;:::-;9979:2;9974:3;9970:12;9963:19;;9622:366;;;:::o;9994:419::-;10160:4;10198:2;10187:9;10183:18;10175:26;;10247:9;10241:4;10237:20;10233:1;10222:9;10218:17;10211:47;10275:131;10401:4;10275:131;:::i;:::-;10267:139;;9994:419;;;:::o;10419:143::-;10476:5;10507:6;10501:13;10492:22;;10523:33;10550:5;10523:33;:::i;:::-;10419:143;;;;:::o;10568:351::-;10638:6;10687:2;10675:9;10666:7;10662:23;10658:32;10655:119;;;10693:79;;:::i;:::-;10655:119;10813:1;10838:64;10894:7;10885:6;10874:9;10870:22;10838:64;:::i;:::-;10828:74;;10784:128;10568:351;;;;:::o;10925:169::-;11065:21;11061:1;11053:6;11049:14;11042:45;10925:169;:::o;11100:366::-;11242:3;11263:67;11327:2;11322:3;11263:67;:::i;:::-;11256:74;;11339:93;11428:3;11339:93;:::i;:::-;11457:2;11452:3;11448:12;11441:19;;11100:366;;;:::o;11472:419::-;11638:4;11676:2;11665:9;11661:18;11653:26;;11725:9;11719:4;11715:20;11711:1;11700:9;11696:17;11689:47;11753:131;11879:4;11753:131;:::i;:::-;11745:139;;11472:419;;;:::o;11897:332::-;12018:4;12056:2;12045:9;12041:18;12033:26;;12069:71;12137:1;12126:9;12122:17;12113:6;12069:71;:::i;:::-;12150:72;12218:2;12207:9;12203:18;12194:6;12150:72;:::i;:::-;11897:332;;;;;:::o;12235:143::-;12292:5;12323:6;12317:13;12308:22;;12339:33;12366:5;12339:33;:::i;:::-;12235:143;;;;:::o;12384:351::-;12454:6;12503:2;12491:9;12482:7;12478:23;12474:32;12471:119;;;12509:79;;:::i;:::-;12471:119;12629:1;12654:64;12710:7;12701:6;12690:9;12686:22;12654:64;:::i;:::-;12644:74;;12600:128;12384:351;;;;:::o;12741:176::-;12881:28;12877:1;12869:6;12865:14;12858:52;12741:176;:::o;12923:366::-;13065:3;13086:67;13150:2;13145:3;13086:67;:::i;:::-;13079:74;;13162:93;13251:3;13162:93;:::i;:::-;13280:2;13275:3;13271:12;13264:19;;12923:366;;;:::o;13295:419::-;13461:4;13499:2;13488:9;13484:18;13476:26;;13548:9;13542:4;13538:20;13534:1;13523:9;13519:17;13512:47;13576:131;13702:4;13576:131;:::i;:::-;13568:139;;13295:419;;;:::o;13720:224::-;13860:34;13856:1;13848:6;13844:14;13837:58;13929:7;13924:2;13916:6;13912:15;13905:32;13720:224;:::o;13950:366::-;14092:3;14113:67;14177:2;14172:3;14113:67;:::i;:::-;14106:74;;14189:93;14278:3;14189:93;:::i;:::-;14307:2;14302:3;14298:12;14291:19;;13950:366;;;:::o;14322:419::-;14488:4;14526:2;14515:9;14511:18;14503:26;;14575:9;14569:4;14565:20;14561:1;14550:9;14546:17;14539:47;14603:131;14729:4;14603:131;:::i;:::-;14595:139;;14322:419;;;:::o;14747:182::-;14887:34;14883:1;14875:6;14871:14;14864:58;14747:182;:::o;14935:366::-;15077:3;15098:67;15162:2;15157:3;15098:67;:::i;:::-;15091:74;;15174:93;15263:3;15174:93;:::i;:::-;15292:2;15287:3;15283:12;15276:19;;14935:366;;;:::o;15307:419::-;15473:4;15511:2;15500:9;15496:18;15488:26;;15560:9;15554:4;15550:20;15546:1;15535:9;15531:17;15524:47;15588:131;15714:4;15588:131;:::i;:::-;15580:139;;15307:419;;;:::o;15732:180::-;15780:77;15777:1;15770:88;15877:4;15874:1;15867:15;15901:4;15898:1;15891:15;15918:98;15969:6;16003:5;15997:12;15987:22;;15918:98;;;:::o;16022:147::-;16123:11;16160:3;16145:18;;16022:147;;;;:::o;16175:386::-;16279:3;16307:38;16339:5;16307:38;:::i;:::-;16361:88;16442:6;16437:3;16361:88;:::i;:::-;16354:95;;16458:65;16516:6;16511:3;16504:4;16497:5;16493:16;16458:65;:::i;:::-;16548:6;16543:3;16539:16;16532:23;;16283:278;16175:386;;;;:::o;16567:271::-;16697:3;16719:93;16808:3;16799:6;16719:93;:::i;:::-;16712:100;;16829:3;16822:10;;16567:271;;;;:::o;16844:177::-;16984:29;16980:1;16972:6;16968:14;16961:53;16844:177;:::o;17027:366::-;17169:3;17190:67;17254:2;17249:3;17190:67;:::i;:::-;17183:74;;17266:93;17355:3;17266:93;:::i;:::-;17384:2;17379:3;17375:12;17368:19;;17027:366;;;:::o;17399:419::-;17565:4;17603:2;17592:9;17588:18;17580:26;;17652:9;17646:4;17642:20;17638:1;17627:9;17623:17;17616:47;17680:131;17806:4;17680:131;:::i;:::-;17672:139;;17399:419;;;:::o;17824:225::-;17964:34;17960:1;17952:6;17948:14;17941:58;18033:8;18028:2;18020:6;18016:15;18009:33;17824:225;:::o;18055:366::-;18197:3;18218:67;18282:2;18277:3;18218:67;:::i;:::-;18211:74;;18294:93;18383:3;18294:93;:::i;:::-;18412:2;18407:3;18403:12;18396:19;;18055:366;;;:::o;18427:419::-;18593:4;18631:2;18620:9;18616:18;18608:26;;18680:9;18674:4;18670:20;18666:1;18655:9;18651:17;18644:47;18708:131;18834:4;18708:131;:::i;:::-;18700:139;;18427:419;;;:::o;18852:182::-;18992:34;18988:1;18980:6;18976:14;18969:58;18852:182;:::o;19040:366::-;19182:3;19203:67;19267:2;19262:3;19203:67;:::i;:::-;19196:74;;19279:93;19368:3;19279:93;:::i;:::-;19397:2;19392:3;19388:12;19381:19;;19040:366;;;:::o;19412:419::-;19578:4;19616:2;19605:9;19601:18;19593:26;;19665:9;19659:4;19655:20;19651:1;19640:9;19636:17;19629:47;19693:131;19819:4;19693:131;:::i;:::-;19685:139;;19412:419;;;:::o;19837:223::-;19977:34;19973:1;19965:6;19961:14;19954:58;20046:6;20041:2;20033:6;20029:15;20022:31;19837:223;:::o;20066:366::-;20208:3;20229:67;20293:2;20288:3;20229:67;:::i;:::-;20222:74;;20305:93;20394:3;20305:93;:::i;:::-;20423:2;20418:3;20414:12;20407:19;;20066:366;;;:::o;20438:419::-;20604:4;20642:2;20631:9;20627:18;20619:26;;20691:9;20685:4;20681:20;20677:1;20666:9;20662:17;20655:47;20719:131;20845:4;20719:131;:::i;:::-;20711:139;;20438:419;;;:::o;20863:221::-;21003:34;20999:1;20991:6;20987:14;20980:58;21072:4;21067:2;21059:6;21055:15;21048:29;20863:221;:::o;21090:366::-;21232:3;21253:67;21317:2;21312:3;21253:67;:::i;:::-;21246:74;;21329:93;21418:3;21329:93;:::i;:::-;21447:2;21442:3;21438:12;21431:19;;21090:366;;;:::o;21462:419::-;21628:4;21666:2;21655:9;21651:18;21643:26;;21715:9;21709:4;21705:20;21701:1;21690:9;21686:17;21679:47;21743:131;21869:4;21743:131;:::i;:::-;21735:139;;21462:419;;;:::o;21887:179::-;22027:31;22023:1;22015:6;22011:14;22004:55;21887:179;:::o;22072:366::-;22214:3;22235:67;22299:2;22294:3;22235:67;:::i;:::-;22228:74;;22311:93;22400:3;22311:93;:::i;:::-;22429:2;22424:3;22420:12;22413:19;;22072:366;;;:::o;22444:419::-;22610:4;22648:2;22637:9;22633:18;22625:26;;22697:9;22691:4;22687:20;22683:1;22672:9;22668:17;22661:47;22725:131;22851:4;22725:131;:::i;:::-;22717:139;;22444:419;;;:::o;22869:170::-;23009:22;23005:1;22997:6;22993:14;22986:46;22869:170;:::o;23045:366::-;23187:3;23208:67;23272:2;23267:3;23208:67;:::i;:::-;23201:74;;23284:93;23373:3;23284:93;:::i;:::-;23402:2;23397:3;23393:12;23386:19;;23045:366;;;:::o;23417:419::-;23583:4;23621:2;23610:9;23606:18;23598:26;;23670:9;23664:4;23660:20;23656:1;23645:9;23641:17;23634:47;23698:131;23824:4;23698:131;:::i;:::-;23690:139;;23417:419;;;:::o;23842:775::-;24075:4;24113:3;24102:9;24098:19;24090:27;;24127:71;24195:1;24184:9;24180:17;24171:6;24127:71;:::i;:::-;24208:72;24276:2;24265:9;24261:18;24252:6;24208:72;:::i;:::-;24290;24358:2;24347:9;24343:18;24334:6;24290:72;:::i;:::-;24372;24440:2;24429:9;24425:18;24416:6;24372:72;:::i;:::-;24454:73;24522:3;24511:9;24507:19;24498:6;24454:73;:::i;:::-;24537;24605:3;24594:9;24590:19;24581:6;24537:73;:::i;:::-;23842:775;;;;;;;;;:::o;24623:175::-;24763:27;24759:1;24751:6;24747:14;24740:51;24623:175;:::o;24804:366::-;24946:3;24967:67;25031:2;25026:3;24967:67;:::i;:::-;24960:74;;25043:93;25132:3;25043:93;:::i;:::-;25161:2;25156:3;25152:12;25145:19;;24804:366;;;:::o;25176:419::-;25342:4;25380:2;25369:9;25365:18;25357:26;;25429:9;25423:4;25419:20;25415:1;25404:9;25400:17;25393:47;25457:131;25583:4;25457:131;:::i;:::-;25449:139;;25176:419;;;:::o;25601:332::-;25722:4;25760:2;25749:9;25745:18;25737:26;;25773:71;25841:1;25830:9;25826:17;25817:6;25773:71;:::i;:::-;25854:72;25922:2;25911:9;25907:18;25898:6;25854:72;:::i;:::-;25601:332;;;;;:::o;25939:180::-;25987:77;25984:1;25977:88;26084:4;26081:1;26074:15;26108:4;26105:1;26098:15;26125:180;26173:77;26170:1;26163:88;26270:4;26267:1;26260:15;26294:4;26291:1;26284:15;26311:224;26451:34;26447:1;26439:6;26435:14;26428:58;26520:7;26515:2;26507:6;26503:15;26496:32;26311:224;:::o;26541:366::-;26683:3;26704:67;26768:2;26763:3;26704:67;:::i;:::-;26697:74;;26780:93;26869:3;26780:93;:::i;:::-;26898:2;26893:3;26889:12;26882:19;;26541:366;;;:::o;26913:419::-;27079:4;27117:2;27106:9;27102:18;27094:26;;27166:9;27160:4;27156:20;27152:1;27141:9;27137:17;27130:47;27194:131;27320:4;27194:131;:::i;:::-;27186:139;;26913:419;;;:::o;27338:222::-;27478:34;27474:1;27466:6;27462:14;27455:58;27547:5;27542:2;27534:6;27530:15;27523:30;27338:222;:::o;27566:366::-;27708:3;27729:67;27793:2;27788:3;27729:67;:::i;:::-;27722:74;;27805:93;27894:3;27805:93;:::i;:::-;27923:2;27918:3;27914:12;27907:19;;27566:366;;;:::o;27938:419::-;28104:4;28142:2;28131:9;28127:18;28119:26;;28191:9;28185:4;28181:20;28177:1;28166:9;28162:17;28155:47;28219:131;28345:4;28219:131;:::i;:::-;28211:139;;27938:419;;;:::o;28363:225::-;28503:34;28499:1;28491:6;28487:14;28480:58;28572:8;28567:2;28559:6;28555:15;28548:33;28363:225;:::o;28594:366::-;28736:3;28757:67;28821:2;28816:3;28757:67;:::i;:::-;28750:74;;28833:93;28922:3;28833:93;:::i;:::-;28951:2;28946:3;28942:12;28935:19;;28594:366;;;:::o;28966:419::-;29132:4;29170:2;29159:9;29155:18;29147:26;;29219:9;29213:4;29209:20;29205:1;29194:9;29190:17;29183:47;29247:131;29373:4;29247:131;:::i;:::-;29239:139;;28966:419;;;:::o;29391:181::-;29531:33;29527:1;29519:6;29515:14;29508:57;29391:181;:::o;29578:366::-;29720:3;29741:67;29805:2;29800:3;29741:67;:::i;:::-;29734:74;;29817:93;29906:3;29817:93;:::i;:::-;29935:2;29930:3;29926:12;29919:19;;29578:366;;;:::o;29950:419::-;30116:4;30154:2;30143:9;30139:18;30131:26;;30203:9;30197:4;30193:20;30189:1;30178:9;30174:17;30167:47;30231:131;30357:4;30231:131;:::i;:::-;30223:139;;29950:419;;;:::o;30375:116::-;30445:21;30460:5;30445:21;:::i;:::-;30438:5;30435:32;30425:60;;30481:1;30478;30471:12;30425:60;30375:116;:::o;30497:137::-;30551:5;30582:6;30576:13;30567:22;;30598:30;30622:5;30598:30;:::i;:::-;30497:137;;;;:::o;30640:345::-;30707:6;30756:2;30744:9;30735:7;30731:23;30727:32;30724:119;;;30762:79;;:::i;:::-;30724:119;30882:1;30907:61;30960:7;30951:6;30940:9;30936:22;30907:61;:::i;:::-;30897:71;;30853:125;30640:345;;;;:::o;30991:229::-;31131:34;31127:1;31119:6;31115:14;31108:58;31200:12;31195:2;31187:6;31183:15;31176:37;30991:229;:::o;31226:366::-;31368:3;31389:67;31453:2;31448:3;31389:67;:::i;:::-;31382:74;;31465:93;31554:3;31465:93;:::i;:::-;31583:2;31578:3;31574:12;31567:19;;31226:366;;;:::o;31598:419::-;31764:4;31802:2;31791:9;31787:18;31779:26;;31851:9;31845:4;31841:20;31837:1;31826:9;31822:17;31815:47;31879:131;32005:4;31879:131;:::i;:::-;31871:139;;31598:419;;;:::o;32023:225::-;32163:34;32159:1;32151:6;32147:14;32140:58;32232:8;32227:2;32219:6;32215:15;32208:33;32023:225;:::o;32254:366::-;32396:3;32417:67;32481:2;32476:3;32417:67;:::i;:::-;32410:74;;32493:93;32582:3;32493:93;:::i;:::-;32611:2;32606:3;32602:12;32595:19;;32254:366;;;:::o;32626:419::-;32792:4;32830:2;32819:9;32815:18;32807:26;;32879:9;32873:4;32869:20;32865:1;32854:9;32850:17;32843:47;32907:131;33033:4;32907:131;:::i;:::-;32899:139;;32626:419;;;:::o;33051:179::-;33191:31;33187:1;33179:6;33175:14;33168:55;33051:179;:::o;33236:366::-;33378:3;33399:67;33463:2;33458:3;33399:67;:::i;:::-;33392:74;;33475:93;33564:3;33475:93;:::i;:::-;33593:2;33588:3;33584:12;33577:19;;33236:366;;;:::o;33608:419::-;33774:4;33812:2;33801:9;33797:18;33789:26;;33861:9;33855:4;33851:20;33847:1;33836:9;33832:17;33825:47;33889:131;34015:4;33889:131;:::i;:::-;33881:139;;33608:419;;;:::o

Metadata Hash

ipfs://c64e7e070871bce2d206a209e6281a06135cd2d76acc714a9a8a6a2cc15d50e7
Loading