ETH Price: $3,102.11 (+1.09%)
Gas: 8 Gwei

Token

GROGE (GROGE)
 

Overview

Max Total Supply

69,000,000 GROGE

Holders

406

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000004642062 GROGE

Value
$0.00
0x155971d77fc329b577cf40270c4161134fc6b1f0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GROGE

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-27
*/

// Grok + Doge, much AI, such wow
// Website: https://grogecoin.net
// Telegram: https://t.me/grogecoin

// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the upd allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IDexPair {
    function sync() external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

contract GROGE is ERC20, Ownable {
    using SafeMath for uint256;

    IDexRouter private immutable dexRouter;
    address public immutable dexPair;
    address private newOwner = 0x0f41Bf3555C11428164AE1fe26e803BB30799DB4;

    // Swapback
    bool private swapping;

    bool private swapbackEnabled = false;
    uint256 private swapBackValueMin;
    uint256 private swapBackValueMax;

    //Anti-whale
    bool private limitsInEffect = true;
    bool private trasnferDelayEnabled = true;
    uint256 private maxWallet;
    uint256 private maxTx;
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch

    bool public tradingOn = false;

    // burn
    bool private burnEnabled = true;
    uint256 private lastSync = 0;

    // Fee receivers
    address private autoLPReceiver;
    address private mktReceiver;
    address private devReceiver;

    uint256 private totalBuyFee;
    uint256 private buyMktFee;
    uint256 private buyLPFee;
    uint256 private buyDevFee;

    uint256 private totalSellFee;
    uint256 private sellMktFee;
    uint256 private sellLpFee;
    uint256 private sellDevFee;

    uint256 private totalTransferFee;
    uint256 private transferMktFee;
    uint256 private transferLpFee;
    uint256 private transferDevFee;

    uint256 private tokensForMarketing;
    uint256 private tokensForLiquidity;
    uint256 private tokensForDev;

    /******************/

    // exlcude from fees and max transaction amount
    mapping(address => bool) private isFeeExempt;
    mapping(address => bool) private isTxLimitExempt;
    mapping(address => bool) private automatedMarketMakerPairs;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeFromLimits(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event TradingEnabled(uint256 indexed timestamp);
    event LimitsRemoved(uint256 indexed timestamp);
    event DisabledTransferDelay(uint256 indexed timestamp);

    event SwapbackSettingsUpdated(
        bool enabled,
        uint256 swapBackValueMin,
        uint256 swapBackValueMax
    );
    event MaxTxUpdated(uint256 maxTx);
    event MaxWalletUpdated(uint256 maxWallet);

    event mktReceiverUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event devReceiverUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event lpReceiverUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event TriggerBurn(uint256 percentBurnt);

    event BuyFeeUpdated(
        uint256 totalBuyFee,
        uint256 buyMktFee,
        uint256 buyLPFee,
        uint256 buyDevFee
    );

    event SellFeeUpdated(
        uint256 totalSellFee,
        uint256 sellMktFee,
        uint256 sellLpFee,
        uint256 sellDevFee
    );

    event TransferFeeUpdated(
        uint256 totalTransferFee,
        uint256 transferMktFee,
        uint256 transferLpFee,
        uint256 transferDevFee
    );

    constructor() ERC20("GROGE", "GROGE") {
        IDexRouter _dexRouter = IDexRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        lastSync = block.timestamp;

        excludeFromMaxTransaction(address(_dexRouter), true);
        dexRouter = _dexRouter;

        dexPair = IDexFactory(_dexRouter.factory()).createPair(
            address(this),
            _dexRouter.WETH()
        );
        excludeFromMaxTransaction(address(dexPair), true);
        _setAutomatedMarketMakerPair(address(dexPair), true);

        uint256 _buyMktFee = 25;
        uint256 _buyLPFee = 0;
        uint256 _buyDevFee = 5;

        uint256 _sellMktFee = 30;
        uint256 _sellLpFee = 0;
        uint256 _sellDevFee = 0;

        uint256 _transferMktFee = 0;
        uint256 _transferLpFee =  0;
        uint256 _transferDevFee = 0;

        uint256 totalSupply = 69000000 * 10 ** decimals();

        maxTx = (totalSupply * 10) / 1000;
        maxWallet = (totalSupply * 20) / 1000;

        swapBackValueMin = (totalSupply * 50) / 1000;
        swapBackValueMax = (totalSupply * 100) / 100;

        buyMktFee = _buyMktFee;
        buyLPFee = _buyLPFee;
        buyDevFee = _buyDevFee;
        totalBuyFee = buyMktFee + buyLPFee + buyDevFee;

        sellMktFee = _sellMktFee;
        sellLpFee = _sellLpFee;
        sellDevFee = _sellDevFee;
        totalSellFee = sellMktFee + sellLpFee + sellDevFee;

        transferMktFee = _transferMktFee;
        transferLpFee = _transferLpFee;
        transferDevFee = _transferDevFee;
        totalTransferFee = transferMktFee + transferLpFee + transferDevFee;

        mktReceiver = address(0x46d2EEaE19D261fa1863a74C2cc2B8521443AcA2);
        devReceiver = address(0x0f41Bf3555C11428164AE1fe26e803BB30799DB4);
        autoLPReceiver = address(0x000000000000000000000000000000000000dEaD);

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

        excludeFromMaxTransaction(newOwner, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        excludeFromMaxTransaction(autoLPReceiver, true);

        transferOwnership(newOwner);

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(newOwner, totalSupply);
    }

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

    /**
     * @notice  Information about the swapback settings
     * @return  _swapbackEnabled  if swapback is enabled
     * @return  _swapBackValueMin  the minimum amount of tokens in the contract balance to trigger swapback
     * @return  _swapBackValueMax  the maximum amount of tokens in the contract balance to trigger swapback
     */
    function swapbackInfo()
        external
        view
        returns (
            bool _swapbackEnabled,
            uint256 _swapBackValueMin,
            uint256 _swapBackValueMax
        )
    {
        _swapbackEnabled = swapbackEnabled;
        _swapBackValueMin = swapBackValueMin;
        _swapBackValueMax = swapBackValueMax;
    }

    /**
     * @notice  Information about the anti whale parameters
     * @return  _limitsInEffect  if the wallet limits are in effect
     * @return  _trasnferDelayEnabled  if the transfer delay is enabled
     * @return  _maxWallet  The maximum amount of tokens that can be held by a wallet
     * @return  _maxTx  The maximum amount of tokens that can be bought or sold in a single transaction
     */
    function antiWhaleInfo()
        external
        view
        returns (
            bool _limitsInEffect,
            bool _trasnferDelayEnabled,
            uint256 _maxWallet,
            uint256 _maxTx
        )
    {
        _limitsInEffect = limitsInEffect;
        _trasnferDelayEnabled = trasnferDelayEnabled;
        _maxWallet = maxWallet;
        _maxTx = maxTx;
    }

    /**
     * @notice The wallets that receive the collected fees
     * @return _autoLPReceiver The wallet that receives the LP fees
     * @return _mktReceiver The wallet that receives the marketing fees
     * @return _devReceiver The wallet that receives the dev fees
     */
    function feeReceivers()
        external
        view
        returns (
            address _autoLPReceiver,
            address _mktReceiver,
            address _devReceiver
        )
    {
        return (autoLPReceiver, mktReceiver, devReceiver);
    }

    /**
     * @notice Fees for buys, sells, and transfers
     * @return _totalBuyFee The total fee for buys
     * @return _buyMktFee The fee for buys that gets sent to marketing
     * @return _buyLPFee The fee for buys that gets sent to LP
     * @return _buyDevFee The fee for buys that gets sent to dev
     * @return _totalSellFee The total fee for sells
     * @return _sellMktFee The fee for sells that gets sent to marketing
     * @return _sellLpFee The fee for sells that gets sent to LP
     * @return _sellDevFee The fee for sells that gets sent to dev
     * @return _totalTransferFee The total fee for transfers
     * @return _transferMktFee The fee for transfers that gets sent to marketing
     * @return _transferLpFee The fee for transfers that gets sent to LP
     * @return _transferDevFee The fee for transfers that gets sent to dev
     */
    function feeRates()
        external
        view
        returns (
            uint256 _totalBuyFee,
            uint256 _buyMktFee,
            uint256 _buyLPFee,
            uint256 _buyDevFee,
            uint256 _totalSellFee,
            uint256 _sellMktFee,
            uint256 _sellLpFee,
            uint256 _sellDevFee,
            uint256 _totalTransferFee,
            uint256 _transferMktFee,
            uint256 _transferLpFee,
            uint256 _transferDevFee
        )
    {
        _totalBuyFee = totalBuyFee;
        _buyMktFee = buyMktFee;
        _buyLPFee = buyLPFee;
        _buyDevFee = buyDevFee;
        _totalSellFee = totalSellFee;
        _sellMktFee = sellMktFee;
        _sellLpFee = sellLpFee;
        _sellDevFee = sellDevFee;
        _totalTransferFee = totalTransferFee;
        _transferMktFee = transferMktFee;
        _transferLpFee = transferLpFee;
        _transferDevFee = transferDevFee;
    }

    /**
     * @notice  If the wallet is excluded from fees and max transaction amount and if the wallet is a automated market maker pair
     * @param   _target  The wallet to check
     * @return  _isFeeExempt  If the wallet is excluded from fees
     * @return  _isTxLimitExempt  If the wallet is excluded from max transaction amount
     * @return  _automatedMarketMakerPairs If the wallet is a automated market maker pair
     */
    function checkAddressPermissions(
        address _target
    )
        external
        view
        returns (
            bool _isFeeExempt,
            bool _isTxLimitExempt,
            bool _automatedMarketMakerPairs
        )
    {
        _isFeeExempt = isFeeExempt[_target];
        _isTxLimitExempt = isTxLimitExempt[_target];
        _automatedMarketMakerPairs = automatedMarketMakerPairs[_target];
    }

    /**
     * @notice Information related to the burn function
     * @return _burnEnabled If burn is enabled
     * @return _lastSync The last time burn was called
     */
    function burnInfo() external view returns (bool _burnEnabled, uint256 _lastSync) {
        _burnEnabled = burnEnabled;
        _lastSync = lastSync;
    }

    receive() external payable {}

    /**
     * @notice  Opens public trading for the token
     * @dev     onlyOwner.
     */
    function enableTrading() external onlyOwner {
        tradingOn = true;
        swapbackEnabled = true;
        emit TradingEnabled(block.timestamp);
    }

    /**
     * @notice Removes the max wallet and max transaction limits
     * @dev onlyOwner.
     * Emits an {LimitsRemoved} event
     */
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit LimitsRemoved(block.timestamp);
    }

    /**
     * @notice Removes the transfer delay
     * @dev onlyOwner.
     * Emits an {DisabledTransferDelay} event
     */
    function disableTransferDelay() external onlyOwner {
        trasnferDelayEnabled = false;
        emit DisabledTransferDelay(block.timestamp);
    }

    /**
     * @notice sets if swapback is enabled and sets the minimum and maximum amounts
     * @dev onlyOwner.
     * Emits an {SwapbackSettingsUpdated} event
     * @param _enabled If swapback is enabled
     * @param _min The minimum amount of tokens the contract must have before swapping tokens for ETH. Base 10000, so 1% = 100.
     * @param _max The maximum amount of tokens the contract can swap for ETH. Base 10000, so 1% = 100.
     */
    function setSwapBackSettings(
        bool _enabled,
        uint256 _min,
        uint256 _max
    ) external onlyOwner {
        require(
            _min >= 1,
            "Swap amount cannot be lower than 0.01% total supply."
        );
        require(_max >= _min, "maximum amount cant be higher than minimum");

        swapbackEnabled = _enabled;
        swapBackValueMin = (totalSupply() * _min) / 10000;
        swapBackValueMax = (totalSupply() * _max) / 10000;
        emit SwapbackSettingsUpdated(_enabled, _min, _max);
    }

    /**
     * @notice Changes the maximum amount of tokens that can be bought or sold in a single transaction
     * @dev onlyOwner.
     * Emits an {MaxTxUpdated} event
     * @param newNum Base 1000, so 1% = 10
     */
    function setTxLimit(uint256 newNum) external onlyOwner {
        require(newNum >= 1, "Cannot set maxTx lower than 0.1%");
        maxTx = (newNum * totalSupply()) / 1000;
        emit MaxTxUpdated(maxTx);
    }

    /**
     * @notice Changes the maximum amount of tokens a wallet can hold
     * @dev onlyOwner.
     * Emits an {MaxWalletUpdated} event
     * @param newNum Base 1000, so 1% = 10
     */
    function setWalletLimit(uint256 newNum) external onlyOwner {
        require(newNum >= 5, "Cannot set maxWallet lower than 0.5%");
        maxWallet = (newNum * totalSupply()) / 1000;
        emit MaxWalletUpdated(maxWallet);
    }

    /**
     * @notice Sets if a wallet is excluded from the max wallet and tx limits
     * @dev onlyOwner.
     * Emits an {ExcludeFromLimits} event
     * @param updAds The wallet to update
     * @param isEx If the wallet is excluded or not
     */
    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        isTxLimitExempt[updAds] = isEx;
        emit ExcludeFromLimits(updAds, isEx);
    }

    /**
     * @notice Sets the fees for buys
     * @dev onlyOwner.
     * Emits a {BuyFeeUpdated} event
     * All fees added up must be less than %maxTax%
     * @param _marketingFee The fee for the marketing wallet
     * @param _liquidityFee The fee for the liquidity pool
     * @param _devFee The fee for the dev wallet
     */
    function setBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        buyMktFee = _marketingFee;
        buyLPFee = _liquidityFee;
        buyDevFee = _devFee;
        totalBuyFee = buyMktFee + buyLPFee + buyDevFee;
        require(totalBuyFee <= 60, "Total buy fee cannot be higher than %maxTax%%");
        emit BuyFeeUpdated(totalBuyFee, buyMktFee, buyLPFee, buyDevFee);
    }

    /**
     * @notice Sets the fees for sells
     * @dev onlyOwner.
     * Emits a {SellFeeUpdated} event
     * All fees added up must be less than %maxTax%
     * @param _marketingFee The fee for the marketing wallet
     * @param _liquidityFee The fee for the liquidity pool
     * @param _devFee The fee for the dev wallet
     */
    function setSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        sellMktFee = _marketingFee;
        sellLpFee = _liquidityFee;
        sellDevFee = _devFee;
        totalSellFee = sellMktFee + sellLpFee + sellDevFee;
        require(
            totalSellFee <= 60,
            "Total sell fee cannot be higher than %maxTax%%"
        );
        emit SellFeeUpdated(totalSellFee, sellMktFee, sellLpFee, sellDevFee);
    }

    /**
     * @notice Sets the fees for transfers
     * @dev onlyOwner.
     * Emits a {TransferFeeUpdated} event
     * All fees added up must be less than %maxTax%
     * @param _marketingFee The fee for the marketing wallet
     * @param _liquidityFee The fee for the liquidity pool
     * @param _devFee The fee for the dev wallet
     */
    function setTransferFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        transferMktFee = _marketingFee;
        transferLpFee = _liquidityFee;
        transferDevFee = _devFee;
        totalTransferFee = transferMktFee + transferLpFee + transferDevFee;
        require(
            totalTransferFee <= 10,
            "Total transfer fee cannot be higher than %maxTax%%"
        );
        emit TransferFeeUpdated(
            totalTransferFee,
            transferMktFee,
            transferLpFee,
            transferDevFee
        );
    }

    /**
     * @notice Sets if an address is excluded from fees
     * @dev onlyOwner.
     * Emits an {ExcludeFromFees} event
     * @param account The wallet to update
     * @param excluded If the wallet is excluded or not
     */
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        isFeeExempt[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    /**
     * @notice Sets an address as a new liquidity pair. You probably dont want to do this.
     * @dev onlyOwner.
     * Emits a {SetAutomatedMarketMakerPair} event
     * @param pair the address of the pair
     * @param value If the pair is a automated market maker pair or not
     */
    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(
            pair != dexPair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    /**
     * @notice Sets the marketing wallet
     * @dev onlyOwner.
     * Emits an {mktReceiverUpdated} event
     * @param newWallet The new marketing wallet
     */
    function setMarketingWallet(address newWallet) external onlyOwner {
        emit mktReceiverUpdated(newWallet, mktReceiver);
        mktReceiver = newWallet;
    }

    /**
     * @notice Sets the LP receiver
     * @dev onlyOwner.
     * Emits an {lpReceiverUpdated} event
     * @param newWallet The new dev wallet
     */
    function setLPWallet(address newWallet) external onlyOwner {
        emit lpReceiverUpdated(newWallet, autoLPReceiver);
        autoLPReceiver = newWallet;
    }

    /**
     * @notice Sets the dev wallet
     * @dev onlyOwner.
     * Emits an {devReceiverUpdated} event
     * @param newWallet The new dev wallet
     */
    function setDevWallet(address newWallet) external onlyOwner {
        emit devReceiverUpdated(newWallet, devReceiver);
        devReceiver = newWallet;
    }

    /**
     * @notice Triggers the manual burn function
     * @dev onlyOwner.
     * Emits a {TriggerBurn} event
     * Reverts if the last burn was less than 5 minutes ago
     * @param percent The percentage of tokens to burn from the LP. Base 10000, so 1% = 100. Max value is 200 (2%)
     */
    function triggerBurn(uint256 percent) public onlyOwner returns (bool) {
        require(
            percent <= 200,
            "May not burn more than 2% of tokens in LP at a time"
        );
        require(block.timestamp > lastSync + 5 minutes, "Too soon");
        require(burnEnabled, "Burns are disabled");

        uint256 lp_tokens = this.balanceOf(dexPair);
        uint256 lp_burn = lp_tokens.mul(percent).div(10_000);

        if (lp_burn > 0) {
            super._transfer(dexPair, address(0xdead), lp_burn);
            IDexPair(dexPair).sync();
            return true;
        }
        emit TriggerBurn(percent);

        return false;
    }

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

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

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

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

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

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapBackValueMin;

        if (
            canSwap &&
            swapbackEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !isFeeExempt[from] &&
            !isFeeExempt[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (isFeeExempt[from] || isFeeExempt[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && totalSellFee > 0) {
                fees = amount.mul(totalSellFee).div(100);
                tokensForLiquidity += (fees * sellLpFee) / totalSellFee;
                tokensForDev += (fees * sellDevFee) / totalSellFee;
                tokensForMarketing += (fees * sellMktFee) / totalSellFee;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && totalBuyFee > 0) {
                fees = amount.mul(totalBuyFee).div(100);
                tokensForLiquidity += (fees * buyLPFee) / totalBuyFee;
                tokensForDev += (fees * buyDevFee) / totalBuyFee;
                tokensForMarketing += (fees * buyMktFee) / totalBuyFee;
            }
            // on transfer
            else if (totalTransferFee > 0) {
                fees = amount.mul(totalTransferFee).div(100);
                tokensForLiquidity += (fees * transferLpFee) / totalTransferFee;
                tokensForDev += (fees * transferDevFee) / totalTransferFee;
                tokensForMarketing +=
                    (fees * transferMktFee) /
                    totalTransferFee;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

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

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

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

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDev;
        bool success;

        if (contractBalance == 0) {
            return;
        }

        if (contractBalance > swapBackValueMax) {
            contractBalance = swapBackValueMax;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

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

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;

        (success, ) = address(devReceiver).call{value: ethForDev}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        (success, ) = address(mktReceiver).call{value: address(this).balance}(
            ""
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBuyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMktFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLPFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisabledTransferDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LimitsRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTx","type":"uint256"}],"name":"MaxTxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"MaxWalletUpdated","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":"totalSellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMktFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLpFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"swapBackValueMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapBackValueMax","type":"uint256"}],"name":"SwapbackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalTransferFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferMktFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferLpFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferDevFee","type":"uint256"}],"name":"TransferFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentBurnt","type":"uint256"}],"name":"TriggerBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"lpReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"mktReceiverUpdated","type":"event"},{"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":[],"name":"antiWhaleInfo","outputs":[{"internalType":"bool","name":"_limitsInEffect","type":"bool"},{"internalType":"bool","name":"_trasnferDelayEnabled","type":"bool"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_maxTx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnInfo","outputs":[{"internalType":"bool","name":"_burnEnabled","type":"bool"},{"internalType":"uint256","name":"_lastSync","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"checkAddressPermissions","outputs":[{"internalType":"bool","name":"_isFeeExempt","type":"bool"},{"internalType":"bool","name":"_isTxLimitExempt","type":"bool"},{"internalType":"bool","name":"_automatedMarketMakerPairs","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRates","outputs":[{"internalType":"uint256","name":"_totalBuyFee","type":"uint256"},{"internalType":"uint256","name":"_buyMktFee","type":"uint256"},{"internalType":"uint256","name":"_buyLPFee","type":"uint256"},{"internalType":"uint256","name":"_buyDevFee","type":"uint256"},{"internalType":"uint256","name":"_totalSellFee","type":"uint256"},{"internalType":"uint256","name":"_sellMktFee","type":"uint256"},{"internalType":"uint256","name":"_sellLpFee","type":"uint256"},{"internalType":"uint256","name":"_sellDevFee","type":"uint256"},{"internalType":"uint256","name":"_totalTransferFee","type":"uint256"},{"internalType":"uint256","name":"_transferMktFee","type":"uint256"},{"internalType":"uint256","name":"_transferLpFee","type":"uint256"},{"internalType":"uint256","name":"_transferDevFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceivers","outputs":[{"internalType":"address","name":"_autoLPReceiver","type":"address"},{"internalType":"address","name":"_mktReceiver","type":"address"},{"internalType":"address","name":"_devReceiver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setLPWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapbackInfo","outputs":[{"internalType":"bool","name":"_swapbackEnabled","type":"bool"},{"internalType":"uint256","name":"_swapBackValueMin","type":"uint256"},{"internalType":"uint256","name":"_swapBackValueMax","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":"tradingOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"triggerBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260068054600161ff0160a01b031916730f41bf3555c11428164ae1fe26e803bb30799db41790556009805461010161ffff1991821617909155600d80549091166101001790556000600e553480156200005c57600080fd5b5060408051808201825260058082526447524f474560d81b60208084018290528451808601909552918452908301529060036200009a8382620008fb565b506004620000a98282620008fb565b505050620000c6620000c0620004b060201b60201c565b620004b4565b42600e55737a250d5630b4cf539739df2c5dacb4c659f2488d620000ec81600162000506565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000137573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015d9190620009c7565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d19190620009c7565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200021f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002459190620009c7565b6001600160a01b031660a08190526200026090600162000506565b60a05162000270906001620005b5565b601960006005601e8280808080806200028c6012600a62000b0e565b6200029c9063041cdb4062000b1f565b90506103e8620002ae82600a62000b1f565b620002ba919062000b39565b600b556103e8620002cd82601462000b1f565b620002d9919062000b39565b600a556103e8620002ec82603262000b1f565b620002f8919062000b39565b600755606462000309828262000b1f565b62000315919062000b39565b60085560138a90556014899055601588905587620003348a8c62000b5c565b62000340919062000b5c565b601255601787905560188690556019859055846200035f878962000b5c565b6200036b919062000b5c565b601655601b849055601c839055601d829055816200038a848662000b5c565b62000396919062000b5c565b601a55601080546001600160a01b03199081167346d2eeae19d261fa1863a74c2cc2b8521443aca217909155601180548216730f41bf3555c11428164ae1fe26e803bb30799db4179055600f805490911661dead17905560065462000406906001600160a01b0316600162000609565b6200041330600162000609565b6200042261dead600162000609565b6006546200043b906001600160a01b0316600162000506565b6200044830600162000506565b6200045761dead600162000506565b600f5462000470906001600160a01b0316600162000506565b60065462000487906001600160a01b0316620006ad565b6006546200049f906001600160a01b0316826200076d565b505050505050505050505062000b72565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620005555760405162461bcd60e51b8152602060048201819052602482015260008051602062003a9983398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9291015b60405180910390a25050565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620006545760405162461bcd60e51b8152602060048201819052602482015260008051602062003a9983398151915260448201526064016200054c565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101620005a9565b6005546001600160a01b03163314620006f85760405162461bcd60e51b8152602060048201819052602482015260008051602062003a9983398151915260448201526064016200054c565b6001600160a01b0381166200075f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200054c565b6200076a81620004b4565b50565b6001600160a01b038216620007c55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200054c565b8060026000828254620007d9919062000b5c565b90915550506001600160a01b038216600090815260208190526040812080548392906200080890849062000b5c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200088257607f821691505b602082108103620008a357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200085257600081815260208120601f850160051c81016020861015620008d25750805b601f850160051c820191505b81811015620008f357828155600101620008de565b505050505050565b81516001600160401b0381111562000917576200091762000857565b6200092f816200092884546200086d565b84620008a9565b602080601f8311600181146200096757600084156200094e5750858301515b600019600386901b1c1916600185901b178555620008f3565b600085815260208120601f198616915b82811015620009985788860151825594840194600190910190840162000977565b5085821015620009b75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009da57600080fd5b81516001600160a01b0381168114620009f257600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a5057816000190482111562000a345762000a34620009f9565b8085161562000a4257918102915b93841c939080029062000a14565b509250929050565b60008262000a695750600162000b08565b8162000a785750600062000b08565b816001811462000a91576002811462000a9c5762000abc565b600191505062000b08565b60ff84111562000ab05762000ab0620009f9565b50506001821b62000b08565b5060208310610133831016604e8410600b841016171562000ae1575081810a62000b08565b62000aed838362000a0f565b806000190482111562000b045762000b04620009f9565b0290505b92915050565b6000620009f260ff84168362000a58565b808202811582820484141762000b085762000b08620009f9565b60008262000b5757634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000b085762000b08620009f9565b60805160a051612ebb62000bde6000396000818161081101528181610a6401528181610aff01528181610b29015281816113200152611de7015260008181611da9015281816127fc015281816128b5015281816128f10152818161296b01526129d30152612ebb6000f3fe6080604052600436106102295760003560e01c80637688c58411610123578063bfd201f5116100ab578063e884f2601161006f578063e884f260146107ca578063f1d5f517146107df578063f242ab41146107ff578063f2fde38b14610833578063fd1bc2ca1461085357600080fd5b8063bfd201f5146106e4578063c024666814610704578063d088935814610724578063dd62ed3e14610744578063dd9cdaed1461078a57600080fd5b806395d89b41116100f257806395d89b41146106305780639a7a23d614610645578063a457c2d714610665578063a9059cbb14610685578063ae7ed567146106a557600080fd5b80637688c5841461052b5780638a8c523c146105b55780638da5cb5b146105ca5780639374ae82146105fc57600080fd5b8063313ce567116101b15780635d098b38116101755780635d098b381461048b57806370a08231146104ab578063715018a6146104e1578063751039fc146104f65780637571336a1461050b57600080fd5b8063313ce567146103c457806339509351146103e05780633b0aacbc146104005780633ff5ad78146104205780635c85974f1461046b57600080fd5b80630f683e90116101f85780630f683e90146102d257806318160ddd146102f25780631cffccf4146103115780631f53ac021461038457806323b872dd146103a457600080fd5b806306fdde0314610235578063095ea7b3146102605780630bc8cbcf146102905780630d075d9c146102b057600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a61086d565b6040516102579190612a4b565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612aae565b6108ff565b6040519015158152602001610257565b34801561029c57600080fd5b506102806102ab366004612ada565b610916565b3480156102bc57600080fd5b506102d06102cb366004612af3565b610be3565b005b3480156102de57600080fd5b506102d06102ed366004612af3565b610cf3565b3480156102fe57600080fd5b506002545b604051908152602001610257565b34801561031d57600080fd5b5061036561032c366004612b1f565b6001600160a01b03166000908152602160209081526040808320546022835281842054602390935292205460ff92831693918316921690565b6040805193151584529115156020840152151590820152606001610257565b34801561039057600080fd5b506102d061039f366004612b1f565b610dfb565b3480156103b057600080fd5b506102806103bf366004612b3c565b610e82565b3480156103d057600080fd5b5060405160128152602001610257565b3480156103ec57600080fd5b506102806103fb366004612aae565b610f2c565b34801561040c57600080fd5b506102d061041b366004612b1f565b610f68565b34801561042c57600080fd5b50610449600954600a54600b5460ff808416946101009094041692565b6040805194151585529215156020850152918301526060820152608001610257565b34801561047757600080fd5b506102d0610486366004612ada565b610fef565b34801561049757600080fd5b506102d06104a6366004612b1f565b6110c6565b3480156104b757600080fd5b506103036104c6366004612b1f565b6001600160a01b031660009081526020819052604090205490565b3480156104ed57600080fd5b506102d061114d565b34801561050257600080fd5b506102d0611183565b34801561051757600080fd5b506102d0610526366004612b8d565b6111e4565b34801561053757600080fd5b50601254601354601454601554601654601754601854601954601a54601b54601c54601d54604080519c8d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015261016082015261018001610257565b3480156105c157600080fd5b506102d061126e565b3480156105d657600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610257565b34801561060857600080fd5b50600d54600e5461010090910460ff1690604080519215158352602083019190915201610257565b34801561063c57600080fd5b5061024a6112e5565b34801561065157600080fd5b506102d0610660366004612b8d565b6112f4565b34801561067157600080fd5b50610280610680366004612aae565b6113d3565b34801561069157600080fd5b506102806106a0366004612aae565b61146c565b3480156106b157600080fd5b50600654600754600854600160a81b90920460ff1691604080519315158452602084019290925290820152606001610257565b3480156106f057600080fd5b506102d06106ff366004612af3565b611479565b34801561071057600080fd5b506102d061071f366004612b8d565b611585565b34801561073057600080fd5b506102d061073f366004612bc2565b611607565b34801561075057600080fd5b5061030361075f366004612bf5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561079657600080fd5b50600f54601054601154604080516001600160a01b0394851681529284166020840152921691810191909152606001610257565b3480156107d657600080fd5b506102d061179d565b3480156107eb57600080fd5b506102d06107fa366004612ada565b6117ff565b34801561080b57600080fd5b506105e47f000000000000000000000000000000000000000000000000000000000000000081565b34801561083f57600080fd5b506102d061084e366004612b1f565b6118db565b34801561085f57600080fd5b50600d546102809060ff1681565b60606003805461087c90612c2e565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890612c2e565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b600061090c338484611976565b5060015b92915050565b6005546000906001600160a01b0316331461094c5760405162461bcd60e51b815260040161094390612c68565b60405180910390fd5b60c88211156109b95760405162461bcd60e51b815260206004820152603360248201527f4d6179206e6f74206275726e206d6f7265207468616e203225206f6620746f6b604482015272656e7320696e204c5020617420612074696d6560681b6064820152608401610943565b600e546109c89061012c612cb3565b4211610a015760405162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b6044820152606401610943565b600d54610100900460ff16610a4d5760405162461bcd60e51b8152602060048201526012602482015271109d5c9b9cc8185c9948191a5cd8589b195960721b6044820152606401610943565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260009030906370a0823190602401602060405180830381865afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad89190612cc6565b90506000610af2612710610aec8487611a9a565b90611aad565b90508015610ba457610b277f000000000000000000000000000000000000000000000000000000000000000061dead83611ab9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b506001979650505050505050565b6040518481527fe279c8cc227b0f94d9a3751223e114ad163e3a876078648260aa1cdacf558a159060200160405180910390a16000925050505b919050565b6005546001600160a01b03163314610c0d5760405162461bcd60e51b815260040161094390612c68565b60138390556014829055601581905580610c278385612cb3565b610c319190612cb3565b6012819055603c1015610c9c5760405162461bcd60e51b815260206004820152602d60248201527f546f74616c20627579206665652063616e6e6f7420626520686967686572207460448201526c68616e20256d6178546178252560981b6064820152608401610943565b6012546013546014546015546040805194855260208501939093529183015260608201527f3d839c4d8187eded7cfbdfb38e8c68ae748d7c674400c8c3b8c837ba2933d1ac906080015b60405180910390a1505050565b6005546001600160a01b03163314610d1d5760405162461bcd60e51b815260040161094390612c68565b60178390556018829055601981905580610d378385612cb3565b610d419190612cb3565b6016819055603c1015610dad5760405162461bcd60e51b815260206004820152602e60248201527f546f74616c2073656c6c206665652063616e6e6f74206265206869676865722060448201526d7468616e20256d6178546178252560901b6064820152608401610943565b6016546017546018546019546040805194855260208501939093529183015260608201527f5453929bc359b94bdd2542a6d8391ca15fe386d74f044db5277328a36de3c65090608001610ce6565b6005546001600160a01b03163314610e255760405162461bcd60e51b815260040161094390612c68565b6011546040516001600160a01b03918216918316907fc246820312f1be47e3958d661d0c150c01b96d1fe3df1e38edd76693ffa8122b90600090a3601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e8f848484611c0e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f145760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610943565b610f218533858403611976565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161090c918590610f63908690612cb3565b611976565b6005546001600160a01b03163314610f925760405162461bcd60e51b815260040161094390612c68565b600f546040516001600160a01b03918216918316907f1c3fdcf16dce794746858765f6acfdac41e7355deba3a0d04cef33a3710ca47c90600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110195760405162461bcd60e51b815260040161094390612c68565b600181101561106a5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420736574206d61785478206c6f776572207468616e20302e31256044820152606401610943565b6103e861107660025490565b6110809083612cdf565b61108a9190612cf6565b600b8190556040519081527fff3dd5e80294197918c284bbfc3dadd97d0b40ce92106110946329088f80068a906020015b60405180910390a150565b6005546001600160a01b031633146110f05760405162461bcd60e51b815260040161094390612c68565b6010546040516001600160a01b03918216918316907fa90d7598849ffffb63cb2a2b23157fa85704d50370070de404a308243fe1daec90600090a3601080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111775760405162461bcd60e51b815260040161094390612c68565b61118160006124d7565b565b6005546001600160a01b031633146111ad5760405162461bcd60e51b815260040161094390612c68565b6009805460ff1916905560405142907ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261690600090a2565b6005546001600160a01b0316331461120e5760405162461bcd60e51b815260040161094390612c68565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9291015b60405180910390a25050565b6005546001600160a01b031633146112985760405162461bcd60e51b815260040161094390612c68565b600d805460ff191660011790556006805460ff60a81b1916600160a81b17905560405142907fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92390600090a2565b60606004805461087c90612c2e565b6005546001600160a01b0316331461131e5760405162461bcd60e51b815260040161094390612c68565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036113c55760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610943565b6113cf8282612529565b5050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156114555760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610943565b6114623385858403611976565b5060019392505050565b600061090c338484611c0e565b6005546001600160a01b031633146114a35760405162461bcd60e51b815260040161094390612c68565b601b839055601c829055601d819055806114bd8385612cb3565b6114c79190612cb3565b601a819055600a10156115375760405162461bcd60e51b815260206004820152603260248201527f546f74616c207472616e73666572206665652063616e6e6f7420626520686967604482015271686572207468616e20256d6178546178252560701b6064820152608401610943565b601a54601b54601c54601d546040805194855260208501939093529183015260608201527f29ca25f871e92385edcc1db1ce9c82a11549def46dbee1cff41bbed1dcac6ecb90608001610ce6565b6005546001600160a01b031633146115af5760405162461bcd60e51b815260040161094390612c68565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611262565b6005546001600160a01b031633146116315760405162461bcd60e51b815260040161094390612c68565b600182101561169f5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e604482015273101817181892903a37ba30b61039bab838363c9760611b6064820152608401610943565b818110156117025760405162461bcd60e51b815260206004820152602a60248201527f6d6178696d756d20616d6f756e742063616e7420626520686967686572207468604482015269616e206d696e696d756d60b01b6064820152608401610943565b6006805460ff60a81b1916600160a81b8515150217905560025461271090839061172c9190612cdf565b6117369190612cf6565b6007556127108161174660025490565b6117509190612cdf565b61175a9190612cf6565b600855604080518415158152602081018490529081018290527f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c77990606001610ce6565b6005546001600160a01b031633146117c75760405162461bcd60e51b815260040161094390612c68565b6009805461ff001916905560405142907f26e776fcf7ca20aa79b5b946e9b5111f47205539ece9d7a7995271dd6a8b5bad90600090a2565b6005546001600160a01b031633146118295760405162461bcd60e51b815260040161094390612c68565b60058110156118865760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610943565b6103e861189260025490565b61189c9083612cdf565b6118a69190612cf6565b600a8190556040519081527f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace906020016110bb565b6005546001600160a01b031633146119055760405162461bcd60e51b815260040161094390612c68565b6001600160a01b03811661196a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610943565b611973816124d7565b50565b6001600160a01b0383166119d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610943565b6001600160a01b038216611a395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610943565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611aa68284612cdf565b9392505050565b6000611aa68284612cf6565b6001600160a01b038316611adf5760405162461bcd60e51b815260040161094390612d18565b6001600160a01b038216611b055760405162461bcd60e51b815260040161094390612d5d565b6001600160a01b03831660009081526020819052604090205481811015611b7d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610943565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611bb4908490612cb3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c0091815260200190565b60405180910390a350505050565b6001600160a01b038316611c345760405162461bcd60e51b815260040161094390612d18565b6001600160a01b038216611c5a5760405162461bcd60e51b815260040161094390612d5d565b80600003611c7357611c6e83836000611ab9565b505050565b60095460ff1615612112576005546001600160a01b03848116911614801590611caa57506005546001600160a01b03838116911614155b8015611cbe57506001600160a01b03821615155b8015611cd557506001600160a01b03821661dead14155b8015611ceb5750600654600160a01b900460ff16155b1561211257600d5460ff16611d7e576001600160a01b03831660009081526021602052604090205460ff1680611d3957506001600160a01b03821660009081526021602052604090205460ff165b611d7e5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610943565b600954610100900460ff1615611eca576005546001600160a01b03838116911614801590611dde57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015611e1c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611eca57326000908152600c60205260409020544311611eb75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610943565b326000908152600c602052604090204390555b6001600160a01b03831660009081526023602052604090205460ff168015611f0b57506001600160a01b03821660009081526022602052604090205460ff16155b15611fe057600b54811115611f715760405162461bcd60e51b815260206004820152602660248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526536b0bc2a3c1760d11b6064820152608401610943565b600a546001600160a01b038316600090815260208190526040902054611f979083612cb3565b1115611fdb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610943565b612112565b6001600160a01b03821660009081526023602052604090205460ff16801561202157506001600160a01b03831660009081526022602052604090205460ff16155b1561208857600b54811115611fdb5760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152661036b0bc2a3c1760c91b6064820152608401610943565b6001600160a01b03821660009081526022602052604090205460ff1661211257600a546001600160a01b0383166000908152602081905260409020546120ce9083612cb3565b11156121125760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610943565b306000908152602081905260409020546007548110801590819061213f5750600654600160a81b900460ff165b80156121555750600654600160a01b900460ff16155b801561217a57506001600160a01b03851660009081526023602052604090205460ff16155b801561219f57506001600160a01b03851660009081526021602052604090205460ff16155b80156121c457506001600160a01b03841660009081526021602052604090205460ff16155b156121f2576006805460ff60a01b1916600160a01b1790556121e461257d565b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526021602052604090205460ff600160a01b90920482161591168061224057506001600160a01b03851660009081526021602052604090205460ff165b15612249575060005b600081156124c3576001600160a01b03861660009081526023602052604090205460ff16801561227b57506000601654115b156123335761229a6064610aec60165488611a9a90919063ffffffff16565b9050601654601854826122ad9190612cdf565b6122b79190612cf6565b601f60008282546122c89190612cb3565b90915550506016546019546122dd9083612cdf565b6122e79190612cf6565b602060008282546122f89190612cb3565b909155505060165460175461230d9083612cdf565b6123179190612cf6565b601e60008282546123289190612cb3565b909155506124a59050565b6001600160a01b03871660009081526023602052604090205460ff16801561235d57506000601254115b156123ef5761237c6064610aec60125488611a9a90919063ffffffff16565b90506012546014548261238f9190612cdf565b6123999190612cf6565b601f60008282546123aa9190612cb3565b90915550506012546015546123bf9083612cdf565b6123c99190612cf6565b602060008282546123da9190612cb3565b909155505060125460135461230d9083612cdf565b601a54156124a5576124116064610aec601a5488611a9a90919063ffffffff16565b9050601a54601c54826124249190612cdf565b61242e9190612cf6565b601f600082825461243f9190612cb3565b9091555050601a54601d546124549083612cdf565b61245e9190612cf6565b6020600082825461246f9190612cb3565b9091555050601a54601b546124849083612cdf565b61248e9190612cf6565b601e600082825461249f9190612cb3565b90915550505b80156124b6576124b6873083611ab9565b6124c08186612da0565b94505b6124ce878787611ab9565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b3060009081526020819052604081205490506000602054601e54601f546125a49190612cb3565b6125ae9190612cb3565b90506000826000036125bf57505050565b6008548311156125cf5760085492505b6000600283601f54866125e29190612cdf565b6125ec9190612cf6565b6125f69190612cf6565b905060006126048583612799565b905047612610826127a5565b600061261c4783612799565b9050600061263987610aec601e5485611a9a90919063ffffffff16565b9050600061265688610aec60205486611a9a90919063ffffffff16565b90506000816126658486612da0565b61266f9190612da0565b6000601f819055601e81905560208190556011546040519293506001600160a01b031691849181818185875af1925050503d80600081146126cc576040519150601f19603f3d011682016040523d82523d6000602084013e6126d1565b606091505b509098505086158015906126e55750600081115b15612738576126f48782612965565b601f54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6010546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612785576040519150601f19603f3d011682016040523d82523d6000602084013e61278a565b606091505b50505050505050505050505050565b6000611aa68284612da0565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106127da576127da612db3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287c9190612dc9565b8160018151811061288f5761288f612db3565b60200260200101906001600160a01b031690816001600160a01b0316815250506128da307f000000000000000000000000000000000000000000000000000000000000000084611976565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061292f908590600090869030904290600401612de6565b600060405180830381600087803b15801561294957600080fd5b505af115801561295d573d6000803e3d6000fd5b505050505050565b612990307f000000000000000000000000000000000000000000000000000000000000000084611976565b600f5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612a1f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a449190612e57565b5050505050565b600060208083528351808285015260005b81811015612a7857858101830151858201604001528201612a5c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461197357600080fd5b60008060408385031215612ac157600080fd5b8235612acc81612a99565b946020939093013593505050565b600060208284031215612aec57600080fd5b5035919050565b600080600060608486031215612b0857600080fd5b505081359360208301359350604090920135919050565b600060208284031215612b3157600080fd5b8135611aa681612a99565b600080600060608486031215612b5157600080fd5b8335612b5c81612a99565b92506020840135612b6c81612a99565b929592945050506040919091013590565b80358015158114610bde57600080fd5b60008060408385031215612ba057600080fd5b8235612bab81612a99565b9150612bb960208401612b7d565b90509250929050565b600080600060608486031215612bd757600080fd5b612be084612b7d565b95602085013595506040909401359392505050565b60008060408385031215612c0857600080fd5b8235612c1381612a99565b91506020830135612c2381612a99565b809150509250929050565b600181811c90821680612c4257607f821691505b602082108103612c6257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561091057610910612c9d565b600060208284031215612cd857600080fd5b5051919050565b808202811582820484141761091057610910612c9d565b600082612d1357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561091057610910612c9d565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612ddb57600080fd5b8151611aa681612a99565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e365784516001600160a01b031683529383019391830191600101612e11565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612e6c57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207df6b1e6fcdbd49b0f24e8555edb3da8405d55fba8563ffda062d03263618d3764736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106102295760003560e01c80637688c58411610123578063bfd201f5116100ab578063e884f2601161006f578063e884f260146107ca578063f1d5f517146107df578063f242ab41146107ff578063f2fde38b14610833578063fd1bc2ca1461085357600080fd5b8063bfd201f5146106e4578063c024666814610704578063d088935814610724578063dd62ed3e14610744578063dd9cdaed1461078a57600080fd5b806395d89b41116100f257806395d89b41146106305780639a7a23d614610645578063a457c2d714610665578063a9059cbb14610685578063ae7ed567146106a557600080fd5b80637688c5841461052b5780638a8c523c146105b55780638da5cb5b146105ca5780639374ae82146105fc57600080fd5b8063313ce567116101b15780635d098b38116101755780635d098b381461048b57806370a08231146104ab578063715018a6146104e1578063751039fc146104f65780637571336a1461050b57600080fd5b8063313ce567146103c457806339509351146103e05780633b0aacbc146104005780633ff5ad78146104205780635c85974f1461046b57600080fd5b80630f683e90116101f85780630f683e90146102d257806318160ddd146102f25780631cffccf4146103115780631f53ac021461038457806323b872dd146103a457600080fd5b806306fdde0314610235578063095ea7b3146102605780630bc8cbcf146102905780630d075d9c146102b057600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a61086d565b6040516102579190612a4b565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612aae565b6108ff565b6040519015158152602001610257565b34801561029c57600080fd5b506102806102ab366004612ada565b610916565b3480156102bc57600080fd5b506102d06102cb366004612af3565b610be3565b005b3480156102de57600080fd5b506102d06102ed366004612af3565b610cf3565b3480156102fe57600080fd5b506002545b604051908152602001610257565b34801561031d57600080fd5b5061036561032c366004612b1f565b6001600160a01b03166000908152602160209081526040808320546022835281842054602390935292205460ff92831693918316921690565b6040805193151584529115156020840152151590820152606001610257565b34801561039057600080fd5b506102d061039f366004612b1f565b610dfb565b3480156103b057600080fd5b506102806103bf366004612b3c565b610e82565b3480156103d057600080fd5b5060405160128152602001610257565b3480156103ec57600080fd5b506102806103fb366004612aae565b610f2c565b34801561040c57600080fd5b506102d061041b366004612b1f565b610f68565b34801561042c57600080fd5b50610449600954600a54600b5460ff808416946101009094041692565b6040805194151585529215156020850152918301526060820152608001610257565b34801561047757600080fd5b506102d0610486366004612ada565b610fef565b34801561049757600080fd5b506102d06104a6366004612b1f565b6110c6565b3480156104b757600080fd5b506103036104c6366004612b1f565b6001600160a01b031660009081526020819052604090205490565b3480156104ed57600080fd5b506102d061114d565b34801561050257600080fd5b506102d0611183565b34801561051757600080fd5b506102d0610526366004612b8d565b6111e4565b34801561053757600080fd5b50601254601354601454601554601654601754601854601954601a54601b54601c54601d54604080519c8d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015261016082015261018001610257565b3480156105c157600080fd5b506102d061126e565b3480156105d657600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610257565b34801561060857600080fd5b50600d54600e5461010090910460ff1690604080519215158352602083019190915201610257565b34801561063c57600080fd5b5061024a6112e5565b34801561065157600080fd5b506102d0610660366004612b8d565b6112f4565b34801561067157600080fd5b50610280610680366004612aae565b6113d3565b34801561069157600080fd5b506102806106a0366004612aae565b61146c565b3480156106b157600080fd5b50600654600754600854600160a81b90920460ff1691604080519315158452602084019290925290820152606001610257565b3480156106f057600080fd5b506102d06106ff366004612af3565b611479565b34801561071057600080fd5b506102d061071f366004612b8d565b611585565b34801561073057600080fd5b506102d061073f366004612bc2565b611607565b34801561075057600080fd5b5061030361075f366004612bf5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561079657600080fd5b50600f54601054601154604080516001600160a01b0394851681529284166020840152921691810191909152606001610257565b3480156107d657600080fd5b506102d061179d565b3480156107eb57600080fd5b506102d06107fa366004612ada565b6117ff565b34801561080b57600080fd5b506105e47f00000000000000000000000039705ff79f4e50c9d6a59393e3b73933938e2a3081565b34801561083f57600080fd5b506102d061084e366004612b1f565b6118db565b34801561085f57600080fd5b50600d546102809060ff1681565b60606003805461087c90612c2e565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890612c2e565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b600061090c338484611976565b5060015b92915050565b6005546000906001600160a01b0316331461094c5760405162461bcd60e51b815260040161094390612c68565b60405180910390fd5b60c88211156109b95760405162461bcd60e51b815260206004820152603360248201527f4d6179206e6f74206275726e206d6f7265207468616e203225206f6620746f6b604482015272656e7320696e204c5020617420612074696d6560681b6064820152608401610943565b600e546109c89061012c612cb3565b4211610a015760405162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b6044820152606401610943565b600d54610100900460ff16610a4d5760405162461bcd60e51b8152602060048201526012602482015271109d5c9b9cc8185c9948191a5cd8589b195960721b6044820152606401610943565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000039705ff79f4e50c9d6a59393e3b73933938e2a3016600482015260009030906370a0823190602401602060405180830381865afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad89190612cc6565b90506000610af2612710610aec8487611a9a565b90611aad565b90508015610ba457610b277f00000000000000000000000039705ff79f4e50c9d6a59393e3b73933938e2a3061dead83611ab9565b7f00000000000000000000000039705ff79f4e50c9d6a59393e3b73933938e2a306001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b506001979650505050505050565b6040518481527fe279c8cc227b0f94d9a3751223e114ad163e3a876078648260aa1cdacf558a159060200160405180910390a16000925050505b919050565b6005546001600160a01b03163314610c0d5760405162461bcd60e51b815260040161094390612c68565b60138390556014829055601581905580610c278385612cb3565b610c319190612cb3565b6012819055603c1015610c9c5760405162461bcd60e51b815260206004820152602d60248201527f546f74616c20627579206665652063616e6e6f7420626520686967686572207460448201526c68616e20256d6178546178252560981b6064820152608401610943565b6012546013546014546015546040805194855260208501939093529183015260608201527f3d839c4d8187eded7cfbdfb38e8c68ae748d7c674400c8c3b8c837ba2933d1ac906080015b60405180910390a1505050565b6005546001600160a01b03163314610d1d5760405162461bcd60e51b815260040161094390612c68565b60178390556018829055601981905580610d378385612cb3565b610d419190612cb3565b6016819055603c1015610dad5760405162461bcd60e51b815260206004820152602e60248201527f546f74616c2073656c6c206665652063616e6e6f74206265206869676865722060448201526d7468616e20256d6178546178252560901b6064820152608401610943565b6016546017546018546019546040805194855260208501939093529183015260608201527f5453929bc359b94bdd2542a6d8391ca15fe386d74f044db5277328a36de3c65090608001610ce6565b6005546001600160a01b03163314610e255760405162461bcd60e51b815260040161094390612c68565b6011546040516001600160a01b03918216918316907fc246820312f1be47e3958d661d0c150c01b96d1fe3df1e38edd76693ffa8122b90600090a3601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e8f848484611c0e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f145760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610943565b610f218533858403611976565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161090c918590610f63908690612cb3565b611976565b6005546001600160a01b03163314610f925760405162461bcd60e51b815260040161094390612c68565b600f546040516001600160a01b03918216918316907f1c3fdcf16dce794746858765f6acfdac41e7355deba3a0d04cef33a3710ca47c90600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110195760405162461bcd60e51b815260040161094390612c68565b600181101561106a5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420736574206d61785478206c6f776572207468616e20302e31256044820152606401610943565b6103e861107660025490565b6110809083612cdf565b61108a9190612cf6565b600b8190556040519081527fff3dd5e80294197918c284bbfc3dadd97d0b40ce92106110946329088f80068a906020015b60405180910390a150565b6005546001600160a01b031633146110f05760405162461bcd60e51b815260040161094390612c68565b6010546040516001600160a01b03918216918316907fa90d7598849ffffb63cb2a2b23157fa85704d50370070de404a308243fe1daec90600090a3601080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111775760405162461bcd60e51b815260040161094390612c68565b61118160006124d7565b565b6005546001600160a01b031633146111ad5760405162461bcd60e51b815260040161094390612c68565b6009805460ff1916905560405142907ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261690600090a2565b6005546001600160a01b0316331461120e5760405162461bcd60e51b815260040161094390612c68565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9291015b60405180910390a25050565b6005546001600160a01b031633146112985760405162461bcd60e51b815260040161094390612c68565b600d805460ff191660011790556006805460ff60a81b1916600160a81b17905560405142907fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92390600090a2565b60606004805461087c90612c2e565b6005546001600160a01b0316331461131e5760405162461bcd60e51b815260040161094390612c68565b7f00000000000000000000000039705ff79f4e50c9d6a59393e3b73933938e2a306001600160a01b0316826001600160a01b0316036113c55760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610943565b6113cf8282612529565b5050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156114555760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610943565b6114623385858403611976565b5060019392505050565b600061090c338484611c0e565b6005546001600160a01b031633146114a35760405162461bcd60e51b815260040161094390612c68565b601b839055601c829055601d819055806114bd8385612cb3565b6114c79190612cb3565b601a819055600a10156115375760405162461bcd60e51b815260206004820152603260248201527f546f74616c207472616e73666572206665652063616e6e6f7420626520686967604482015271686572207468616e20256d6178546178252560701b6064820152608401610943565b601a54601b54601c54601d546040805194855260208501939093529183015260608201527f29ca25f871e92385edcc1db1ce9c82a11549def46dbee1cff41bbed1dcac6ecb90608001610ce6565b6005546001600160a01b031633146115af5760405162461bcd60e51b815260040161094390612c68565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611262565b6005546001600160a01b031633146116315760405162461bcd60e51b815260040161094390612c68565b600182101561169f5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e604482015273101817181892903a37ba30b61039bab838363c9760611b6064820152608401610943565b818110156117025760405162461bcd60e51b815260206004820152602a60248201527f6d6178696d756d20616d6f756e742063616e7420626520686967686572207468604482015269616e206d696e696d756d60b01b6064820152608401610943565b6006805460ff60a81b1916600160a81b8515150217905560025461271090839061172c9190612cdf565b6117369190612cf6565b6007556127108161174660025490565b6117509190612cdf565b61175a9190612cf6565b600855604080518415158152602081018490529081018290527f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c77990606001610ce6565b6005546001600160a01b031633146117c75760405162461bcd60e51b815260040161094390612c68565b6009805461ff001916905560405142907f26e776fcf7ca20aa79b5b946e9b5111f47205539ece9d7a7995271dd6a8b5bad90600090a2565b6005546001600160a01b031633146118295760405162461bcd60e51b815260040161094390612c68565b60058110156118865760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610943565b6103e861189260025490565b61189c9083612cdf565b6118a69190612cf6565b600a8190556040519081527f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace906020016110bb565b6005546001600160a01b031633146119055760405162461bcd60e51b815260040161094390612c68565b6001600160a01b03811661196a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610943565b611973816124d7565b50565b6001600160a01b0383166119d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610943565b6001600160a01b038216611a395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610943565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611aa68284612cdf565b9392505050565b6000611aa68284612cf6565b6001600160a01b038316611adf5760405162461bcd60e51b815260040161094390612d18565b6001600160a01b038216611b055760405162461bcd60e51b815260040161094390612d5d565b6001600160a01b03831660009081526020819052604090205481811015611b7d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610943565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611bb4908490612cb3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c0091815260200190565b60405180910390a350505050565b6001600160a01b038316611c345760405162461bcd60e51b815260040161094390612d18565b6001600160a01b038216611c5a5760405162461bcd60e51b815260040161094390612d5d565b80600003611c7357611c6e83836000611ab9565b505050565b60095460ff1615612112576005546001600160a01b03848116911614801590611caa57506005546001600160a01b03838116911614155b8015611cbe57506001600160a01b03821615155b8015611cd557506001600160a01b03821661dead14155b8015611ceb5750600654600160a01b900460ff16155b1561211257600d5460ff16611d7e576001600160a01b03831660009081526021602052604090205460ff1680611d3957506001600160a01b03821660009081526021602052604090205460ff165b611d7e5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610943565b600954610100900460ff1615611eca576005546001600160a01b03838116911614801590611dde57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b8015611e1c57507f00000000000000000000000039705ff79f4e50c9d6a59393e3b73933938e2a306001600160a01b0316826001600160a01b031614155b15611eca57326000908152600c60205260409020544311611eb75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610943565b326000908152600c602052604090204390555b6001600160a01b03831660009081526023602052604090205460ff168015611f0b57506001600160a01b03821660009081526022602052604090205460ff16155b15611fe057600b54811115611f715760405162461bcd60e51b815260206004820152602660248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526536b0bc2a3c1760d11b6064820152608401610943565b600a546001600160a01b038316600090815260208190526040902054611f979083612cb3565b1115611fdb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610943565b612112565b6001600160a01b03821660009081526023602052604090205460ff16801561202157506001600160a01b03831660009081526022602052604090205460ff16155b1561208857600b54811115611fdb5760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152661036b0bc2a3c1760c91b6064820152608401610943565b6001600160a01b03821660009081526022602052604090205460ff1661211257600a546001600160a01b0383166000908152602081905260409020546120ce9083612cb3565b11156121125760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610943565b306000908152602081905260409020546007548110801590819061213f5750600654600160a81b900460ff165b80156121555750600654600160a01b900460ff16155b801561217a57506001600160a01b03851660009081526023602052604090205460ff16155b801561219f57506001600160a01b03851660009081526021602052604090205460ff16155b80156121c457506001600160a01b03841660009081526021602052604090205460ff16155b156121f2576006805460ff60a01b1916600160a01b1790556121e461257d565b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526021602052604090205460ff600160a01b90920482161591168061224057506001600160a01b03851660009081526021602052604090205460ff165b15612249575060005b600081156124c3576001600160a01b03861660009081526023602052604090205460ff16801561227b57506000601654115b156123335761229a6064610aec60165488611a9a90919063ffffffff16565b9050601654601854826122ad9190612cdf565b6122b79190612cf6565b601f60008282546122c89190612cb3565b90915550506016546019546122dd9083612cdf565b6122e79190612cf6565b602060008282546122f89190612cb3565b909155505060165460175461230d9083612cdf565b6123179190612cf6565b601e60008282546123289190612cb3565b909155506124a59050565b6001600160a01b03871660009081526023602052604090205460ff16801561235d57506000601254115b156123ef5761237c6064610aec60125488611a9a90919063ffffffff16565b90506012546014548261238f9190612cdf565b6123999190612cf6565b601f60008282546123aa9190612cb3565b90915550506012546015546123bf9083612cdf565b6123c99190612cf6565b602060008282546123da9190612cb3565b909155505060125460135461230d9083612cdf565b601a54156124a5576124116064610aec601a5488611a9a90919063ffffffff16565b9050601a54601c54826124249190612cdf565b61242e9190612cf6565b601f600082825461243f9190612cb3565b9091555050601a54601d546124549083612cdf565b61245e9190612cf6565b6020600082825461246f9190612cb3565b9091555050601a54601b546124849083612cdf565b61248e9190612cf6565b601e600082825461249f9190612cb3565b90915550505b80156124b6576124b6873083611ab9565b6124c08186612da0565b94505b6124ce878787611ab9565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b3060009081526020819052604081205490506000602054601e54601f546125a49190612cb3565b6125ae9190612cb3565b90506000826000036125bf57505050565b6008548311156125cf5760085492505b6000600283601f54866125e29190612cdf565b6125ec9190612cf6565b6125f69190612cf6565b905060006126048583612799565b905047612610826127a5565b600061261c4783612799565b9050600061263987610aec601e5485611a9a90919063ffffffff16565b9050600061265688610aec60205486611a9a90919063ffffffff16565b90506000816126658486612da0565b61266f9190612da0565b6000601f819055601e81905560208190556011546040519293506001600160a01b031691849181818185875af1925050503d80600081146126cc576040519150601f19603f3d011682016040523d82523d6000602084013e6126d1565b606091505b509098505086158015906126e55750600081115b15612738576126f48782612965565b601f54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6010546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612785576040519150601f19603f3d011682016040523d82523d6000602084013e61278a565b606091505b50505050505050505050505050565b6000611aa68284612da0565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106127da576127da612db3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287c9190612dc9565b8160018151811061288f5761288f612db3565b60200260200101906001600160a01b031690816001600160a01b0316815250506128da307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611976565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061292f908590600090869030904290600401612de6565b600060405180830381600087803b15801561294957600080fd5b505af115801561295d573d6000803e3d6000fd5b505050505050565b612990307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611976565b600f5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612a1f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a449190612e57565b5050505050565b600060208083528351808285015260005b81811015612a7857858101830151858201604001528201612a5c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461197357600080fd5b60008060408385031215612ac157600080fd5b8235612acc81612a99565b946020939093013593505050565b600060208284031215612aec57600080fd5b5035919050565b600080600060608486031215612b0857600080fd5b505081359360208301359350604090920135919050565b600060208284031215612b3157600080fd5b8135611aa681612a99565b600080600060608486031215612b5157600080fd5b8335612b5c81612a99565b92506020840135612b6c81612a99565b929592945050506040919091013590565b80358015158114610bde57600080fd5b60008060408385031215612ba057600080fd5b8235612bab81612a99565b9150612bb960208401612b7d565b90509250929050565b600080600060608486031215612bd757600080fd5b612be084612b7d565b95602085013595506040909401359392505050565b60008060408385031215612c0857600080fd5b8235612c1381612a99565b91506020830135612c2381612a99565b809150509250929050565b600181811c90821680612c4257607f821691505b602082108103612c6257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561091057610910612c9d565b600060208284031215612cd857600080fd5b5051919050565b808202811582820484141761091057610910612c9d565b600082612d1357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561091057610910612c9d565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612ddb57600080fd5b8151611aa681612a99565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e365784516001600160a01b031683529383019391830191600101612e11565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612e6c57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207df6b1e6fcdbd49b0f24e8555edb3da8405d55fba8563ffda062d03263618d3764736f6c63430008130033

Deployed Bytecode Sourcemap

25286:28343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11020:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13253:194;;;;;;;;;;-1:-1:-1;13253:194:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;13253:194:0;1023:187:1;45258:678:0;;;;;;;;;;-1:-1:-1;45258:678:0;;;;;:::i;:::-;;:::i;40362:462::-;;;;;;;;;;-1:-1:-1;40362:462:0;;;;;:::i;:::-;;:::i;:::-;;41178:514;;;;;;;;;;-1:-1:-1;41178:514:0;;;;;:::i;:::-;;:::i;12140:108::-;;;;;;;;;;-1:-1:-1;12228:12:0;;12140:108;;;1867:25:1;;;1855:2;1840:18;12140:108:0;1721:177:1;35980:428:0;;;;;;;;;;-1:-1:-1;35980:428:0;;;;;:::i;:::-;-1:-1:-1;;;;;36252:20:0;36110:17;36252:20;;;:11;:20;;;;;;;;;36302:15;:24;;;;;;36366:25;:34;;;;;;36252:20;;;;;36302:24;;;;36366:34;;35980:428;;;;;2364:14:1;;2357:22;2339:41;;2423:14;;2416:22;2411:2;2396:18;;2389:50;2482:14;2475:22;2455:18;;;2448:50;2327:2;2312:18;35980:428:0;2155:349:1;44785:160:0;;;;;;;;;;-1:-1:-1;44785:160:0;;;;;:::i;:::-;;:::i;13925:529::-;;;;;;;;;;-1:-1:-1;13925:529:0;;;;;:::i;:::-;;:::i;31495:93::-;;;;;;;;;;-1:-1:-1;31495:93:0;;31578:2;3112:36:1;;3100:2;3085:18;31495:93:0;2970:184:1;14859:290:0;;;;;;;;;;-1:-1:-1;14859:290:0;;;;;:::i;:::-;;:::i;44447:164::-;;;;;;;;;;-1:-1:-1;44447:164:0;;;;;:::i;:::-;;:::i;32721:393::-;;;;;;;;;;;;32979:14;;33072:9;;33101:5;;32979:14;;;;;;33028:20;;;;;32721:393;;;;;3403:14:1;;3396:22;3378:41;;3462:14;;3455:22;3450:2;3435:18;;3428:50;3494:18;;;3487:34;3552:2;3537:18;;3530:34;3365:3;3350:19;32721:393:0;3159:411:1;38885:215:0;;;;;;;;;;-1:-1:-1;38885:215:0;;;;;:::i;:::-;;:::i;44107:166::-;;;;;;;;;;-1:-1:-1;44107:166:0;;;;;:::i;:::-;;:::i;12311:143::-;;;;;;;;;;-1:-1:-1;12311:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;12428:18:0;12401:7;12428:18;;;;;;;;;;;;12311:143;22165:103;;;;;;;;;;;;;:::i;37209:130::-;;;;;;;;;;;;;:::i;39810:200::-;;;;;;;;;;-1:-1:-1;39810:200:0;;;;;:::i;:::-;;:::i;34563:967::-;;;;;;;;;;-1:-1:-1;35098:11:0;;35133:9;;35165:8;;35197:9;;35233:12;;35270:10;;35304:9;;35338:10;;35379:16;;35424:14;;35466:13;;35508:14;;34563:967;;;4517:25:1;;;4573:2;4558:18;;4551:34;;;;4601:18;;;4594:34;;;;4659:2;4644:18;;4637:34;;;;4702:3;4687:19;;4680:35;;;;4746:3;4731:19;;4724:35;;;;4790:3;4775:19;;4768:35;4834:3;4819:19;;4812:35;4878:3;4863:19;;4856:35;4922:3;4907:19;;4900:35;4966:3;4951:19;;4944:36;5011:3;4996:19;;4989:36;4504:3;4489:19;34563:967:0;4060:971:1;36895:159:0;;;;;;;;;;;;;:::i;21514:87::-;;;;;;;;;;-1:-1:-1;21587:6:0;;-1:-1:-1;;;;;21587:6:0;21514:87;;;-1:-1:-1;;;;;5200:32:1;;;5182:51;;5170:2;5155:18;21514:87:0;5036:203:1;36595:157:0;;;;;;;;;;-1:-1:-1;36702:11:0;;36736:8;;36702:11;;;;;;;36595:157;;;5437:14:1;;5430:22;5412:41;;5484:2;5469:18;;5462:34;;;;5385:18;36595:157:0;5244:258:1;11239:104:0;;;;;;;;;;;;;:::i;43425:300::-;;;;;;;;;;-1:-1:-1;43425:300:0;;;;;:::i;:::-;;:::i;15648:475::-;;;;;;;;;;-1:-1:-1;15648:475:0;;;;;:::i;:::-;;:::i;12667:200::-;;;;;;;;;;-1:-1:-1;12667:200:0;;;;;:::i;:::-;;:::i;31947:353::-;;;;;;;;;;-1:-1:-1;32183:15:0;;32229:16;;32276;;-1:-1:-1;;;32183:15:0;;;;;;31947:353;;;5728:14:1;;5721:22;5703:41;;5775:2;5760:18;;5753:34;;;;5803:18;;;5796:34;5691:2;5676:18;31947:353:0;5507:329:1;42054:637:0;;;;;;;;;;-1:-1:-1;42054:637:0;;;;;:::i;:::-;;:::i;42940:174::-;;;;;;;;;;-1:-1:-1;42940:174:0;;;;;:::i;:::-;;:::i;38096:553::-;;;;;;;;;;-1:-1:-1;38096:553:0;;;;;:::i;:::-;;:::i;12930:176::-;;;;;;;;;;-1:-1:-1;12930:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;13071:18:0;;;13044:7;13071:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12930:176;33409:266;;;;;;;;;;-1:-1:-1;33626:14:0;;33642:11;;33655;;33409:266;;;-1:-1:-1;;;;;33626:14:0;;;6795:34:1;;33642:11:0;;;6860:2:1;6845:18;;6838:43;33655:11:0;;6897:18:1;;;6890:43;;;;6745:2;6730:18;33409:266:0;6555:384:1;37479:152:0;;;;;;;;;;;;;:::i;39307:235::-;;;;;;;;;;-1:-1:-1;39307:235:0;;;;;:::i;:::-;;:::i;25406:32::-;;;;;;;;;;;;;;;22423:238;;;;;;;;;;-1:-1:-1;22423:238:0;;;;;:::i;:::-;;:::i;25984:29::-;;;;;;;;;;-1:-1:-1;25984:29:0;;;;;;;;11020:100;11074:13;11107:5;11100:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11020:100;:::o;13253:194::-;13361:4;13378:39;10106:10;13401:7;13410:6;13378:8;:39::i;:::-;-1:-1:-1;13435:4:0;13253:194;;;;;:::o;45258:678::-;21587:6;;45322:4;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;;;;;;;;;45372:3:::1;45361:7;:14;;45339:115;;;::::0;-1:-1:-1;;;45339:115:0;;7892:2:1;45339:115:0::1;::::0;::::1;7874:21:1::0;7931:2;7911:18;;;7904:30;7970:34;7950:18;;;7943:62;-1:-1:-1;;;8021:18:1;;;8014:49;8080:19;;45339:115:0::1;7690:415:1::0;45339:115:0::1;45491:8;::::0;:20:::1;::::0;45502:9:::1;45491:20;:::i;:::-;45473:15;:38;45465:59;;;::::0;-1:-1:-1;;;45465:59:0;;8574:2:1;45465:59:0::1;::::0;::::1;8556:21:1::0;8613:1;8593:18;;;8586:29;-1:-1:-1;;;8631:18:1;;;8624:38;8679:18;;45465:59:0::1;8372:331:1::0;45465:59:0::1;45543:11;::::0;::::1;::::0;::::1;;;45535:42;;;::::0;-1:-1:-1;;;45535:42:0;;8910:2:1;45535:42:0::1;::::0;::::1;8892:21:1::0;8949:2;8929:18;;;8922:30;-1:-1:-1;;;8968:18:1;;;8961:48;9026:18;;45535:42:0::1;8708:342:1::0;45535:42:0::1;45610:23;::::0;-1:-1:-1;;;45610:23:0;;-1:-1:-1;;;;;45625:7:0::1;5200:32:1::0;45610:23:0::1;::::0;::::1;5182:51:1::0;45590:17:0::1;::::0;45610:4:::1;::::0;:14:::1;::::0;5155:18:1;;45610:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45590:43:::0;-1:-1:-1;45644:15:0::1;45662:34;45689:6;45662:22;45590:43:::0;45676:7;45662:13:::1;:22::i;:::-;:26:::0;::::1;:34::i;:::-;45644:52:::0;-1:-1:-1;45713:11:0;;45709:159:::1;;45741:50;45757:7;45774:6;45783:7;45741:15;:50::i;:::-;45815:7;-1:-1:-1::0;;;;;45806:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45852:4:0::1;::::0;45258:678;-1:-1:-1;;;;;;;45258:678:0:o;45709:159::-:1;45883:20;::::0;1867:25:1;;;45883:20:0::1;::::0;1855:2:1;1840:18;45883:20:0::1;;;;;;;45923:5;45916:12;;;;21805:1;45258:678:::0;;;:::o;40362:462::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;40509:9:::1;:25:::0;;;40545:8:::1;:24:::0;;;40580:9:::1;:19:::0;;;40592:7;40624:20:::1;40556:13:::0;40521;40624:20:::1;:::i;:::-;:32;;;;:::i;:::-;40610:11;:46:::0;;;40690:2:::1;-1:-1:-1::0;40675:17:0::1;40667:75;;;::::0;-1:-1:-1;;;40667:75:0;;9446:2:1;40667:75:0::1;::::0;::::1;9428:21:1::0;9485:2;9465:18;;;9458:30;9524:34;9504:18;;;9497:62;-1:-1:-1;;;9575:18:1;;;9568:43;9628:19;;40667:75:0::1;9244:409:1::0;40667:75:0::1;40772:11;::::0;40785:9:::1;::::0;40796:8:::1;::::0;40806:9:::1;::::0;40758:58:::1;::::0;;9889:25:1;;;9945:2;9930:18;;9923:34;;;;9973:18;;;9966:34;10031:2;10016:18;;10009:34;40758:58:0::1;::::0;9876:3:1;9861:19;40758:58:0::1;;;;;;;;40362:462:::0;;;:::o;41178:514::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;41326:10:::1;:26:::0;;;41363:9:::1;:25:::0;;;41399:10:::1;:20:::0;;;41412:7;41445:22:::1;41375:13:::0;41339;41445:22:::1;:::i;:::-;:35;;;;:::i;:::-;41430:12;:50:::0;;;41529:2:::1;-1:-1:-1::0;41513:18:0::1;41491:114;;;::::0;-1:-1:-1;;;41491:114:0;;10256:2:1;41491:114:0::1;::::0;::::1;10238:21:1::0;10295:2;10275:18;;;10268:30;10334:34;10314:18;;;10307:62;-1:-1:-1;;;10385:18:1;;;10378:44;10439:19;;41491:114:0::1;10054:410:1::0;41491:114:0::1;41636:12;::::0;41650:10:::1;::::0;41662:9:::1;::::0;41673:10:::1;::::0;41621:63:::1;::::0;;9889:25:1;;;9945:2;9930:18;;9923:34;;;;9973:18;;;9966:34;10031:2;10016:18;;10009:34;41621:63:0::1;::::0;9876:3:1;9861:19;41621:63:0::1;9658:391:1::0;44785:160:0;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;44891:11:::1;::::0;44861:42:::1;::::0;-1:-1:-1;;;;;44891:11:0;;::::1;::::0;44861:42;::::1;::::0;::::1;::::0;44891:11:::1;::::0;44861:42:::1;44914:11;:23:::0;;-1:-1:-1;;;;;;44914:23:0::1;-1:-1:-1::0;;;;;44914:23:0;;;::::1;::::0;;;::::1;::::0;;44785:160::o;13925:529::-;14065:4;14082:36;14092:6;14100:9;14111:6;14082:9;:36::i;:::-;-1:-1:-1;;;;;14158:19:0;;14131:24;14158:19;;;:11;:19;;;;;;;;10106:10;14158:33;;;;;;;;14224:26;;;;14202:116;;;;-1:-1:-1;;;14202:116:0;;10671:2:1;14202:116:0;;;10653:21:1;10710:2;10690:18;;;10683:30;10749:34;10729:18;;;10722:62;-1:-1:-1;;;10800:18:1;;;10793:38;10848:19;;14202:116:0;10469:404:1;14202:116:0;14354:57;14363:6;10106:10;14404:6;14385:16;:25;14354:8;:57::i;:::-;-1:-1:-1;14442:4:0;;13925:529;-1:-1:-1;;;;13925:529:0:o;14859:290::-;10106:10;14972:4;15061:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15061:34:0;;;;;;;;;;14972:4;;14989:130;;15039:7;;15061:47;;15098:10;;15061:47;:::i;:::-;14989:8;:130::i;44447:164::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;44551:14:::1;::::0;44522:44:::1;::::0;-1:-1:-1;;;;;44551:14:0;;::::1;::::0;44522:44;::::1;::::0;::::1;::::0;44551:14:::1;::::0;44522:44:::1;44577:14;:26:::0;;-1:-1:-1;;;;;;44577:26:0::1;-1:-1:-1::0;;;;;44577:26:0;;;::::1;::::0;;;::::1;::::0;;44447:164::o;38885:215::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;38969:1:::1;38959:6;:11;;38951:56;;;::::0;-1:-1:-1;;;38951:56:0;;11080:2:1;38951:56:0::1;::::0;::::1;11062:21:1::0;;;11099:18;;;11092:30;11158:34;11138:18;;;11131:62;11210:18;;38951:56:0::1;10878:356:1::0;38951:56:0::1;39053:4;39036:13;12228:12:::0;;;12140:108;39036:13:::1;39027:22;::::0;:6;:22:::1;:::i;:::-;39026:31;;;;:::i;:::-;39018:5;:39:::0;;;39073:19:::1;::::0;1867:25:1;;;39073:19:0::1;::::0;1855:2:1;1840:18;39073:19:0::1;;;;;;;;38885:215:::0;:::o;44107:166::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;44219:11:::1;::::0;44189:42:::1;::::0;-1:-1:-1;;;;;44219:11:0;;::::1;::::0;44189:42;::::1;::::0;::::1;::::0;44219:11:::1;::::0;44189:42:::1;44242:11;:23:::0;;-1:-1:-1;;;;;;44242:23:0::1;-1:-1:-1::0;;;;;44242:23:0;;;::::1;::::0;;;::::1;::::0;;44107:166::o;22165:103::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;22230:30:::1;22257:1;22230:18;:30::i;:::-;22165:103::o:0;37209:130::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;37263:14:::1;:22:::0;;-1:-1:-1;;37263:22:0::1;::::0;;37301:30:::1;::::0;37315:15:::1;::::0;37301:30:::1;::::0;37280:5:::1;::::0;37301:30:::1;37209:130::o:0;39810:200::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39925:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;;:30;;-1:-1:-1;;39925:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39971:31;;1163:41:1;;;39971:31:0::1;::::0;1136:18:1;39971:31:0::1;;;;;;;;39810:200:::0;;:::o;36895:159::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;36950:9:::1;:16:::0;;-1:-1:-1;;36950:16:0::1;36962:4;36950:16;::::0;;36977:15:::1;:22:::0;;-1:-1:-1;;;;36977:22:0::1;-1:-1:-1::0;;;36977:22:0::1;::::0;;37015:31:::1;::::0;37030:15:::1;::::0;37015:31:::1;::::0;36950:9:::1;::::0;37015:31:::1;36895:159::o:0;11239:104::-;11295:13;11328:7;11321:14;;;;;:::i;43425:300::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;43571:7:::1;-1:-1:-1::0;;;;;43563:15:0::1;:4;-1:-1:-1::0;;;;;43563:15:0::1;::::0;43541:122:::1;;;::::0;-1:-1:-1;;;43541:122:0;;11836:2:1;43541:122:0::1;::::0;::::1;11818:21:1::0;11875:2;11855:18;;;11848:30;11914:34;11894:18;;;11887:62;11985:27;11965:18;;;11958:55;12030:19;;43541:122:0::1;11634:421:1::0;43541:122:0::1;43676:41;43705:4;43711:5;43676:28;:41::i;:::-;43425:300:::0;;:::o;15648:475::-;10106:10;15766:4;15810:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15810:34:0;;;;;;;;;;15877:35;;;;15855:122;;;;-1:-1:-1;;;15855:122:0;;12262:2:1;15855:122:0;;;12244:21:1;12301:2;12281:18;;;12274:30;12340:34;12320:18;;;12313:62;-1:-1:-1;;;12391:18:1;;;12384:35;12436:19;;15855:122:0;12060:401:1;15855:122:0;16013:67;10106:10;16036:7;16064:15;16045:16;:34;16013:8;:67::i;:::-;-1:-1:-1;16111:4:0;;15648:475;-1:-1:-1;;;15648:475:0:o;12667:200::-;12778:4;12795:42;10106:10;12819:9;12830:6;12795:9;:42::i;42054:637::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;42206:14:::1;:30:::0;;;42247:13:::1;:29:::0;;;42287:14:::1;:24:::0;;;42304:7;42341:30:::1;42263:13:::0;42223;42341:30:::1;:::i;:::-;:47;;;;:::i;:::-;42322:16;:66:::0;;;42441:2:::1;-1:-1:-1::0;42421:22:0::1;42399:122;;;::::0;-1:-1:-1;;;42399:122:0;;12668:2:1;42399:122:0::1;::::0;::::1;12650:21:1::0;12707:2;12687:18;;;12680:30;12746:34;12726:18;;;12719:62;-1:-1:-1;;;12797:18:1;;;12790:48;12855:19;;42399:122:0::1;12466:414:1::0;42399:122:0::1;42570:16;::::0;42601:14:::1;::::0;42630:13:::1;::::0;42658:14:::1;::::0;42537:146:::1;::::0;;9889:25:1;;;9945:2;9930:18;;9923:34;;;;9973:18;;;9966:34;10031:2;10016:18;;10009:34;42537:146:0::1;::::0;9876:3:1;9861:19;42537:146:0::1;9658:391:1::0;42940:174:0;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43025:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;;;:31;;-1:-1:-1;;43025:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43072:34;;1163:41:1;;;43072:34:0::1;::::0;1136:18:1;43072:34:0::1;1023:187:1::0;38096:553:0;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;38262:1:::1;38254:4;:9;;38232:111;;;::::0;-1:-1:-1;;;38232:111:0;;13087:2:1;38232:111:0::1;::::0;::::1;13069:21:1::0;13126:2;13106:18;;;13099:30;13165:34;13145:18;;;13138:62;-1:-1:-1;;;13216:18:1;;;13209:50;13276:19;;38232:111:0::1;12885:416:1::0;38232:111:0::1;38370:4;38362;:12;;38354:67;;;::::0;-1:-1:-1;;;38354:67:0;;13508:2:1;38354:67:0::1;::::0;::::1;13490:21:1::0;13547:2;13527:18;;;13520:30;13586:34;13566:18;;;13559:62;-1:-1:-1;;;13637:18:1;;;13630:40;13687:19;;38354:67:0::1;13306:406:1::0;38354:67:0::1;38434:15;:26:::0;;-1:-1:-1;;;;38434:26:0::1;-1:-1:-1::0;;;38434:26:0;::::1;;;;::::0;;12228:12;;38515:5:::1;::::0;38507:4;;38491:20:::1;;;;:::i;:::-;38490:30;;;;:::i;:::-;38471:16;:49:::0;38575:5:::1;38567:4:::0;38551:13:::1;12228:12:::0;;;12140:108;38551:13:::1;:20;;;;:::i;:::-;38550:30;;;;:::i;:::-;38531:16;:49:::0;38596:45:::1;::::0;;5728:14:1;;5721:22;5703:41;;5775:2;5760:18;;5753:34;;;5803:18;;;5796:34;;;38596:45:0::1;::::0;5691:2:1;5676:18;38596:45:0::1;5507:329:1::0;37479:152:0;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;37541:20:::1;:28:::0;;-1:-1:-1;;37541:28:0::1;::::0;;37585:38:::1;::::0;37607:15:::1;::::0;37585:38:::1;::::0;37564:5:::1;::::0;37585:38:::1;37479:152::o:0;39307:235::-;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;39395:1:::1;39385:6;:11;;39377:60;;;::::0;-1:-1:-1;;;39377:60:0;;13919:2:1;39377:60:0::1;::::0;::::1;13901:21:1::0;13958:2;13938:18;;;13931:30;13997:34;13977:18;;;13970:62;-1:-1:-1;;;14048:18:1;;;14041:34;14092:19;;39377:60:0::1;13717:400:1::0;39377:60:0::1;39487:4;39470:13;12228:12:::0;;;12140:108;39470:13:::1;39461:22;::::0;:6;:22:::1;:::i;:::-;39460:31;;;;:::i;:::-;39448:9;:43:::0;;;39507:27:::1;::::0;1867:25:1;;;39507:27:0::1;::::0;1855:2:1;1840:18;39507:27:0::1;1721:177:1::0;22423:238:0;21587:6;;-1:-1:-1;;;;;21587:6:0;10106:10;21734:23;21726:68;;;;-1:-1:-1;;;21726:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22526:22:0;::::1;22504:110;;;::::0;-1:-1:-1;;;22504:110:0;;14324:2:1;22504:110:0::1;::::0;::::1;14306:21:1::0;14363:2;14343:18;;;14336:30;14402:34;14382:18;;;14375:62;-1:-1:-1;;;14453:18:1;;;14446:36;14499:19;;22504:110:0::1;14122:402:1::0;22504:110:0::1;22625:28;22644:8;22625:18;:28::i;:::-;22423:238:::0;:::o;19431:380::-;-1:-1:-1;;;;;19567:19:0;;19559:68;;;;-1:-1:-1;;;19559:68:0;;14731:2:1;19559:68:0;;;14713:21:1;14770:2;14750:18;;;14743:30;14809:34;14789:18;;;14782:62;-1:-1:-1;;;14860:18:1;;;14853:34;14904:19;;19559:68:0;14529:400:1;19559:68:0;-1:-1:-1;;;;;19646:21:0;;19638:68;;;;-1:-1:-1;;;19638:68:0;;15136:2:1;19638:68:0;;;15118:21:1;15175:2;15155:18;;;15148:30;15214:34;15194:18;;;15187:62;-1:-1:-1;;;15265:18:1;;;15258:32;15307:19;;19638:68:0;14934:398:1;19638:68:0;-1:-1:-1;;;;;19719:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19771:32;;1867:25:1;;;19771:32:0;;1840:18:1;19771:32:0;;;;;;;19431:380;;;:::o;3385:98::-;3443:7;3470:5;3474:1;3470;:5;:::i;:::-;3463:12;3385:98;-1:-1:-1;;;3385:98:0:o;3784:::-;3842:7;3869:5;3873:1;3869;:5;:::i;16613:770::-;-1:-1:-1;;;;;16753:20:0;;16745:70;;;;-1:-1:-1;;;16745:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16834:23:0;;16826:71;;;;-1:-1:-1;;;16826:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16994:17:0;;16970:21;16994:17;;;;;;;;;;;17044:23;;;;17022:111;;;;-1:-1:-1;;;17022:111:0;;16349:2:1;17022:111:0;;;16331:21:1;16388:2;16368:18;;;16361:30;16427:34;16407:18;;;16400:62;-1:-1:-1;;;16478:18:1;;;16471:36;16524:19;;17022:111:0;16147:402:1;17022:111:0;-1:-1:-1;;;;;17169:17:0;;;:9;:17;;;;;;;;;;;17189:22;;;17169:42;;17233:20;;;;;;;;:30;;17205:6;;17169:9;17233:30;;17205:6;;17233:30;:::i;:::-;;;;;;;;17298:9;-1:-1:-1;;;;;17281:35:0;17290:6;-1:-1:-1;;;;;17281:35:0;;17309:6;17281:35;;;;1867:25:1;;1855:2;1840:18;;1721:177;17281:35:0;;;;;;;;16734:649;16613:770;;;:::o;45944:4865::-;-1:-1:-1;;;;;46076:18:0;;46068:68;;;;-1:-1:-1;;;46068:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46155:16:0;;46147:64;;;;-1:-1:-1;;;46147:64:0;;;;;;;:::i;:::-;46228:6;46238:1;46228:11;46224:93;;46256:28;46272:4;46278:2;46282:1;46256:15;:28::i;:::-;45944:4865;;;:::o;46224:93::-;46333:14;;;;46329:2265;;;21587:6;;-1:-1:-1;;;;;46386:15:0;;;21587:6;;46386:15;;;;:49;;-1:-1:-1;21587:6:0;;-1:-1:-1;;;;;46422:13:0;;;21587:6;;46422:13;;46386:49;:86;;;;-1:-1:-1;;;;;;46456:16:0;;;;46386:86;:128;;;;-1:-1:-1;;;;;;46493:21:0;;46507:6;46493:21;;46386:128;:158;;;;-1:-1:-1;46536:8:0;;-1:-1:-1;;;46536:8:0;;;;46535:9;46386:158;46364:2219;;;46584:9;;;;46579:203;;-1:-1:-1;;;;;46652:17:0;;;;;;:11;:17;;;;;;;;;:36;;-1:-1:-1;;;;;;46673:15:0;;;;;;:11;:15;;;;;;;;46652:36;46618:144;;;;-1:-1:-1;;;46618:144:0;;16756:2:1;46618:144:0;;;16738:21:1;16795:2;16775:18;;;16768:30;-1:-1:-1;;;16814:18:1;;;16807:52;16876:18;;46618:144:0;16554:346:1;46618:144:0;46938:20;;;;;;;46934:629;;;21587:6;;-1:-1:-1;;;;;47013:13:0;;;21587:6;;47013:13;;;;:66;;;47069:9;-1:-1:-1;;;;;47055:24:0;:2;-1:-1:-1;;;;;47055:24:0;;;47013:66;:117;;;;;47122:7;-1:-1:-1;;;;;47108:22:0;:2;-1:-1:-1;;;;;47108:22:0;;;47013:117;46983:561;;;47248:9;47219:39;;;;:28;:39;;;;;;47294:12;-1:-1:-1;47181:258:0;;;;-1:-1:-1;;;47181:258:0;;17107:2:1;47181:258:0;;;17089:21:1;17146:2;17126:18;;;17119:30;17185:34;17165:18;;;17158:62;17256:34;17236:18;;;17229:62;-1:-1:-1;;;17307:19:1;;;17300:40;17357:19;;47181:258:0;16905:477:1;47181:258:0;47495:9;47466:39;;;;:28;:39;;;;;47508:12;47466:54;;46983:561;-1:-1:-1;;;;;47615:31:0;;;;;;:25;:31;;;;;;;;:55;;;;-1:-1:-1;;;;;;47651:19:0;;;;;;:15;:19;;;;;;;;47650:20;47615:55;47611:957;;;47739:5;;47729:6;:15;;47695:139;;;;-1:-1:-1;;;47695:139:0;;17589:2:1;47695:139:0;;;17571:21:1;17628:2;17608:18;;;17601:30;17667:34;17647:18;;;17640:62;-1:-1:-1;;;17718:18:1;;;17711:36;17764:19;;47695:139:0;17387:402:1;47695:139:0;47917:9;;-1:-1:-1;;;;;12428:18:0;;12401:7;12428:18;;;;;;;;;;;47891:22;;:6;:22;:::i;:::-;:35;;47857:140;;;;-1:-1:-1;;;47857:140:0;;17996:2:1;47857:140:0;;;17978:21:1;18035:2;18015:18;;;18008:30;-1:-1:-1;;;18054:18:1;;;18047:49;18113:18;;47857:140:0;17794:343:1;47857:140:0;47611:957;;;-1:-1:-1;;;;;48095:29:0;;;;;;:25;:29;;;;;;;;:55;;;;-1:-1:-1;;;;;;48129:21:0;;;;;;:15;:21;;;;;;;;48128:22;48095:55;48069:499;;;48237:5;;48227:6;:15;;48193:140;;;;-1:-1:-1;;;48193:140:0;;18344:2:1;48193:140:0;;;18326:21:1;18383:2;18363:18;;;18356:30;18422:34;18402:18;;;18395:62;-1:-1:-1;;;18473:18:1;;;18466:37;18520:19;;48193:140:0;18142:403:1;48069:499:0;-1:-1:-1;;;;;48364:19:0;;;;;;:15;:19;;;;;;;;48359:209;;48468:9;;-1:-1:-1;;;;;12428:18:0;;12401:7;12428:18;;;;;;;;;;;48442:22;;:6;:22;:::i;:::-;:35;;48408:140;;;;-1:-1:-1;;;48408:140:0;;17996:2:1;48408:140:0;;;17978:21:1;18035:2;18015:18;;;18008:30;-1:-1:-1;;;18054:18:1;;;18047:49;18113:18;;48408:140:0;17794:343:1;48408:140:0;48655:4;48606:28;12428:18;;;;;;;;;;;48713:16;;48689:40;;;;;;;48760:39;;-1:-1:-1;48784:15:0;;-1:-1:-1;;;48784:15:0;;;;48760:39;:65;;;;-1:-1:-1;48817:8:0;;-1:-1:-1;;;48817:8:0;;;;48816:9;48760:65;:114;;;;-1:-1:-1;;;;;;48843:31:0;;;;;;:25;:31;;;;;;;;48842:32;48760:114;:149;;;;-1:-1:-1;;;;;;48892:17:0;;;;;;:11;:17;;;;;;;;48891:18;48760:149;:182;;;;-1:-1:-1;;;;;;48927:15:0;;;;;;:11;:15;;;;;;;;48926:16;48760:182;48742:314;;;48969:8;:15;;-1:-1:-1;;;;48969:15:0;-1:-1:-1;;;48969:15:0;;;49001:10;:8;:10::i;:::-;49028:8;:16;;-1:-1:-1;;;;49028:16:0;;;48742:314;49084:8;;-1:-1:-1;;;;;49194:17:0;;49068:12;49194:17;;;:11;:17;;;;;;49084:8;-1:-1:-1;;;49084:8:0;;;;;49083:9;;49194:17;;:36;;-1:-1:-1;;;;;;49215:15:0;;;;;;:11;:15;;;;;;;;49194:36;49190:84;;;-1:-1:-1;49257:5:0;49190:84;49286:12;49391:7;49387:1369;;;-1:-1:-1;;;;;49443:29:0;;;;;;:25;:29;;;;;;;;:49;;;;;49491:1;49476:12;;:16;49443:49;49439:1168;;;49520:33;49549:3;49520:24;49531:12;;49520:6;:10;;:24;;;;:::i;:33::-;49513:40;;49615:12;;49602:9;;49595:4;:16;;;;:::i;:::-;49594:33;;;;:::i;:::-;49572:18;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;49684:12:0;;49670:10;;49663:17;;:4;:17;:::i;:::-;49662:34;;;;:::i;:::-;49646:12;;:50;;;;;;;:::i;:::-;;;;-1:-1:-1;;49759:12:0;;49745:10;;49738:17;;:4;:17;:::i;:::-;49737:34;;;;:::i;:::-;49715:18;;:56;;;;;;;:::i;:::-;;;;-1:-1:-1;49439:1168:0;;-1:-1:-1;49439:1168:0;;-1:-1:-1;;;;;49833:31:0;;;;;;:25;:31;;;;;;;;:50;;;;;49882:1;49868:11;;:15;49833:50;49829:778;;;49911:32;49939:3;49911:23;49922:11;;49911:6;:10;;:23;;;;:::i;:32::-;49904:39;;50004:11;;49992:8;;49985:4;:15;;;;:::i;:::-;49984:31;;;;:::i;:::-;49962:18;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;;50071:11:0;;50058:9;;50051:16;;:4;:16;:::i;:::-;50050:32;;;;:::i;:::-;50034:12;;:48;;;;;;;:::i;:::-;;;;-1:-1:-1;;50144:11:0;;50131:9;;50124:16;;:4;:16;:::i;49829:778::-;50222:16;;:20;50218:389;;50270:37;50303:3;50270:28;50281:16;;50270:6;:10;;:28;;;;:::i;:37::-;50263:44;;50373:16;;50356:13;;50349:4;:20;;;;:::i;:::-;50348:41;;;;:::i;:::-;50326:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;50450:16:0;;50432:14;;50425:21;;:4;:21;:::i;:::-;50424:42;;;;:::i;:::-;50408:12;;:58;;;;;;;:::i;:::-;;;;-1:-1:-1;;50575:16:0;;50536:14;;50529:21;;:4;:21;:::i;:::-;50528:63;;;;:::i;:::-;50485:18;;:106;;;;;;;:::i;:::-;;;;-1:-1:-1;;50218:389:0;50627:8;;50623:91;;50656:42;50672:4;50686;50693;50656:15;:42::i;:::-;50730:14;50740:4;50730:14;;:::i;:::-;;;49387:1369;50768:33;50784:4;50790:2;50794:6;50768:15;:33::i;:::-;46057:4752;;;;45944:4865;;;:::o;22821:191::-;22914:6;;;-1:-1:-1;;;;;22931:17:0;;;-1:-1:-1;;;;;;22931:17:0;;;;;;;22964:40;;22914:6;;;22931:17;22914:6;;22964:40;;22895:16;;22964:40;22884:128;22821:191;:::o;43733:188::-;-1:-1:-1;;;;;43816:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;43816:39:0;;;;;;;;;;43873:40;;43816:39;;:31;43873:40;;;43733:188;;:::o;51912:1714::-;51995:4;51951:23;12428:18;;;;;;;;;;;51951:50;;52012:25;52108:12;;52074:18;;52040;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;52012:108;;52131:12;52160:15;52179:1;52160:20;52156:59;;52197:7;;;51912:1714::o;52156:59::-;52249:16;;52231:15;:34;52227:101;;;52300:16;;52282:34;;52227:101;52389:23;52502:1;52469:17;52434:18;;52416:15;:36;;;;:::i;:::-;52415:71;;;;:::i;:::-;:88;;;;:::i;:::-;52389:114;-1:-1:-1;52514:26:0;52543:36;:15;52389:114;52543:19;:36::i;:::-;52514:65;-1:-1:-1;52620:21:0;52654:36;52514:65;52654:16;:36::i;:::-;52703:18;52724:44;:21;52750:17;52724:25;:44::i;:::-;52703:65;;52781:23;52807:81;52860:17;52807:34;52822:18;;52807:10;:14;;:34;;;;:::i;:81::-;52781:107;;52899:17;52919:51;52952:17;52919:28;52934:12;;52919:10;:14;;:28;;;;:::i;:51::-;52899:71;-1:-1:-1;52983:23:0;52899:71;53009:28;53022:15;53009:10;:28;:::i;:::-;:40;;;;:::i;:::-;53083:1;53062:18;:22;;;53095:18;:22;;;53128:12;:16;;;53179:11;;53171:47;;52983:66;;-1:-1:-1;;;;;;53179:11:0;;53204:9;;53171:47;53083:1;53171:47;53204:9;53179:11;53171:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53157:61:0;;-1:-1:-1;;53235:19:0;;;;;:42;;;53276:1;53258:15;:19;53235:42;53231:278;;;53294:46;53307:15;53324;53294:12;:46::i;:::-;53464:18;;53360:137;;;19095:25:1;;;19151:2;19136:18;;19129:34;;;19179:18;;;19172:34;;;;53360:137:0;;;;;;19083:2:1;53360:137:0;;;53231:278;53543:11;;53535:83;;-1:-1:-1;;;;;53543:11:0;;;;53568:21;;53535:83;;;;53568:21;53543:11;53535:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;51912:1714:0:o;3028:98::-;3086:7;3113:5;3117:1;3113;:5;:::i;50817:571::-;50967:16;;;50981:1;50967:16;;;;;;;;50943:21;;50967:16;;;;;;;;;;-1:-1:-1;50967:16:0;50943:40;;51012:4;50994;50999:1;50994:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50994:23:0;;;-1:-1:-1;;;;;50994:23:0;;;;;51038:9;-1:-1:-1;;;;;51038:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51028:4;51033:1;51028:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;51028:26:0;;;-1:-1:-1;;;;;51028:26:0;;;;;51067:56;51084:4;51099:9;51111:11;51067:8;:56::i;:::-;51162:218;;-1:-1:-1;;;51162:218:0;;-1:-1:-1;;;;;51162:9:0;:60;;;;:218;;51237:11;;51263:1;;51307:4;;51334;;51354:15;;51162:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50872:516;50817:571;:::o;51396:508::-;51544:56;51561:4;51576:9;51588:11;51544:8;:56::i;:::-;51841:14;;51643:253;;-1:-1:-1;;;51643:253:0;;51709:4;51643:253;;;21063:34:1;21113:18;;;21106:34;;;51755:1:0;21156:18:1;;;21149:34;;;21199:18;;;21192:34;-1:-1:-1;;;;;51841:14:0;;;21242:19:1;;;21235:44;51870:15:0;21295:19:1;;;21288:35;51643:9:0;:25;;;;;;51676:9;;20997:19:1;;51643:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51396:508;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1400:316::-;1477:6;1485;1493;1546:2;1534:9;1525:7;1521:23;1517:32;1514:52;;;1562:1;1559;1552:12;1514:52;-1:-1:-1;;1585:23:1;;;1655:2;1640:18;;1627:32;;-1:-1:-1;1706:2:1;1691:18;;;1678:32;;1400:316;-1:-1:-1;1400:316:1:o;1903:247::-;1962:6;2015:2;2003:9;1994:7;1990:23;1986:32;1983:52;;;2031:1;2028;2021:12;1983:52;2070:9;2057:23;2089:31;2114:5;2089:31;:::i;2509:456::-;2586:6;2594;2602;2655:2;2643:9;2634:7;2630:23;2626:32;2623:52;;;2671:1;2668;2661:12;2623:52;2710:9;2697:23;2729:31;2754:5;2729:31;:::i;:::-;2779:5;-1:-1:-1;2836:2:1;2821:18;;2808:32;2849:33;2808:32;2849:33;:::i;:::-;2509:456;;2901:7;;-1:-1:-1;;;2955:2:1;2940:18;;;;2927:32;;2509:456::o;3575:160::-;3640:20;;3696:13;;3689:21;3679:32;;3669:60;;3725:1;3722;3715:12;3740:315;3805:6;3813;3866:2;3854:9;3845:7;3841:23;3837:32;3834:52;;;3882:1;3879;3872:12;3834:52;3921:9;3908:23;3940:31;3965:5;3940:31;:::i;:::-;3990:5;-1:-1:-1;4014:35:1;4045:2;4030:18;;4014:35;:::i;:::-;4004:45;;3740:315;;;;;:::o;5841:316::-;5915:6;5923;5931;5984:2;5972:9;5963:7;5959:23;5955:32;5952:52;;;6000:1;5997;5990:12;5952:52;6023:26;6039:9;6023:26;:::i;:::-;6013:36;6096:2;6081:18;;6068:32;;-1:-1:-1;6147:2:1;6132:18;;;6119:32;;5841:316;-1:-1:-1;;;5841:316:1:o;6162:388::-;6230:6;6238;6291:2;6279:9;6270:7;6266:23;6262:32;6259:52;;;6307:1;6304;6297:12;6259:52;6346:9;6333:23;6365:31;6390:5;6365:31;:::i;:::-;6415:5;-1:-1:-1;6472:2:1;6457:18;;6444:32;6485:33;6444:32;6485:33;:::i;:::-;6537:7;6527:17;;;6162:388;;;;;:::o;6944:380::-;7023:1;7019:12;;;;7066;;;7087:61;;7141:4;7133:6;7129:17;7119:27;;7087:61;7194:2;7186:6;7183:14;7163:18;7160:38;7157:161;;7240:10;7235:3;7231:20;7228:1;7221:31;7275:4;7272:1;7265:15;7303:4;7300:1;7293:15;7157:161;;6944:380;;;:::o;7329:356::-;7531:2;7513:21;;;7550:18;;;7543:30;7609:34;7604:2;7589:18;;7582:62;7676:2;7661:18;;7329:356::o;8110:127::-;8171:10;8166:3;8162:20;8159:1;8152:31;8202:4;8199:1;8192:15;8226:4;8223:1;8216:15;8242:125;8307:9;;;8328:10;;;8325:36;;;8341:18;;:::i;9055:184::-;9125:6;9178:2;9166:9;9157:7;9153:23;9149:32;9146:52;;;9194:1;9191;9184:12;9146:52;-1:-1:-1;9217:16:1;;9055:184;-1:-1:-1;9055:184:1:o;11239:168::-;11312:9;;;11343;;11360:15;;;11354:22;;11340:37;11330:71;;11381:18;;:::i;11412:217::-;11452:1;11478;11468:132;;11522:10;11517:3;11513:20;11510:1;11503:31;11557:4;11554:1;11547:15;11585:4;11582:1;11575:15;11468:132;-1:-1:-1;11614:9:1;;11412:217::o;15337:401::-;15539:2;15521:21;;;15578:2;15558:18;;;15551:30;15617:34;15612:2;15597:18;;15590:62;-1:-1:-1;;;15683:2:1;15668:18;;15661:35;15728:3;15713:19;;15337:401::o;15743:399::-;15945:2;15927:21;;;15984:2;15964:18;;;15957:30;16023:34;16018:2;16003:18;;15996:62;-1:-1:-1;;;16089:2:1;16074:18;;16067:33;16132:3;16117:19;;15743:399::o;18550:128::-;18617:9;;;18638:11;;;18635:37;;;18652:18;;:::i;19349:127::-;19410:10;19405:3;19401:20;19398:1;19391:31;19441:4;19438:1;19431:15;19465:4;19462:1;19455:15;19481:251;19551:6;19604:2;19592:9;19583:7;19579:23;19575:32;19572:52;;;19620:1;19617;19610:12;19572:52;19652:9;19646:16;19671:31;19696:5;19671:31;:::i;19737:980::-;19999:4;20047:3;20036:9;20032:19;20078:6;20067:9;20060:25;20104:2;20142:6;20137:2;20126:9;20122:18;20115:34;20185:3;20180:2;20169:9;20165:18;20158:31;20209:6;20244;20238:13;20275:6;20267;20260:22;20313:3;20302:9;20298:19;20291:26;;20352:2;20344:6;20340:15;20326:29;;20373:1;20383:195;20397:6;20394:1;20391:13;20383:195;;;20462:13;;-1:-1:-1;;;;;20458:39:1;20446:52;;20553:15;;;;20518:12;;;;20494:1;20412:9;20383:195;;;-1:-1:-1;;;;;;;20634:32:1;;;;20629:2;20614:18;;20607:60;-1:-1:-1;;;20698:3:1;20683:19;20676:35;20595:3;19737:980;-1:-1:-1;;;19737:980:1:o;21334:306::-;21422:6;21430;21438;21491:2;21479:9;21470:7;21466:23;21462:32;21459:52;;;21507:1;21504;21497:12;21459:52;21536:9;21530:16;21520:26;;21586:2;21575:9;21571:18;21565:25;21555:35;;21630:2;21619:9;21615:18;21609:25;21599:35;;21334:306;;;;;:::o

Swarm Source

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