ETH Price: $3,233.81 (-3.63%)

Token

Zegent AI (ZGEN)
 

Overview

Max Total Supply

1,000,000,000 ZGEN

Holders

1,789 ( 0.335%)

Market

Price

$0.00 @ 0.000001 ETH (+17.27%)

Onchain Market Cap

$1,895,450.00

Circulating Supply Market Cap

$1,567,707.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
7,260,921.303993326307337863 ZGEN

Value
$13,762.71 ( ~4.2559 Eth) [0.7261%]
0xa10d92f268f2e75fdca39a7f6d0ef87b3274592c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

AI agents made accessible for seamless interaction.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZGEN

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-20
*/

/*
    ███████╗███████╗ ██████╗ ███████╗███╗   ██╗████████╗     █████╗ ██╗
    ╚══███╔╝██╔════╝██╔════╝ ██╔════╝████╗  ██║╚══██╔══╝    ██╔══██╗██║
      ███╔╝ █████╗  ██║  ███╗█████╗  ██╔██╗ ██║   ██║       ███████║██║
     ███╔╝  ██╔══╝  ██║   ██║██╔══╝  ██║╚██╗██║   ██║       ██╔══██║██║
    ███████╗███████╗╚██████╔╝███████╗██║ ╚████║   ██║       ██║  ██║██║
    ╚══════╝╚══════╝ ╚═════╝ ╚══════╝╚═╝  ╚═══╝   ╚═╝       ╚═╝  ╚═╝╚═╝
                                                                       
    Website: https://zegent.app/
    Telegram: https://t.me/ZegentAI
    Twitter: https://x.com/ZegentAI

    Zegent AI - AI Agent At Your Fingertips
*/


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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`'s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`'s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`'s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @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}.
 *
 * 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].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => 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}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

// File: @uniswap/v2-periphery/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 swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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


// File: contracts/ZegentAi.sol


pragma solidity 0.8.20;


contract ZGEN is ERC20, Ownable {

    IUniswapV2Router02 public dexRouter;
    address public dexPair;

    uint public swapAndLiquidityThreshold;
    uint public maxPurchaseAmount;
    uint public transactionFee;

    bool private inSwapAndLiquify;
    bool public isTradingOpen;

    uint256 public liquidityFeeShare;
    uint256 public ethFeeShare;

    address public treasuryWallet;

    mapping (address => bool) private _isExemptFromLimit;

    event LimitationExemptionUpdated(address indexed account, bool isExempt);
    event BatchLimitationExemptionUpdated(address[] account, bool[] isExempt);
    event SwapAndLiquidityProcessed(uint256 tokensSwapped, uint256 tokensForLiquidity, uint256 ethForLiquidity, uint256 ethForTreasury);
    event TransactionFeeUpdated(uint feePercent);
    event MaxPurchaseAmountUpdated(uint limitPercent);
    event SwapThresholdSet(uint256 amount);
    event EthExtracted(address indexed to, uint256 amount);
    event TokensExtracted(address indexed to, uint256 amount);
    event TradingStatusChanged(bool status);

    uint256 public constant VERSION = 1;
    bool public isContractLocked;

    modifier lockSwap {
        require(!inSwapAndLiquify, "Swap and liquify in progress");
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier whenNotLocked {
        require(!isContractLocked, "Contract is locked");
        _;
    }

    constructor(
        address _router, 
        uint256 _transactionFee,
        uint256 _ethFeeShare,
        uint256 _liquidityFeeShare, 
        uint256 _maxPurchaseAmount, 
        address _treasuryWallet) ERC20("Zegent AI", "ZGEN") Ownable(msg.sender) {
        _mint(_msgSender(), 1000e6 ether);

        treasuryWallet = payable(_treasuryWallet);
        address uniswapRouter = _router;
        IUniswapV2Router02 _dexRouter = IUniswapV2Router02(uniswapRouter);
        IUniswapV2Factory _dexFactory = IUniswapV2Factory(_dexRouter.factory());

        ethFeeShare = _ethFeeShare;
        liquidityFeeShare = _liquidityFeeShare;

        address _dexPair = _dexFactory.createPair(address(this), _dexRouter.WETH());

        dexRouter = _dexRouter;
        dexPair = _dexPair;
        transactionFee = _transactionFee;
        maxPurchaseAmount = _maxPurchaseAmount;
        swapAndLiquidityThreshold = 5e5 ether;

        _setLimitationExemption(dexPair, true);
        _setLimitationExemption(address(uniswapRouter), true);
        _setLimitationExemption(_msgSender(), true);
        _setLimitationExemption(address(this), true);
    }

    receive() external payable {}

    function processSwapAndLiquidity(uint256 tokensToProcess) private lockSwap {
        // ... (keep the existing logic, just rename variables)
    }

    function _setLimitationExemption(address account, bool exempt) private {
        _isExemptFromLimit[account] = exempt;
        emit LimitationExemptionUpdated(account, exempt);
    }

    function moveAssets(address recipient, uint256 amount) public virtual returns (bool) {
        return transfer(recipient, amount);
    }

    function approveSpending(address spender, uint256 amount) public virtual returns (bool) {
        return approve(spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal override {
        require(amount > 0, "Transfer amount must be greater than zero");
        if(!_isExemptFromLimit[sender] || !_isExemptFromLimit[recipient]) {
            require(isTradingOpen, "Trading is not yet open");
        }

        uint256 feeAmount = 0;

        if (sender == dexPair && recipient != address(dexRouter) && !_isExemptFromLimit[recipient]) {
            require(amount <= totalSupply() * maxPurchaseAmount / 1e4, "Purchase exceeds max amount");
        }

        if((!_isExemptFromLimit[sender] || !_isExemptFromLimit[recipient]) && sender != address(this)){
            if((sender == dexPair || recipient == dexPair) && transactionFee > 0){
                feeAmount = amount * transactionFee / 1e4;
                super._transfer(sender, address(this), feeAmount);
            }
        }

        if (!inSwapAndLiquify && recipient == dexPair && !_isExemptFromLimit[sender]) {
            uint256 contractTokenBalance = balanceOf(address(this));
            if(contractTokenBalance >= swapAndLiquidityThreshold) {
                uint256 maxProcessAmount = swapAndLiquidityThreshold + (swapAndLiquidityThreshold / 5); 
                if(contractTokenBalance >= maxProcessAmount){
                    processSwapAndLiquidity(maxProcessAmount);
                } else {
                    processSwapAndLiquidity(swapAndLiquidityThreshold);
                }
            }
        }

        super._transfer(sender, recipient, (amount-feeAmount));
    }

    function updateTransactionFee(
        uint forTreasuryInPercentage, 
        uint forLiquidityInPercentage) external onlyOwner whenNotLocked {
        
        uint256 newFeePercentage = forTreasuryInPercentage + forLiquidityInPercentage;
        uint256 currentFeePercentage = transactionFee / 100;
        require(newFeePercentage <= currentFeePercentage, "New fee must not exceed current fee");

        ethFeeShare = forTreasuryInPercentage;
        liquidityFeeShare = forLiquidityInPercentage;

        transactionFee = newFeePercentage * 100;
        
        emit TransactionFeeUpdated(transactionFee);
    }

    function enableTrading() external onlyOwner whenNotLocked {
        require(!isTradingOpen, "Trading is already enabled");
        isTradingOpen = true;
        emit TradingStatusChanged(true);
    }

    function setMaxPurchaseAmount(uint _limit) external onlyOwner whenNotLocked {
        maxPurchaseAmount = _limit;
        emit MaxPurchaseAmountUpdated(_limit);
    }

    function setSwapThreshold(uint256 amount) public onlyOwner whenNotLocked {
        uint256 currentTotalSupply = totalSupply();
        uint256 minThreshold = currentTotalSupply / 10000; 
        uint256 maxThreshold = currentTotalSupply * 5 / 1000; 

        require(amount >= minThreshold && amount <= maxThreshold, "Threshold out of allowed range");
        swapAndLiquidityThreshold = amount;
        emit SwapThresholdSet(amount);
    }

    function setLimitationExemption(address account, bool exempt) public onlyOwner whenNotLocked {
        _setLimitationExemption(account, exempt);
    }

    function batchSetLimitationExemption(address[] calldata accounts, bool[] calldata exemptStatus) public onlyOwner whenNotLocked {
        require(accounts.length == exemptStatus.length, "Array length mismatch");
        for(uint i = 0; i < accounts.length; i++) {
            _setLimitationExemption(accounts[i], exemptStatus[i]);
        }
        emit BatchLimitationExemptionUpdated(accounts, exemptStatus);
    }

    function extractEth(address payable _to) external onlyOwner whenNotLocked {
        require(address(this).balance > 0, "No ETH available for extraction");
        uint256 amount = address(this).balance;
        (bool sent, ) = _to.call{value: amount}("");
        require(sent, "Failed to send Ether");
        emit EthExtracted(_to, amount);
    }

    function extractErc20Tokens(address token, address to) public onlyOwner whenNotLocked {
        uint256 balance = IERC20(token).balanceOf(address(this));
        require(balance > 0, "Insufficient token balance");
        IERC20(token).transfer(to, balance);
        emit TokensExtracted(to, balance);
    }

    function lockContract() external onlyOwner {
        isContractLocked = true;
    }

    function getContractVersion() public pure returns (uint256) {
        return VERSION;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256","name":"_transactionFee","type":"uint256"},{"internalType":"uint256","name":"_ethFeeShare","type":"uint256"},{"internalType":"uint256","name":"_liquidityFeeShare","type":"uint256"},{"internalType":"uint256","name":"_maxPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_treasuryWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":false,"internalType":"address[]","name":"account","type":"address[]"},{"indexed":false,"internalType":"bool[]","name":"isExempt","type":"bool[]"}],"name":"BatchLimitationExemptionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthExtracted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"LimitationExemptionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limitPercent","type":"uint256"}],"name":"MaxPurchaseAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethForTreasury","type":"uint256"}],"name":"SwapAndLiquidityProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapThresholdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensExtracted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"TradingStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feePercent","type":"uint256"}],"name":"TransactionFeeUpdated","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":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveSpending","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":"accounts","type":"address[]"},{"internalType":"bool[]","name":"exemptStatus","type":"bool[]"}],"name":"batchSetLimitationExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethFeeShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"extractErc20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"extractEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isContractLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPurchaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"moveAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setLimitationExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPurchaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquidityThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"transactionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"forTreasuryInPercentage","type":"uint256"},{"internalType":"uint256","name":"forLiquidityInPercentage","type":"uint256"}],"name":"updateTransactionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801562000010575f80fd5b506040516200417c3803806200417c83398181016040528101906200003691906200091e565b336040518060400160405280600981526020017f5a6567656e7420414900000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5a47454e000000000000000000000000000000000000000000000000000000008152508160039081620000b4919062000c11565b508060049081620000c6919062000c11565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000133919062000d06565b60405180910390fd5b6200014d816200046160201b60201c565b506200017b620001626200052460201b60201c565b6b033b2e3c9fd0803ce80000006200052b60201b60201c565b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8690505f8190505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200020e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000234919062000d21565b905086600d8190555085600c819055505f8173ffffffffffffffffffffffffffffffffffffffff1663c9c65396308573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002d2919062000d21565b6040518363ffffffff1660e01b8152600401620002f192919062000d51565b6020604051808303815f875af11580156200030e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000334919062000d21565b90508260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600a81905550856009819055506969e10de76676d08000006008819055506200040960075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620005b560201b60201c565b6200041c846001620005b560201b60201c565b6200043e620004306200052460201b60201c565b6001620005b560201b60201c565b62000451306001620005b560201b60201c565b5050505050505050505062000e81565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200059e575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000595919062000d06565b60405180910390fd5b620005b15f83836200065d60201b60201c565b5050565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f63c42a6d367e0b07b7ac57be2fe620cba5dfb3d7aacad4a3d9284801cd007db18260405162000651919062000d98565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620006b1578060025f828254620006a4919062000de0565b9250508190555062000782565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156200073d578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620007349392919062000e2b565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007cb578060025f828254039250508190555062000815565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000874919062000e66565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620008b08262000885565b9050919050565b620008c281620008a4565b8114620008cd575f80fd5b50565b5f81519050620008e081620008b7565b92915050565b5f819050919050565b620008fa81620008e6565b811462000905575f80fd5b50565b5f815190506200091881620008ef565b92915050565b5f805f805f8060c087890312156200093b576200093a62000881565b5b5f6200094a89828a01620008d0565b96505060206200095d89828a0162000908565b95505060406200097089828a0162000908565b94505060606200098389828a0162000908565b93505060806200099689828a0162000908565b92505060a0620009a989828a01620008d0565b9150509295509295509295565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000a3257607f821691505b60208210810362000a485762000a47620009ed565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000aac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a6f565b62000ab8868362000a6f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000af962000af362000aed84620008e6565b62000ad0565b620008e6565b9050919050565b5f819050919050565b62000b148362000ad9565b62000b2c62000b238262000b00565b84845462000a7b565b825550505050565b5f90565b62000b4262000b34565b62000b4f81848462000b09565b505050565b5b8181101562000b765762000b6a5f8262000b38565b60018101905062000b55565b5050565b601f82111562000bc55762000b8f8162000a4e565b62000b9a8462000a60565b8101602085101562000baa578190505b62000bc262000bb98562000a60565b83018262000b54565b50505b505050565b5f82821c905092915050565b5f62000be75f198460080262000bca565b1980831691505092915050565b5f62000c01838362000bd6565b9150826002028217905092915050565b62000c1c82620009b6565b67ffffffffffffffff81111562000c385762000c37620009c0565b5b62000c44825462000a1a565b62000c5182828562000b7a565b5f60209050601f83116001811462000c87575f841562000c72578287015190505b62000c7e858262000bf4565b86555062000ced565b601f19841662000c978662000a4e565b5f5b8281101562000cc05784890151825560018201915060208501945060208101905062000c99565b8683101562000ce0578489015162000cdc601f89168262000bd6565b8355505b6001600288020188555050505b505050505050565b62000d0081620008a4565b82525050565b5f60208201905062000d1b5f83018462000cf5565b92915050565b5f6020828403121562000d395762000d3862000881565b5b5f62000d4884828501620008d0565b91505092915050565b5f60408201905062000d665f83018562000cf5565b62000d75602083018462000cf5565b9392505050565b5f8115159050919050565b62000d928162000d7c565b82525050565b5f60208201905062000dad5f83018462000d87565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000dec82620008e6565b915062000df983620008e6565b925082820190508082111562000e145762000e1362000db3565b5b92915050565b62000e2581620008e6565b82525050565b5f60608201905062000e405f83018662000cf5565b62000e4f602083018562000e1a565b62000e5e604083018462000e1a565b949350505050565b5f60208201905062000e7b5f83018462000e1a565b92915050565b6132ed8062000e8f5f395ff3fe608060405260043610610207575f3560e01c8063847e88ef11610117578063a9059cbb1161009f578063e5b4f6c61161006e578063e5b4f6c614610732578063f242ab411461075c578063f2fde38b14610786578063f952fcad146107ae578063ffa1ad74146107d85761020e565b8063a9059cbb14610668578063ab18dc64146106a4578063c97d97ec146106ce578063dd62ed3e146106f65761020e565b806395d89b41116100e657806395d89b411461059a5780639d0014b1146105c45780639ed3edf0146105ec578063a5fa12f014610616578063a7713e701461063e5761020e565b8063847e88ef146105085780638a8c523c146105305780638aa10435146105465780638da5cb5b146105705761020e565b80635169ebea1161019a57806370a082311161016957806370a0823114610428578063715018a614610464578063753868e31461047a5780637d1eade9146104905780637d4b7195146104cc5761020e565b80635169ebea1461038457806356a060a2146103ae5780635ea88f6f146103d85780636088d479146104005761020e565b806318160ddd116101d657806318160ddd146102ca57806323b872dd146102f4578063313ce567146103305780634626402b1461035a5761020e565b80630225c7411461021257806306fdde031461023a5780630758d92414610264578063095ea7b31461028e5761020e565b3661020e57005b5f80fd5b34801561021d575f80fd5b5061023860048036038101906102339190612384565b610802565b005b348015610245575f80fd5b5061024e61095d565b60405161025b919061248c565b60405180910390f35b34801561026f575f80fd5b506102786109ed565b6040516102859190612526565b60405180910390f35b348015610299575f80fd5b506102b460048036038101906102af91906125ad565b610a12565b6040516102c19190612605565b60405180910390f35b3480156102d5575f80fd5b506102de610a34565b6040516102eb919061262d565b60405180910390f35b3480156102ff575f80fd5b5061031a60048036038101906103159190612646565b610a3d565b6040516103279190612605565b60405180910390f35b34801561033b575f80fd5b50610344610a6b565b60405161035191906126b1565b60405180910390f35b348015610365575f80fd5b5061036e610a73565b60405161037b91906126d9565b60405180910390f35b34801561038f575f80fd5b50610398610a98565b6040516103a5919061262d565b60405180910390f35b3480156103b9575f80fd5b506103c2610a9e565b6040516103cf9190612605565b60405180910390f35b3480156103e3575f80fd5b506103fe60048036038101906103f991906126f2565b610ab1565b005b34801561040b575f80fd5b506104266004803603810190610421919061276b565b610bcc565b005b348015610433575f80fd5b5061044e60048036038101906104499190612796565b610d64565b60405161045b919061262d565b60405180910390f35b34801561046f575f80fd5b50610478610da9565b005b348015610485575f80fd5b5061048e610dbc565b005b34801561049b575f80fd5b506104b660048036038101906104b191906125ad565b610de0565b6040516104c39190612605565b60405180910390f35b3480156104d7575f80fd5b506104f260048036038101906104ed91906125ad565b610df3565b6040516104ff9190612605565b60405180910390f35b348015610513575f80fd5b5061052e600480360381019061052991906127c1565b610e06565b005b34801561053b575f80fd5b50610544610fe9565b005b348015610551575f80fd5b5061055a6110e5565b604051610567919061262d565b60405180910390f35b34801561057b575f80fd5b506105846110ed565b60405161059191906126d9565b60405180910390f35b3480156105a5575f80fd5b506105ae611115565b6040516105bb919061248c565b60405180910390f35b3480156105cf575f80fd5b506105ea60048036038101906105e591906127ff565b6111a5565b005b3480156105f7575f80fd5b506106006112c8565b60405161060d919061262d565b60405180910390f35b348015610621575f80fd5b5061063c600480360381019061063791906127ff565b6112ce565b005b348015610649575f80fd5b50610652611366565b60405161065f919061262d565b60405180910390f35b348015610673575f80fd5b5061068e600480360381019061068991906125ad565b61136c565b60405161069b9190612605565b60405180910390f35b3480156106af575f80fd5b506106b861138e565b6040516106c5919061262d565b60405180910390f35b3480156106d9575f80fd5b506106f460048036038101906106ef9190612854565b611394565b005b348015610701575f80fd5b5061071c600480360381019061071791906127c1565b6113f9565b604051610729919061262d565b60405180910390f35b34801561073d575f80fd5b5061074661147b565b6040516107539190612605565b60405180910390f35b348015610767575f80fd5b5061077061148d565b60405161077d91906126d9565b60405180910390f35b348015610791575f80fd5b506107ac60048036038101906107a79190612796565b6114b2565b005b3480156107b9575f80fd5b506107c2611536565b6040516107cf919061262d565b60405180910390f35b3480156107e3575f80fd5b506107ec61153c565b6040516107f9919061262d565b60405180910390f35b61080a611541565b60105f9054906101000a900460ff1615610859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610850906128dc565b60405180910390fd5b8181905084849050146108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089890612944565b60405180910390fd5b5f5b84849050811015610919576109068585838181106108c4576108c3612962565b5b90506020020160208101906108d99190612796565b8484848181106108ec576108eb612962565b5b9050602002016020810190610901919061298f565b6115c8565b8080610911906129e7565b9150506108a3565b507fc103dc4731308c979b79f6e889209454b6d651cac969f14fb718b2843b5d12e98484848460405161094f9493929190612ba6565b60405180910390a150505050565b60606003805461096c90612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461099890612c0c565b80156109e35780601f106109ba576101008083540402835291602001916109e3565b820191905f5260205f20905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610a1c61166e565b9050610a29818585611675565b600191505092915050565b5f600254905090565b5f80610a4761166e565b9050610a54858285611687565b610a5f858585611719565b60019150509392505050565b5f6012905090565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600b60019054906101000a900460ff1681565b610ab9611541565b60105f9054906101000a900460ff1615610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff906128dc565b60405180910390fd5b5f8183610b159190612c3c565b90505f6064600a54610b279190612c9c565b905080821115610b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6390612d3c565b60405180910390fd5b83600d8190555082600c81905550606482610b879190612d5a565b600a819055507f21ea14061974d1886e13e854a8a738e5177a587170a7f767a2b182a3f8b8dcdf600a54604051610bbe919061262d565b60405180910390a150505050565b610bd4611541565b60105f9054906101000a900460ff1615610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a906128dc565b60405180910390fd5b5f4711610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612de5565b60405180910390fd5b5f4790505f8273ffffffffffffffffffffffffffffffffffffffff1682604051610c8e90612e30565b5f6040518083038185875af1925050503d805f8114610cc8576040519150601f19603f3d011682016040523d82523d5f602084013e610ccd565b606091505b5050905080610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612e8e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f7867ed54f9df24b0df81b91e533396b2b642e89a777728b3120f0b7b93b316f483604051610d57919061262d565b60405180910390a2505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610db1611541565b610dba5f611ca6565b565b610dc4611541565b600160105f6101000a81548160ff021916908315150217905550565b5f610deb838361136c565b905092915050565b5f610dfe8383610a12565b905092915050565b610e0e611541565b60105f9054906101000a900460ff1615610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906128dc565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e9791906126d9565b602060405180830381865afa158015610eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed69190612ec0565b90505f8111610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190612f35565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f55929190612f53565b6020604051808303815f875af1158015610f71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f959190612f8e565b508173ffffffffffffffffffffffffffffffffffffffff167f8f8d27e529b41a5ef123b4ddba0b70b45def70658adf4c8e62952e02443a69f282604051610fdc919061262d565b60405180910390a2505050565b610ff1611541565b60105f9054906101000a900460ff1615611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906128dc565b60405180910390fd5b600b60019054906101000a900460ff1615611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790613003565b60405180910390fd5b6001600b60016101000a81548160ff0219169083151502179055507f63e9bb35ae90a43113bc6f999f1c6395e88ee5f59560b46bd45815fe8560efae60016040516110db9190612605565b60405180910390a1565b5f6001905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461112490612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461115090612c0c565b801561119b5780601f106111725761010080835404028352916020019161119b565b820191905f5260205f20905b81548152906001019060200180831161117e57829003601f168201915b5050505050905090565b6111ad611541565b60105f9054906101000a900460ff16156111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f3906128dc565b60405180910390fd5b5f611205610a34565b90505f612710826112169190612c9c565b90505f6103e86005846112299190612d5a565b6112339190612c9c565b90508184101580156112455750808411155b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b9061306b565b60405180910390fd5b836008819055507f9fc768dac1136a45ca72c282b889524622e8b77c6dc6b0068736c02bedd6ebe8846040516112ba919061262d565b60405180910390a150505050565b600a5481565b6112d6611541565b60105f9054906101000a900460ff1615611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c906128dc565b60405180910390fd5b806009819055507fa6d23fbe05b294f8076797acbd9f1196e134e1dd44872a1e324f157e37f129208160405161135b919061262d565b60405180910390a150565b600d5481565b5f8061137661166e565b9050611383818585611719565b600191505092915050565b600c5481565b61139c611541565b60105f9054906101000a900460ff16156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e2906128dc565b60405180910390fd5b6113f582826115c8565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60105f9054906101000a900460ff1681565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114ba611541565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152a575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161152191906126d9565b60405180910390fd5b61153381611ca6565b50565b60095481565b600181565b61154961166e565b73ffffffffffffffffffffffffffffffffffffffff166115676110ed565b73ffffffffffffffffffffffffffffffffffffffff16146115c65761158a61166e565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016115bd91906126d9565b60405180910390fd5b565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f63c42a6d367e0b07b7ac57be2fe620cba5dfb3d7aacad4a3d9284801cd007db1826040516116629190612605565b60405180910390a25050565b5f33905090565b6116828383836001611d69565b505050565b5f61169284846113f9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117135781811015611704578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016116fb93929190613089565b60405180910390fd5b61171284848484035f611d69565b5b50505050565b5f811161175b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117529061312e565b60405180910390fd5b600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615806117f85750600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561184d57600b60019054906101000a900460ff1661184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390613196565b60405180910390fd5b5b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156118f7575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561194a5750600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156119b45761271060095461195d610a34565b6119679190612d5a565b6119719190612c9c565b8211156119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa906131fe565b60405180910390fd5b5b600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580611a515750600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611a8957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611b715760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b35575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015611b4257505f600a54115b15611b7057612710600a5483611b589190612d5a565b611b629190612c9c565b9050611b6f843083611f38565b5b5b600b5f9054906101000a900460ff16158015611bd9575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015611c2c5750600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611c8a575f611c3b30610d64565b90506008548110611c88575f6005600854611c569190612c9c565b600854611c639190612c3c565b9050808210611c7a57611c7581612028565b611c86565b611c85600854612028565b5b505b505b611ca084848385611c9b919061321c565b611f38565b50505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611dd9575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611dd091906126d9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e49575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611e4091906126d9565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611f32578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611f29919061262d565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fa8575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f9f91906126d9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612018575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161200f91906126d9565b60405180910390fd5b6120238383836120ad565b505050565b600b5f9054906101000a900460ff1615612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90613299565b60405180910390fd5b6001600b5f6101000a81548160ff0219169083151502179055505f600b5f6101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120fd578060025f8282546120f19190612c3c565b925050819055506121cb565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612186578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161217d93929190613089565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612212578060025f828254039250508190555061225c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122b9919061262d565b60405180910390a3505050565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126122ef576122ee6122ce565b5b8235905067ffffffffffffffff81111561230c5761230b6122d2565b5b602083019150836020820283011115612328576123276122d6565b5b9250929050565b5f8083601f840112612344576123436122ce565b5b8235905067ffffffffffffffff811115612361576123606122d2565b5b60208301915083602082028301111561237d5761237c6122d6565b5b9250929050565b5f805f806040858703121561239c5761239b6122c6565b5b5f85013567ffffffffffffffff8111156123b9576123b86122ca565b5b6123c5878288016122da565b9450945050602085013567ffffffffffffffff8111156123e8576123e76122ca565b5b6123f48782880161232f565b925092505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561243957808201518184015260208101905061241e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61245e82612402565b612468818561240c565b935061247881856020860161241c565b61248181612444565b840191505092915050565b5f6020820190508181035f8301526124a48184612454565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6124ee6124e96124e4846124ac565b6124cb565b6124ac565b9050919050565b5f6124ff826124d4565b9050919050565b5f612510826124f5565b9050919050565b61252081612506565b82525050565b5f6020820190506125395f830184612517565b92915050565b5f612549826124ac565b9050919050565b6125598161253f565b8114612563575f80fd5b50565b5f8135905061257481612550565b92915050565b5f819050919050565b61258c8161257a565b8114612596575f80fd5b50565b5f813590506125a781612583565b92915050565b5f80604083850312156125c3576125c26122c6565b5b5f6125d085828601612566565b92505060206125e185828601612599565b9150509250929050565b5f8115159050919050565b6125ff816125eb565b82525050565b5f6020820190506126185f8301846125f6565b92915050565b6126278161257a565b82525050565b5f6020820190506126405f83018461261e565b92915050565b5f805f6060848603121561265d5761265c6122c6565b5b5f61266a86828701612566565b935050602061267b86828701612566565b925050604061268c86828701612599565b9150509250925092565b5f60ff82169050919050565b6126ab81612696565b82525050565b5f6020820190506126c45f8301846126a2565b92915050565b6126d38161253f565b82525050565b5f6020820190506126ec5f8301846126ca565b92915050565b5f8060408385031215612708576127076122c6565b5b5f61271585828601612599565b925050602061272685828601612599565b9150509250929050565b5f61273a826124ac565b9050919050565b61274a81612730565b8114612754575f80fd5b50565b5f8135905061276581612741565b92915050565b5f602082840312156127805761277f6122c6565b5b5f61278d84828501612757565b91505092915050565b5f602082840312156127ab576127aa6122c6565b5b5f6127b884828501612566565b91505092915050565b5f80604083850312156127d7576127d66122c6565b5b5f6127e485828601612566565b92505060206127f585828601612566565b9150509250929050565b5f60208284031215612814576128136122c6565b5b5f61282184828501612599565b91505092915050565b612833816125eb565b811461283d575f80fd5b50565b5f8135905061284e8161282a565b92915050565b5f806040838503121561286a576128696122c6565b5b5f61287785828601612566565b925050602061288885828601612840565b9150509250929050565b7f436f6e7472616374206973206c6f636b656400000000000000000000000000005f82015250565b5f6128c660128361240c565b91506128d182612892565b602082019050919050565b5f6020820190508181035f8301526128f3816128ba565b9050919050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f61292e60158361240c565b9150612939826128fa565b602082019050919050565b5f6020820190508181035f83015261295b81612922565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156129a4576129a36122c6565b5b5f6129b184828501612840565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6129f18261257a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a2357612a226129ba565b5b600182019050919050565b5f82825260208201905092915050565b5f819050919050565b612a508161253f565b82525050565b5f612a618383612a47565b60208301905092915050565b5f612a7b6020840184612566565b905092915050565b5f602082019050919050565b5f612a9a8385612a2e565b9350612aa582612a3e565b805f5b85811015612add57612aba8284612a6d565b612ac48882612a56565b9750612acf83612a83565b925050600181019050612aa8565b5085925050509392505050565b5f82825260208201905092915050565b5f819050919050565b612b0c816125eb565b82525050565b5f612b1d8383612b03565b60208301905092915050565b5f612b376020840184612840565b905092915050565b5f602082019050919050565b5f612b568385612aea565b9350612b6182612afa565b805f5b85811015612b9957612b768284612b29565b612b808882612b12565b9750612b8b83612b3f565b925050600181019050612b64565b5085925050509392505050565b5f6040820190508181035f830152612bbf818688612a8f565b90508181036020830152612bd4818486612b4b565b905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c2357607f821691505b602082108103612c3657612c35612bdf565b5b50919050565b5f612c468261257a565b9150612c518361257a565b9250828201905080821115612c6957612c686129ba565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ca68261257a565b9150612cb18361257a565b925082612cc157612cc0612c6f565b5b828204905092915050565b7f4e657720666565206d757374206e6f74206578636565642063757272656e74205f8201527f6665650000000000000000000000000000000000000000000000000000000000602082015250565b5f612d2660238361240c565b9150612d3182612ccc565b604082019050919050565b5f6020820190508181035f830152612d5381612d1a565b9050919050565b5f612d648261257a565b9150612d6f8361257a565b9250828202612d7d8161257a565b91508282048414831517612d9457612d936129ba565b5b5092915050565b7f4e6f2045544820617661696c61626c6520666f722065787472616374696f6e005f82015250565b5f612dcf601f8361240c565b9150612dda82612d9b565b602082019050919050565b5f6020820190508181035f830152612dfc81612dc3565b9050919050565b5f81905092915050565b50565b5f612e1b5f83612e03565b9150612e2682612e0d565b5f82019050919050565b5f612e3a82612e10565b9150819050919050565b7f4661696c656420746f2073656e642045746865720000000000000000000000005f82015250565b5f612e7860148361240c565b9150612e8382612e44565b602082019050919050565b5f6020820190508181035f830152612ea581612e6c565b9050919050565b5f81519050612eba81612583565b92915050565b5f60208284031215612ed557612ed46122c6565b5b5f612ee284828501612eac565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f612f1f601a8361240c565b9150612f2a82612eeb565b602082019050919050565b5f6020820190508181035f830152612f4c81612f13565b9050919050565b5f604082019050612f665f8301856126ca565b612f73602083018461261e565b9392505050565b5f81519050612f888161282a565b92915050565b5f60208284031215612fa357612fa26122c6565b5b5f612fb084828501612f7a565b91505092915050565b7f54726164696e6720697320616c726561647920656e61626c65640000000000005f82015250565b5f612fed601a8361240c565b9150612ff882612fb9565b602082019050919050565b5f6020820190508181035f83015261301a81612fe1565b9050919050565b7f5468726573686f6c64206f7574206f6620616c6c6f7765642072616e676500005f82015250565b5f613055601e8361240c565b915061306082613021565b602082019050919050565b5f6020820190508181035f83015261308281613049565b9050919050565b5f60608201905061309c5f8301866126ca565b6130a9602083018561261e565b6130b6604083018461261e565b949350505050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f61311860298361240c565b9150613123826130be565b604082019050919050565b5f6020820190508181035f8301526131458161310c565b9050919050565b7f54726164696e67206973206e6f7420796574206f70656e0000000000000000005f82015250565b5f61318060178361240c565b915061318b8261314c565b602082019050919050565b5f6020820190508181035f8301526131ad81613174565b9050919050565b7f50757263686173652065786365656473206d617820616d6f756e7400000000005f82015250565b5f6131e8601b8361240c565b91506131f3826131b4565b602082019050919050565b5f6020820190508181035f830152613215816131dc565b9050919050565b5f6132268261257a565b91506132318361257a565b9250828203905081811115613249576132486129ba565b5b92915050565b7f5377617020616e64206c69717569667920696e2070726f6772657373000000005f82015250565b5f613283601c8361240c565b915061328e8261324f565b602082019050919050565b5f6020820190508181035f8301526132b081613277565b905091905056fea264697066735822122077b7c463ab4477bf1b36bd701e55ef0287dea6c9f136d33f6d0fd48c0f9cac3164736f6c634300081400330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000190000000000000000000000005a965bddbcf0ce4e2f8182499f1a2a931acfa15f

Deployed Bytecode

0x608060405260043610610207575f3560e01c8063847e88ef11610117578063a9059cbb1161009f578063e5b4f6c61161006e578063e5b4f6c614610732578063f242ab411461075c578063f2fde38b14610786578063f952fcad146107ae578063ffa1ad74146107d85761020e565b8063a9059cbb14610668578063ab18dc64146106a4578063c97d97ec146106ce578063dd62ed3e146106f65761020e565b806395d89b41116100e657806395d89b411461059a5780639d0014b1146105c45780639ed3edf0146105ec578063a5fa12f014610616578063a7713e701461063e5761020e565b8063847e88ef146105085780638a8c523c146105305780638aa10435146105465780638da5cb5b146105705761020e565b80635169ebea1161019a57806370a082311161016957806370a0823114610428578063715018a614610464578063753868e31461047a5780637d1eade9146104905780637d4b7195146104cc5761020e565b80635169ebea1461038457806356a060a2146103ae5780635ea88f6f146103d85780636088d479146104005761020e565b806318160ddd116101d657806318160ddd146102ca57806323b872dd146102f4578063313ce567146103305780634626402b1461035a5761020e565b80630225c7411461021257806306fdde031461023a5780630758d92414610264578063095ea7b31461028e5761020e565b3661020e57005b5f80fd5b34801561021d575f80fd5b5061023860048036038101906102339190612384565b610802565b005b348015610245575f80fd5b5061024e61095d565b60405161025b919061248c565b60405180910390f35b34801561026f575f80fd5b506102786109ed565b6040516102859190612526565b60405180910390f35b348015610299575f80fd5b506102b460048036038101906102af91906125ad565b610a12565b6040516102c19190612605565b60405180910390f35b3480156102d5575f80fd5b506102de610a34565b6040516102eb919061262d565b60405180910390f35b3480156102ff575f80fd5b5061031a60048036038101906103159190612646565b610a3d565b6040516103279190612605565b60405180910390f35b34801561033b575f80fd5b50610344610a6b565b60405161035191906126b1565b60405180910390f35b348015610365575f80fd5b5061036e610a73565b60405161037b91906126d9565b60405180910390f35b34801561038f575f80fd5b50610398610a98565b6040516103a5919061262d565b60405180910390f35b3480156103b9575f80fd5b506103c2610a9e565b6040516103cf9190612605565b60405180910390f35b3480156103e3575f80fd5b506103fe60048036038101906103f991906126f2565b610ab1565b005b34801561040b575f80fd5b506104266004803603810190610421919061276b565b610bcc565b005b348015610433575f80fd5b5061044e60048036038101906104499190612796565b610d64565b60405161045b919061262d565b60405180910390f35b34801561046f575f80fd5b50610478610da9565b005b348015610485575f80fd5b5061048e610dbc565b005b34801561049b575f80fd5b506104b660048036038101906104b191906125ad565b610de0565b6040516104c39190612605565b60405180910390f35b3480156104d7575f80fd5b506104f260048036038101906104ed91906125ad565b610df3565b6040516104ff9190612605565b60405180910390f35b348015610513575f80fd5b5061052e600480360381019061052991906127c1565b610e06565b005b34801561053b575f80fd5b50610544610fe9565b005b348015610551575f80fd5b5061055a6110e5565b604051610567919061262d565b60405180910390f35b34801561057b575f80fd5b506105846110ed565b60405161059191906126d9565b60405180910390f35b3480156105a5575f80fd5b506105ae611115565b6040516105bb919061248c565b60405180910390f35b3480156105cf575f80fd5b506105ea60048036038101906105e591906127ff565b6111a5565b005b3480156105f7575f80fd5b506106006112c8565b60405161060d919061262d565b60405180910390f35b348015610621575f80fd5b5061063c600480360381019061063791906127ff565b6112ce565b005b348015610649575f80fd5b50610652611366565b60405161065f919061262d565b60405180910390f35b348015610673575f80fd5b5061068e600480360381019061068991906125ad565b61136c565b60405161069b9190612605565b60405180910390f35b3480156106af575f80fd5b506106b861138e565b6040516106c5919061262d565b60405180910390f35b3480156106d9575f80fd5b506106f460048036038101906106ef9190612854565b611394565b005b348015610701575f80fd5b5061071c600480360381019061071791906127c1565b6113f9565b604051610729919061262d565b60405180910390f35b34801561073d575f80fd5b5061074661147b565b6040516107539190612605565b60405180910390f35b348015610767575f80fd5b5061077061148d565b60405161077d91906126d9565b60405180910390f35b348015610791575f80fd5b506107ac60048036038101906107a79190612796565b6114b2565b005b3480156107b9575f80fd5b506107c2611536565b6040516107cf919061262d565b60405180910390f35b3480156107e3575f80fd5b506107ec61153c565b6040516107f9919061262d565b60405180910390f35b61080a611541565b60105f9054906101000a900460ff1615610859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610850906128dc565b60405180910390fd5b8181905084849050146108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089890612944565b60405180910390fd5b5f5b84849050811015610919576109068585838181106108c4576108c3612962565b5b90506020020160208101906108d99190612796565b8484848181106108ec576108eb612962565b5b9050602002016020810190610901919061298f565b6115c8565b8080610911906129e7565b9150506108a3565b507fc103dc4731308c979b79f6e889209454b6d651cac969f14fb718b2843b5d12e98484848460405161094f9493929190612ba6565b60405180910390a150505050565b60606003805461096c90612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461099890612c0c565b80156109e35780601f106109ba576101008083540402835291602001916109e3565b820191905f5260205f20905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610a1c61166e565b9050610a29818585611675565b600191505092915050565b5f600254905090565b5f80610a4761166e565b9050610a54858285611687565b610a5f858585611719565b60019150509392505050565b5f6012905090565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600b60019054906101000a900460ff1681565b610ab9611541565b60105f9054906101000a900460ff1615610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff906128dc565b60405180910390fd5b5f8183610b159190612c3c565b90505f6064600a54610b279190612c9c565b905080821115610b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6390612d3c565b60405180910390fd5b83600d8190555082600c81905550606482610b879190612d5a565b600a819055507f21ea14061974d1886e13e854a8a738e5177a587170a7f767a2b182a3f8b8dcdf600a54604051610bbe919061262d565b60405180910390a150505050565b610bd4611541565b60105f9054906101000a900460ff1615610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a906128dc565b60405180910390fd5b5f4711610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90612de5565b60405180910390fd5b5f4790505f8273ffffffffffffffffffffffffffffffffffffffff1682604051610c8e90612e30565b5f6040518083038185875af1925050503d805f8114610cc8576040519150601f19603f3d011682016040523d82523d5f602084013e610ccd565b606091505b5050905080610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612e8e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f7867ed54f9df24b0df81b91e533396b2b642e89a777728b3120f0b7b93b316f483604051610d57919061262d565b60405180910390a2505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610db1611541565b610dba5f611ca6565b565b610dc4611541565b600160105f6101000a81548160ff021916908315150217905550565b5f610deb838361136c565b905092915050565b5f610dfe8383610a12565b905092915050565b610e0e611541565b60105f9054906101000a900460ff1615610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906128dc565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e9791906126d9565b602060405180830381865afa158015610eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed69190612ec0565b90505f8111610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190612f35565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f55929190612f53565b6020604051808303815f875af1158015610f71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f959190612f8e565b508173ffffffffffffffffffffffffffffffffffffffff167f8f8d27e529b41a5ef123b4ddba0b70b45def70658adf4c8e62952e02443a69f282604051610fdc919061262d565b60405180910390a2505050565b610ff1611541565b60105f9054906101000a900460ff1615611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906128dc565b60405180910390fd5b600b60019054906101000a900460ff1615611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790613003565b60405180910390fd5b6001600b60016101000a81548160ff0219169083151502179055507f63e9bb35ae90a43113bc6f999f1c6395e88ee5f59560b46bd45815fe8560efae60016040516110db9190612605565b60405180910390a1565b5f6001905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461112490612c0c565b80601f016020809104026020016040519081016040528092919081815260200182805461115090612c0c565b801561119b5780601f106111725761010080835404028352916020019161119b565b820191905f5260205f20905b81548152906001019060200180831161117e57829003601f168201915b5050505050905090565b6111ad611541565b60105f9054906101000a900460ff16156111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f3906128dc565b60405180910390fd5b5f611205610a34565b90505f612710826112169190612c9c565b90505f6103e86005846112299190612d5a565b6112339190612c9c565b90508184101580156112455750808411155b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b9061306b565b60405180910390fd5b836008819055507f9fc768dac1136a45ca72c282b889524622e8b77c6dc6b0068736c02bedd6ebe8846040516112ba919061262d565b60405180910390a150505050565b600a5481565b6112d6611541565b60105f9054906101000a900460ff1615611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c906128dc565b60405180910390fd5b806009819055507fa6d23fbe05b294f8076797acbd9f1196e134e1dd44872a1e324f157e37f129208160405161135b919061262d565b60405180910390a150565b600d5481565b5f8061137661166e565b9050611383818585611719565b600191505092915050565b600c5481565b61139c611541565b60105f9054906101000a900460ff16156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e2906128dc565b60405180910390fd5b6113f582826115c8565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60105f9054906101000a900460ff1681565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114ba611541565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152a575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161152191906126d9565b60405180910390fd5b61153381611ca6565b50565b60095481565b600181565b61154961166e565b73ffffffffffffffffffffffffffffffffffffffff166115676110ed565b73ffffffffffffffffffffffffffffffffffffffff16146115c65761158a61166e565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016115bd91906126d9565b60405180910390fd5b565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f63c42a6d367e0b07b7ac57be2fe620cba5dfb3d7aacad4a3d9284801cd007db1826040516116629190612605565b60405180910390a25050565b5f33905090565b6116828383836001611d69565b505050565b5f61169284846113f9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117135781811015611704578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016116fb93929190613089565b60405180910390fd5b61171284848484035f611d69565b5b50505050565b5f811161175b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117529061312e565b60405180910390fd5b600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615806117f85750600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561184d57600b60019054906101000a900460ff1661184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390613196565b60405180910390fd5b5b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156118f7575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561194a5750600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156119b45761271060095461195d610a34565b6119679190612d5a565b6119719190612c9c565b8211156119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa906131fe565b60405180910390fd5b5b600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580611a515750600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611a8957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611b715760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b35575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015611b4257505f600a54115b15611b7057612710600a5483611b589190612d5a565b611b629190612c9c565b9050611b6f843083611f38565b5b5b600b5f9054906101000a900460ff16158015611bd9575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015611c2c5750600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611c8a575f611c3b30610d64565b90506008548110611c88575f6005600854611c569190612c9c565b600854611c639190612c3c565b9050808210611c7a57611c7581612028565b611c86565b611c85600854612028565b5b505b505b611ca084848385611c9b919061321c565b611f38565b50505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611dd9575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611dd091906126d9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e49575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611e4091906126d9565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611f32578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611f29919061262d565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fa8575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f9f91906126d9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612018575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161200f91906126d9565b60405180910390fd5b6120238383836120ad565b505050565b600b5f9054906101000a900460ff1615612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90613299565b60405180910390fd5b6001600b5f6101000a81548160ff0219169083151502179055505f600b5f6101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120fd578060025f8282546120f19190612c3c565b925050819055506121cb565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612186578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161217d93929190613089565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612212578060025f828254039250508190555061225c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122b9919061262d565b60405180910390a3505050565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126122ef576122ee6122ce565b5b8235905067ffffffffffffffff81111561230c5761230b6122d2565b5b602083019150836020820283011115612328576123276122d6565b5b9250929050565b5f8083601f840112612344576123436122ce565b5b8235905067ffffffffffffffff811115612361576123606122d2565b5b60208301915083602082028301111561237d5761237c6122d6565b5b9250929050565b5f805f806040858703121561239c5761239b6122c6565b5b5f85013567ffffffffffffffff8111156123b9576123b86122ca565b5b6123c5878288016122da565b9450945050602085013567ffffffffffffffff8111156123e8576123e76122ca565b5b6123f48782880161232f565b925092505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561243957808201518184015260208101905061241e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61245e82612402565b612468818561240c565b935061247881856020860161241c565b61248181612444565b840191505092915050565b5f6020820190508181035f8301526124a48184612454565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6124ee6124e96124e4846124ac565b6124cb565b6124ac565b9050919050565b5f6124ff826124d4565b9050919050565b5f612510826124f5565b9050919050565b61252081612506565b82525050565b5f6020820190506125395f830184612517565b92915050565b5f612549826124ac565b9050919050565b6125598161253f565b8114612563575f80fd5b50565b5f8135905061257481612550565b92915050565b5f819050919050565b61258c8161257a565b8114612596575f80fd5b50565b5f813590506125a781612583565b92915050565b5f80604083850312156125c3576125c26122c6565b5b5f6125d085828601612566565b92505060206125e185828601612599565b9150509250929050565b5f8115159050919050565b6125ff816125eb565b82525050565b5f6020820190506126185f8301846125f6565b92915050565b6126278161257a565b82525050565b5f6020820190506126405f83018461261e565b92915050565b5f805f6060848603121561265d5761265c6122c6565b5b5f61266a86828701612566565b935050602061267b86828701612566565b925050604061268c86828701612599565b9150509250925092565b5f60ff82169050919050565b6126ab81612696565b82525050565b5f6020820190506126c45f8301846126a2565b92915050565b6126d38161253f565b82525050565b5f6020820190506126ec5f8301846126ca565b92915050565b5f8060408385031215612708576127076122c6565b5b5f61271585828601612599565b925050602061272685828601612599565b9150509250929050565b5f61273a826124ac565b9050919050565b61274a81612730565b8114612754575f80fd5b50565b5f8135905061276581612741565b92915050565b5f602082840312156127805761277f6122c6565b5b5f61278d84828501612757565b91505092915050565b5f602082840312156127ab576127aa6122c6565b5b5f6127b884828501612566565b91505092915050565b5f80604083850312156127d7576127d66122c6565b5b5f6127e485828601612566565b92505060206127f585828601612566565b9150509250929050565b5f60208284031215612814576128136122c6565b5b5f61282184828501612599565b91505092915050565b612833816125eb565b811461283d575f80fd5b50565b5f8135905061284e8161282a565b92915050565b5f806040838503121561286a576128696122c6565b5b5f61287785828601612566565b925050602061288885828601612840565b9150509250929050565b7f436f6e7472616374206973206c6f636b656400000000000000000000000000005f82015250565b5f6128c660128361240c565b91506128d182612892565b602082019050919050565b5f6020820190508181035f8301526128f3816128ba565b9050919050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f61292e60158361240c565b9150612939826128fa565b602082019050919050565b5f6020820190508181035f83015261295b81612922565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156129a4576129a36122c6565b5b5f6129b184828501612840565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6129f18261257a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a2357612a226129ba565b5b600182019050919050565b5f82825260208201905092915050565b5f819050919050565b612a508161253f565b82525050565b5f612a618383612a47565b60208301905092915050565b5f612a7b6020840184612566565b905092915050565b5f602082019050919050565b5f612a9a8385612a2e565b9350612aa582612a3e565b805f5b85811015612add57612aba8284612a6d565b612ac48882612a56565b9750612acf83612a83565b925050600181019050612aa8565b5085925050509392505050565b5f82825260208201905092915050565b5f819050919050565b612b0c816125eb565b82525050565b5f612b1d8383612b03565b60208301905092915050565b5f612b376020840184612840565b905092915050565b5f602082019050919050565b5f612b568385612aea565b9350612b6182612afa565b805f5b85811015612b9957612b768284612b29565b612b808882612b12565b9750612b8b83612b3f565b925050600181019050612b64565b5085925050509392505050565b5f6040820190508181035f830152612bbf818688612a8f565b90508181036020830152612bd4818486612b4b565b905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c2357607f821691505b602082108103612c3657612c35612bdf565b5b50919050565b5f612c468261257a565b9150612c518361257a565b9250828201905080821115612c6957612c686129ba565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ca68261257a565b9150612cb18361257a565b925082612cc157612cc0612c6f565b5b828204905092915050565b7f4e657720666565206d757374206e6f74206578636565642063757272656e74205f8201527f6665650000000000000000000000000000000000000000000000000000000000602082015250565b5f612d2660238361240c565b9150612d3182612ccc565b604082019050919050565b5f6020820190508181035f830152612d5381612d1a565b9050919050565b5f612d648261257a565b9150612d6f8361257a565b9250828202612d7d8161257a565b91508282048414831517612d9457612d936129ba565b5b5092915050565b7f4e6f2045544820617661696c61626c6520666f722065787472616374696f6e005f82015250565b5f612dcf601f8361240c565b9150612dda82612d9b565b602082019050919050565b5f6020820190508181035f830152612dfc81612dc3565b9050919050565b5f81905092915050565b50565b5f612e1b5f83612e03565b9150612e2682612e0d565b5f82019050919050565b5f612e3a82612e10565b9150819050919050565b7f4661696c656420746f2073656e642045746865720000000000000000000000005f82015250565b5f612e7860148361240c565b9150612e8382612e44565b602082019050919050565b5f6020820190508181035f830152612ea581612e6c565b9050919050565b5f81519050612eba81612583565b92915050565b5f60208284031215612ed557612ed46122c6565b5b5f612ee284828501612eac565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f612f1f601a8361240c565b9150612f2a82612eeb565b602082019050919050565b5f6020820190508181035f830152612f4c81612f13565b9050919050565b5f604082019050612f665f8301856126ca565b612f73602083018461261e565b9392505050565b5f81519050612f888161282a565b92915050565b5f60208284031215612fa357612fa26122c6565b5b5f612fb084828501612f7a565b91505092915050565b7f54726164696e6720697320616c726561647920656e61626c65640000000000005f82015250565b5f612fed601a8361240c565b9150612ff882612fb9565b602082019050919050565b5f6020820190508181035f83015261301a81612fe1565b9050919050565b7f5468726573686f6c64206f7574206f6620616c6c6f7765642072616e676500005f82015250565b5f613055601e8361240c565b915061306082613021565b602082019050919050565b5f6020820190508181035f83015261308281613049565b9050919050565b5f60608201905061309c5f8301866126ca565b6130a9602083018561261e565b6130b6604083018461261e565b949350505050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f61311860298361240c565b9150613123826130be565b604082019050919050565b5f6020820190508181035f8301526131458161310c565b9050919050565b7f54726164696e67206973206e6f7420796574206f70656e0000000000000000005f82015250565b5f61318060178361240c565b915061318b8261314c565b602082019050919050565b5f6020820190508181035f8301526131ad81613174565b9050919050565b7f50757263686173652065786365656473206d617820616d6f756e7400000000005f82015250565b5f6131e8601b8361240c565b91506131f3826131b4565b602082019050919050565b5f6020820190508181035f830152613215816131dc565b9050919050565b5f6132268261257a565b91506132318361257a565b9250828203905081811115613249576132486129ba565b5b92915050565b7f5377617020616e64206c69717569667920696e2070726f6772657373000000005f82015250565b5f613283601c8361240c565b915061328e8261324f565b602082019050919050565b5f6020820190508181035f8301526132b081613277565b905091905056fea264697066735822122077b7c463ab4477bf1b36bd701e55ef0287dea6c9f136d33f6d0fd48c0f9cac3164736f6c63430008140033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000190000000000000000000000005a965bddbcf0ce4e2f8182499f1a2a931acfa15f

-----Decoded View---------------
Arg [0] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _transactionFee (uint256): 1500
Arg [2] : _ethFeeShare (uint256): 400
Arg [3] : _liquidityFeeShare (uint256): 100
Arg [4] : _maxPurchaseAmount (uint256): 25
Arg [5] : _treasuryWallet (address): 0x5a965bdDbcf0CE4E2f8182499f1A2A931acFa15F

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000190
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [5] : 0000000000000000000000005a965bddbcf0ce4e2f8182499f1a2a931acfa15f


Deployed Bytecode Sourcemap

32998:7872:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39570:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17764:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33039:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20057:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18866:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20825:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18717:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33371:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33112:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33263:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37927:631;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39999:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19028:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4669:103;;;;;;;;;;;;;:::i;:::-;;40681:85;;;;;;;;;;;;;:::i;:::-;;36031:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40361:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38566:203;;;;;;;;;;;;;:::i;:::-;;40774:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3994:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17974:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38954:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33192:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38777:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33336:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19351:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33297:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39410:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19596:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34134:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33081:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4927:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33156:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34092:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39570:421;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;39735:12:::2;;:19;;39716:8;;:15;;:38;39708:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;39795:6;39791:122;39811:8;;:15;;39807:1;:19;39791:122;;;39848:53;39872:8;;39881:1;39872:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39885:12;;39898:1;39885:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39848:23;:53::i;:::-;39828:3;;;;;:::i;:::-;;;;39791:122;;;;39928:55;39960:8;;39970:12;;39928:55;;;;;;;;;:::i;:::-;;;;;;;;39570:421:::0;;;;:::o;17764:91::-;17809:13;17842:5;17835:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17764:91;:::o;33039:35::-;;;;;;;;;;;;;:::o;20057:190::-;20130:4;20147:13;20163:12;:10;:12::i;:::-;20147:28;;20186:31;20195:5;20202:7;20211:5;20186:8;:31::i;:::-;20235:4;20228:11;;;20057:190;;;;:::o;18866:99::-;18918:7;18945:12;;18938:19;;18866:99;:::o;20825:249::-;20912:4;20929:15;20947:12;:10;:12::i;:::-;20929:30;;20970:37;20986:4;20992:7;21001:5;20970:15;:37::i;:::-;21018:26;21028:4;21034:2;21038:5;21018:9;:26::i;:::-;21062:4;21055:11;;;20825:249;;;;;:::o;18717:84::-;18766:5;18791:2;18784:9;;18717:84;:::o;33371:29::-;;;;;;;;;;;;;:::o;33112:37::-;;;;:::o;33263:25::-;;;;;;;;;;;;;:::o;37927:631::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;38092:24:::2;38145;38119:23;:50;;;;:::i;:::-;38092:77;;38180:28;38228:3;38211:14;;:20;;;;:::i;:::-;38180:51;;38270:20;38250:16;:40;;38242:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;38357:23;38343:11;:37;;;;38411:24;38391:17;:44;;;;38484:3;38465:16;:22;;;;:::i;:::-;38448:14;:39;;;;38513:37;38535:14;;38513:37;;;;;;:::i;:::-;;;;;;;;38071:487;;37927:631:::0;;:::o;39999:354::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;40116:1:::2;40092:21;:25;40084:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40164:14;40181:21;40164:38;;40214:9;40229:3;:8;;40245:6;40229:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40213:43;;;40275:4;40267:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;40333:3;40320:25;;;40338:6;40320:25;;;;;;:::i;:::-;;;;;;;;40073:280;;39999:354:::0;:::o;19028:118::-;19093:7;19120:9;:18;19130:7;19120:18;;;;;;;;;;;;;;;;19113:25;;19028:118;;;:::o;4669:103::-;3880:13;:11;:13::i;:::-;4734:30:::1;4761:1;4734:18;:30::i;:::-;4669:103::o:0;40681:85::-;3880:13;:11;:13::i;:::-;40754:4:::1;40735:16;;:23;;;;;;;;;;;;;;;;;;40681:85::o:0;36031:138::-;36110:4;36134:27;36143:9;36154:6;36134:8;:27::i;:::-;36127:34;;36031:138;;;;:::o;36177:::-;36259:4;36283:24;36291:7;36300:6;36283:7;:24::i;:::-;36276:31;;36177:138;;;;:::o;40361:312::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;40458:15:::2;40483:5;40476:23;;;40508:4;40476:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40458:56;;40543:1;40533:7;:11;40525:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;40593:5;40586:22;;;40609:2;40613:7;40586:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40653:2;40637:28;;;40657:7;40637:28;;;;;;:::i;:::-;;;;;;;;40447:226;40361:312:::0;;:::o;38566:203::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;38644:13:::2;;;;;;;;;;;38643:14;38635:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38715:4;38699:13;;:20;;;;;;;;;;;;;;;;;;38735:26;38756:4;38735:26;;;;;;:::i;:::-;;;;;;;;38566:203::o:0;40774:93::-;40825:7;34126:1;40845:14;;40774:93;:::o;3994:87::-;4040:7;4067:6;;;;;;;;;;;4060:13;;3994:87;:::o;17974:95::-;18021:13;18054:7;18047:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17974:95;:::o;38954:448::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;39038:26:::2;39067:13;:11;:13::i;:::-;39038:42;;39091:20;39135:5;39114:18;:26;;;;:::i;:::-;39091:49;;39152:20;39200:4;39196:1;39175:18;:22;;;;:::i;:::-;:29;;;;:::i;:::-;39152:52;;39236:12;39226:6;:22;;:48;;;;;39262:12;39252:6;:22;;39226:48;39218:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;39348:6;39320:25;:34;;;;39370:24;39387:6;39370:24;;;;;;:::i;:::-;;;;;;;;39027:375;;;38954:448:::0;:::o;33192:26::-;;;;:::o;38777:169::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;38884:6:::2;38864:17;:26;;;;38906:32;38931:6;38906:32;;;;;;:::i;:::-;;;;;;;;38777:169:::0;:::o;33336:26::-;;;;:::o;19351:182::-;19420:4;19437:13;19453:12;:10;:12::i;:::-;19437:28;;19476:27;19486:5;19493:2;19497:5;19476:9;:27::i;:::-;19521:4;19514:11;;;19351:182;;;;:::o;33297:32::-;;;;:::o;39410:152::-;3880:13;:11;:13::i;:::-;34398:16:::1;;;;;;;;;;;34397:17;34389:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;39514:40:::2;39538:7;39547:6;39514:23;:40::i;:::-;39410:152:::0;;:::o;19596:142::-;19676:7;19703:11;:18;19715:5;19703:18;;;;;;;;;;;;;;;:27;19722:7;19703:27;;;;;;;;;;;;;;;;19696:34;;19596:142;;;;:::o;34134:28::-;;;;;;;;;;;;;:::o;33081:22::-;;;;;;;;;;;;;:::o;4927:220::-;3880:13;:11;:13::i;:::-;5032:1:::1;5012:22;;:8;:22;;::::0;5008:93:::1;;5086:1;5058:31;;;;;;;;;;;:::i;:::-;;;;;;;;5008:93;5111:28;5130:8;5111:18;:28::i;:::-;4927:220:::0;:::o;33156:29::-;;;;:::o;34092:35::-;34126:1;34092:35;:::o;4159:166::-;4230:12;:10;:12::i;:::-;4219:23;;:7;:5;:7::i;:::-;:23;;;4215:103;;4293:12;:10;:12::i;:::-;4266:40;;;;;;;;;;;:::i;:::-;;;;;;;;4215:103;4159:166::o;35838:185::-;35950:6;35920:18;:27;35939:7;35920:27;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;35999:7;35972:43;;;36008:6;35972:43;;;;;;:::i;:::-;;;;;;;;35838:185;;:::o;2003:98::-;2056:7;2083:10;2076:17;;2003:98;:::o;24893:130::-;24978:37;24987:5;24994:7;25003:5;25010:4;24978:8;:37::i;:::-;24893:130;;;:::o;26609:487::-;26709:24;26736:25;26746:5;26753:7;26736:9;:25::i;:::-;26709:52;;26796:17;26776:16;:37;26772:317;;26853:5;26834:16;:24;26830:132;;;26913:7;26922:16;26940:5;26886:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;26830:132;27005:57;27014:5;27021:7;27049:5;27030:16;:24;27056:5;27005:8;:57::i;:::-;26772:317;26698:398;26609:487;;;:::o;36323:1596::-;36439:1;36430:6;:10;36422:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36501:18;:26;36520:6;36501:26;;;;;;;;;;;;;;;;;;;;;;;;;36500:27;:61;;;;36532:18;:29;36551:9;36532:29;;;;;;;;;;;;;;;;;;;;;;;;;36531:30;36500:61;36497:142;;;36586:13;;;;;;;;;;;36578:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;36497:142;36651:17;36699:7;;;;;;;;;;;36689:17;;:6;:17;;;:52;;;;;36731:9;;;;;;;;;;;36710:31;;:9;:31;;;;36689:52;:86;;;;;36746:18;:29;36765:9;36746:29;;;;;;;;;;;;;;;;;;;;;;;;;36745:30;36689:86;36685:208;;;36846:3;36826:17;;36810:13;:11;:13::i;:::-;:33;;;;:::i;:::-;:39;;;;:::i;:::-;36800:6;:49;;36792:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;36685:208;36910:18;:26;36929:6;36910:26;;;;;;;;;;;;;;;;;;;;;;;;;36909:27;:61;;;;36941:18;:29;36960:9;36941:29;;;;;;;;;;;;;;;;;;;;;;;;;36940:30;36909:61;36908:90;;;;;36993:4;36975:23;;:6;:23;;;;36908:90;36905:333;;;37028:7;;;;;;;;;;;37018:17;;:6;:17;;;:41;;;;37052:7;;;;;;;;;;;37039:20;;:9;:20;;;37018:41;37017:65;;;;;37081:1;37064:14;;:18;37017:65;37014:213;;;37140:3;37123:14;;37114:6;:23;;;;:::i;:::-;:29;;;;:::i;:::-;37102:41;;37162:49;37178:6;37194:4;37201:9;37162:15;:49::i;:::-;37014:213;36905:333;37255:16;;;;;;;;;;;37254:17;:41;;;;;37288:7;;;;;;;;;;;37275:20;;:9;:20;;;37254:41;:72;;;;;37300:18;:26;37319:6;37300:26;;;;;;;;;;;;;;;;;;;;;;;;;37299:27;37254:72;37250:595;;;37343:28;37374:24;37392:4;37374:9;:24::i;:::-;37343:55;;37440:25;;37416:20;:49;37413:421;;37486:24;37570:1;37542:25;;:29;;;;:::i;:::-;37513:25;;:59;;;;:::i;:::-;37486:86;;37619:16;37595:20;:40;37592:227;;37659:41;37683:16;37659:23;:41::i;:::-;37592:227;;;37749:50;37773:25;;37749:23;:50::i;:::-;37592:227;37467:367;37413:421;37328:517;37250:595;37857:54;37873:6;37881:9;37900;37893:6;:16;;;;:::i;:::-;37857:15;:54::i;:::-;36411:1508;36323:1596;;;:::o;5307:191::-;5381:16;5400:6;;;;;;;;;;;5381:25;;5426:8;5417:6;;:17;;;;;;;;;;;;;;;;;;5481:8;5450:40;;5471:8;5450:40;;;;;;;;;;;;5370:128;5307:191;:::o;25874:443::-;26004:1;25987:19;;:5;:19;;;25983:91;;26059:1;26030:32;;;;;;;;;;;:::i;:::-;;;;;;;;25983:91;26107:1;26088:21;;:7;:21;;;26084:92;;26161:1;26133:31;;;;;;;;;;;:::i;:::-;;;;;;;;26084:92;26216:5;26186:11;:18;26198:5;26186:18;;;;;;;;;;;;;;;:27;26205:7;26186:27;;;;;;;;;;;;;;;:35;;;;26236:9;26232:78;;;26283:7;26267:31;;26276:5;26267:31;;;26292:5;26267:31;;;;;;:::i;:::-;;;;;;;;26232:78;25874:443;;;;:::o;21459:316::-;21567:1;21551:18;;:4;:18;;;21547:88;;21620:1;21593:30;;;;;;;;;;;:::i;:::-;;;;;;;;21547:88;21663:1;21649:16;;:2;:16;;;21645:88;;21718:1;21689:32;;;;;;;;;;;:::i;:::-;;;;;;;;21645:88;21743:24;21751:4;21757:2;21761:5;21743:7;:24::i;:::-;21459:316;;;:::o;35682:148::-;34209:16;;;;;;;;;;;34208:17;34200:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34288:4;34269:16;;:23;;;;;;;;;;;;;;;;;;34334:5;34315:16;;:24;;;;;;;;;;;;;;;;;;35682:148;:::o;22099:1135::-;22205:1;22189:18;;:4;:18;;;22185:552;;22343:5;22327:12;;:21;;;;;;;:::i;:::-;;;;;;;;22185:552;;;22381:19;22403:9;:15;22413:4;22403:15;;;;;;;;;;;;;;;;22381:37;;22451:5;22437:11;:19;22433:117;;;22509:4;22515:11;22528:5;22484:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;22433:117;22705:5;22691:11;:19;22673:9;:15;22683:4;22673:15;;;;;;;;;;;;;;;:37;;;;22366:371;22185:552;22767:1;22753:16;;:2;:16;;;22749:435;;22935:5;22919:12;;:21;;;;;;;;;;;22749:435;;;23152:5;23135:9;:13;23145:2;23135:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;22749:435;23216:2;23201:25;;23210:4;23201:25;;;23220:5;23201:25;;;;;;:::i;:::-;;;;;;;;22099:1135;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1308:565::-;1378:8;1388:6;1438:3;1431:4;1423:6;1419:17;1415:27;1405:122;;1446:79;;:::i;:::-;1405:122;1559:6;1546:20;1536:30;;1589:18;1581:6;1578:30;1575:117;;;1611:79;;:::i;:::-;1575:117;1725:4;1717:6;1713:17;1701:29;;1779:3;1771:4;1763:6;1759:17;1749:8;1745:32;1742:41;1739:128;;;1786:79;;:::i;:::-;1739:128;1308:565;;;;;:::o;1879:928::-;1998:6;2006;2014;2022;2071:2;2059:9;2050:7;2046:23;2042:32;2039:119;;;2077:79;;:::i;:::-;2039:119;2225:1;2214:9;2210:17;2197:31;2255:18;2247:6;2244:30;2241:117;;;2277:79;;:::i;:::-;2241:117;2390:80;2462:7;2453:6;2442:9;2438:22;2390:80;:::i;:::-;2372:98;;;;2168:312;2547:2;2536:9;2532:18;2519:32;2578:18;2570:6;2567:30;2564:117;;;2600:79;;:::i;:::-;2564:117;2713:77;2782:7;2773:6;2762:9;2758:22;2713:77;:::i;:::-;2695:95;;;;2490:310;1879:928;;;;;;;:::o;2813:99::-;2865:6;2899:5;2893:12;2883:22;;2813:99;;;:::o;2918:169::-;3002:11;3036:6;3031:3;3024:19;3076:4;3071:3;3067:14;3052:29;;2918:169;;;;:::o;3093:246::-;3174:1;3184:113;3198:6;3195:1;3192:13;3184:113;;;3283:1;3278:3;3274:11;3268:18;3264:1;3259:3;3255:11;3248:39;3220:2;3217:1;3213:10;3208:15;;3184:113;;;3331:1;3322:6;3317:3;3313:16;3306:27;3155:184;3093:246;;;:::o;3345:102::-;3386:6;3437:2;3433:7;3428:2;3421:5;3417:14;3413:28;3403:38;;3345:102;;;:::o;3453:377::-;3541:3;3569:39;3602:5;3569:39;:::i;:::-;3624:71;3688:6;3683:3;3624:71;:::i;:::-;3617:78;;3704:65;3762:6;3757:3;3750:4;3743:5;3739:16;3704:65;:::i;:::-;3794:29;3816:6;3794:29;:::i;:::-;3789:3;3785:39;3778:46;;3545:285;3453:377;;;;:::o;3836:313::-;3949:4;3987:2;3976:9;3972:18;3964:26;;4036:9;4030:4;4026:20;4022:1;4011:9;4007:17;4000:47;4064:78;4137:4;4128:6;4064:78;:::i;:::-;4056:86;;3836:313;;;;:::o;4155:126::-;4192:7;4232:42;4225:5;4221:54;4210:65;;4155:126;;;:::o;4287:60::-;4315:3;4336:5;4329:12;;4287:60;;;:::o;4353:142::-;4403:9;4436:53;4454:34;4463:24;4481:5;4463:24;:::i;:::-;4454:34;:::i;:::-;4436:53;:::i;:::-;4423:66;;4353:142;;;:::o;4501:126::-;4551:9;4584:37;4615:5;4584:37;:::i;:::-;4571:50;;4501:126;;;:::o;4633:153::-;4710:9;4743:37;4774:5;4743:37;:::i;:::-;4730:50;;4633:153;;;:::o;4792:185::-;4906:64;4964:5;4906:64;:::i;:::-;4901:3;4894:77;4792:185;;:::o;4983:276::-;5103:4;5141:2;5130:9;5126:18;5118:26;;5154:98;5249:1;5238:9;5234:17;5225:6;5154:98;:::i;:::-;4983:276;;;;:::o;5265:96::-;5302:7;5331:24;5349:5;5331:24;:::i;:::-;5320:35;;5265:96;;;:::o;5367:122::-;5440:24;5458:5;5440:24;:::i;:::-;5433:5;5430:35;5420:63;;5479:1;5476;5469:12;5420:63;5367:122;:::o;5495:139::-;5541:5;5579:6;5566:20;5557:29;;5595:33;5622:5;5595:33;:::i;:::-;5495:139;;;;:::o;5640:77::-;5677:7;5706:5;5695:16;;5640:77;;;:::o;5723:122::-;5796:24;5814:5;5796:24;:::i;:::-;5789:5;5786:35;5776:63;;5835:1;5832;5825:12;5776:63;5723:122;:::o;5851:139::-;5897:5;5935:6;5922:20;5913:29;;5951:33;5978:5;5951:33;:::i;:::-;5851:139;;;;:::o;5996:474::-;6064:6;6072;6121:2;6109:9;6100:7;6096:23;6092:32;6089:119;;;6127:79;;:::i;:::-;6089:119;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6374:2;6400:53;6445:7;6436:6;6425:9;6421:22;6400:53;:::i;:::-;6390:63;;6345:118;5996:474;;;;;:::o;6476:90::-;6510:7;6553:5;6546:13;6539:21;6528:32;;6476:90;;;:::o;6572:109::-;6653:21;6668:5;6653:21;:::i;:::-;6648:3;6641:34;6572:109;;:::o;6687:210::-;6774:4;6812:2;6801:9;6797:18;6789:26;;6825:65;6887:1;6876:9;6872:17;6863:6;6825:65;:::i;:::-;6687:210;;;;:::o;6903:118::-;6990:24;7008:5;6990:24;:::i;:::-;6985:3;6978:37;6903:118;;:::o;7027:222::-;7120:4;7158:2;7147:9;7143:18;7135:26;;7171:71;7239:1;7228:9;7224:17;7215:6;7171:71;:::i;:::-;7027:222;;;;:::o;7255:619::-;7332:6;7340;7348;7397:2;7385:9;7376:7;7372:23;7368:32;7365:119;;;7403:79;;:::i;:::-;7365:119;7523:1;7548:53;7593:7;7584:6;7573:9;7569:22;7548:53;:::i;:::-;7538:63;;7494:117;7650:2;7676:53;7721:7;7712:6;7701:9;7697:22;7676:53;:::i;:::-;7666:63;;7621:118;7778:2;7804:53;7849:7;7840:6;7829:9;7825:22;7804:53;:::i;:::-;7794:63;;7749:118;7255:619;;;;;:::o;7880:86::-;7915:7;7955:4;7948:5;7944:16;7933:27;;7880:86;;;:::o;7972:112::-;8055:22;8071:5;8055:22;:::i;:::-;8050:3;8043:35;7972:112;;:::o;8090:214::-;8179:4;8217:2;8206:9;8202:18;8194:26;;8230:67;8294:1;8283:9;8279:17;8270:6;8230:67;:::i;:::-;8090:214;;;;:::o;8310:118::-;8397:24;8415:5;8397:24;:::i;:::-;8392:3;8385:37;8310:118;;:::o;8434:222::-;8527:4;8565:2;8554:9;8550:18;8542:26;;8578:71;8646:1;8635:9;8631:17;8622:6;8578:71;:::i;:::-;8434:222;;;;:::o;8662:474::-;8730:6;8738;8787:2;8775:9;8766:7;8762:23;8758:32;8755:119;;;8793:79;;:::i;:::-;8755:119;8913:1;8938:53;8983:7;8974:6;8963:9;8959:22;8938:53;:::i;:::-;8928:63;;8884:117;9040:2;9066:53;9111:7;9102:6;9091:9;9087:22;9066:53;:::i;:::-;9056:63;;9011:118;8662:474;;;;;:::o;9142:104::-;9187:7;9216:24;9234:5;9216:24;:::i;:::-;9205:35;;9142:104;;;:::o;9252:138::-;9333:32;9359:5;9333:32;:::i;:::-;9326:5;9323:43;9313:71;;9380:1;9377;9370:12;9313:71;9252:138;:::o;9396:155::-;9450:5;9488:6;9475:20;9466:29;;9504:41;9539:5;9504:41;:::i;:::-;9396:155;;;;:::o;9557:345::-;9624:6;9673:2;9661:9;9652:7;9648:23;9644:32;9641:119;;;9679:79;;:::i;:::-;9641:119;9799:1;9824:61;9877:7;9868:6;9857:9;9853:22;9824:61;:::i;:::-;9814:71;;9770:125;9557:345;;;;:::o;9908:329::-;9967:6;10016:2;10004:9;9995:7;9991:23;9987:32;9984:119;;;10022:79;;:::i;:::-;9984:119;10142:1;10167:53;10212:7;10203:6;10192:9;10188:22;10167:53;:::i;:::-;10157:63;;10113:117;9908:329;;;;:::o;10243:474::-;10311:6;10319;10368:2;10356:9;10347:7;10343:23;10339:32;10336:119;;;10374:79;;:::i;:::-;10336:119;10494:1;10519:53;10564:7;10555:6;10544:9;10540:22;10519:53;:::i;:::-;10509:63;;10465:117;10621:2;10647:53;10692:7;10683:6;10672:9;10668:22;10647:53;:::i;:::-;10637:63;;10592:118;10243:474;;;;;:::o;10723:329::-;10782:6;10831:2;10819:9;10810:7;10806:23;10802:32;10799:119;;;10837:79;;:::i;:::-;10799:119;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;10723:329;;;;:::o;11058:116::-;11128:21;11143:5;11128:21;:::i;:::-;11121:5;11118:32;11108:60;;11164:1;11161;11154:12;11108:60;11058:116;:::o;11180:133::-;11223:5;11261:6;11248:20;11239:29;;11277:30;11301:5;11277:30;:::i;:::-;11180:133;;;;:::o;11319:468::-;11384:6;11392;11441:2;11429:9;11420:7;11416:23;11412:32;11409:119;;;11447:79;;:::i;:::-;11409:119;11567:1;11592:53;11637:7;11628:6;11617:9;11613:22;11592:53;:::i;:::-;11582:63;;11538:117;11694:2;11720:50;11762:7;11753:6;11742:9;11738:22;11720:50;:::i;:::-;11710:60;;11665:115;11319:468;;;;;:::o;11793:168::-;11933:20;11929:1;11921:6;11917:14;11910:44;11793:168;:::o;11967:366::-;12109:3;12130:67;12194:2;12189:3;12130:67;:::i;:::-;12123:74;;12206:93;12295:3;12206:93;:::i;:::-;12324:2;12319:3;12315:12;12308:19;;11967:366;;;:::o;12339:419::-;12505:4;12543:2;12532:9;12528:18;12520:26;;12592:9;12586:4;12582:20;12578:1;12567:9;12563:17;12556:47;12620:131;12746:4;12620:131;:::i;:::-;12612:139;;12339:419;;;:::o;12764:171::-;12904:23;12900:1;12892:6;12888:14;12881:47;12764:171;:::o;12941:366::-;13083:3;13104:67;13168:2;13163:3;13104:67;:::i;:::-;13097:74;;13180:93;13269:3;13180:93;:::i;:::-;13298:2;13293:3;13289:12;13282:19;;12941:366;;;:::o;13313:419::-;13479:4;13517:2;13506:9;13502:18;13494:26;;13566:9;13560:4;13556:20;13552:1;13541:9;13537:17;13530:47;13594:131;13720:4;13594:131;:::i;:::-;13586:139;;13313:419;;;:::o;13738:180::-;13786:77;13783:1;13776:88;13883:4;13880:1;13873:15;13907:4;13904:1;13897:15;13924:323;13980:6;14029:2;14017:9;14008:7;14004:23;14000:32;13997:119;;;14035:79;;:::i;:::-;13997:119;14155:1;14180:50;14222:7;14213:6;14202:9;14198:22;14180:50;:::i;:::-;14170:60;;14126:114;13924:323;;;;:::o;14253:180::-;14301:77;14298:1;14291:88;14398:4;14395:1;14388:15;14422:4;14419:1;14412:15;14439:233;14478:3;14501:24;14519:5;14501:24;:::i;:::-;14492:33;;14547:66;14540:5;14537:77;14534:103;;14617:18;;:::i;:::-;14534:103;14664:1;14657:5;14653:13;14646:20;;14439:233;;;:::o;14678:184::-;14777:11;14811:6;14806:3;14799:19;14851:4;14846:3;14842:14;14827:29;;14678:184;;;;:::o;14868:102::-;14937:4;14960:3;14952:11;;14868:102;;;:::o;14976:108::-;15053:24;15071:5;15053:24;:::i;:::-;15048:3;15041:37;14976:108;;:::o;15090:179::-;15159:10;15180:46;15222:3;15214:6;15180:46;:::i;:::-;15258:4;15253:3;15249:14;15235:28;;15090:179;;;;:::o;15275:122::-;15327:5;15352:39;15387:2;15382:3;15378:12;15373:3;15352:39;:::i;:::-;15343:48;;15275:122;;;;:::o;15403:115::-;15475:4;15507;15502:3;15498:14;15490:22;;15403:115;;;:::o;15554:699::-;15683:3;15706:86;15785:6;15780:3;15706:86;:::i;:::-;15699:93;;15816:58;15868:5;15816:58;:::i;:::-;15897:7;15928:1;15913:315;15938:6;15935:1;15932:13;15913:315;;;16008:42;16043:6;16034:7;16008:42;:::i;:::-;16070:63;16129:3;16114:13;16070:63;:::i;:::-;16063:70;;16156:62;16211:6;16156:62;:::i;:::-;16146:72;;15973:255;15960:1;15957;15953:9;15948:14;;15913:315;;;15917:14;16244:3;16237:10;;15688:565;;15554:699;;;;;:::o;16259:181::-;16355:11;16389:6;16384:3;16377:19;16429:4;16424:3;16420:14;16405:29;;16259:181;;;;:::o;16446:99::-;16512:4;16535:3;16527:11;;16446:99;;;:::o;16551:::-;16622:21;16637:5;16622:21;:::i;:::-;16617:3;16610:34;16551:99;;:::o;16656:167::-;16719:10;16740:40;16776:3;16768:6;16740:40;:::i;:::-;16812:4;16807:3;16803:14;16789:28;;16656:167;;;;:::o;16829:116::-;16878:5;16903:36;16935:2;16930:3;16926:12;16921:3;16903:36;:::i;:::-;16894:45;;16829:116;;;;:::o;16951:112::-;17020:4;17052;17047:3;17043:14;17035:22;;16951:112;;;:::o;17093:675::-;17216:3;17239:83;17315:6;17310:3;17239:83;:::i;:::-;17232:90;;17346:55;17395:5;17346:55;:::i;:::-;17424:7;17455:1;17440:303;17465:6;17462:1;17459:13;17440:303;;;17535:39;17567:6;17558:7;17535:39;:::i;:::-;17594:57;17647:3;17632:13;17594:57;:::i;:::-;17587:64;;17674:59;17726:6;17674:59;:::i;:::-;17664:69;;17500:243;17487:1;17484;17480:9;17475:14;;17440:303;;;17444:14;17759:3;17752:10;;17221:547;;17093:675;;;;;:::o;17774:662::-;18009:4;18047:2;18036:9;18032:18;18024:26;;18096:9;18090:4;18086:20;18082:1;18071:9;18067:17;18060:47;18124:118;18237:4;18228:6;18220;18124:118;:::i;:::-;18116:126;;18289:9;18283:4;18279:20;18274:2;18263:9;18259:18;18252:48;18317:112;18424:4;18415:6;18407;18317:112;:::i;:::-;18309:120;;17774:662;;;;;;;:::o;18442:180::-;18490:77;18487:1;18480:88;18587:4;18584:1;18577:15;18611:4;18608:1;18601:15;18628:320;18672:6;18709:1;18703:4;18699:12;18689:22;;18756:1;18750:4;18746:12;18777:18;18767:81;;18833:4;18825:6;18821:17;18811:27;;18767:81;18895:2;18887:6;18884:14;18864:18;18861:38;18858:84;;18914:18;;:::i;:::-;18858:84;18679:269;18628:320;;;:::o;18954:191::-;18994:3;19013:20;19031:1;19013:20;:::i;:::-;19008:25;;19047:20;19065:1;19047:20;:::i;:::-;19042:25;;19090:1;19087;19083:9;19076:16;;19111:3;19108:1;19105:10;19102:36;;;19118:18;;:::i;:::-;19102:36;18954:191;;;;:::o;19151:180::-;19199:77;19196:1;19189:88;19296:4;19293:1;19286:15;19320:4;19317:1;19310:15;19337:185;19377:1;19394:20;19412:1;19394:20;:::i;:::-;19389:25;;19428:20;19446:1;19428:20;:::i;:::-;19423:25;;19467:1;19457:35;;19472:18;;:::i;:::-;19457:35;19514:1;19511;19507:9;19502:14;;19337:185;;;;:::o;19528:222::-;19668:34;19664:1;19656:6;19652:14;19645:58;19737:5;19732:2;19724:6;19720:15;19713:30;19528:222;:::o;19756:366::-;19898:3;19919:67;19983:2;19978:3;19919:67;:::i;:::-;19912:74;;19995:93;20084:3;19995:93;:::i;:::-;20113:2;20108:3;20104:12;20097:19;;19756:366;;;:::o;20128:419::-;20294:4;20332:2;20321:9;20317:18;20309:26;;20381:9;20375:4;20371:20;20367:1;20356:9;20352:17;20345:47;20409:131;20535:4;20409:131;:::i;:::-;20401:139;;20128:419;;;:::o;20553:410::-;20593:7;20616:20;20634:1;20616:20;:::i;:::-;20611:25;;20650:20;20668:1;20650:20;:::i;:::-;20645:25;;20705:1;20702;20698:9;20727:30;20745:11;20727:30;:::i;:::-;20716:41;;20906:1;20897:7;20893:15;20890:1;20887:22;20867:1;20860:9;20840:83;20817:139;;20936:18;;:::i;:::-;20817:139;20601:362;20553:410;;;;:::o;20969:181::-;21109:33;21105:1;21097:6;21093:14;21086:57;20969:181;:::o;21156:366::-;21298:3;21319:67;21383:2;21378:3;21319:67;:::i;:::-;21312:74;;21395:93;21484:3;21395:93;:::i;:::-;21513:2;21508:3;21504:12;21497:19;;21156:366;;;:::o;21528:419::-;21694:4;21732:2;21721:9;21717:18;21709:26;;21781:9;21775:4;21771:20;21767:1;21756:9;21752:17;21745:47;21809:131;21935:4;21809:131;:::i;:::-;21801:139;;21528:419;;;:::o;21953:147::-;22054:11;22091:3;22076:18;;21953:147;;;;:::o;22106:114::-;;:::o;22226:398::-;22385:3;22406:83;22487:1;22482:3;22406:83;:::i;:::-;22399:90;;22498:93;22587:3;22498:93;:::i;:::-;22616:1;22611:3;22607:11;22600:18;;22226:398;;;:::o;22630:379::-;22814:3;22836:147;22979:3;22836:147;:::i;:::-;22829:154;;23000:3;22993:10;;22630:379;;;:::o;23015:170::-;23155:22;23151:1;23143:6;23139:14;23132:46;23015:170;:::o;23191:366::-;23333:3;23354:67;23418:2;23413:3;23354:67;:::i;:::-;23347:74;;23430:93;23519:3;23430:93;:::i;:::-;23548:2;23543:3;23539:12;23532:19;;23191:366;;;:::o;23563:419::-;23729:4;23767:2;23756:9;23752:18;23744:26;;23816:9;23810:4;23806:20;23802:1;23791:9;23787:17;23780:47;23844:131;23970:4;23844:131;:::i;:::-;23836:139;;23563:419;;;:::o;23988:143::-;24045:5;24076:6;24070:13;24061:22;;24092:33;24119:5;24092:33;:::i;:::-;23988:143;;;;:::o;24137:351::-;24207:6;24256:2;24244:9;24235:7;24231:23;24227:32;24224:119;;;24262:79;;:::i;:::-;24224:119;24382:1;24407:64;24463:7;24454:6;24443:9;24439:22;24407:64;:::i;:::-;24397:74;;24353:128;24137:351;;;;:::o;24494:176::-;24634:28;24630:1;24622:6;24618:14;24611:52;24494:176;:::o;24676:366::-;24818:3;24839:67;24903:2;24898:3;24839:67;:::i;:::-;24832:74;;24915:93;25004:3;24915:93;:::i;:::-;25033:2;25028:3;25024:12;25017:19;;24676:366;;;:::o;25048:419::-;25214:4;25252:2;25241:9;25237:18;25229:26;;25301:9;25295:4;25291:20;25287:1;25276:9;25272:17;25265:47;25329:131;25455:4;25329:131;:::i;:::-;25321:139;;25048:419;;;:::o;25473:332::-;25594:4;25632:2;25621:9;25617:18;25609:26;;25645:71;25713:1;25702:9;25698:17;25689:6;25645:71;:::i;:::-;25726:72;25794:2;25783:9;25779:18;25770:6;25726:72;:::i;:::-;25473:332;;;;;:::o;25811:137::-;25865:5;25896:6;25890:13;25881:22;;25912:30;25936:5;25912:30;:::i;:::-;25811:137;;;;:::o;25954:345::-;26021:6;26070:2;26058:9;26049:7;26045:23;26041:32;26038:119;;;26076:79;;:::i;:::-;26038:119;26196:1;26221:61;26274:7;26265:6;26254:9;26250:22;26221:61;:::i;:::-;26211:71;;26167:125;25954:345;;;;:::o;26305:176::-;26445:28;26441:1;26433:6;26429:14;26422:52;26305:176;:::o;26487:366::-;26629:3;26650:67;26714:2;26709:3;26650:67;:::i;:::-;26643:74;;26726:93;26815:3;26726:93;:::i;:::-;26844:2;26839:3;26835:12;26828:19;;26487:366;;;:::o;26859:419::-;27025:4;27063:2;27052:9;27048:18;27040:26;;27112:9;27106:4;27102:20;27098:1;27087:9;27083:17;27076:47;27140:131;27266:4;27140:131;:::i;:::-;27132:139;;26859:419;;;:::o;27284:180::-;27424:32;27420:1;27412:6;27408:14;27401:56;27284:180;:::o;27470:366::-;27612:3;27633:67;27697:2;27692:3;27633:67;:::i;:::-;27626:74;;27709:93;27798:3;27709:93;:::i;:::-;27827:2;27822:3;27818:12;27811:19;;27470:366;;;:::o;27842:419::-;28008:4;28046:2;28035:9;28031:18;28023:26;;28095:9;28089:4;28085:20;28081:1;28070:9;28066:17;28059:47;28123:131;28249:4;28123:131;:::i;:::-;28115:139;;27842:419;;;:::o;28267:442::-;28416:4;28454:2;28443:9;28439:18;28431:26;;28467:71;28535:1;28524:9;28520:17;28511:6;28467:71;:::i;:::-;28548:72;28616:2;28605:9;28601:18;28592:6;28548:72;:::i;:::-;28630;28698:2;28687:9;28683:18;28674:6;28630:72;:::i;:::-;28267:442;;;;;;:::o;28715:228::-;28855:34;28851:1;28843:6;28839:14;28832:58;28924:11;28919:2;28911:6;28907:15;28900:36;28715:228;:::o;28949:366::-;29091:3;29112:67;29176:2;29171:3;29112:67;:::i;:::-;29105:74;;29188:93;29277:3;29188:93;:::i;:::-;29306:2;29301:3;29297:12;29290:19;;28949:366;;;:::o;29321:419::-;29487:4;29525:2;29514:9;29510:18;29502:26;;29574:9;29568:4;29564:20;29560:1;29549:9;29545:17;29538:47;29602:131;29728:4;29602:131;:::i;:::-;29594:139;;29321:419;;;:::o;29746:173::-;29886:25;29882:1;29874:6;29870:14;29863:49;29746:173;:::o;29925:366::-;30067:3;30088:67;30152:2;30147:3;30088:67;:::i;:::-;30081:74;;30164:93;30253:3;30164:93;:::i;:::-;30282:2;30277:3;30273:12;30266:19;;29925:366;;;:::o;30297:419::-;30463:4;30501:2;30490:9;30486:18;30478:26;;30550:9;30544:4;30540:20;30536:1;30525:9;30521:17;30514:47;30578:131;30704:4;30578:131;:::i;:::-;30570:139;;30297:419;;;:::o;30722:177::-;30862:29;30858:1;30850:6;30846:14;30839:53;30722:177;:::o;30905:366::-;31047:3;31068:67;31132:2;31127:3;31068:67;:::i;:::-;31061:74;;31144:93;31233:3;31144:93;:::i;:::-;31262:2;31257:3;31253:12;31246:19;;30905:366;;;:::o;31277:419::-;31443:4;31481:2;31470:9;31466:18;31458:26;;31530:9;31524:4;31520:20;31516:1;31505:9;31501:17;31494:47;31558:131;31684:4;31558:131;:::i;:::-;31550:139;;31277:419;;;:::o;31702:194::-;31742:4;31762:20;31780:1;31762:20;:::i;:::-;31757:25;;31796:20;31814:1;31796:20;:::i;:::-;31791:25;;31840:1;31837;31833:9;31825:17;;31864:1;31858:4;31855:11;31852:37;;;31869:18;;:::i;:::-;31852:37;31702:194;;;;:::o;31902:178::-;32042:30;32038:1;32030:6;32026:14;32019:54;31902:178;:::o;32086:366::-;32228:3;32249:67;32313:2;32308:3;32249:67;:::i;:::-;32242:74;;32325:93;32414:3;32325:93;:::i;:::-;32443:2;32438:3;32434:12;32427:19;;32086:366;;;:::o;32458:419::-;32624:4;32662:2;32651:9;32647:18;32639:26;;32711:9;32705:4;32701:20;32697:1;32686:9;32682:17;32675:47;32739:131;32865:4;32739:131;:::i;:::-;32731:139;;32458:419;;;:::o

Swarm Source

ipfs://77b7c463ab4477bf1b36bd701e55ef0287dea6c9f136d33f6d0fd48c0f9cac31
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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