ETH Price: $3,368.65 (-0.56%)

Token

MAGA AGAIN (MAGAA)
 

Overview

Max Total Supply

1,000,000,000 MAGAA

Holders

3,728 ( 0.107%)

Market

Price

$0.00 @ 0.000000 ETH (-5.28%)

Onchain Market Cap

$1,201,722.78

Circulating Supply Market Cap

$1,201,722.78

Other Info

Token Contract (WITH 18 Decimals)

Balance
600,988.928043934621266236 MAGAA

Value
$722.22 ( ~0.214394806511416 Eth) [0.0601%]
0x4ef2e45e7dc955522c4f273ff47ad1bf69b4969a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Market

Volume (24H):$557,958.03
Market Capitalization:$1,201,722.78
Circulating Supply:1,000,000,000.00 MAGAA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MAGAA

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-06-04
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/**
Website:  magaa.io
Telegram: https://t.me/MAGAAtoken
Twitter:  https://twitter.com/MAGAAtoken
*/

/**

 ███████████ ███████████   █████  █████ ██████   ██████ ███████████ 
░█░░░███░░░█░░███░░░░░███ ░░███  ░░███ ░░██████ ██████ ░░███░░░░░███
░   ░███  ░  ░███    ░███  ░███   ░███  ░███░█████░███  ░███    ░███
    ░███     ░██████████   ░███   ░███  ░███░░███ ░███  ░██████████ 
    ░███     ░███░░░░░███  ░███   ░███  ░███ ░░░  ░███  ░███░░░░░░  
    ░███     ░███    ░███  ░███   ░███  ░███      ░███  ░███        
    █████    █████   █████ ░░████████   █████     █████ █████       
   ░░░░░    ░░░░░   ░░░░░   ░░░░░░░░   ░░░░░     ░░░░░ ░░░░░        
                                                                                                                                     
*/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token taxes, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

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

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

        emit Transfer(from, to, value);
    }

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

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

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        _approve(owner, spender, value, true);
    }

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

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

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

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

    function WETH() external pure returns (address);

    function swapExactTokensForETH(
        uint256 amountIn, 
        uint256 amountOutMin, 
        address[] calldata path, 
        address to, 
        uint256 deadline
    )
    external
    returns (uint[] memory amounts);

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

contract MAGAA is ERC20, Ownable {

    //Wallets 
    //owner Wallet and
    /// marketing buy wallet = TaxWallet1
    address public taxWallet1;
    /// marketing sell wallet = TaxWallet2
    address public taxWallet2;

    /// MAX AMOUNT PER BUY / SELL
    uint256 public maxAmountPerTx = MAX_SUPPLY / 50;
    /// MAX WALLET AMOUNT
    uint256 public maxWalletAmount = MAX_SUPPLY / 50;
    
    /// MAX SUPPLY
    uint256 internal constant MAX_SUPPLY = 1_000_000_000 * 1e18;
    /// PERCENT_DIVISOR
    uint256 internal constant PERCENT_DIVISOR = 10000;
    /// Threshold after which collected tax is sold for eth
    uint256 public swapTokensAtAmount = MAX_SUPPLY / 100000; // = 0.001%

    /// Trading flag
    bool public trading;

    /// mapping for managing users which are excluded from taxes
    mapping(address => bool) public isExcludedFromTaxes;

    /// mapping for blacklist
    mapping(address => bool) public blacklist;
    
    ////// TAX STRUCTS //
    struct BuyTax {
        uint256 marketing;
    }

    struct SellTax {
        uint256 marketing;
    }

    BuyTax public buyTax;
    SellTax public sellTax;

    uint256 public totalBuyTax;
    uint256 public totalSellTax;
    
    /// @notice uniswapV2Router
    IUniswapV2Router public immutable uniswapV2Router;
    /// @notice uniswapPair
    address public immutable uniswapPair;
    /// swapping used during collected tokens are swapped for eth
    bool swapping;
        
    //// EVENTS

    event TaxWallet1Transferred(address indexed oldTaxWallet1,address indexed newTaxWallet1);
    event TaxWallet2Transferred(address indexed oldTaxWallet2,address indexed newTaxWallet2);

    event enabledTrading();
    event disabledTrading();

    event SellTaxesUpdated(uint256 indexed sellTax);
    event BuyTaxesUpdated(uint256 indexed buyTax);

    event collectedFee(uint256 indexed fee);

    event EthClaimed(address indexed wallet, uint256 indexed amount);


    //// MODIFIER 

    /**
     * @dev Throws if the sender is not the marketing wallet.
     */

    modifier onlyTaxWallet1() {
        require(taxWallet1 == msg.sender, "Only Tax Wallet 1 can call this function");
        _;
    }

    modifier onlyTaxWallet2() {
        require(taxWallet2 == msg.sender, "Only Tax Wallet 2 can call this function");
        _;
    }

    modifier onlyTaxWallets() {
        require(taxWallet1 == msg.sender || taxWallet2 == msg.sender, "Only Tax Wallets can call this function");
        _;
    }

    /** @notice create an erc20, initialize all required variables
     *         like owner, uniswap v2 router, taxes values and wallets values.
     *        excludes the owner and token address from taxes and limits.
     *        mints the total supply to the owner wallet.
     */

    constructor() 
        ERC20("MAGA AGAIN", "MAGAA") Ownable(msg.sender) {

        uniswapV2Router = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        taxWallet1 = 0xEe4fe51310Ba173bDbE76d45240772fF76f3a4AA; 
        taxWallet2 = 0x9D6CEd5850d285c24cE7c6848c70551c7FaE2b3a; 
        
        uniswapPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );
        
        // 100 = 1%  10 = 0.1%  1 = 0.01%
        buyTax = BuyTax ({
            marketing: 100
        });

        totalBuyTax = buyTax.marketing;

        sellTax = SellTax ({
            marketing: 100
        });

        totalSellTax = sellTax.marketing;

        isExcludedFromTaxes[address(this)] = true;
        isExcludedFromTaxes[msg.sender] = true;
        isExcludedFromTaxes[address(0x0)] = true;
        isExcludedFromTaxes[taxWallet1] = true;
        isExcludedFromTaxes[taxWallet2] = true;

        trading = false;

        _mint(msg.sender, MAX_SUPPLY);
    }

    /**
     * @notice to recieve ETH from uniswapV2Router when swapping
     */

    receive() external payable  {
    }

    /**
     * @notice Allows the marketing wallet to claim stuck ERC20 tokens
     * @dev Only the marketing wallet can call this function
     * @param token The address of the ERC20 token to claim
     * @param value The amount of tokens to claim
     * @param wallet The address to transfer the claimed tokens to
     */

    function claimStuckERC20(
        address token,
        uint256 value,
        address wallet
    ) external onlyTaxWallets {
        ERC20 ERC20Token = ERC20(token);
        bool success = ERC20Token.transfer(wallet, value);
        require(success, "ERC20 transfer failed");
    }

    /**
     * @notice Allows the marketing wallet to claim stuck ERC20 tokens
     * @dev Only the marketing wallet can call this function
     * @param wallet The address to transfer the claimed tokens to
     */

    function claimStuckEth(address wallet) external onlyTaxWallets {
        require(wallet != address(0), "Wallet must not be 0x0 address");
        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to transfer");

        payable(wallet).transfer(balance);
        emit EthClaimed(wallet, balance);
    }

    /**
     * @notice Exclude or include an account from taxes.
     *
     * @param account The address of the account to be excluded or included.
     * @param value Boolean value indicating whether the account should
     *        be excluded (true) or included (false).
     */

    function setExcludeFromTaxes(address account, bool value) external onlyOwner {
        require(account != address(0), "Account must not be 0x0 address");
        isExcludedFromTaxes[account] = value;
    }


   /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     * To ensure no mishap when renouncing the ownership, we guarantee that trading will be enabled regardless.
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public override onlyOwner {
        enableTrading();
        super.renounceOwnership();
    }

   /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public override onlyOwner {
        isExcludedFromTaxes[owner()] = false;
        super.transferOwnership(newOwner);
        isExcludedFromTaxes[newOwner] = true;
    }

    /**
     * @notice Enable Trading
     */

    function enableTrading() public onlyOwner {
        trading = true;
        emit enabledTrading();
    }

    /**
     * @notice Disable Trading
     */

    function disableTrading() external onlyOwner {
        trading = false;
        emit disabledTrading();
    }

    /**
     * @notice Update the Tax Wallet 1 wallet address
     * @param newTaxWallet1: The new address for the Tax wallet 1
     */

    function transferTaxWallet1(address newTaxWallet1) external onlyTaxWallet1 {
        require(newTaxWallet1 != address(0x0), "New Tax Wallet 1 must not be 0x0 address");
        isExcludedFromTaxes[taxWallet1] = false;
        isExcludedFromTaxes[newTaxWallet1] = true;
        emit TaxWallet1Transferred(taxWallet1, newTaxWallet1);
        taxWallet1 = newTaxWallet1;

    }

    /**
     * @notice Update the Tax Wallet 2 wallet address
     * @param newTaxWallet2: The new address for the Tax wallet 2
     */

    function transferTaxWallet2(address newTaxWallet2) external onlyTaxWallet2 {
        require(newTaxWallet2 != address(0x0), "New Tax Wallet 2 must not be 0x0 address");
        isExcludedFromTaxes[taxWallet2] = false;
        isExcludedFromTaxes[newTaxWallet2] = true;
        emit TaxWallet2Transferred(taxWallet2, newTaxWallet2);
        taxWallet2 = newTaxWallet2;
    }


    /**
     * @notice Renounce the Tax Wallet 1 
     */

    function renounceTaxWallet1() external onlyTaxWallet1 {
        isExcludedFromTaxes[taxWallet1] = false;
        taxWallet1 = address(0x0);
        buyTax.marketing = 0;
        totalBuyTax = 0;
    }

    /**
     * @notice Renounce the Tax Wallet 2 
     */

    function renounceTaxWallet2() external onlyTaxWallet2 {
        isExcludedFromTaxes[taxWallet2] = false;
        taxWallet2 = address(0x0);
        sellTax.marketing = 0;
        totalSellTax = 0;
    }

    /**
     * @notice Update the wallets for taxes distribution.
     *
     * @param newTaxWallet1 The address of the marketing wallet.
     * @param newTaxWallet2 The address of the marketing wallet.
     *
     */

    function setWallets(address newTaxWallet1, address newTaxWallet2) external onlyOwner {
        require(newTaxWallet1 != address(0x0), "New Tax Wallet 1 must not be 0x0 address");
        require(newTaxWallet2 != address(0x0), "New Tax Wallet 2 must not be 0x0 address");
        emit TaxWallet1Transferred(taxWallet1, newTaxWallet1);
        taxWallet1 = newTaxWallet1;
        emit TaxWallet2Transferred(taxWallet2, newTaxWallet2);
        taxWallet2 = newTaxWallet2;
    }

    /**
     * @notice Add to the blacklist. 
     *
     * @param blacklistedAddresses Array of addresses to be blacklisted
     */
     
    function addToBlacklist(address[] calldata blacklistedAddresses) external onlyOwner {
        for (uint256 i = 0; i < blacklistedAddresses.length; i++) {
            require(!isExcludedFromTaxes[blacklistedAddresses[i]], "Address is excluded from taxes, cannot blacklist");
            blacklist[blacklistedAddresses[i]] = true;
        }
    }

     /**
     * @notice Remove from the blacklist. 
     *
     * @param blacklistedAddresses Array of addresses to removed from the blacklist
     */
     
    function removeFromBlacklist(address[] calldata blacklistedAddresses) external onlyOwner {
        for (uint256 i = 0; i < blacklistedAddresses.length; i++) {
            blacklist[blacklistedAddresses[i]] = false;
        }
    }

    /**
     * @notice set max no. of tokens a user a buy/sell per tx
     * @param percent: percent of supply that a user/account can buy/sell per tx
     * min percent is limited to 1% of the total supply
     */
    function setMaxAmountPerTx(uint256 percent) external onlyOwner {
        require(percent >= 1 && PERCENT_DIVISOR >= percent, "Max amount per TX out of range");
        maxAmountPerTx = (MAX_SUPPLY * percent) / PERCENT_DIVISOR;
    }

    /**
     * @notice set max wallet amount percent
     * @param percent: percent of supply that a person can hold
     **/
    function setMaxWalletPercent(uint256 percent) external onlyOwner {
        require(percent >= 1 && PERCENT_DIVISOR >= percent, "Max wallet amount is out of range");
        maxWalletAmount = (MAX_SUPPLY * percent) / PERCENT_DIVISOR;
    }

    /**
     * @notice update swap threshold at/after collected tax is swapped for eth
     * @param tokens
     **/

    function setSwapTokensAtAmount(uint256 tokens) external onlyOwner {
        require(tokens > 1000e18, "Minimum of 1000 tokens required");
        swapTokensAtAmount = tokens;
    }


    /**
     * @notice Override for _update required by Solidity
     *  Manage fees on buy/sell and maxTxAmount/MaxWalletLimit
     **/

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {

        // Check if either the sender or receiver is blacklisted
        require(!(blacklist[from] || blacklist[to]), "Address is blacklisted, aborting");

        require(trading || isExcludedFromTaxes[from] || isExcludedFromTaxes[to] 
        || (from == address(uniswapV2Router) && to == uniswapPair) || (to == address(uniswapV2Router) && from == uniswapPair), "Trading disabled, only owner can transfer");

        /*
            These addresses here are not triggering any fees
            isExcludedFromTaxes[address(this)] = true;
            isExcludedFromTaxes[msg.sender] = true;
            isExcludedFromTaxes[address(0x0)] = true;
            isExcludedFromTaxes[taxWallet1] = true;
            isExcludedFromTaxes[taxWallet2] = true;
        */      

        if (!(isExcludedFromTaxes[from] || isExcludedFromTaxes[to]) && trading) {
            uint256 fee;
            if(to != uniswapPair){
                require(amount + balanceOf(to) <= maxWalletAmount, "Max limit per wallet reached");
            }
            if (from == uniswapPair) {
                require(amount <= maxAmountPerTx, "Max buy amount per Tx exceeded");

                if (totalBuyTax > 0) {
                    fee = (amount * totalBuyTax) / PERCENT_DIVISOR;
                }
            } 
            else if (to == uniswapPair) {
                require(amount <= maxAmountPerTx, "Max sell amount per Tx exceeded");

                if (totalSellTax > 0) {
                    fee = (amount * totalSellTax) / PERCENT_DIVISOR;
                }
            }

           emit collectedFee(fee);
           
           amount = amount - fee;

            if (fee > 0) {
                super._update(from, address(this), fee);
            }
        }

        uint256 contractBalance = balanceOf(address(this));

        //Only swap into ETH when trading is happening (prevents werid Uniswap loop bugs)
        bool canSwap = contractBalance >= swapTokensAtAmount &&
            from != uniswapPair && !isExcludedFromTaxes[from] && !swapping && trading;

        if (canSwap) {
            swapping = true;
            swapAndDistribute(contractBalance);
            swapping = false;
        }

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

    /**
     * @notice The function swaps tokens for ETH, adds liquidity to the Uniswap V2 pair,
     *  and distributes fees according to the configured percentages.
     *
     * @param tokens The total amount of tokens to process for swapping and liquidity addition.
     *
     */

    function swapAndDistribute(uint256 tokens) private {
        if ((totalBuyTax > 0 || totalSellTax > 0) && tokens > 0) {
            swapForEth(tokens);
            if (address(this).balance > 0) {
                payable(taxWallet1).transfer(address(this).balance/2);
                payable(taxWallet2).transfer(address(this).balance);
            }
        }
    }

    /**
     * @notice Swaps the specified amount of tokens for ETH using the Uniswap V2 Router.
     *
     * @param tokens The amount of tokens to swap for ETH.
     *
     * @dev This function generates the Uniswap pair path for the token to WETH,
     * checks the allowance for the token with the Uniswap V2 Router, and then makes
     * the swap from tokens to ETH. It ensures that the swap supports fees on transfer tokens
     * and sets a deadline for the swap transaction.
     */
    function swapForEth(uint256 tokens) private {
        // generate the Uniswap pair path of token -> WETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if (allowance(address(this), address(uniswapV2Router)) < tokens) {
            _approve(
                address(this),
                address(uniswapV2Router),
                type(uint256).max
            );
        }

        // make the swap
        uniswapV2Router.swapExactTokensForETH(
            tokens,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"buyTax","type":"uint256"}],"name":"BuyTaxesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"sellTax","type":"uint256"}],"name":"SellTaxesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTaxWallet1","type":"address"},{"indexed":true,"internalType":"address","name":"newTaxWallet1","type":"address"}],"name":"TaxWallet1Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTaxWallet2","type":"address"},{"indexed":true,"internalType":"address","name":"newTaxWallet2","type":"address"}],"name":"TaxWallet2Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"collectedFee","type":"event"},{"anonymous":false,"inputs":[],"name":"disabledTrading","type":"event"},{"anonymous":false,"inputs":[],"name":"enabledTrading","type":"event"},{"inputs":[{"internalType":"address[]","name":"blacklistedAddresses","type":"address[]"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromTaxes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address[]","name":"blacklistedAddresses","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludeFromTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet1","type":"address"},{"internalType":"address","name":"newTaxWallet2","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet1","type":"address"}],"name":"transferTaxWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet2","type":"address"}],"name":"transferTaxWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405261001b60326b033b2e3c9fd0803ce8000000610d2c565b60085561003560326b033b2e3c9fd0803ce8000000610d2c565b600955610051620186a06b033b2e3c9fd0803ce8000000610d2c565b600a5534801561005f575f80fd5b50336040518060400160405280600a81526020016926a0a3a09020a3a0a4a760b11b815250604051806040016040528060058152602001644d4147414160d81b81525081600390816100b19190610ddb565b5060046100be8282610ddb565b5050506001600160a01b0381166100ef57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100f881610375565b50737a250d5630b4cf539739df2c5dacb4c659f2488d6080819052600680546001600160a01b031990811673ee4fe51310ba173bdbe76d45240772ff76f3a4aa1790915560078054909116739d6ced5850d285c24ce7c6848c70551c7fae2b3a1790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610194573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101b89190610e9a565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102299190610e9a565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015610273573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102979190610e9a565b6001600160a01b0390811660a0526040805160208082018352606491829052600e829055601082905582518082018452829052600f829055601191909155305f908152600c909152818120805460ff1990811660019081179092553380845284842080548316841790557f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e88054831684179055600654861684528484208054831684179055600754909516835292909120805483169091179055600b80549091169055610370906b033b2e3c9fd0803ce80000006103c6565b611041565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166103ef5760405163ec442f0560e01b81525f60048201526024016100e6565b6103fa5f83836103fe565b5050565b6001600160a01b0383165f908152600d602052604090205460ff168061043b57506001600160a01b0382165f908152600d602052604090205460ff165b156104885760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320626c61636b6c69737465642c2061626f7274696e6760448201526064016100e6565b600b5460ff16806104b057506001600160a01b0383165f908152600c602052604090205460ff165b806104d257506001600160a01b0382165f908152600c602052604090205460ff165b8061050e57506080516001600160a01b0316836001600160a01b031614801561050e575060a0516001600160a01b0316826001600160a01b0316145b8061054a57506080516001600160a01b0316826001600160a01b031614801561054a575060a0516001600160a01b0316836001600160a01b0316145b6105a85760405162461bcd60e51b815260206004820152602960248201527f54726164696e672064697361626c65642c206f6e6c79206f776e65722063616e604482015268103a3930b739b332b960b91b60648201526084016100e6565b6001600160a01b0383165f908152600c602052604090205460ff16806105e557506001600160a01b0382165f908152600c602052604090205460ff165b1580156105f45750600b5460ff165b156107fc575f60a0516001600160a01b0316836001600160a01b031614610688576009546001600160a01b0384165f9081526020819052604090205461063a9084610ec7565b11156106885760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c657420726561636865640000000060448201526064016100e6565b60a0516001600160a01b0316846001600160a01b031603610720576008548211156106f55760405162461bcd60e51b815260206004820152601e60248201527f4d61782062757920616d6f756e7420706572205478206578636565646564000060448201526064016100e6565b6010541561071b576127106010548361070e9190610eda565b6107189190610d2c565b90505b6107b3565b60a0516001600160a01b0316836001600160a01b0316036107b35760085482111561078d5760405162461bcd60e51b815260206004820152601f60248201527f4d61782073656c6c20616d6f756e74207065722054782065786365656465640060448201526064016100e6565b601154156107b357612710601154836107a69190610eda565b6107b09190610d2c565b90505b60405181907f946cf2ce5ccac152682786d5f6b2e2dcfd804ab709002314d1d3b7dd2122f837905f90a26107e78183610ef1565b915080156107fa576107fa8430836108b0565b505b305f9081526020819052604081205490505f600a548210158015610834575060a0516001600160a01b0316856001600160a01b031614155b801561085857506001600160a01b0385165f908152600c602052604090205460ff16155b8015610867575060125460ff16155b80156108755750600b5460ff165b9050801561089e576012805460ff19166001179055610893826109d6565b6012805460ff191690555b6108a98585856108b0565b5050505050565b6001600160a01b0383166108da578060025f8282546108cf9190610ec7565b9091555061094a9050565b6001600160a01b0383165f908152602081905260409020548181101561092c5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100e6565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661096657600280548290039055610984565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516109c991815260200190565b60405180910390a3505050565b5f60105411806109e757505f601154115b80156109f257505f81115b15610a7c57610a0081610a7f565b4715610a7c576006546001600160a01b03166108fc610a20600247610d2c565b6040518115909202915f818181858888f19350505050158015610a45573d5f803e3d5ffd5b506007546040516001600160a01b03909116904780156108fc02915f818181858888f193505050501580156103fa573d5f803e3d5ffd5b50565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110610ab257610ab2610f04565b60200260200101906001600160a01b031690816001600160a01b0316815250506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b349190610e9a565b81600181518110610b4757610b47610f04565b60200260200101906001600160a01b031690816001600160a01b03168152505081610b7a30608051610c1160201b60201c565b1015610b9457610b94306080515f19610c3d60201b60201c565b6080516001600160a01b03166318cbafe5835f8430426040518663ffffffff1660e01b8152600401610bca959493929190610f18565b5f604051808303815f875af1158015610be5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c0c9190810190610f89565b505050565b6001600160a01b038083165f908152600160209081526040808320938516835292905220545b92915050565b610c0c83838360016001600160a01b038416610c6e5760405163e602df0560e01b81525f60048201526024016100e6565b6001600160a01b038316610c9757604051634a1406b160e11b81525f60048201526024016100e6565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610d1257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d0991815260200190565b60405180910390a35b50505050565b634e487b7160e01b5f52601160045260245ffd5b5f82610d4657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610d7357607f821691505b602082108103610d9157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c0c57805f5260205f20601f840160051c81016020851015610dbc5750805b601f840160051c820191505b818110156108a9575f8155600101610dc8565b81516001600160401b03811115610df457610df4610d4b565b610e0881610e028454610d5f565b84610d97565b602080601f831160018114610e3b575f8415610e245750858301515b5f19600386901b1c1916600185901b178555610e92565b5f85815260208120601f198616915b82811015610e6957888601518255948401946001909101908401610e4a565b5085821015610e8657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610eaa575f80fd5b81516001600160a01b0381168114610ec0575f80fd5b9392505050565b80820180821115610c3757610c37610d18565b8082028115828204841417610c3757610c37610d18565b81810381811115610c3757610c37610d18565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015610f685784516001600160a01b031683529383019391830191600101610f43565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215610f9a575f80fd5b82516001600160401b0380821115610fb0575f80fd5b818501915085601f830112610fc3575f80fd5b815181811115610fd557610fd5610d4b565b8060051b604051601f19603f83011681018181108582111715610ffa57610ffa610d4b565b604052918252848201925083810185019188831115611017575f80fd5b938501935b828510156110355784518452938501939285019261101c565b98975050505050505050565b60805160a05161246c6110b65f395f81816105d3015281816115fa015281816116720152818161175801528181611804015281816118ba01526119d301525f81816102b6015281816115be0152818161163601528181611cf301528181611dab01528181611ddb0152611e18015261246c5ff3fe608060405260043610610241575f3560e01c806389daf79911610134578063cbe2de71116100b3578063e39111ab11610078578063e39111ab1461067d578063ec44acf21461069c578063f26a9816146106b5578063f2fde38b146106d4578063f9f92be4146106f3578063fba62f5e14610721575f80fd5b8063cbe2de71146105f5578063cc1776d314610614578063d3f6a1571461062a578063dd62ed3e14610649578063e2f4560514610668575f80fd5b8063a9059cbb116100f9578063a9059cbb14610550578063aa4bde281461056f578063afa4f3b214610584578063c345c4d5146105a3578063c816841b146105c2575f80fd5b806389daf799146104cd5780638a8c523c146104ec5780638da5cb5b14610500578063935eb35f1461051d57806395d89b411461053c575f80fd5b80633d8f0453116101c057806370a082311161018557806370a082311461043d578063715018a6146104715780637a9590761461048557806382bf293c1461049957806385b27c85146104b8575f80fd5b80633d8f0453146103b557806346469afb146103d45780634f7041a5146103e95780635b58741b146103ff5780636eb3a90f1461041e575f80fd5b80631bff7898116102065780631bff78981461032457806323b872dd1461033957806327b07d7514610358578063313ce5671461038657806333096098146103a1575f80fd5b806306fdde031461024c578063095ea7b3146102765780631694505e146102a557806317700f01146102f057806318160ddd14610306575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b50610260610740565b60405161026d9190611e97565b60405180910390f35b348015610281575f80fd5b50610295610290366004611ee0565b6107d0565b604051901515815260200161026d565b3480156102b0575f80fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026d565b3480156102fb575f80fd5b506103046107e9565b005b348015610311575f80fd5b506002545b60405190815260200161026d565b34801561032f575f80fd5b5061031660115481565b348015610344575f80fd5b50610295610353366004611f0a565b610825565b348015610363575f80fd5b50610295610372366004611f48565b600c6020525f908152604090205460ff1681565b348015610391575f80fd5b506040516012815260200161026d565b3480156103ac575f80fd5b50610304610848565b3480156103c0575f80fd5b506103046103cf366004611f6a565b6108b6565b3480156103df575f80fd5b5061031660105481565b3480156103f4575f80fd5b50600e546103169081565b34801561040a575f80fd5b50610304610419366004611fb6565b6109b7565b348015610429575f80fd5b50610304610438366004611f48565b610a3f565b348015610448575f80fd5b50610316610457366004611f48565b6001600160a01b03165f9081526020819052604090205490565b34801561047c575f80fd5b50610304610b18565b348015610490575f80fd5b50610304610b32565b3480156104a4575f80fd5b506103046104b3366004611fed565b610b97565b3480156104c3575f80fd5b5061031660085481565b3480156104d8575f80fd5b506103046104e7366004612004565b610c31565b3480156104f7575f80fd5b50610304610ca2565b34801561050b575f80fd5b506005546001600160a01b03166102d8565b348015610528575f80fd5b50610304610537366004612004565b610ce1565b348015610547575f80fd5b50610260610dfa565b34801561055b575f80fd5b5061029561056a366004611ee0565b610e09565b34801561057a575f80fd5b5061031660095481565b34801561058f575f80fd5b5061030461059e366004611fed565b610e16565b3480156105ae575f80fd5b506103046105bd366004611f48565b610e7b565b3480156105cd575f80fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b348015610600575f80fd5b506007546102d8906001600160a01b031681565b34801561061f575f80fd5b50600f546103169081565b348015610635575f80fd5b50610304610644366004612073565b610fc0565b348015610654575f80fd5b50610316610663366004612073565b6110c4565b348015610673575f80fd5b50610316600a5481565b348015610688575f80fd5b506006546102d8906001600160a01b031681565b3480156106a7575f80fd5b50600b546102959060ff1681565b3480156106c0575f80fd5b506103046106cf366004611fed565b6110ee565b3480156106df575f80fd5b506103046106ee366004611f48565b61117e565b3480156106fe575f80fd5b5061029561070d366004611f48565b600d6020525f908152604090205460ff1681565b34801561072c575f80fd5b5061030461073b366004611f48565b6111ef565b60606003805461074f9061209f565b80601f016020809104026020016040519081016040528092919081815260200182805461077b9061209f565b80156107c65780601f1061079d576101008083540402835291602001916107c6565b820191905f5260205f20905b8154815290600101906020018083116107a957829003601f168201915b5050505050905090565b5f336107dd8185856112c8565b60019150505b92915050565b6107f16112d5565b600b805460ff191690556040517f822119f1d1dbfeb2dca7218674b3bfc8047a99f0149d5812b12daae7a2f62712905f90a1565b5f33610832858285611302565b61083d858585611365565b506001949350505050565b6006546001600160a01b0316331461087b5760405162461bcd60e51b8152600401610872906120d7565b60405180910390fd5b600680546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600e819055601055565b6006546001600160a01b03163314806108d957506007546001600160a01b031633145b6108f55760405162461bcd60e51b81526004016108729061211f565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284915f9183169063a9059cbb906044016020604051808303815f875af1158015610945573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109699190612166565b9050806109b05760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610872565b5050505050565b6109bf6112d5565b6001600160a01b038216610a155760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74206d757374206e6f74206265203078302061646472657373006044820152606401610872565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b6006546001600160a01b03163314610a695760405162461bcd60e51b8152600401610872906120d7565b6001600160a01b038116610a8f5760405162461bcd60e51b815260040161087290612181565b600680546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa050811319190a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b610b206112d5565b610b28610ca2565b610b306113c2565b565b6007546001600160a01b03163314610b5c5760405162461bcd60e51b8152600401610872906121c9565b600780546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600f819055601155565b610b9f6112d5565b60018110158015610bb257508061271010155b610c085760405162461bcd60e51b815260206004820152602160248201527f4d61782077616c6c657420616d6f756e74206973206f7574206f662072616e676044820152606560f81b6064820152608401610872565b612710610c21826b033b2e3c9fd0803ce8000000612225565b610c2b919061223c565b60095550565b610c396112d5565b5f5b81811015610c9d575f600d5f858585818110610c5957610c5961225b565b9050602002016020810190610c6e9190611f48565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610c3b565b505050565b610caa6112d5565b600b805460ff191660011790556040517fa62ccc2c5bc0b8eb49b01f78e5ca0c296b739ecac1c21b7b74793559450bf45a905f90a1565b610ce96112d5565b5f5b81811015610c9d57600c5f848484818110610d0857610d0861225b565b9050602002016020810190610d1d9190611f48565b6001600160a01b0316815260208101919091526040015f205460ff1615610d9f5760405162461bcd60e51b815260206004820152603060248201527f41646472657373206973206578636c756465642066726f6d2074617865732c2060448201526f18d85b9b9bdd08189b1858dadb1a5cdd60821b6064820152608401610872565b6001600d5f858585818110610db657610db661225b565b9050602002016020810190610dcb9190611f48565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610ceb565b60606004805461074f9061209f565b5f336107dd818585611365565b610e1e6112d5565b683635c9adc5dea000008111610e765760405162461bcd60e51b815260206004820152601f60248201527f4d696e696d756d206f66203130303020746f6b656e73207265717569726564006044820152606401610872565b600a55565b6006546001600160a01b0316331480610e9e57506007546001600160a01b031633145b610eba5760405162461bcd60e51b81526004016108729061211f565b6001600160a01b038116610f105760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574206d757374206e6f7420626520307830206164647265737300006044820152606401610872565b4780610f535760405162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903a3930b739b332b960711b6044820152606401610872565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610f86573d5f803e3d5ffd5b5060405181906001600160a01b038416907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c9905f90a35050565b610fc86112d5565b6001600160a01b038216610fee5760405162461bcd60e51b815260040161087290612181565b6001600160a01b0381166110145760405162461bcd60e51b81526004016108729061226f565b6006546040516001600160a01b038085169216907fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa05081131905f90a3600680546001600160a01b0319166001600160a01b03848116919091179091556007546040518383169291909116907f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d905f90a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6110f66112d5565b6001811015801561110957508061271010155b6111555760405162461bcd60e51b815260206004820152601e60248201527f4d617820616d6f756e7420706572205458206f7574206f662072616e676500006044820152606401610872565b61271061116e826b033b2e3c9fd0803ce8000000612225565b611178919061223c565b60085550565b6111866112d5565b5f600c5f61119c6005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790556111cc816113d3565b6001600160a01b03165f908152600c60205260409020805460ff19166001179055565b6007546001600160a01b031633146112195760405162461bcd60e51b8152600401610872906121c9565b6001600160a01b03811661123f5760405162461bcd60e51b81526004016108729061226f565b600780546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d9190a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610c9d8383836001611410565b6005546001600160a01b03163314610b305760405163118cdaa760e01b8152336004820152602401610872565b5f61130d84846110c4565b90505f19811461135f578181101561135157604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610872565b61135f84848484035f611410565b50505050565b6001600160a01b03831661138e57604051634b637e8f60e11b81525f6004820152602401610872565b6001600160a01b0382166113b75760405163ec442f0560e01b81525f6004820152602401610872565b610c9d8383836114e2565b6113ca6112d5565b610b305f611a7d565b6113db6112d5565b6001600160a01b03811661140457604051631e4fbdf760e01b81525f6004820152602401610872565b61140d81611a7d565b50565b6001600160a01b0384166114395760405163e602df0560e01b81525f6004820152602401610872565b6001600160a01b03831661146257604051634a1406b160e11b81525f6004820152602401610872565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561135f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114d491815260200190565b60405180910390a350505050565b6001600160a01b0383165f908152600d602052604090205460ff168061151f57506001600160a01b0382165f908152600d602052604090205460ff165b1561156c5760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320626c61636b6c69737465642c2061626f7274696e676044820152606401610872565b600b5460ff168061159457506001600160a01b0383165f908152600c602052604090205460ff165b806115b657506001600160a01b0382165f908152600c602052604090205460ff165b8061162e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614801561162e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b806116a657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480156116a657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b6117045760405162461bcd60e51b815260206004820152602960248201527f54726164696e672064697361626c65642c206f6e6c79206f776e65722063616e604482015268103a3930b739b332b960b91b6064820152608401610872565b6001600160a01b0383165f908152600c602052604090205460ff168061174157506001600160a01b0382165f908152600c602052604090205460ff165b1580156117505750600b5460ff165b156119b2575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611802576009546001600160a01b0384165f908152602081905260409020546117b490846122b7565b11156118025760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c65742072656163686564000000006044820152606401610872565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036118b85760085482111561188d5760405162461bcd60e51b815260206004820152601e60248201527f4d61782062757920616d6f756e742070657220547820657863656564656400006044820152606401610872565b601054156118b357612710601054836118a69190612225565b6118b0919061223c565b90505b611969565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031603611969576008548211156119435760405162461bcd60e51b815260206004820152601f60248201527f4d61782073656c6c20616d6f756e7420706572205478206578636565646564006044820152606401610872565b60115415611969576127106011548361195c9190612225565b611966919061223c565b90505b60405181907f946cf2ce5ccac152682786d5f6b2e2dcfd804ab709002314d1d3b7dd2122f837905f90a261199d81836122ca565b915080156119b0576119b0843083611ace565b505b305f9081526020819052604081205490505f600a548210158015611a0857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611a2c57506001600160a01b0385165f908152600c602052604090205460ff16155b8015611a3b575060125460ff16155b8015611a495750600b5460ff165b90508015611a72576012805460ff19166001179055611a6782611bf4565b6012805460ff191690555b6109b0858585611ace565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611af8578060025f828254611aed91906122b7565b90915550611b689050565b6001600160a01b0383165f9081526020819052604090205481811015611b4a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610872565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b8457600280548290039055611ba2565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be791815260200190565b60405180910390a3505050565b5f6010541180611c0557505f601154115b8015611c1057505f81115b1561140d57611c1e81611c9e565b471561140d576006546001600160a01b03166108fc611c3e60024761223c565b6040518115909202915f818181858888f19350505050158015611c63573d5f803e3d5ffd5b506007546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611c9a573d5f803e3d5ffd5b5050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611cd157611cd161225b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7191906122f1565b81600181518110611d8457611d8461225b565b60200260200101906001600160a01b031690816001600160a01b03168152505081611dcf307f00000000000000000000000000000000000000000000000000000000000000006110c4565b1015611e0157611e01307f00000000000000000000000000000000000000000000000000000000000000005f196112c8565b6040516318cbafe560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe590611e559085905f9086903090429060040161230c565b5f604051808303815f875af1158015611e70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c9d919081019061237d565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461140d575f80fd5b5f8060408385031215611ef1575f80fd5b8235611efc81611ecc565b946020939093013593505050565b5f805f60608486031215611f1c575f80fd5b8335611f2781611ecc565b92506020840135611f3781611ecc565b929592945050506040919091013590565b5f60208284031215611f58575f80fd5b8135611f6381611ecc565b9392505050565b5f805f60608486031215611f7c575f80fd5b8335611f8781611ecc565b9250602084013591506040840135611f9e81611ecc565b809150509250925092565b801515811461140d575f80fd5b5f8060408385031215611fc7575f80fd5b8235611fd281611ecc565b91506020830135611fe281611fa9565b809150509250929050565b5f60208284031215611ffd575f80fd5b5035919050565b5f8060208385031215612015575f80fd5b823567ffffffffffffffff8082111561202c575f80fd5b818501915085601f83011261203f575f80fd5b81358181111561204d575f80fd5b8660208260051b8501011115612061575f80fd5b60209290920196919550909350505050565b5f8060408385031215612084575f80fd5b823561208f81611ecc565b91506020830135611fe281611ecc565b600181811c908216806120b357607f821691505b6020821081036120d157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526028908201527f4f6e6c79205461782057616c6c657420312063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b60208082526027908201527f4f6e6c79205461782057616c6c6574732063616e2063616c6c207468697320666040820152663ab731ba34b7b760c91b606082015260800190565b5f60208284031215612176575f80fd5b8151611f6381611fa9565b60208082526028908201527f4e6577205461782057616c6c65742031206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b60208082526028908201527f4f6e6c79205461782057616c6c657420322063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107e3576107e3612211565b5f8261225657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b60208082526028908201527f4e6577205461782057616c6c65742032206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b808201808211156107e3576107e3612211565b818103818111156107e3576107e3612211565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612301575f80fd5b8151611f6381611ecc565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101561235c5784516001600160a01b031683529383019391830191600101612337565b50506001600160a01b03969096166060850152505050608001529392505050565b5f602080838503121561238e575f80fd5b825167ffffffffffffffff808211156123a5575f80fd5b818501915085601f8301126123b8575f80fd5b8151818111156123ca576123ca6122dd565b8060051b604051601f19603f830116810181811085821117156123ef576123ef6122dd565b60405291825284820192508381018501918883111561240c575f80fd5b938501935b8285101561242a57845184529385019392850192612411565b9897505050505050505056fea2646970667358221220146d85fb3e537fa0ac3aee2147c183955b92295e4180bd0bb938bd70467e2c0564736f6c63430008190033

Deployed Bytecode

0x608060405260043610610241575f3560e01c806389daf79911610134578063cbe2de71116100b3578063e39111ab11610078578063e39111ab1461067d578063ec44acf21461069c578063f26a9816146106b5578063f2fde38b146106d4578063f9f92be4146106f3578063fba62f5e14610721575f80fd5b8063cbe2de71146105f5578063cc1776d314610614578063d3f6a1571461062a578063dd62ed3e14610649578063e2f4560514610668575f80fd5b8063a9059cbb116100f9578063a9059cbb14610550578063aa4bde281461056f578063afa4f3b214610584578063c345c4d5146105a3578063c816841b146105c2575f80fd5b806389daf799146104cd5780638a8c523c146104ec5780638da5cb5b14610500578063935eb35f1461051d57806395d89b411461053c575f80fd5b80633d8f0453116101c057806370a082311161018557806370a082311461043d578063715018a6146104715780637a9590761461048557806382bf293c1461049957806385b27c85146104b8575f80fd5b80633d8f0453146103b557806346469afb146103d45780634f7041a5146103e95780635b58741b146103ff5780636eb3a90f1461041e575f80fd5b80631bff7898116102065780631bff78981461032457806323b872dd1461033957806327b07d7514610358578063313ce5671461038657806333096098146103a1575f80fd5b806306fdde031461024c578063095ea7b3146102765780631694505e146102a557806317700f01146102f057806318160ddd14610306575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b50610260610740565b60405161026d9190611e97565b60405180910390f35b348015610281575f80fd5b50610295610290366004611ee0565b6107d0565b604051901515815260200161026d565b3480156102b0575f80fd5b506102d87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161026d565b3480156102fb575f80fd5b506103046107e9565b005b348015610311575f80fd5b506002545b60405190815260200161026d565b34801561032f575f80fd5b5061031660115481565b348015610344575f80fd5b50610295610353366004611f0a565b610825565b348015610363575f80fd5b50610295610372366004611f48565b600c6020525f908152604090205460ff1681565b348015610391575f80fd5b506040516012815260200161026d565b3480156103ac575f80fd5b50610304610848565b3480156103c0575f80fd5b506103046103cf366004611f6a565b6108b6565b3480156103df575f80fd5b5061031660105481565b3480156103f4575f80fd5b50600e546103169081565b34801561040a575f80fd5b50610304610419366004611fb6565b6109b7565b348015610429575f80fd5b50610304610438366004611f48565b610a3f565b348015610448575f80fd5b50610316610457366004611f48565b6001600160a01b03165f9081526020819052604090205490565b34801561047c575f80fd5b50610304610b18565b348015610490575f80fd5b50610304610b32565b3480156104a4575f80fd5b506103046104b3366004611fed565b610b97565b3480156104c3575f80fd5b5061031660085481565b3480156104d8575f80fd5b506103046104e7366004612004565b610c31565b3480156104f7575f80fd5b50610304610ca2565b34801561050b575f80fd5b506005546001600160a01b03166102d8565b348015610528575f80fd5b50610304610537366004612004565b610ce1565b348015610547575f80fd5b50610260610dfa565b34801561055b575f80fd5b5061029561056a366004611ee0565b610e09565b34801561057a575f80fd5b5061031660095481565b34801561058f575f80fd5b5061030461059e366004611fed565b610e16565b3480156105ae575f80fd5b506103046105bd366004611f48565b610e7b565b3480156105cd575f80fd5b506102d87f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c81565b348015610600575f80fd5b506007546102d8906001600160a01b031681565b34801561061f575f80fd5b50600f546103169081565b348015610635575f80fd5b50610304610644366004612073565b610fc0565b348015610654575f80fd5b50610316610663366004612073565b6110c4565b348015610673575f80fd5b50610316600a5481565b348015610688575f80fd5b506006546102d8906001600160a01b031681565b3480156106a7575f80fd5b50600b546102959060ff1681565b3480156106c0575f80fd5b506103046106cf366004611fed565b6110ee565b3480156106df575f80fd5b506103046106ee366004611f48565b61117e565b3480156106fe575f80fd5b5061029561070d366004611f48565b600d6020525f908152604090205460ff1681565b34801561072c575f80fd5b5061030461073b366004611f48565b6111ef565b60606003805461074f9061209f565b80601f016020809104026020016040519081016040528092919081815260200182805461077b9061209f565b80156107c65780601f1061079d576101008083540402835291602001916107c6565b820191905f5260205f20905b8154815290600101906020018083116107a957829003601f168201915b5050505050905090565b5f336107dd8185856112c8565b60019150505b92915050565b6107f16112d5565b600b805460ff191690556040517f822119f1d1dbfeb2dca7218674b3bfc8047a99f0149d5812b12daae7a2f62712905f90a1565b5f33610832858285611302565b61083d858585611365565b506001949350505050565b6006546001600160a01b0316331461087b5760405162461bcd60e51b8152600401610872906120d7565b60405180910390fd5b600680546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600e819055601055565b6006546001600160a01b03163314806108d957506007546001600160a01b031633145b6108f55760405162461bcd60e51b81526004016108729061211f565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284915f9183169063a9059cbb906044016020604051808303815f875af1158015610945573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109699190612166565b9050806109b05760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610872565b5050505050565b6109bf6112d5565b6001600160a01b038216610a155760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74206d757374206e6f74206265203078302061646472657373006044820152606401610872565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b6006546001600160a01b03163314610a695760405162461bcd60e51b8152600401610872906120d7565b6001600160a01b038116610a8f5760405162461bcd60e51b815260040161087290612181565b600680546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa050811319190a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b610b206112d5565b610b28610ca2565b610b306113c2565b565b6007546001600160a01b03163314610b5c5760405162461bcd60e51b8152600401610872906121c9565b600780546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600f819055601155565b610b9f6112d5565b60018110158015610bb257508061271010155b610c085760405162461bcd60e51b815260206004820152602160248201527f4d61782077616c6c657420616d6f756e74206973206f7574206f662072616e676044820152606560f81b6064820152608401610872565b612710610c21826b033b2e3c9fd0803ce8000000612225565b610c2b919061223c565b60095550565b610c396112d5565b5f5b81811015610c9d575f600d5f858585818110610c5957610c5961225b565b9050602002016020810190610c6e9190611f48565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610c3b565b505050565b610caa6112d5565b600b805460ff191660011790556040517fa62ccc2c5bc0b8eb49b01f78e5ca0c296b739ecac1c21b7b74793559450bf45a905f90a1565b610ce96112d5565b5f5b81811015610c9d57600c5f848484818110610d0857610d0861225b565b9050602002016020810190610d1d9190611f48565b6001600160a01b0316815260208101919091526040015f205460ff1615610d9f5760405162461bcd60e51b815260206004820152603060248201527f41646472657373206973206578636c756465642066726f6d2074617865732c2060448201526f18d85b9b9bdd08189b1858dadb1a5cdd60821b6064820152608401610872565b6001600d5f858585818110610db657610db661225b565b9050602002016020810190610dcb9190611f48565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610ceb565b60606004805461074f9061209f565b5f336107dd818585611365565b610e1e6112d5565b683635c9adc5dea000008111610e765760405162461bcd60e51b815260206004820152601f60248201527f4d696e696d756d206f66203130303020746f6b656e73207265717569726564006044820152606401610872565b600a55565b6006546001600160a01b0316331480610e9e57506007546001600160a01b031633145b610eba5760405162461bcd60e51b81526004016108729061211f565b6001600160a01b038116610f105760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574206d757374206e6f7420626520307830206164647265737300006044820152606401610872565b4780610f535760405162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903a3930b739b332b960711b6044820152606401610872565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610f86573d5f803e3d5ffd5b5060405181906001600160a01b038416907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c9905f90a35050565b610fc86112d5565b6001600160a01b038216610fee5760405162461bcd60e51b815260040161087290612181565b6001600160a01b0381166110145760405162461bcd60e51b81526004016108729061226f565b6006546040516001600160a01b038085169216907fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa05081131905f90a3600680546001600160a01b0319166001600160a01b03848116919091179091556007546040518383169291909116907f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d905f90a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6110f66112d5565b6001811015801561110957508061271010155b6111555760405162461bcd60e51b815260206004820152601e60248201527f4d617820616d6f756e7420706572205458206f7574206f662072616e676500006044820152606401610872565b61271061116e826b033b2e3c9fd0803ce8000000612225565b611178919061223c565b60085550565b6111866112d5565b5f600c5f61119c6005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790556111cc816113d3565b6001600160a01b03165f908152600c60205260409020805460ff19166001179055565b6007546001600160a01b031633146112195760405162461bcd60e51b8152600401610872906121c9565b6001600160a01b03811661123f5760405162461bcd60e51b81526004016108729061226f565b600780546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d9190a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610c9d8383836001611410565b6005546001600160a01b03163314610b305760405163118cdaa760e01b8152336004820152602401610872565b5f61130d84846110c4565b90505f19811461135f578181101561135157604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610872565b61135f84848484035f611410565b50505050565b6001600160a01b03831661138e57604051634b637e8f60e11b81525f6004820152602401610872565b6001600160a01b0382166113b75760405163ec442f0560e01b81525f6004820152602401610872565b610c9d8383836114e2565b6113ca6112d5565b610b305f611a7d565b6113db6112d5565b6001600160a01b03811661140457604051631e4fbdf760e01b81525f6004820152602401610872565b61140d81611a7d565b50565b6001600160a01b0384166114395760405163e602df0560e01b81525f6004820152602401610872565b6001600160a01b03831661146257604051634a1406b160e11b81525f6004820152602401610872565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561135f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114d491815260200190565b60405180910390a350505050565b6001600160a01b0383165f908152600d602052604090205460ff168061151f57506001600160a01b0382165f908152600d602052604090205460ff165b1561156c5760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320626c61636b6c69737465642c2061626f7274696e676044820152606401610872565b600b5460ff168061159457506001600160a01b0383165f908152600c602052604090205460ff165b806115b657506001600160a01b0382165f908152600c602052604090205460ff165b8061162e57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b031614801561162e57507f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c6001600160a01b0316826001600160a01b0316145b806116a657507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b03161480156116a657507f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c6001600160a01b0316836001600160a01b0316145b6117045760405162461bcd60e51b815260206004820152602960248201527f54726164696e672064697361626c65642c206f6e6c79206f776e65722063616e604482015268103a3930b739b332b960b91b6064820152608401610872565b6001600160a01b0383165f908152600c602052604090205460ff168061174157506001600160a01b0382165f908152600c602052604090205460ff165b1580156117505750600b5460ff165b156119b2575f7f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c6001600160a01b0316836001600160a01b031614611802576009546001600160a01b0384165f908152602081905260409020546117b490846122b7565b11156118025760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c65742072656163686564000000006044820152606401610872565b7f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c6001600160a01b0316846001600160a01b0316036118b85760085482111561188d5760405162461bcd60e51b815260206004820152601e60248201527f4d61782062757920616d6f756e742070657220547820657863656564656400006044820152606401610872565b601054156118b357612710601054836118a69190612225565b6118b0919061223c565b90505b611969565b7f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c6001600160a01b0316836001600160a01b031603611969576008548211156119435760405162461bcd60e51b815260206004820152601f60248201527f4d61782073656c6c20616d6f756e7420706572205478206578636565646564006044820152606401610872565b60115415611969576127106011548361195c9190612225565b611966919061223c565b90505b60405181907f946cf2ce5ccac152682786d5f6b2e2dcfd804ab709002314d1d3b7dd2122f837905f90a261199d81836122ca565b915080156119b0576119b0843083611ace565b505b305f9081526020819052604081205490505f600a548210158015611a0857507f0000000000000000000000006d1bf1bad3ad84fec48d8808d752b683cf30c77c6001600160a01b0316856001600160a01b031614155b8015611a2c57506001600160a01b0385165f908152600c602052604090205460ff16155b8015611a3b575060125460ff16155b8015611a495750600b5460ff165b90508015611a72576012805460ff19166001179055611a6782611bf4565b6012805460ff191690555b6109b0858585611ace565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611af8578060025f828254611aed91906122b7565b90915550611b689050565b6001600160a01b0383165f9081526020819052604090205481811015611b4a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610872565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b8457600280548290039055611ba2565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be791815260200190565b60405180910390a3505050565b5f6010541180611c0557505f601154115b8015611c1057505f81115b1561140d57611c1e81611c9e565b471561140d576006546001600160a01b03166108fc611c3e60024761223c565b6040518115909202915f818181858888f19350505050158015611c63573d5f803e3d5ffd5b506007546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611c9a573d5f803e3d5ffd5b5050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611cd157611cd161225b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7191906122f1565b81600181518110611d8457611d8461225b565b60200260200101906001600160a01b031690816001600160a01b03168152505081611dcf307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6110c4565b1015611e0157611e01307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d5f196112c8565b6040516318cbafe560e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16906318cbafe590611e559085905f9086903090429060040161230c565b5f604051808303815f875af1158015611e70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c9d919081019061237d565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461140d575f80fd5b5f8060408385031215611ef1575f80fd5b8235611efc81611ecc565b946020939093013593505050565b5f805f60608486031215611f1c575f80fd5b8335611f2781611ecc565b92506020840135611f3781611ecc565b929592945050506040919091013590565b5f60208284031215611f58575f80fd5b8135611f6381611ecc565b9392505050565b5f805f60608486031215611f7c575f80fd5b8335611f8781611ecc565b9250602084013591506040840135611f9e81611ecc565b809150509250925092565b801515811461140d575f80fd5b5f8060408385031215611fc7575f80fd5b8235611fd281611ecc565b91506020830135611fe281611fa9565b809150509250929050565b5f60208284031215611ffd575f80fd5b5035919050565b5f8060208385031215612015575f80fd5b823567ffffffffffffffff8082111561202c575f80fd5b818501915085601f83011261203f575f80fd5b81358181111561204d575f80fd5b8660208260051b8501011115612061575f80fd5b60209290920196919550909350505050565b5f8060408385031215612084575f80fd5b823561208f81611ecc565b91506020830135611fe281611ecc565b600181811c908216806120b357607f821691505b6020821081036120d157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526028908201527f4f6e6c79205461782057616c6c657420312063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b60208082526027908201527f4f6e6c79205461782057616c6c6574732063616e2063616c6c207468697320666040820152663ab731ba34b7b760c91b606082015260800190565b5f60208284031215612176575f80fd5b8151611f6381611fa9565b60208082526028908201527f4e6577205461782057616c6c65742031206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b60208082526028908201527f4f6e6c79205461782057616c6c657420322063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107e3576107e3612211565b5f8261225657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b60208082526028908201527f4e6577205461782057616c6c65742032206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b808201808211156107e3576107e3612211565b818103818111156107e3576107e3612211565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612301575f80fd5b8151611f6381611ecc565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101561235c5784516001600160a01b031683529383019391830191600101612337565b50506001600160a01b03969096166060850152505050608001529392505050565b5f602080838503121561238e575f80fd5b825167ffffffffffffffff808211156123a5575f80fd5b818501915085601f8301126123b8575f80fd5b8151818111156123ca576123ca6122dd565b8060051b604051601f19603f830116810181811085821117156123ef576123ef6122dd565b60405291825284820192508381018501918883111561240c575f80fd5b938501935b8285101561242a57845184529385019392850192612411565b9897505050505050505056fea2646970667358221220146d85fb3e537fa0ac3aee2147c183955b92295e4180bd0bb938bd70467e2c0564736f6c63430008190033

Deployed Bytecode Sourcemap

23218:15892:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12611:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14945:222;;;;;;;;;;-1:-1:-1;14945:222:0;;;;;:::i;:::-;;:::i;:::-;;;1058:14:1;;1051:22;1033:41;;1021:2;1006:18;14945:222:0;893:187:1;24503:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1273:32:1;;;1255:51;;1243:2;1228:18;24503:49:0;1085:227:1;30171:112:0;;;;;;;;;;;;;:::i;:::-;;13713:99;;;;;;;;;;-1:-1:-1;13792:12:0;;13713:99;;;1463:25:1;;;1451:2;1436:18;13713:99:0;1317:177:1;24430:27:0;;;;;;;;;;;;;;;;15745:283;;;;;;;;;;-1:-1:-1;15745:283:0;;;;;:::i;:::-;;:::i;24050:51::-;;;;;;;;;;-1:-1:-1;24050:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13564:84;;;;;;;;;;-1:-1:-1;13564:84:0;;13638:2;2354:36:1;;2342:2;2327:18;13564:84:0;2212:184:1;31416:205:0;;;;;;;;;;;;;:::i;27633:291::-;;;;;;;;;;-1:-1:-1;27633:291:0;;;;;:::i;:::-;;:::i;24397:26::-;;;;;;;;;;;;;;;;24339:20;;;;;;;;;;-1:-1:-1;24339:20:0;;;;;;28791:208;;;;;;;;;;-1:-1:-1;28791:208:0;;;;;:::i;:::-;;:::i;30433:381::-;;;;;;;;;;-1:-1:-1;30433:381:0;;;;;:::i;:::-;;:::i;13875:118::-;;;;;;;;;;-1:-1:-1;13875:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;13967:18:0;13940:7;13967:18;;;;;;;;;;;;13875:118;29449:125;;;;;;;;;;;;;:::i;31692:207::-;;;;;;;;;;;;;:::i;34123:241::-;;;;;;;;;;-1:-1:-1;34123:241:0;;;;;:::i;:::-;;:::i;23488:47::-;;;;;;;;;;;;;;;;33288:234;;;;;;;;;;-1:-1:-1;33288:234:0;;;;;:::i;:::-;;:::i;30004:107::-;;;;;;;;;;;;;:::i;6019:87::-;;;;;;;;;;-1:-1:-1;6092:6:0;;-1:-1:-1;;;;;6092:6:0;6019:87;;32768:349;;;;;;;;;;-1:-1:-1;32768:349:0;;;;;:::i;:::-;;:::i;12821:95::-;;;;;;;;;;;;;:::i;14198:182::-;;;;;;;;;;-1:-1:-1;14198:182:0;;;;;:::i;:::-;;:::i;23569:48::-;;;;;;;;;;;;;;;;34495:183;;;;;;;;;;-1:-1:-1;34495:183:0;;;;;:::i;:::-;;:::i;28154:337::-;;;;;;;;;;-1:-1:-1;28154:337:0;;;;;:::i;:::-;;:::i;24588:36::-;;;;;;;;;;;;;;;23419:25;;;;;;;;;;-1:-1:-1;23419:25:0;;;;-1:-1:-1;;;;;23419:25:0;;;24366:22;;;;;;;;;;-1:-1:-1;24366:22:0;;;;;;32134:481;;;;;;;;;;-1:-1:-1;32134:481:0;;;;;:::i;:::-;;:::i;14443:183::-;;;;;;;;;;-1:-1:-1;14443:183:0;;;;;:::i;:::-;;:::i;23858:55::-;;;;;;;;;;;;;;;;23343:25;;;;;;;;;;-1:-1:-1;23343:25:0;;;;-1:-1:-1;;;;;23343:25:0;;;23956:19;;;;;;;;;;-1:-1:-1;23956:19:0;;;;;;;;33750:235;;;;;;;;;;-1:-1:-1;33750:235:0;;;;;:::i;:::-;;:::i;29728:217::-;;;;;;;;;;-1:-1:-1;29728:217:0;;;;;:::i;:::-;;:::i;24141:41::-;;;;;;;;;;-1:-1:-1;24141:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30964:379;;;;;;;;;;-1:-1:-1;30964:379:0;;;;;:::i;:::-;;:::i;12611:91::-;12656:13;12689:5;12682:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12611:91;:::o;14945:222::-;15045:4;4242:10;15106:31;4242:10;15122:7;15131:5;15106:8;:31::i;:::-;15155:4;15148:11;;;14945:222;;;;;:::o;30171:112::-;5905:13;:11;:13::i;:::-;30227:7:::1;:15:::0;;-1:-1:-1;;30227:15:0::1;::::0;;30258:17:::1;::::0;::::1;::::0;30237:5:::1;::::0;30258:17:::1;30171:112::o:0;15745:283::-;15866:4;4242:10;15924:37;15940:4;4242:10;15955:5;15924:15;:37::i;:::-;15972:26;15982:4;15988:2;15992:5;15972:9;:26::i;:::-;-1:-1:-1;16016:4:0;;15745:283;-1:-1:-1;;;;15745:283:0:o;31416:205::-;25381:10;;-1:-1:-1;;;;;25381:10:0;25395;25381:24;25373:77;;;;-1:-1:-1;;;25373:77:0;;;;;;;:::i;:::-;;;;;;;;;31501:10:::1;::::0;;-1:-1:-1;;;;;31501:10:0::1;31515:5;31481:31:::0;;;:19:::1;:31;::::0;;;;:39;;-1:-1:-1;;31481:39:0::1;::::0;;31531:25;;-1:-1:-1;;;;;;31531:25:0::1;::::0;;;31567:6:::1;:20:::0;;;31598:11:::1;:15:::0;31416:205::o;27633:291::-;25665:10;;-1:-1:-1;;;;;25665:10:0;25679;25665:24;;:52;;-1:-1:-1;25693:10:0;;-1:-1:-1;;;;;25693:10:0;25707;25693:24;25665:52;25657:104;;;;-1:-1:-1;;;25657:104:0;;;;;;;:::i;:::-;27830:34:::1;::::0;-1:-1:-1;;;27830:34:0;;-1:-1:-1;;;;;6172:32:1;;;27830:34:0::1;::::0;::::1;6154:51:1::0;6221:18;;;6214:34;;;27798:5:0;;27773:16:::1;::::0;27830:19;::::1;::::0;::::1;::::0;6127:18:1;;27830:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27815:49;;27883:7;27875:41;;;::::0;-1:-1:-1;;;27875:41:0;;6711:2:1;27875:41:0::1;::::0;::::1;6693:21:1::0;6750:2;6730:18;;;6723:30;-1:-1:-1;;;6769:18:1;;;6762:51;6830:18;;27875:41:0::1;6509:345:1::0;27875:41:0::1;27762:162;;27633:291:::0;;;:::o;28791:208::-;5905:13;:11;:13::i;:::-;-1:-1:-1;;;;;28887:21:0;::::1;28879:65;;;::::0;-1:-1:-1;;;28879:65:0;;7061:2:1;28879:65:0::1;::::0;::::1;7043:21:1::0;7100:2;7080:18;;;7073:30;7139:33;7119:18;;;7112:61;7190:18;;28879:65:0::1;6859:355:1::0;28879:65:0::1;-1:-1:-1::0;;;;;28955:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;28955:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28791:208::o;30433:381::-;25381:10;;-1:-1:-1;;;;;25381:10:0;25395;25381:24;25373:77;;;;-1:-1:-1;;;25373:77:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30527:29:0;::::1;30519:82;;;;-1:-1:-1::0;;;30519:82:0::1;;;;;;;:::i;:::-;30632:10;::::0;;-1:-1:-1;;;;;30632:10:0;;::::1;30646:5;30612:31:::0;;;:19:::1;:31;::::0;;;;;:39;;-1:-1:-1;;30612:39:0;;::::1;::::0;;;30662:34;;::::1;::::0;;;;;;:41;;;;::::1;30632:10:::0;30662:41:::1;::::0;;;30741:10;;30719:48;;30741:10;::::1;::::0;30719:48:::1;::::0;30646:5;30719:48:::1;30778:10;:26:::0;;-1:-1:-1;;;;;;30778:26:0::1;-1:-1:-1::0;;;;;30778:26:0;;;::::1;::::0;;;::::1;::::0;;30433:381::o;29449:125::-;5905:13;:11;:13::i;:::-;29515:15:::1;:13;:15::i;:::-;29541:25;:23;:25::i;:::-;29449:125::o:0;31692:207::-;25523:10;;-1:-1:-1;;;;;25523:10:0;25537;25523:24;25515:77;;;;-1:-1:-1;;;25515:77:0;;;;;;;:::i;:::-;31777:10:::1;::::0;;-1:-1:-1;;;;;31777:10:0::1;31791:5;31757:31:::0;;;:19:::1;:31;::::0;;;;:39;;-1:-1:-1;;31757:39:0::1;::::0;;31807:25;;-1:-1:-1;;;;;;31807:25:0::1;::::0;;;31843:7:::1;:21:::0;;;31875:12:::1;:16:::0;31692:207::o;34123:241::-;5905:13;:11;:13::i;:::-;34218:1:::1;34207:7;:12;;:42;;;;;34242:7;23785:5;34223:26;;34207:42;34199:88;;;::::0;-1:-1:-1;;;34199:88:0;;8239:2:1;34199:88:0::1;::::0;::::1;8221:21:1::0;8278:2;8258:18;;;8251:30;8317:34;8297:18;;;8290:62;-1:-1:-1;;;8368:18:1;;;8361:31;8409:19;;34199:88:0::1;8037:397:1::0;34199:88:0::1;23785:5;34317:20;34330:7:::0;23689:20:::1;34317;:::i;:::-;34316:40;;;;:::i;:::-;34298:15;:58:::0;-1:-1:-1;34123:241:0:o;33288:234::-;5905:13;:11;:13::i;:::-;33393:9:::1;33388:127;33408:31:::0;;::::1;33388:127;;;33498:5;33461:9;:34;33471:20;;33492:1;33471:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33461:34:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;33461:34:0;:42;;-1:-1:-1;;33461:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;33441:3:0::1;33388:127;;;;33288:234:::0;;:::o;30004:107::-;5905:13;:11;:13::i;:::-;30057:7:::1;:14:::0;;-1:-1:-1;;30057:14:0::1;30067:4;30057:14;::::0;;30087:16:::1;::::0;::::1;::::0;30057:7:::1;::::0;30087:16:::1;30004:107::o:0;32768:349::-;5905:13;:11;:13::i;:::-;32868:9:::1;32863:247;32883:31:::0;;::::1;32863:247;;;32945:19;:44;32965:20;;32986:1;32965:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32945:44:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32945:44:0;;::::1;;32944:45;32936:106;;;::::0;-1:-1:-1;;;32936:106:0;;9300:2:1;32936:106:0::1;::::0;::::1;9282:21:1::0;9339:2;9319:18;;;9312:30;9378:34;9358:18;;;9351:62;-1:-1:-1;;;9429:18:1;;;9422:46;9485:19;;32936:106:0::1;9098:412:1::0;32936:106:0::1;33094:4;33057:9;:34;33067:20;;33088:1;33067:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33057:34:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;33057:34:0;:41;;-1:-1:-1;;33057:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;32916:3:0::1;32863:247;;12821:95:::0;12868:13;12901:7;12894:14;;;;;:::i;14198:182::-;14267:4;4242:10;14323:27;4242:10;14340:2;14344:5;14323:9;:27::i;34495:183::-;5905:13;:11;:13::i;:::-;34589:7:::1;34580:6;:16;34572:60;;;::::0;-1:-1:-1;;;34572:60:0;;9717:2:1;34572:60:0::1;::::0;::::1;9699:21:1::0;9756:2;9736:18;;;9729:30;9795:33;9775:18;;;9768:61;9846:18;;34572:60:0::1;9515:355:1::0;34572:60:0::1;34643:18;:27:::0;34495:183::o;28154:337::-;25665:10;;-1:-1:-1;;;;;25665:10:0;25679;25665:24;;:52;;-1:-1:-1;25693:10:0;;-1:-1:-1;;;;;25693:10:0;25707;25693:24;25665:52;25657:104;;;;-1:-1:-1;;;25657:104:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28236:20:0;::::1;28228:63;;;::::0;-1:-1:-1;;;28228:63:0;;10077:2:1;28228:63:0::1;::::0;::::1;10059:21:1::0;10116:2;10096:18;;;10089:30;10155:32;10135:18;;;10128:60;10205:18;;28228:63:0::1;9875:354:1::0;28228:63:0::1;28320:21;28360:11:::0;28352:42:::1;;;::::0;-1:-1:-1;;;28352:42:0;;10436:2:1;28352:42:0::1;::::0;::::1;10418:21:1::0;10475:2;10455:18;;;10448:30;-1:-1:-1;;;10494:18:1;;;10487:48;10552:18;;28352:42:0::1;10234:342:1::0;28352:42:0::1;28407:33;::::0;-1:-1:-1;;;;;28407:24:0;::::1;::::0;:33;::::1;;;::::0;28432:7;;28407:33:::1;::::0;;;28432:7;28407:24;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;28456:27:0::1;::::0;28475:7;;-1:-1:-1;;;;;28456:27:0;::::1;::::0;::::1;::::0;;;::::1;28217:274;28154:337:::0;:::o;32134:481::-;5905:13;:11;:13::i;:::-;-1:-1:-1;;;;;32238:29:0;::::1;32230:82;;;;-1:-1:-1::0;;;32230:82:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32331:29:0;::::1;32323:82;;;;-1:-1:-1::0;;;32323:82:0::1;;;;;;;:::i;:::-;32443:10;::::0;32421:48:::1;::::0;-1:-1:-1;;;;;32421:48:0;;::::1;::::0;32443:10:::1;::::0;32421:48:::1;::::0;32443:10:::1;::::0;32421:48:::1;32480:10;:26:::0;;-1:-1:-1;;;;;;32480:26:0::1;-1:-1:-1::0;;;;;32480:26:0;;::::1;::::0;;;::::1;::::0;;;32544:10:::1;::::0;32522:48:::1;::::0;;;::::1;::::0;32544:10;;;::::1;::::0;32522:48:::1;::::0;-1:-1:-1;;32522:48:0::1;32581:10;:26:::0;;-1:-1:-1;;;;;;32581:26:0::1;-1:-1:-1::0;;;;;32581:26:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;32134:481:0:o;14443:183::-;-1:-1:-1;;;;;14591:18:0;;;14559:7;14591:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14443:183::o;33750:235::-;5905:13;:11;:13::i;:::-;33843:1:::1;33832:7;:12;;:42;;;;;33867:7;23785:5;33848:26;;33832:42;33824:85;;;::::0;-1:-1:-1;;;33824:85:0;;11192:2:1;33824:85:0::1;::::0;::::1;11174:21:1::0;11231:2;11211:18;;;11204:30;11270:32;11250:18;;;11243:60;11320:18;;33824:85:0::1;10990:354:1::0;33824:85:0::1;23785:5;33938:20;33951:7:::0;23689:20:::1;33938;:::i;:::-;33937:40;;;;:::i;:::-;33920:14;:57:::0;-1:-1:-1;33750:235:0:o;29728:217::-;5905:13;:11;:13::i;:::-;29841:5:::1;29810:19;:28;29830:7;6092:6:::0;;-1:-1:-1;;;;;6092:6:0;;6019:87;29830:7:::1;-1:-1:-1::0;;;;;29810:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;29810:28:0;:36;;-1:-1:-1;;29810:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29857:33:::1;29881:8:::0;29857:23:::1;:33::i;:::-;-1:-1:-1::0;;;;;29901:29:0::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;29901:36:0::1;29933:4;29901:36;::::0;;29728:217::o;30964:379::-;25523:10;;-1:-1:-1;;;;;25523:10:0;25537;25523:24;25515:77;;;;-1:-1:-1;;;25515:77:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31058:29:0;::::1;31050:82;;;;-1:-1:-1::0;;;31050:82:0::1;;;;;;;:::i;:::-;31163:10;::::0;;-1:-1:-1;;;;;31163:10:0;;::::1;31177:5;31143:31:::0;;;:19:::1;:31;::::0;;;;;:39;;-1:-1:-1;;31143:39:0;;::::1;::::0;;;31193:34;;::::1;::::0;;;;;;:41;;;;::::1;31163:10:::0;31193:41:::1;::::0;;;31272:10;;31250:48;;31272:10;::::1;::::0;31250:48:::1;::::0;31177:5;31250:48:::1;31309:10;:26:::0;;-1:-1:-1;;;;;;31309:26:0::1;-1:-1:-1::0;;;;;31309:26:0;;;::::1;::::0;;;::::1;::::0;;30964:379::o;19907:164::-;20026:37;20035:5;20042:7;20051:5;20058:4;20026:8;:37::i;6184:166::-;6092:6;;-1:-1:-1;;;;;6092:6:0;4242:10;6244:23;6240:103;;6291:40;;-1:-1:-1;;;6291:40:0;;4242:10;6291:40;;;1255:51:1;1228:18;;6291:40:0;1085:227:1;21700:603:0;21834:24;21861:25;21871:5;21878:7;21861:9;:25::i;:::-;21834:52;;-1:-1:-1;;21901:16:0;:37;21897:399;;21978:5;21959:16;:24;21955:214;;;22011:142;;-1:-1:-1;;;22011:142:0;;-1:-1:-1;;;;;11569:32:1;;22011:142:0;;;11551:51:1;11618:18;;;11611:34;;;11661:18;;;11654:34;;;11524:18;;22011:142:0;11349:345:1;21955:214:0;22212:57;22221:5;22228:7;22256:5;22237:16;:24;22263:5;22212:8;:57::i;:::-;21823:480;21700:603;;;:::o;16414:342::-;-1:-1:-1;;;;;16532:18:0;;16528:88;;16574:30;;-1:-1:-1;;;16574:30:0;;16601:1;16574:30;;;1255:51:1;1228:18;;16574:30:0;1085:227:1;16528:88:0;-1:-1:-1;;;;;16630:16:0;;16626:88;;16670:32;;-1:-1:-1;;;16670:32:0;;16699:1;16670:32;;;1255:51:1;1228:18;;16670:32:0;1085:227:1;16626:88:0;16724:24;16732:4;16738:2;16742:5;16724:7;:24::i;6694:103::-;5905:13;:11;:13::i;:::-;6759:30:::1;6786:1;6759:18;:30::i;6952:220::-:0;5905:13;:11;:13::i;:::-;-1:-1:-1;;;;;7037:22:0;::::1;7033:93;;7083:31;::::0;-1:-1:-1;;;7083:31:0;;7111:1:::1;7083:31;::::0;::::1;1255:51:1::0;1228:18;;7083:31:0::1;1085:227:1::0;7033:93:0::1;7136:28;7155:8;7136:18;:28::i;:::-;6952:220:::0;:::o;20922:486::-;-1:-1:-1;;;;;21078:19:0;;21074:91;;21121:32;;-1:-1:-1;;;21121:32:0;;21150:1;21121:32;;;1255:51:1;1228:18;;21121:32:0;1085:227:1;21074:91:0;-1:-1:-1;;;;;21179:21:0;;21175:92;;21224:31;;-1:-1:-1;;;21224:31:0;;21252:1;21224:31;;;1255:51:1;1228:18;;21224:31:0;1085:227:1;21175:92:0;-1:-1:-1;;;;;21277:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;21323:78;;;;21374:7;-1:-1:-1;;;;;21358:31:0;21367:5;-1:-1:-1;;;;;21358:31:0;;21383:5;21358:31;;;;1463:25:1;;1451:2;1436:18;;1317:177;21358:31:0;;;;;;;;20922:486;;;;:::o;34831:2412::-;-1:-1:-1;;;;;35031:15:0;;;;;;:9;:15;;;;;;;;;:32;;-1:-1:-1;;;;;;35050:13:0;;;;;;:9;:13;;;;;;;;35031:32;35029:35;35021:80;;;;-1:-1:-1;;;35021:80:0;;11901:2:1;35021:80:0;;;11883:21:1;;;11920:18;;;11913:30;11979:34;11959:18;;;11952:62;12031:18;;35021:80:0;11699:356:1;35021:80:0;35122:7;;;;;:36;;-1:-1:-1;;;;;;35133:25:0;;;;;;:19;:25;;;;;;;;35122:36;:63;;;-1:-1:-1;;;;;;35162:23:0;;;;;;:19;:23;;;;;;;;35122:63;:132;;;;35216:15;-1:-1:-1;;;;;35200:32:0;:4;-1:-1:-1;;;;;35200:32:0;;:53;;;;;35242:11;-1:-1:-1;;;;;35236:17:0;:2;-1:-1:-1;;;;;35236:17:0;;35200:53;35122:191;;;;35273:15;-1:-1:-1;;;;;35259:30:0;:2;-1:-1:-1;;;;;35259:30:0;;:53;;;;;35301:11;-1:-1:-1;;;;;35293:19:0;:4;-1:-1:-1;;;;;35293:19:0;;35259:53;35114:245;;;;-1:-1:-1;;;35114:245:0;;12262:2:1;35114:245:0;;;12244:21:1;12301:2;12281:18;;;12274:30;12340:34;12320:18;;;12313:62;-1:-1:-1;;;12391:18:1;;;12384:39;12440:19;;35114:245:0;12060:405:1;35114:245:0;-1:-1:-1;;;;;35742:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;35771:23:0;;;;;;:19;:23;;;;;;;;35742:52;35740:55;:66;;;;-1:-1:-1;35799:7:0;;;;35740:66;35736:1000;;;35823:11;35858;-1:-1:-1;;;;;35852:17:0;:2;-1:-1:-1;;;;;35852:17:0;;35849:138;;35923:15;;-1:-1:-1;;;;;13967:18:0;;13940:7;13967:18;;;;;;;;;;;35897:22;;:6;:22;:::i;:::-;:41;;35889:82;;;;-1:-1:-1;;;35889:82:0;;12802:2:1;35889:82:0;;;12784:21:1;12841:2;12821:18;;;12814:30;12880;12860:18;;;12853:58;12928:18;;35889:82:0;12600:352:1;35889:82:0;36013:11;-1:-1:-1;;;;;36005:19:0;:4;-1:-1:-1;;;;;36005:19:0;;36001:535;;36063:14;;36053:6;:24;;36045:67;;;;-1:-1:-1;;;36045:67:0;;13159:2:1;36045:67:0;;;13141:21:1;13198:2;13178:18;;;13171:30;13237:32;13217:18;;;13210:60;13287:18;;36045:67:0;12957:354:1;36045:67:0;36137:11;;:15;36133:110;;23785:5;36193:11;;36184:6;:20;;;;:::i;:::-;36183:40;;;;:::i;:::-;36177:46;;36133:110;36001:535;;;36288:11;-1:-1:-1;;;;;36282:17:0;:2;-1:-1:-1;;;;;36282:17:0;;36278:258;;36338:14;;36328:6;:24;;36320:68;;;;-1:-1:-1;;;36320:68:0;;13518:2:1;36320:68:0;;;13500:21:1;13557:2;13537:18;;;13530:30;13596:33;13576:18;;;13569:61;13647:18;;36320:68:0;13316:355:1;36320:68:0;36413:12;;:16;36409:112;;23785:5;36470:12;;36461:6;:21;;;;:::i;:::-;36460:41;;;;:::i;:::-;36454:47;;36409:112;36556:17;;36569:3;;36556:17;;;;;36609:12;36618:3;36609:6;:12;:::i;:::-;36600:21;-1:-1:-1;36642:7:0;;36638:87;;36670:39;36684:4;36698;36705:3;36670:13;:39::i;:::-;35808:928;35736:1000;36792:4;36748:23;13967:18;;;;;;;;;;;36748:50;;36902:12;36936:18;;36917:15;:37;;:73;;;;;36979:11;-1:-1:-1;;;;;36971:19:0;:4;-1:-1:-1;;;;;36971:19:0;;;36917:73;:103;;;;-1:-1:-1;;;;;;36995:25:0;;;;;;:19;:25;;;;;;;;36994:26;36917:103;:116;;;;-1:-1:-1;37025:8:0;;;;37024:9;36917:116;:127;;;;-1:-1:-1;37037:7:0;;;;36917:127;36902:142;;37061:7;37057:135;;;37085:8;:15;;-1:-1:-1;;37085:15:0;37096:4;37085:15;;;37115:34;37133:15;37115:17;:34::i;:::-;37164:8;:16;;-1:-1:-1;;37164:16:0;;;37057:135;37204:31;37218:4;37224:2;37228:6;37204:13;:31::i;7332:191::-;7425:6;;;-1:-1:-1;;;;;7442:17:0;;;-1:-1:-1;;;;;;7442:17:0;;;;;;;7475:40;;7425:6;;;7442:17;7425:6;;7475:40;;7406:16;;7475:40;7395:128;7332:191;:::o;17080:1169::-;-1:-1:-1;;;;;17204:18:0;;17200:552;;17358:5;17342:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;17200:552:0;;-1:-1:-1;17200:552:0;;-1:-1:-1;;;;;17418:15:0;;17396:19;17418:15;;;;;;;;;;;17452:19;;;17448:117;;;17499:50;;-1:-1:-1;;;17499:50:0;;-1:-1:-1;;;;;11569:32:1;;17499:50:0;;;11551:51:1;11618:18;;;11611:34;;;11661:18;;;11654:34;;;11524:18;;17499:50:0;11349:345:1;17448:117:0;-1:-1:-1;;;;;17688:15:0;;:9;:15;;;;;;;;;;17706:19;;;;17688:37;;17200:552;-1:-1:-1;;;;;17768:16:0;;17764:435;;17934:12;:21;;;;;;;17764:435;;;-1:-1:-1;;;;;18150:13:0;;:9;:13;;;;;;;;;;:22;;;;;;17764:435;18231:2;-1:-1:-1;;;;;18216:25:0;18225:4;-1:-1:-1;;;;;18216:25:0;;18235:5;18216:25;;;;1463::1;;1451:2;1436:18;;1317:177;18216:25:0;;;;;;;;17080:1169;;;:::o;37545:374::-;37626:1;37612:11;;:15;:35;;;;37646:1;37631:12;;:16;37612:35;37611:51;;;;;37661:1;37652:6;:10;37611:51;37607:305;;;37679:18;37690:6;37679:10;:18::i;:::-;37716:21;:25;37712:189;;37770:10;;-1:-1:-1;;;;;37770:10:0;37762:53;37791:23;37813:1;37791:21;:23;:::i;:::-;37762:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37842:10:0;;37834:51;;-1:-1:-1;;;;;37842:10:0;;;;37863:21;37834:51;;;;;37842:10;37834:51;37842:10;37834:51;37863:21;37842:10;37834:51;;;;;;;;;;;;;;;;;;;;;37545:374;:::o;38428:679::-;38567:16;;;38581:1;38567:16;;;;;;;;38543:21;;38567:16;;;;;;;;;;-1:-1:-1;38567:16:0;38543:40;;38612:4;38594;38599:1;38594:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;38594:23:0;;;-1:-1:-1;;;;;38594:23:0;;;;;38638:15;-1:-1:-1;;;;;38638:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38628:4;38633:1;38628:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;38628:32:0;;;-1:-1:-1;;;;;38628:32:0;;;;;38730:6;38677:50;38695:4;38710:15;38677:9;:50::i;:::-;:59;38673:226;;;38753:134;38788:4;38820:15;-1:-1:-1;;38753:8:0;:134::i;:::-;38937:162;;-1:-1:-1;;;38937:162:0;;-1:-1:-1;;;;;38937:15:0;:37;;;;:162;;38989:6;;39010:1;;39026:4;;39053;;39073:15;;38937:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38937:162:0;;;;;;;;;;;;:::i;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:315;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;878:2;863:18;;;;850:32;;-1:-1:-1;;;573:315:1:o;1499:456::-;1576:6;1584;1592;1645:2;1633:9;1624:7;1620:23;1616:32;1613:52;;;1661:1;1658;1651:12;1613:52;1700:9;1687:23;1719:31;1744:5;1719:31;:::i;:::-;1769:5;-1:-1:-1;1826:2:1;1811:18;;1798:32;1839:33;1798:32;1839:33;:::i;:::-;1499:456;;1891:7;;-1:-1:-1;;;1945:2:1;1930:18;;;;1917:32;;1499:456::o;1960:247::-;2019:6;2072:2;2060:9;2051:7;2047:23;2043:32;2040:52;;;2088:1;2085;2078:12;2040:52;2127:9;2114:23;2146:31;2171:5;2146:31;:::i;:::-;2196:5;1960:247;-1:-1:-1;;;1960:247:1:o;2401:456::-;2478:6;2486;2494;2547:2;2535:9;2526:7;2522:23;2518:32;2515:52;;;2563:1;2560;2553:12;2515:52;2602:9;2589:23;2621:31;2646:5;2621:31;:::i;:::-;2671:5;-1:-1:-1;2723:2:1;2708:18;;2695:32;;-1:-1:-1;2779:2:1;2764:18;;2751:32;2792:33;2751:32;2792:33;:::i;:::-;2844:7;2834:17;;;2401:456;;;;;:::o;2862:118::-;2948:5;2941:13;2934:21;2927:5;2924:32;2914:60;;2970:1;2967;2960:12;2985:382;3050:6;3058;3111:2;3099:9;3090:7;3086:23;3082:32;3079:52;;;3127:1;3124;3117:12;3079:52;3166:9;3153:23;3185:31;3210:5;3185:31;:::i;:::-;3235:5;-1:-1:-1;3292:2:1;3277:18;;3264:32;3305:30;3264:32;3305:30;:::i;:::-;3354:7;3344:17;;;2985:382;;;;;:::o;3372:180::-;3431:6;3484:2;3472:9;3463:7;3459:23;3455:32;3452:52;;;3500:1;3497;3490:12;3452:52;-1:-1:-1;3523:23:1;;3372:180;-1:-1:-1;3372:180:1:o;3557:615::-;3643:6;3651;3704:2;3692:9;3683:7;3679:23;3675:32;3672:52;;;3720:1;3717;3710:12;3672:52;3760:9;3747:23;3789:18;3830:2;3822:6;3819:14;3816:34;;;3846:1;3843;3836:12;3816:34;3884:6;3873:9;3869:22;3859:32;;3929:7;3922:4;3918:2;3914:13;3910:27;3900:55;;3951:1;3948;3941:12;3900:55;3991:2;3978:16;4017:2;4009:6;4006:14;4003:34;;;4033:1;4030;4023:12;4003:34;4086:7;4081:2;4071:6;4068:1;4064:14;4060:2;4056:23;4052:32;4049:45;4046:65;;;4107:1;4104;4097:12;4046:65;4138:2;4130:11;;;;;4160:6;;-1:-1:-1;3557:615:1;;-1:-1:-1;;;;3557:615:1:o;4385:388::-;4453:6;4461;4514:2;4502:9;4493:7;4489:23;4485:32;4482:52;;;4530:1;4527;4520:12;4482:52;4569:9;4556:23;4588:31;4613:5;4588:31;:::i;:::-;4638:5;-1:-1:-1;4695:2:1;4680:18;;4667:32;4708:33;4667:32;4708:33;:::i;4778:380::-;4857:1;4853:12;;;;4900;;;4921:61;;4975:4;4967:6;4963:17;4953:27;;4921:61;5028:2;5020:6;5017:14;4997:18;4994:38;4991:161;;5074:10;5069:3;5065:20;5062:1;5055:31;5109:4;5106:1;5099:15;5137:4;5134:1;5127:15;4991:161;;4778:380;;;:::o;5163:404::-;5365:2;5347:21;;;5404:2;5384:18;;;5377:30;5443:34;5438:2;5423:18;;5416:62;-1:-1:-1;;;5509:2:1;5494:18;;5487:38;5557:3;5542:19;;5163:404::o;5572:403::-;5774:2;5756:21;;;5813:2;5793:18;;;5786:30;5852:34;5847:2;5832:18;;5825:62;-1:-1:-1;;;5918:2:1;5903:18;;5896:37;5965:3;5950:19;;5572:403::o;6259:245::-;6326:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:52;;;6395:1;6392;6385:12;6347:52;6427:9;6421:16;6446:28;6468:5;6446:28;:::i;7219:404::-;7421:2;7403:21;;;7460:2;7440:18;;;7433:30;7499:34;7494:2;7479:18;;7472:62;-1:-1:-1;;;7565:2:1;7550:18;;7543:38;7613:3;7598:19;;7219:404::o;7628:::-;7830:2;7812:21;;;7869:2;7849:18;;;7842:30;7908:34;7903:2;7888:18;;7881:62;-1:-1:-1;;;7974:2:1;7959:18;;7952:38;8022:3;8007:19;;7628:404::o;8439:127::-;8500:10;8495:3;8491:20;8488:1;8481:31;8531:4;8528:1;8521:15;8555:4;8552:1;8545:15;8571:168;8644:9;;;8675;;8692:15;;;8686:22;;8672:37;8662:71;;8713:18;;:::i;8744:217::-;8784:1;8810;8800:132;;8854:10;8849:3;8845:20;8842:1;8835:31;8889:4;8886:1;8879:15;8917:4;8914:1;8907:15;8800:132;-1:-1:-1;8946:9:1;;8744:217::o;8966:127::-;9027:10;9022:3;9018:20;9015:1;9008:31;9058:4;9055:1;9048:15;9082:4;9079:1;9072:15;10581:404;10783:2;10765:21;;;10822:2;10802:18;;;10795:30;10861:34;10856:2;10841:18;;10834:62;-1:-1:-1;;;10927:2:1;10912:18;;10905:38;10975:3;10960:19;;10581:404::o;12470:125::-;12535:9;;;12556:10;;;12553:36;;;12569:18;;:::i;13676:128::-;13743:9;;;13764:11;;;13761:37;;;13778:18;;:::i;13809:127::-;13870:10;13865:3;13861:20;13858:1;13851:31;13901:4;13898:1;13891:15;13925:4;13922:1;13915:15;13941:251;14011:6;14064:2;14052:9;14043:7;14039:23;14035:32;14032:52;;;14080:1;14077;14070:12;14032:52;14112:9;14106:16;14131:31;14156:5;14131:31;:::i;14197:980::-;14459:4;14507:3;14496:9;14492:19;14538:6;14527:9;14520:25;14564:2;14602:6;14597:2;14586:9;14582:18;14575:34;14645:3;14640:2;14629:9;14625:18;14618:31;14669:6;14704;14698:13;14735:6;14727;14720:22;14773:3;14762:9;14758:19;14751:26;;14812:2;14804:6;14800:15;14786:29;;14833:1;14843:195;14857:6;14854:1;14851:13;14843:195;;;14922:13;;-1:-1:-1;;;;;14918:39:1;14906:52;;15013:15;;;;14978:12;;;;14954:1;14872:9;14843:195;;;-1:-1:-1;;;;;;;15094:32:1;;;;15089:2;15074:18;;15067:60;-1:-1:-1;;;15158:3:1;15143:19;15136:35;15055:3;14197:980;-1:-1:-1;;;14197:980:1:o;15182:1105::-;15277:6;15308:2;15351;15339:9;15330:7;15326:23;15322:32;15319:52;;;15367:1;15364;15357:12;15319:52;15400:9;15394:16;15429:18;15470:2;15462:6;15459:14;15456:34;;;15486:1;15483;15476:12;15456:34;15524:6;15513:9;15509:22;15499:32;;15569:7;15562:4;15558:2;15554:13;15550:27;15540:55;;15591:1;15588;15581:12;15540:55;15620:2;15614:9;15642:2;15638;15635:10;15632:36;;;15648:18;;:::i;:::-;15694:2;15691:1;15687:10;15726:2;15720:9;15789:2;15785:7;15780:2;15776;15772:11;15768:25;15760:6;15756:38;15844:6;15832:10;15829:22;15824:2;15812:10;15809:18;15806:46;15803:72;;;15855:18;;:::i;:::-;15891:2;15884:22;15941:18;;;15975:15;;;;-1:-1:-1;16017:11:1;;;16013:20;;;16045:19;;;16042:39;;;16077:1;16074;16067:12;16042:39;16101:11;;;;16121:135;16137:6;16132:3;16129:15;16121:135;;;16203:10;;16191:23;;16154:12;;;;16234;;;;16121:135;;;16275:6;15182:1105;-1:-1:-1;;;;;;;;15182:1105:1:o

Swarm Source

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