ETH Price: $2,672.66 (-0.68%)

Token

Joi AI (JOI)
 

Overview

Max Total Supply

1,000,000,000 JOI

Holders

26

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
98,401,774.119733958808642988 JOI

Value
$0.00
0xdbcad7e2e0443494b8081f328f80f544b5df98bb
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Joi

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-03
*/

/**

AI-POWERED VIRTUAL SOULMATE 

JOI: A cutting-edge AI with a virtual girlfriend experience and innovative 'create2earn' mechanics.

Website - https://joi.cool/
Telegram - https://t.me/joi_ai
Twitter - https://twitter.com/JoiAI_token


*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

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

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

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

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

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

        return account.code.length > 0;
    }

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

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

}

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() external 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) external virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

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

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

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

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

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

    function getAmountsIn(
        uint256 amountOut,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);
}

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

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

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

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

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

contract Joi is Context, IERC20, Ownable {
    using Address for address;
    address payable public marketingWallet =
        payable(0x3F4E6D880D7e883282a1E2caF08EF12129255679);

    //Dead Wallet for SAFU Contract
    address public constant deadWallet = address(0xdEaD);
    //Mapping section for better tracking.
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _noFeeWallet;


    event ExcludeStatus(address,bool);
    event UpdateMarketingWallet(address);
    event UpdateTokensToSwap(uint256);
    event UpdateBuyFee(uint256);
    event UpdateSellFee(uint256);
    event TransferStatus(bool);
    event UpdateDistribution(uint256,uint256);
    event RecoveredETH(uint256);
    event RecoveredTokens(uint256);
    event TradingStarted(bool);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);
    //Supply Definition.
    uint256 private _tTotal = 1_000_000_000 ether;
    uint256 private _tFeeTotal;
    //Token Definition.
    string public constant name = "Joi AI";
    string public constant symbol = "JOI";
    uint8 public constant decimals = 18;
    //Taxes Definition.
    uint public buyFee = 0;

    uint256 public sellFee = 2;

    uint256 public marketingTokensCollected = 0;

    uint256 public minimumTokensBeforeSwap = 100_000 ether;

    //Trading Controls added for SAFU Requirements
    bool public tradingEnabled;
    //Router and Pair Configuration.
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address private immutable WETH;
    //Tracking of Automatic Swap vs Manual Swap.
    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _tOwned[_msgSender()] = _tTotal;
        address currentRouter;
        //Adding Variables for all the routers for easier deployment for our customers.
        if (block.chainid == 56) {
            currentRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS Router
            _noFeeWallet[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true;//PinkSale Lock
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
            _noFeeWallet[0x5E5b9bE5fd939c578ABE5800a90C566eeEbA44a5] = true;//PinkSale Lock
        } else if (block.chainid == 43114) {
            currentRouter = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4; //Avax Mainnet
        } else if (block.chainid == 137) {
            currentRouter = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; //Polygon Ropsten
        } else if (block.chainid == 6066) {
            currentRouter = 0x4169Db906fcBFB8b12DbD20d98850Aee05B7D889; //Tres Leches Chain
        } else if (block.chainid == 250) {
            currentRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; //SpookySwap FTM
        } else if (block.chainid == 42161) {
            currentRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506; //Arbitrum Sushi
            _noFeeWallet[0xeBb415084Ce323338CFD3174162964CC23753dFD] = true;//PinkSale Lock
        } else if (block.chainid == 1 || block.chainid == 5) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
            _noFeeWallet[0x71B5759d73262FBb223956913ecF4ecC51057641] = true;//PinkSale Lock
        } else {
            revert("You're not Blade");
        }

        //End of Router Variables.
        //Create Pair in the contructor, this may fail on some blockchains and can be done in a separate line if needed.
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(currentRouter);
        WETH = _uniswapV2Router.WETH();
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), WETH);
        uniswapV2Router = _uniswapV2Router;
        _noFeeWallet[owner()] = true;
        _noFeeWallet[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    //Readable Functions.
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }


    function balanceOf(address account) public view override returns (uint256) {
        return _tOwned[account];
    }

    //ERC 20 Standard Transfer Functions
    function transfer(
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    //ERC 20 Standard Allowance Function
    //updated _owner to owner_ as requested by audit.
    function allowance(
        address owner_,
        address spender
    ) external  view override returns (uint256) {
        return _allowances[owner_][spender];
    }

    //ERC 20 Standard Approve Function
    function approve(
        address spender,
        uint256 amount
    ) external  override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    //ERC 20 Standard Transfer From
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        uint currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    //ERC 20 Standard increase Allowance
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    //ERC 20 Standard decrease Allowance
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] - subtractedValue
        );
        return true;
    }

    //Approve Function
    function _approve(address _owner, address spender, uint256 amount) private {
        require(_owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    //Transfer function, validate correct wallet structure, take fees, and other custom taxes are done during the transfer.
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            _tOwned[from] >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        require(tradingEnabled || _noFeeWallet[from] || _noFeeWallet[to], "Trading not yet enabled!");

        //Adding logic for automatic swap.
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;
        uint fee = 0;
        //if any account belongs to _noFeeWallet account then remove the fee
        if (
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            overMinimumTokenBalance &&
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify();
        }
        if (to == uniswapV2Pair && !_noFeeWallet[from]) {
            fee = (sellFee * amount) / 100;
        }
        if (from == uniswapV2Pair && !_noFeeWallet[to]) {
            fee = (buyFee * amount) / 100;
        }
        amount -= fee;
        if (fee > 0) {
            _tokenTransfer(from, address(this), fee);
            marketingTokensCollected += fee;
        }
        _tokenTransfer(from, to, amount);
    }

    //Swap Tokens for eth or to add liquidity either automatically or manual, by default this is set to manual.
    //Corrected newBalance bug, it sending eth to wallet and any remaining is on contract and can be recoverred.
    function swapAndLiquify() private lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        swapTokensForEth(totalTokens);
        uint ethBalance = address(this).balance;

        transferToAddressETH(marketingWallet, ethBalance);

        marketingTokensCollected = 0;
    }

    //swap for eth is to support the converstion of tokens to weth during swapandliquify this is a supporting function
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

        emit SwapTokensForETH(tokenAmount, path);
    }

    //ERC 20 standard transfer, only added if taking fees to countup the amount of fees for better tracking and split purpose.
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        _tOwned[sender] -= amount;
        _tOwned[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _noFeeWallet[account];
    }

    //exclude wallets from fees, this is needed for launch or other contracts.
    //changed _isExcludedFromFee to NoFeeWallet, attempting to adddress Whiteliste Detection Issue.
    function setNoFeeWallets(address account, bool status) external onlyOwner {
        require(_noFeeWallet[account] != status, "The wallet already have that status.");
        _noFeeWallet[account] = status;
        emit ExcludeStatus(account,status);
				   
		  
    }
    //Automatic Swap Configuration.
    function setTokensToSwap(
        uint256 _minimumTokensBeforeSwap
    ) external onlyOwner {
        require(
            _minimumTokensBeforeSwap >= 100 ether,
            "You need to enter more than 100 tokens."
        );
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
        emit UpdateTokensToSwap(_minimumTokensBeforeSwap);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        require(swapAndLiquifyEnabled != _enabled, "Value already set");
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //set a new marketing wallet.
    function setMarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != address(0), "setmarketingWallet: ZERO");
        marketingWallet = payable(_marketingWallet);
        emit UpdateMarketingWallet(_marketingWallet);
    }

    function setBuyFee(uint256 _buyFee) external onlyOwner {
        require(_buyFee <= 10, "Buy Fee cannot be more than 10%");
        buyFee = _buyFee;
        emit UpdateBuyFee(_buyFee);
    }

    function setSellFee(uint256 _sellFee) external onlyOwner {
        require(_sellFee <= 10, "Sell Fee cannot be more than 10%");
        sellFee = _sellFee;
        emit UpdateSellFee(_sellFee);
    }

    function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        (bool succ, ) = recipient.call{value: amount}("");
        require(succ, "Transfer failed.");
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    /////---fallback--////
    //This cannot be removed as is a fallback to the swapAndLiquify
    event SwapETHForTokens(uint256 amountIn, address[] path);

    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);
        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            deadWallet, // Burn address
            block.timestamp + 300
        );
        emit SwapETHForTokens(amount, path);
    }

    // Withdraw ETH that's potentially stuck in the Contract
    function recoverETHfromContract() external onlyOwner {
        uint ethBalance = address(this).balance;
        (bool succ, ) = payable(marketingWallet).call{value: ethBalance}("");
        require(succ, "Transfer failed");
        emit TransferStatus(succ);
        emit RecoveredETH(ethBalance);
    }

    // Withdraw ERC20 tokens that are potentially stuck in Contract
    function recoverTokensFromContract(
        address _tokenAddress,
        uint256 _amount
    ) external onlyOwner {
        require(
            _tokenAddress != address(this),
            "Owner can't claim contract's balance of its own tokens"
        );
        bool succ = IERC20(_tokenAddress).transfer(marketingWallet, _amount);
        require(succ, "Transfer failed");
        emit TransferStatus(succ);
        emit RecoveredTokens(_amount);
    }
        //Trading Controls for SAFU Contract
        function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        swapAndLiquifyEnabled = true;
        emit TradingStarted(true);
        emit SwapAndLiquifyEnabledUpdated(true);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"ExcludeStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"RecoveredETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"RecoveredTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"TradingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"TransferStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateBuyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateSellFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UpdateTokensToSwap","type":"event"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","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":[],"name":"recoverETHfromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setNoFeeWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052733f4e6d880d7e883282a1e2caf08ef12129255679600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506b033b2e3c9fd0803ce800000060055560006007556002600855600060095569152d02c7e14af6800000600a556000600b60026101000a81548160ff021916908315150217905550348015620000ae57600080fd5b50620000cf620000c3620007a160201b60201c565b620007a960201b60201c565b60055460026000620000e6620007a160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060384603620001b8577310ed43c718714eb63d5aa57b78b54704e256024e905060016004600073407993575c91ce7643a4d4ccacc9a98c36ee1bbe73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200045a565b606146036200024a5773d99d1c33f9fc3444f8101754abc46c52416550d19050600160046000735e5b9be5fd939c578abe5800a90c566eeeba44a573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000459565b61a86a460362000271577360ae616a2155ee3d9a68541ba4544862310933d4905062000458565b60894603620002975773a5e0829caced8ffdd4de3c43696c57f7d7a678ff905062000457565b6117b24603620002be57734169db906fcbfb8b12dbd20d98850aee05b7d889905062000456565b60fa4603620002e45773f491e7b69e4244ad4002bc14e878a34207e38c29905062000455565b61a4b146036200037757731b02da8cb0d097eb8d57a175b88c7d8b47997506905060016004600073ebb415084ce323338cfd3174162964cc23753dfd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000454565b6001461480620003875750600546145b156200041657737a250d5630b4cf539739df2c5dacb4c659f2488d90506001600460007371b5759d73262fbb223956913ecf4ecc5105764173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000453565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044a90620008f7565b60405180910390fd5b5b5b5b5b5b5b5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d1919062000983565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000576919062000983565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060c0516040518363ffffffff1660e01b8152600401620005b4929190620009c6565b6020604051808303816000875af1158015620005d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005fa919062000983565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160046000620006776200086d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000730620007a160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60055460405162000791919062000a0e565b60405180910390a3505062000a2b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600082825260208201905092915050565b7f596f75277265206e6f7420426c61646500000000000000000000000000000000600082015250565b6000620008df60108362000896565b9150620008ec82620008a7565b602082019050919050565b600060208201905081810360008301526200091281620008d0565b9050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200094b826200091e565b9050919050565b6200095d816200093e565b81146200096957600080fd5b50565b6000815190506200097d8162000952565b92915050565b6000602082840312156200099c576200099b62000919565b5b6000620009ac848285016200096c565b91505092915050565b620009c0816200093e565b82525050565b6000604082019050620009dd6000830185620009b5565b620009ec6020830184620009b5565b9392505050565b6000819050919050565b62000a0881620009f3565b82525050565b600060208201905062000a256000830184620009fd565b92915050565b60805160a05160c05161360b62000a7e600039600061210c015260008181610bb201528181611baf01528181611c2f0152611cf601526000818161091f0152818161217f01526121a6015261360b6000f3fe6080604052600436106102085760003560e01c80636ca60bc611610118578063a457c2d7116100a0578063d2d7ad831161006f578063d2d7ad8314610756578063dd62ed3e14610781578063e3e715b4146107be578063e6be4a72146107e7578063f2fde38b146108105761020f565b8063a457c2d71461069c578063a9059cbb146106d9578063c49b9a8014610716578063ce831ed51461073f5761020f565b806385141a77116100e757806385141a77146105db5780638a8c523c146106065780638b4cee081461061d5780638da5cb5b1461064657806395d89b41146106715761020f565b80636ca60bc61461053157806370a082311461055c578063715018a61461059957806375f0a874146105b05761020f565b8063313ce5671161019b57806349bd5a5e1161016a57806349bd5a5e1461044a5780634a74bb02146104755780634ada218b146104a05780635342acb4146104cb5780635d098b38146105085761020f565b8063313ce5671461038e57806339509351146103b9578063461d9476146103f6578063470624021461041f5761020f565b806318160ddd116101d757806318160ddd146102d0578063220f6696146102fb57806323b872dd146103265780632b14ca56146103635761020f565b806306fdde0314610214578063095ea7b31461023f5780630cc835a31461027c5780631694505e146102a55761020f565b3661020f57005b600080fd5b34801561022057600080fd5b50610229610839565b60405161023691906123b6565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190612471565b610872565b60405161027391906124cc565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906124e7565b610890565b005b3480156102b157600080fd5b506102ba61091d565b6040516102c79190612573565b60405180910390f35b3480156102dc57600080fd5b506102e5610941565b6040516102f2919061259d565b60405180910390f35b34801561030757600080fd5b5061031061094b565b60405161031d91906124cc565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906125b8565b61095e565b60405161035a91906124cc565b60405180910390f35b34801561036f57600080fd5b50610378610a5e565b604051610385919061259d565b60405180910390f35b34801561039a57600080fd5b506103a3610a64565b6040516103b09190612627565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190612471565b610a69565b6040516103ed91906124cc565b60405180910390f35b34801561040257600080fd5b5061041d600480360381019061041891906124e7565b610b15565b005b34801561042b57600080fd5b50610434610baa565b604051610441919061259d565b60405180910390f35b34801561045657600080fd5b5061045f610bb0565b60405161046c9190612651565b60405180910390f35b34801561048157600080fd5b5061048a610bd4565b60405161049791906124cc565b60405180910390f35b3480156104ac57600080fd5b506104b5610be7565b6040516104c291906124cc565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed919061266c565b610bfa565b6040516104ff91906124cc565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a919061266c565b610c50565b005b34801561053d57600080fd5b50610546610d42565b604051610553919061259d565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e919061266c565b610d48565b604051610590919061259d565b60405180910390f35b3480156105a557600080fd5b506105ae610d91565b005b3480156105bc57600080fd5b506105c5610da5565b6040516105d291906126ba565b60405180910390f35b3480156105e757600080fd5b506105f0610dcb565b6040516105fd9190612651565b60405180910390f35b34801561061257600080fd5b5061061b610dd1565b005b34801561062957600080fd5b50610644600480360381019061063f91906124e7565b610ed1565b005b34801561065257600080fd5b5061065b610f5e565b6040516106689190612651565b60405180910390f35b34801561067d57600080fd5b50610686610f87565b60405161069391906123b6565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190612471565b610fc0565b6040516106d091906124cc565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612471565b61106c565b60405161070d91906124cc565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190612701565b61108a565b005b34801561074b57600080fd5b5061075461113b565b005b34801561076257600080fd5b5061076b611288565b604051610778919061259d565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a3919061272e565b61128e565b6040516107b5919061259d565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e0919061276e565b611315565b005b3480156107f357600080fd5b5061080e60048036038101906108099190612471565b611443565b005b34801561081c57600080fd5b506108376004803603810190610832919061266c565b611610565b005b6040518060400160405280600681526020017f4a6f69204149000000000000000000000000000000000000000000000000000081525081565b600061088661087f611693565b848461169b565b6001905092915050565b610898611864565b600a8111156108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d3906127fa565b60405180910390fd5b806007819055507fa480a3a15a511fbdc37ae77ae3f490e03ab3688adde11456ce779e6c1e0abaa281604051610912919061259d565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600554905090565b600b60019054906101000a900460ff1681565b600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109aa611693565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a219061288c565b60405180910390fd5b610a358585856118e2565b610a5285610a41611693565b8584610a4d91906128db565b61169b565b60019150509392505050565b60085481565b601281565b6000610b0b610a76611693565b848460036000610a84611693565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b06919061290f565b61169b565b6001905092915050565b610b1d611864565b68056bc75e2d63100000811015610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b60906129b5565b60405180910390fd5b80600a819055507f17339d8f3c3323d3df3b092130f1bedb79d8e20de4d3ff176b316e89be357cbe81604051610b9f919061259d565b60405180910390a150565b60075481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b60029054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c58611864565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90612a21565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f081604051610d379190612651565b60405180910390a150565b60095481565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d99611864565b610da36000611e0a565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61dead81565b610dd9611864565b600b60009054906101000a900460ff1615610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090612a8d565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055506001600b60026101000a81548160ff0219169083151502179055507ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a36001604051610e8f91906124cc565b60405180910390a17f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1596001604051610ec791906124cc565b60405180910390a1565b610ed9611864565b600a811115610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490612af9565b60405180910390fd5b806008819055507f7d59573ec4acab62b908b5c1cde109eb12273d011506abaa850256636a42d54a81604051610f53919061259d565b60405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600381526020017f4a4f49000000000000000000000000000000000000000000000000000000000081525081565b6000611062610fcd611693565b848460036000610fdb611693565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461105d91906128db565b61169b565b6001905092915050565b6000611080611079611693565b84846118e2565b6001905092915050565b611092611864565b801515600b60029054906101000a900460ff161515036110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90612b65565b60405180910390fd5b80600b60026101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161113091906124cc565b60405180910390a150565b611143611864565b60004790506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161119090612bb6565b60006040518083038185875af1925050503d80600081146111cd576040519150601f19603f3d011682016040523d82523d6000602084013e6111d2565b606091505b5050905080611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90612c17565b60405180910390fd5b7fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e8160405161124591906124cc565b60405180910390a17ffc3b2917f34bc4fba1516519d275441646d5088542342f58de8eea6a7cb5c2ab8260405161127c919061259d565b60405180910390a15050565b600a5481565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61131d611864565b801515600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690612ca9565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa8282604051611437929190612cc9565b60405180910390a15050565b61144b611864565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090612d64565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611518929190612da5565b6020604051808303816000875af1158015611537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155b9190612de3565b90508061159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490612c17565b60405180910390fd5b7fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e816040516115cc91906124cc565b60405180910390a17f9717b3559fe85dc5c6941748cdc56fc5ca4e06048d7b836c700c174f78369bef82604051611603919061259d565b60405180910390a1505050565b611618611864565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90612e82565b60405180910390fd5b61169081611e0a565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170190612f14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090612fa6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611857919061259d565b60405180910390a3505050565b61186c611693565b73ffffffffffffffffffffffffffffffffffffffff1661188a610f5e565b73ffffffffffffffffffffffffffffffffffffffff16146118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790613012565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611948906130a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b790613136565b60405180910390fd5b60008111611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906131c8565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c9061325a565b60405180910390fd5b600b60009054906101000a900460ff1680611ae95750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80611b3d5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b73906132c6565b60405180910390fd5b6000611b8730610d48565b90506000600a5482101590506000600b60019054906101000a900460ff16158015611bfe57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015611c075750815b8015611c1f5750600b60029054906101000a900460ff165b15611c2d57611c2c611ece565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148015611cd25750600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611cf457606484600854611ce791906132e6565b611cf19190613357565b90505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015611d995750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611dbb57606484600754611dae91906132e6565b611db89190613357565b90505b8084611dc791906128db565b93506000811115611df757611ddd863083611f57565b8060096000828254611def919061290f565b925050819055505b611e02868686611f57565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600b60016101000a81548160ff0219169083151502179055506000611ef430610d48565b9050611eff8161206d565b6000479050611f30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612275565b600060098190555050506000600b60016101000a81548160ff021916908315150217905550565b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa691906128db565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffc919061290f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612060919061259d565b60405180910390a3505050565b6000600267ffffffffffffffff81111561208a57612089613388565b5b6040519080825280602002602001820160405280156120b85781602001602082028036833780820191505090505b50905030816000815181106120d0576120cf6133b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061213f5761213e6133b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506121a4307f00000000000000000000000000000000000000000000000000000000000000008461169b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016122069594939291906134df565b600060405180830381600087803b15801561222057600080fd5b505af1158015612234573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612269929190613539565b60405180910390a15050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161229b90612bb6565b60006040518083038185875af1925050503d80600081146122d8576040519150601f19603f3d011682016040523d82523d6000602084013e6122dd565b606091505b5050905080612321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612318906135b5565b60405180910390fd5b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612360578082015181840152602081019050612345565b60008484015250505050565b6000601f19601f8301169050919050565b600061238882612326565b6123928185612331565b93506123a2818560208601612342565b6123ab8161236c565b840191505092915050565b600060208201905081810360008301526123d0818461237d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612408826123dd565b9050919050565b612418816123fd565b811461242357600080fd5b50565b6000813590506124358161240f565b92915050565b6000819050919050565b61244e8161243b565b811461245957600080fd5b50565b60008135905061246b81612445565b92915050565b60008060408385031215612488576124876123d8565b5b600061249685828601612426565b92505060206124a78582860161245c565b9150509250929050565b60008115159050919050565b6124c6816124b1565b82525050565b60006020820190506124e160008301846124bd565b92915050565b6000602082840312156124fd576124fc6123d8565b5b600061250b8482850161245c565b91505092915050565b6000819050919050565b600061253961253461252f846123dd565b612514565b6123dd565b9050919050565b600061254b8261251e565b9050919050565b600061255d82612540565b9050919050565b61256d81612552565b82525050565b60006020820190506125886000830184612564565b92915050565b6125978161243b565b82525050565b60006020820190506125b2600083018461258e565b92915050565b6000806000606084860312156125d1576125d06123d8565b5b60006125df86828701612426565b93505060206125f086828701612426565b92505060406126018682870161245c565b9150509250925092565b600060ff82169050919050565b6126218161260b565b82525050565b600060208201905061263c6000830184612618565b92915050565b61264b816123fd565b82525050565b60006020820190506126666000830184612642565b92915050565b600060208284031215612682576126816123d8565b5b600061269084828501612426565b91505092915050565b60006126a4826123dd565b9050919050565b6126b481612699565b82525050565b60006020820190506126cf60008301846126ab565b92915050565b6126de816124b1565b81146126e957600080fd5b50565b6000813590506126fb816126d5565b92915050565b600060208284031215612717576127166123d8565b5b6000612725848285016126ec565b91505092915050565b60008060408385031215612745576127446123d8565b5b600061275385828601612426565b925050602061276485828601612426565b9150509250929050565b60008060408385031215612785576127846123d8565b5b600061279385828601612426565b92505060206127a4858286016126ec565b9150509250929050565b7f427579204665652063616e6e6f74206265206d6f7265207468616e2031302500600082015250565b60006127e4601f83612331565b91506127ef826127ae565b602082019050919050565b60006020820190508181036000830152612813816127d7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612876602883612331565b91506128818261281a565b604082019050919050565b600060208201905081810360008301526128a581612869565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006128e68261243b565b91506128f18361243b565b9250828203905081811115612909576129086128ac565b5b92915050565b600061291a8261243b565b91506129258361243b565b925082820190508082111561293d5761293c6128ac565b5b92915050565b7f596f75206e65656420746f20656e746572206d6f7265207468616e203130302060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b600061299f602783612331565b91506129aa82612943565b604082019050919050565b600060208201905081810360008301526129ce81612992565b9050919050565b7f7365746d61726b6574696e6757616c6c65743a205a45524f0000000000000000600082015250565b6000612a0b601883612331565b9150612a16826129d5565b602082019050919050565b60006020820190508181036000830152612a3a816129fe565b9050919050565b7f54726164696e6720616c726561647920656e61626c65642e0000000000000000600082015250565b6000612a77601883612331565b9150612a8282612a41565b602082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f53656c6c204665652063616e6e6f74206265206d6f7265207468616e20313025600082015250565b6000612ae3602083612331565b9150612aee82612aad565b602082019050919050565b60006020820190508181036000830152612b1281612ad6565b9050919050565b7f56616c756520616c726561647920736574000000000000000000000000000000600082015250565b6000612b4f601183612331565b9150612b5a82612b19565b602082019050919050565b60006020820190508181036000830152612b7e81612b42565b9050919050565b600081905092915050565b50565b6000612ba0600083612b85565b9150612bab82612b90565b600082019050919050565b6000612bc182612b93565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000612c01600f83612331565b9150612c0c82612bcb565b602082019050919050565b60006020820190508181036000830152612c3081612bf4565b9050919050565b7f5468652077616c6c657420616c7265616479206861766520746861742073746160008201527f7475732e00000000000000000000000000000000000000000000000000000000602082015250565b6000612c93602483612331565b9150612c9e82612c37565b604082019050919050565b60006020820190508181036000830152612cc281612c86565b9050919050565b6000604082019050612cde6000830185612642565b612ceb60208301846124bd565b9392505050565b7f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c60008201527f616e6365206f6620697473206f776e20746f6b656e7300000000000000000000602082015250565b6000612d4e603683612331565b9150612d5982612cf2565b604082019050919050565b60006020820190508181036000830152612d7d81612d41565b9050919050565b6000612d8f82612540565b9050919050565b612d9f81612d84565b82525050565b6000604082019050612dba6000830185612d96565b612dc7602083018461258e565b9392505050565b600081519050612ddd816126d5565b92915050565b600060208284031215612df957612df86123d8565b5b6000612e0784828501612dce565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612e6c602683612331565b9150612e7782612e10565b604082019050919050565b60006020820190508181036000830152612e9b81612e5f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612efe602483612331565b9150612f0982612ea2565b604082019050919050565b60006020820190508181036000830152612f2d81612ef1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f90602283612331565b9150612f9b82612f34565b604082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ffc602083612331565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061308e602583612331565b915061309982613032565b604082019050919050565b600060208201905081810360008301526130bd81613081565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613120602383612331565b915061312b826130c4565b604082019050919050565b6000602082019050818103600083015261314f81613113565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006131b2602983612331565b91506131bd82613156565b604082019050919050565b600060208201905081810360008301526131e1816131a5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613244602683612331565b915061324f826131e8565b604082019050919050565b6000602082019050818103600083015261327381613237565b9050919050565b7f54726164696e67206e6f742079657420656e61626c6564210000000000000000600082015250565b60006132b0601883612331565b91506132bb8261327a565b602082019050919050565b600060208201905081810360008301526132df816132a3565b9050919050565b60006132f18261243b565b91506132fc8361243b565b925082820261330a8161243b565b91508282048414831517613321576133206128ac565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133628261243b565b915061336d8361243b565b92508261337d5761337c613328565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061340b613406613401846133e6565b612514565b61243b565b9050919050565b61341b816133f0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613456816123fd565b82525050565b6000613468838361344d565b60208301905092915050565b6000602082019050919050565b600061348c82613421565b613496818561342c565b93506134a18361343d565b8060005b838110156134d25781516134b9888261345c565b97506134c483613474565b9250506001810190506134a5565b5085935050505092915050565b600060a0820190506134f4600083018861258e565b6135016020830187613412565b81810360408301526135138186613481565b90506135226060830185612642565b61352f608083018461258e565b9695505050505050565b600060408201905061354e600083018561258e565b81810360208301526135608184613481565b90509392505050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061359f601083612331565b91506135aa82613569565b602082019050919050565b600060208201905081810360008301526135ce81613592565b905091905056fea2646970667358221220eac260e631ea6482e9e7b16ed61f787f9a3ec296e131ac0f95fb743e919452f564736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102085760003560e01c80636ca60bc611610118578063a457c2d7116100a0578063d2d7ad831161006f578063d2d7ad8314610756578063dd62ed3e14610781578063e3e715b4146107be578063e6be4a72146107e7578063f2fde38b146108105761020f565b8063a457c2d71461069c578063a9059cbb146106d9578063c49b9a8014610716578063ce831ed51461073f5761020f565b806385141a77116100e757806385141a77146105db5780638a8c523c146106065780638b4cee081461061d5780638da5cb5b1461064657806395d89b41146106715761020f565b80636ca60bc61461053157806370a082311461055c578063715018a61461059957806375f0a874146105b05761020f565b8063313ce5671161019b57806349bd5a5e1161016a57806349bd5a5e1461044a5780634a74bb02146104755780634ada218b146104a05780635342acb4146104cb5780635d098b38146105085761020f565b8063313ce5671461038e57806339509351146103b9578063461d9476146103f6578063470624021461041f5761020f565b806318160ddd116101d757806318160ddd146102d0578063220f6696146102fb57806323b872dd146103265780632b14ca56146103635761020f565b806306fdde0314610214578063095ea7b31461023f5780630cc835a31461027c5780631694505e146102a55761020f565b3661020f57005b600080fd5b34801561022057600080fd5b50610229610839565b60405161023691906123b6565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190612471565b610872565b60405161027391906124cc565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906124e7565b610890565b005b3480156102b157600080fd5b506102ba61091d565b6040516102c79190612573565b60405180910390f35b3480156102dc57600080fd5b506102e5610941565b6040516102f2919061259d565b60405180910390f35b34801561030757600080fd5b5061031061094b565b60405161031d91906124cc565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906125b8565b61095e565b60405161035a91906124cc565b60405180910390f35b34801561036f57600080fd5b50610378610a5e565b604051610385919061259d565b60405180910390f35b34801561039a57600080fd5b506103a3610a64565b6040516103b09190612627565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190612471565b610a69565b6040516103ed91906124cc565b60405180910390f35b34801561040257600080fd5b5061041d600480360381019061041891906124e7565b610b15565b005b34801561042b57600080fd5b50610434610baa565b604051610441919061259d565b60405180910390f35b34801561045657600080fd5b5061045f610bb0565b60405161046c9190612651565b60405180910390f35b34801561048157600080fd5b5061048a610bd4565b60405161049791906124cc565b60405180910390f35b3480156104ac57600080fd5b506104b5610be7565b6040516104c291906124cc565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed919061266c565b610bfa565b6040516104ff91906124cc565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a919061266c565b610c50565b005b34801561053d57600080fd5b50610546610d42565b604051610553919061259d565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e919061266c565b610d48565b604051610590919061259d565b60405180910390f35b3480156105a557600080fd5b506105ae610d91565b005b3480156105bc57600080fd5b506105c5610da5565b6040516105d291906126ba565b60405180910390f35b3480156105e757600080fd5b506105f0610dcb565b6040516105fd9190612651565b60405180910390f35b34801561061257600080fd5b5061061b610dd1565b005b34801561062957600080fd5b50610644600480360381019061063f91906124e7565b610ed1565b005b34801561065257600080fd5b5061065b610f5e565b6040516106689190612651565b60405180910390f35b34801561067d57600080fd5b50610686610f87565b60405161069391906123b6565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190612471565b610fc0565b6040516106d091906124cc565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612471565b61106c565b60405161070d91906124cc565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190612701565b61108a565b005b34801561074b57600080fd5b5061075461113b565b005b34801561076257600080fd5b5061076b611288565b604051610778919061259d565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a3919061272e565b61128e565b6040516107b5919061259d565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e0919061276e565b611315565b005b3480156107f357600080fd5b5061080e60048036038101906108099190612471565b611443565b005b34801561081c57600080fd5b506108376004803603810190610832919061266c565b611610565b005b6040518060400160405280600681526020017f4a6f69204149000000000000000000000000000000000000000000000000000081525081565b600061088661087f611693565b848461169b565b6001905092915050565b610898611864565b600a8111156108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d3906127fa565b60405180910390fd5b806007819055507fa480a3a15a511fbdc37ae77ae3f490e03ab3688adde11456ce779e6c1e0abaa281604051610912919061259d565b60405180910390a150565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600554905090565b600b60019054906101000a900460ff1681565b600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109aa611693565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a219061288c565b60405180910390fd5b610a358585856118e2565b610a5285610a41611693565b8584610a4d91906128db565b61169b565b60019150509392505050565b60085481565b601281565b6000610b0b610a76611693565b848460036000610a84611693565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b06919061290f565b61169b565b6001905092915050565b610b1d611864565b68056bc75e2d63100000811015610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b60906129b5565b60405180910390fd5b80600a819055507f17339d8f3c3323d3df3b092130f1bedb79d8e20de4d3ff176b316e89be357cbe81604051610b9f919061259d565b60405180910390a150565b60075481565b7f000000000000000000000000ef1cafd38302397908c8e4944876b22cd6ccf77e81565b600b60029054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c58611864565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90612a21565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f081604051610d379190612651565b60405180910390a150565b60095481565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d99611864565b610da36000611e0a565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61dead81565b610dd9611864565b600b60009054906101000a900460ff1615610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090612a8d565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055506001600b60026101000a81548160ff0219169083151502179055507ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a36001604051610e8f91906124cc565b60405180910390a17f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1596001604051610ec791906124cc565b60405180910390a1565b610ed9611864565b600a811115610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490612af9565b60405180910390fd5b806008819055507f7d59573ec4acab62b908b5c1cde109eb12273d011506abaa850256636a42d54a81604051610f53919061259d565b60405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600381526020017f4a4f49000000000000000000000000000000000000000000000000000000000081525081565b6000611062610fcd611693565b848460036000610fdb611693565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461105d91906128db565b61169b565b6001905092915050565b6000611080611079611693565b84846118e2565b6001905092915050565b611092611864565b801515600b60029054906101000a900460ff161515036110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90612b65565b60405180910390fd5b80600b60026101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161113091906124cc565b60405180910390a150565b611143611864565b60004790506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161119090612bb6565b60006040518083038185875af1925050503d80600081146111cd576040519150601f19603f3d011682016040523d82523d6000602084013e6111d2565b606091505b5050905080611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90612c17565b60405180910390fd5b7fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e8160405161124591906124cc565b60405180910390a17ffc3b2917f34bc4fba1516519d275441646d5088542342f58de8eea6a7cb5c2ab8260405161127c919061259d565b60405180910390a15050565b600a5481565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61131d611864565b801515600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690612ca9565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f09cdf0cfa7a040edd81ed835da9c0da414b3b1bc89788f88ba53288ce596b5fa8282604051611437929190612cc9565b60405180910390a15050565b61144b611864565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090612d64565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611518929190612da5565b6020604051808303816000875af1158015611537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155b9190612de3565b90508061159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490612c17565b60405180910390fd5b7fc9946980dc929f521b40f678c5eeae1c213b0c26c005bd48d44905450951166e816040516115cc91906124cc565b60405180910390a17f9717b3559fe85dc5c6941748cdc56fc5ca4e06048d7b836c700c174f78369bef82604051611603919061259d565b60405180910390a1505050565b611618611864565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90612e82565b60405180910390fd5b61169081611e0a565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170190612f14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090612fa6565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611857919061259d565b60405180910390a3505050565b61186c611693565b73ffffffffffffffffffffffffffffffffffffffff1661188a610f5e565b73ffffffffffffffffffffffffffffffffffffffff16146118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790613012565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611948906130a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b790613136565b60405180910390fd5b60008111611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906131c8565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c9061325a565b60405180910390fd5b600b60009054906101000a900460ff1680611ae95750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80611b3d5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b73906132c6565b60405180910390fd5b6000611b8730610d48565b90506000600a5482101590506000600b60019054906101000a900460ff16158015611bfe57507f000000000000000000000000ef1cafd38302397908c8e4944876b22cd6ccf77e73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015611c075750815b8015611c1f5750600b60029054906101000a900460ff165b15611c2d57611c2c611ece565b5b7f000000000000000000000000ef1cafd38302397908c8e4944876b22cd6ccf77e73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148015611cd25750600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611cf457606484600854611ce791906132e6565b611cf19190613357565b90505b7f000000000000000000000000ef1cafd38302397908c8e4944876b22cd6ccf77e73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015611d995750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611dbb57606484600754611dae91906132e6565b611db89190613357565b90505b8084611dc791906128db565b93506000811115611df757611ddd863083611f57565b8060096000828254611def919061290f565b925050819055505b611e02868686611f57565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600b60016101000a81548160ff0219169083151502179055506000611ef430610d48565b9050611eff8161206d565b6000479050611f30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612275565b600060098190555050506000600b60016101000a81548160ff021916908315150217905550565b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa691906128db565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffc919061290f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612060919061259d565b60405180910390a3505050565b6000600267ffffffffffffffff81111561208a57612089613388565b5b6040519080825280602002602001820160405280156120b85781602001602082028036833780820191505090505b50905030816000815181106120d0576120cf6133b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061213f5761213e6133b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506121a4307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461169b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016122069594939291906134df565b600060405180830381600087803b15801561222057600080fd5b505af1158015612234573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612269929190613539565b60405180910390a15050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161229b90612bb6565b60006040518083038185875af1925050503d80600081146122d8576040519150601f19603f3d011682016040523d82523d6000602084013e6122dd565b606091505b5050905080612321576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612318906135b5565b60405180910390fd5b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612360578082015181840152602081019050612345565b60008484015250505050565b6000601f19601f8301169050919050565b600061238882612326565b6123928185612331565b93506123a2818560208601612342565b6123ab8161236c565b840191505092915050565b600060208201905081810360008301526123d0818461237d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612408826123dd565b9050919050565b612418816123fd565b811461242357600080fd5b50565b6000813590506124358161240f565b92915050565b6000819050919050565b61244e8161243b565b811461245957600080fd5b50565b60008135905061246b81612445565b92915050565b60008060408385031215612488576124876123d8565b5b600061249685828601612426565b92505060206124a78582860161245c565b9150509250929050565b60008115159050919050565b6124c6816124b1565b82525050565b60006020820190506124e160008301846124bd565b92915050565b6000602082840312156124fd576124fc6123d8565b5b600061250b8482850161245c565b91505092915050565b6000819050919050565b600061253961253461252f846123dd565b612514565b6123dd565b9050919050565b600061254b8261251e565b9050919050565b600061255d82612540565b9050919050565b61256d81612552565b82525050565b60006020820190506125886000830184612564565b92915050565b6125978161243b565b82525050565b60006020820190506125b2600083018461258e565b92915050565b6000806000606084860312156125d1576125d06123d8565b5b60006125df86828701612426565b93505060206125f086828701612426565b92505060406126018682870161245c565b9150509250925092565b600060ff82169050919050565b6126218161260b565b82525050565b600060208201905061263c6000830184612618565b92915050565b61264b816123fd565b82525050565b60006020820190506126666000830184612642565b92915050565b600060208284031215612682576126816123d8565b5b600061269084828501612426565b91505092915050565b60006126a4826123dd565b9050919050565b6126b481612699565b82525050565b60006020820190506126cf60008301846126ab565b92915050565b6126de816124b1565b81146126e957600080fd5b50565b6000813590506126fb816126d5565b92915050565b600060208284031215612717576127166123d8565b5b6000612725848285016126ec565b91505092915050565b60008060408385031215612745576127446123d8565b5b600061275385828601612426565b925050602061276485828601612426565b9150509250929050565b60008060408385031215612785576127846123d8565b5b600061279385828601612426565b92505060206127a4858286016126ec565b9150509250929050565b7f427579204665652063616e6e6f74206265206d6f7265207468616e2031302500600082015250565b60006127e4601f83612331565b91506127ef826127ae565b602082019050919050565b60006020820190508181036000830152612813816127d7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612876602883612331565b91506128818261281a565b604082019050919050565b600060208201905081810360008301526128a581612869565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006128e68261243b565b91506128f18361243b565b9250828203905081811115612909576129086128ac565b5b92915050565b600061291a8261243b565b91506129258361243b565b925082820190508082111561293d5761293c6128ac565b5b92915050565b7f596f75206e65656420746f20656e746572206d6f7265207468616e203130302060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b600061299f602783612331565b91506129aa82612943565b604082019050919050565b600060208201905081810360008301526129ce81612992565b9050919050565b7f7365746d61726b6574696e6757616c6c65743a205a45524f0000000000000000600082015250565b6000612a0b601883612331565b9150612a16826129d5565b602082019050919050565b60006020820190508181036000830152612a3a816129fe565b9050919050565b7f54726164696e6720616c726561647920656e61626c65642e0000000000000000600082015250565b6000612a77601883612331565b9150612a8282612a41565b602082019050919050565b60006020820190508181036000830152612aa681612a6a565b9050919050565b7f53656c6c204665652063616e6e6f74206265206d6f7265207468616e20313025600082015250565b6000612ae3602083612331565b9150612aee82612aad565b602082019050919050565b60006020820190508181036000830152612b1281612ad6565b9050919050565b7f56616c756520616c726561647920736574000000000000000000000000000000600082015250565b6000612b4f601183612331565b9150612b5a82612b19565b602082019050919050565b60006020820190508181036000830152612b7e81612b42565b9050919050565b600081905092915050565b50565b6000612ba0600083612b85565b9150612bab82612b90565b600082019050919050565b6000612bc182612b93565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000612c01600f83612331565b9150612c0c82612bcb565b602082019050919050565b60006020820190508181036000830152612c3081612bf4565b9050919050565b7f5468652077616c6c657420616c7265616479206861766520746861742073746160008201527f7475732e00000000000000000000000000000000000000000000000000000000602082015250565b6000612c93602483612331565b9150612c9e82612c37565b604082019050919050565b60006020820190508181036000830152612cc281612c86565b9050919050565b6000604082019050612cde6000830185612642565b612ceb60208301846124bd565b9392505050565b7f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c60008201527f616e6365206f6620697473206f776e20746f6b656e7300000000000000000000602082015250565b6000612d4e603683612331565b9150612d5982612cf2565b604082019050919050565b60006020820190508181036000830152612d7d81612d41565b9050919050565b6000612d8f82612540565b9050919050565b612d9f81612d84565b82525050565b6000604082019050612dba6000830185612d96565b612dc7602083018461258e565b9392505050565b600081519050612ddd816126d5565b92915050565b600060208284031215612df957612df86123d8565b5b6000612e0784828501612dce565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612e6c602683612331565b9150612e7782612e10565b604082019050919050565b60006020820190508181036000830152612e9b81612e5f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612efe602483612331565b9150612f0982612ea2565b604082019050919050565b60006020820190508181036000830152612f2d81612ef1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f90602283612331565b9150612f9b82612f34565b604082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ffc602083612331565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061308e602583612331565b915061309982613032565b604082019050919050565b600060208201905081810360008301526130bd81613081565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613120602383612331565b915061312b826130c4565b604082019050919050565b6000602082019050818103600083015261314f81613113565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006131b2602983612331565b91506131bd82613156565b604082019050919050565b600060208201905081810360008301526131e1816131a5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613244602683612331565b915061324f826131e8565b604082019050919050565b6000602082019050818103600083015261327381613237565b9050919050565b7f54726164696e67206e6f742079657420656e61626c6564210000000000000000600082015250565b60006132b0601883612331565b91506132bb8261327a565b602082019050919050565b600060208201905081810360008301526132df816132a3565b9050919050565b60006132f18261243b565b91506132fc8361243b565b925082820261330a8161243b565b91508282048414831517613321576133206128ac565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133628261243b565b915061336d8361243b565b92508261337d5761337c613328565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061340b613406613401846133e6565b612514565b61243b565b9050919050565b61341b816133f0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613456816123fd565b82525050565b6000613468838361344d565b60208301905092915050565b6000602082019050919050565b600061348c82613421565b613496818561342c565b93506134a18361343d565b8060005b838110156134d25781516134b9888261345c565b97506134c483613474565b9250506001810190506134a5565b5085935050505092915050565b600060a0820190506134f4600083018861258e565b6135016020830187613412565b81810360408301526135138186613481565b90506135226060830185612642565b61352f608083018461258e565b9695505050505050565b600060408201905061354e600083018561258e565b81810360208301526135608184613481565b90509392505050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061359f601083612331565b91506135aa82613569565b602082019050919050565b600060208201905081810360008301526135ce81613592565b905091905056fea2646970667358221220eac260e631ea6482e9e7b16ed61f787f9a3ec296e131ac0f95fb743e919452f564736f6c63430008130033

Deployed Bytecode Sourcemap

15810:14646:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17084:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21062:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27733:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17544:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20270:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17734:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21296:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17271:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17173:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21826:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26799:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17240:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17602:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17769:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17473:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26173:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27457:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17306:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20375:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5926:105;;;;;;;;;;;;;:::i;:::-;;15890:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16037:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30180:271;;;;;;;;;;;;;:::i;:::-;;27936:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5278:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17129:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22168:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20542:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27167:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29268:309;;;;;;;;;;;;;:::i;:::-;;17358:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20841:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26482:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29654:470;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6186:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17084:38;;;;;;;;;;;;;;;;;;;:::o;21062:189::-;21165:4;21182:39;21191:12;:10;:12::i;:::-;21205:7;21214:6;21182:8;:39::i;:::-;21239:4;21232:11;;21062:189;;;;:::o;27733:195::-;5164:13;:11;:13::i;:::-;27818:2:::1;27807:7;:13;;27799:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27876:7;27867:6;:16;;;;27899:21;27912:7;27899:21;;;;;;:::i;:::-;;;;;;;;27733:195:::0;:::o;17544:51::-;;;:::o;20270:95::-;20323:7;20350;;20343:14;;20270:95;:::o;17734:28::-;;;;;;;;;;;;;:::o;21296:480::-;21430:4;21447:21;21471:11;:19;21483:6;21471:19;;;;;;;;;;;;;;;:33;21491:12;:10;:12::i;:::-;21471:33;;;;;;;;;;;;;;;;21447:57;;21557:6;21537:16;:26;;21515:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;21642:36;21652:6;21660:9;21671:6;21642:9;:36::i;:::-;21689:57;21698:6;21706:12;:10;:12::i;:::-;21739:6;21720:16;:25;;;;:::i;:::-;21689:8;:57::i;:::-;21764:4;21757:11;;;21296:480;;;;;:::o;17271:26::-;;;;:::o;17173:35::-;17206:2;17173:35;:::o;21826:292::-;21941:4;21958:130;21981:12;:10;:12::i;:::-;22008:7;22067:10;22030:11;:25;22042:12;:10;:12::i;:::-;22030:25;;;;;;;;;;;;;;;:34;22056:7;22030:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;21958:8;:130::i;:::-;22106:4;22099:11;;21826:292;;;;:::o;26799:360::-;5164:13;:11;:13::i;:::-;26954:9:::1;26926:24;:37;;26904:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;27067:24;27041:23;:50;;;;27107:44;27126:24;27107:44;;;;;;:::i;:::-;;;;;;;;26799:360:::0;:::o;17240:22::-;;;;:::o;17602:38::-;;;:::o;17769:41::-;;;;;;;;;;;;;:::o;17473:26::-;;;;;;;;;;;;;:::o;26173:120::-;26240:4;26264:12;:21;26277:7;26264:21;;;;;;;;;;;;;;;;;;;;;;;;;26257:28;;26173:120;;;:::o;27457:268::-;5164:13;:11;:13::i;:::-;27577:1:::1;27549:30;;:16;:30;;::::0;27541:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27645:16;27619:15;;:43;;;;;;;;;;;;;;;;;;27678:39;27700:16;27678:39;;;;;;:::i;:::-;;;;;;;;27457:268:::0;:::o;17306:43::-;;;;:::o;20375:117::-;20441:7;20468;:16;20476:7;20468:16;;;;;;;;;;;;;;;;20461:23;;20375:117;;;:::o;5926:105::-;5164:13;:11;:13::i;:::-;5993:30:::1;6020:1;5993:18;:30::i;:::-;5926:105::o:0;15890:101::-;;;;;;;;;;;;;:::o;16037:52::-;16082:6;16037:52;:::o;30180:271::-;5164:13;:11;:13::i;:::-;30243:14:::1;;;;;;;;;;;30242:15;30234:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;30314:4;30297:14;;:21;;;;;;;;;;;;;;;;;;30353:4;30329:21;;:28;;;;;;;;;;;;;;;;;;30373:20;30388:4;30373:20;;;;;;:::i;:::-;;;;;;;;30409:34;30438:4;30409:34;;;;;;:::i;:::-;;;;;;;;30180:271::o:0;27936:203::-;5164:13;:11;:13::i;:::-;28024:2:::1;28012:8;:14;;28004:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;28084:8;28074:7;:18;;;;28108:23;28122:8;28108:23;;;;;;:::i;:::-;;;;;;;;27936:203:::0;:::o;5278:87::-;5324:7;5351:6;;;;;;;;;;;5344:13;;5278:87;:::o;17129:37::-;;;;;;;;;;;;;;;;;;;:::o;22168:302::-;22288:4;22305:135;22328:12;:10;:12::i;:::-;22355:7;22414:15;22377:11;:25;22389:12;:10;:12::i;:::-;22377:25;;;;;;;;;;;;;;;:34;22403:7;22377:34;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;22305:8;:135::i;:::-;22458:4;22451:11;;22168:302;;;;:::o;20542:194::-;20647:4;20664:42;20674:12;:10;:12::i;:::-;20688:9;20699:6;20664:9;:42::i;:::-;20724:4;20717:11;;20542:194;;;;:::o;27167:247::-;5164:13;:11;:13::i;:::-;27279:8:::1;27254:33;;:21;;;;;;;;;;;:33;;::::0;27246:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27344:8;27320:21;;:32;;;;;;;;;;;;;;;;;;27368:38;27397:8;27368:38;;;;;;:::i;:::-;;;;;;;;27167:247:::0;:::o;29268:309::-;5164:13;:11;:13::i;:::-;29332:15:::1;29350:21;29332:39;;29383:9;29406:15;;;;;;;;;;;29398:29;;29435:10;29398:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29382:68;;;29469:4;29461:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;29509:20;29524:4;29509:20;;;;;;:::i;:::-;;;;;;;;29545:24;29558:10;29545:24;;;;;;:::i;:::-;;;;;;;;29321:256;;29268:309::o:0;17358:54::-;;;;:::o;20841:173::-;20951:7;20978:11;:19;20990:6;20978:19;;;;;;;;;;;;;;;:28;20998:7;20978:28;;;;;;;;;;;;;;;;20971:35;;20841:173;;;;:::o;26482:274::-;5164:13;:11;:13::i;:::-;26600:6:::1;26575:31;;:12;:21;26588:7;26575:21;;;;;;;;;;;;;;;;;;;;;;;;;:31;;::::0;26567:80:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26682:6;26658:12;:21;26671:7;26658:21;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;26704:29;26718:7;26726:6;26704:29;;;;;;;:::i;:::-;;;;;;;;26482:274:::0;;:::o;29654:470::-;5164:13;:11;:13::i;:::-;29831:4:::1;29806:30;;:13;:30;;::::0;29784:134:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29929:9;29948:13;29941:30;;;29972:15;;;;;;;;;;;29989:7;29941:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29929:68;;30016:4;30008:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;30056:20;30071:4;30056:20;;;;;;:::i;:::-;;;;;;;;30092:24;30108:7;30092:24;;;;;;:::i;:::-;;;;;;;;29773:351;29654:470:::0;;:::o;6186:240::-;5164:13;:11;:13::i;:::-;6311:1:::1;6291:22;;:8;:22;;::::0;6269:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6390:28;6409:8;6390:18;:28::i;:::-;6186:240:::0;:::o;356:98::-;409:7;436:10;429:17;;356:98;:::o;22502:341::-;22614:1;22596:20;;:6;:20;;;22588:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22695:1;22676:21;;:7;:21;;;22668:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22780:6;22749:11;:19;22761:6;22749:19;;;;;;;;;;;;;;;:28;22769:7;22749:28;;;;;;;;;;;;;;;:37;;;;22819:7;22802:33;;22811:6;22802:33;;;22828:6;22802:33;;;;;;:::i;:::-;;;;;;;;22502:341;;;:::o;5443:132::-;5518:12;:10;:12::i;:::-;5507:23;;:7;:5;:7::i;:::-;:23;;;5499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5443:132::o;22976:1495::-;23080:1;23064:18;;:4;:18;;;23056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23157:1;23143:16;;:2;:16;;;23135:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;23227:1;23218:6;:10;23210:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;23324:6;23307:7;:13;23315:4;23307:13;;;;;;;;;;;;;;;;:23;;23285:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23415:14;;;;;;;;;;;:36;;;;23433:12;:18;23446:4;23433:18;;;;;;;;;;;;;;;;;;;;;;;;;23415:36;:56;;;;23455:12;:16;23468:2;23455:16;;;;;;;;;;;;;;;;;;;;;;;;;23415:56;23407:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;23557:28;23588:24;23606:4;23588:9;:24::i;:::-;23557:55;;23623:28;23691:23;;23654:20;:60;;23623:91;;23725:8;23845:16;;;;;;;;;;;23844:17;:55;;;;;23886:13;23878:21;;:4;:21;;;;23844:55;:95;;;;;23916:23;23844:95;:133;;;;;23956:21;;;;;;;;;;;23844:133;23826:206;;;24004:16;:14;:16::i;:::-;23826:206;24052:13;24046:19;;:2;:19;;;:42;;;;;24070:12;:18;24083:4;24070:18;;;;;;;;;;;;;;;;;;;;;;;;;24069:19;24046:42;24042:105;;;24132:3;24122:6;24112:7;;:16;;;;:::i;:::-;24111:24;;;;:::i;:::-;24105:30;;24042:105;24169:13;24161:21;;:4;:21;;;:42;;;;;24187:12;:16;24200:2;24187:16;;;;;;;;;;;;;;;;;;;;;;;;;24186:17;24161:42;24157:104;;;24246:3;24236:6;24227;;:15;;;;:::i;:::-;24226:23;;;;:::i;:::-;24220:29;;24157:104;24281:3;24271:13;;;;;:::i;:::-;;;24305:1;24299:3;:7;24295:126;;;24323:40;24338:4;24352;24359:3;24323:14;:40::i;:::-;24406:3;24378:24;;:31;;;;;;;:::i;:::-;;;;;;;;24295:126;24431:32;24446:4;24452:2;24456:6;24431:14;:32::i;:::-;23045:1426;;;22976:1495;;;:::o;6586:191::-;6660:16;6679:6;;;;;;;;;;;6660:25;;6705:8;6696:6;;:17;;;;;;;;;;;;;;;;;;6760:8;6729:40;;6750:8;6729:40;;;;;;;;;;;;6649:128;6586:191;:::o;24706:304::-;17872:4;17853:16;;:23;;;;;;;;;;;;;;;;;;24763:19:::1;24785:24;24803:4;24785:9;:24::i;:::-;24763:46;;24820:29;24837:11;24820:16;:29::i;:::-;24860:15;24878:21;24860:39;;24912:49;24933:15;;;;;;;;;;;24950:10;24912:20;:49::i;:::-;25001:1;24974:24;:28;;;;24752:258;;17918:5:::0;17899:16;;:24;;;;;;;;;;;;;;;;;;24706:304::o;25912:253::-;26059:6;26040:7;:15;26048:6;26040:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;26098:6;26076:7;:18;26084:9;26076:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;26139:9;26122:35;;26131:6;26122:35;;;26150:6;26122:35;;;;;;:::i;:::-;;;;;;;;25912:253;;;:::o;25138:638::-;25264:21;25302:1;25288:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25264:40;;25333:4;25315;25320:1;25315:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;25359:4;25349;25354:1;25349:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;;25374:62;25391:4;25406:15;25424:11;25374:8;:62::i;:::-;25475:15;:66;;;25556:11;25582:1;25626:4;25653;25689:15;25475:240;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25733:35;25750:11;25763:4;25733:35;;;;;;;:::i;:::-;;;;;;;;25193:583;25138:638;:::o;28147:218::-;28265:9;28280;:14;;28302:6;28280:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28264:49;;;28332:4;28324:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;28253:112;28147:218;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:60::-;3809:3;3830:5;3823:12;;3781:60;;;:::o;3847:142::-;3897:9;3930:53;3948:34;3957:24;3975:5;3957:24;:::i;:::-;3948:34;:::i;:::-;3930:53;:::i;:::-;3917:66;;3847:142;;;:::o;3995:126::-;4045:9;4078:37;4109:5;4078:37;:::i;:::-;4065:50;;3995:126;;;:::o;4127:152::-;4203:9;4236:37;4267:5;4236:37;:::i;:::-;4223:50;;4127:152;;;:::o;4285:183::-;4398:63;4455:5;4398:63;:::i;:::-;4393:3;4386:76;4285:183;;:::o;4474:274::-;4593:4;4631:2;4620:9;4616:18;4608:26;;4644:97;4738:1;4727:9;4723:17;4714:6;4644:97;:::i;:::-;4474:274;;;;:::o;4754:118::-;4841:24;4859:5;4841:24;:::i;:::-;4836:3;4829:37;4754:118;;:::o;4878:222::-;4971:4;5009:2;4998:9;4994:18;4986:26;;5022:71;5090:1;5079:9;5075:17;5066:6;5022:71;:::i;:::-;4878:222;;;;:::o;5106:619::-;5183:6;5191;5199;5248:2;5236:9;5227:7;5223:23;5219:32;5216:119;;;5254:79;;:::i;:::-;5216:119;5374:1;5399:53;5444:7;5435:6;5424:9;5420:22;5399:53;:::i;:::-;5389:63;;5345:117;5501:2;5527:53;5572:7;5563:6;5552:9;5548:22;5527:53;:::i;:::-;5517:63;;5472:118;5629:2;5655:53;5700:7;5691:6;5680:9;5676:22;5655:53;:::i;:::-;5645:63;;5600:118;5106:619;;;;;:::o;5731:86::-;5766:7;5806:4;5799:5;5795:16;5784:27;;5731:86;;;:::o;5823:112::-;5906:22;5922:5;5906:22;:::i;:::-;5901:3;5894:35;5823:112;;:::o;5941:214::-;6030:4;6068:2;6057:9;6053:18;6045:26;;6081:67;6145:1;6134:9;6130:17;6121:6;6081:67;:::i;:::-;5941:214;;;;:::o;6161:118::-;6248:24;6266:5;6248:24;:::i;:::-;6243:3;6236:37;6161:118;;:::o;6285:222::-;6378:4;6416:2;6405:9;6401:18;6393:26;;6429:71;6497:1;6486:9;6482:17;6473:6;6429:71;:::i;:::-;6285:222;;;;:::o;6513:329::-;6572:6;6621:2;6609:9;6600:7;6596:23;6592:32;6589:119;;;6627:79;;:::i;:::-;6589:119;6747:1;6772:53;6817:7;6808:6;6797:9;6793:22;6772:53;:::i;:::-;6762:63;;6718:117;6513:329;;;;:::o;6848:104::-;6893:7;6922:24;6940:5;6922:24;:::i;:::-;6911:35;;6848:104;;;:::o;6958:142::-;7061:32;7087:5;7061:32;:::i;:::-;7056:3;7049:45;6958:142;;:::o;7106:254::-;7215:4;7253:2;7242:9;7238:18;7230:26;;7266:87;7350:1;7339:9;7335:17;7326:6;7266:87;:::i;:::-;7106:254;;;;:::o;7366:116::-;7436:21;7451:5;7436:21;:::i;:::-;7429:5;7426:32;7416:60;;7472:1;7469;7462:12;7416:60;7366:116;:::o;7488:133::-;7531:5;7569:6;7556:20;7547:29;;7585:30;7609:5;7585:30;:::i;:::-;7488:133;;;;:::o;7627:323::-;7683:6;7732:2;7720:9;7711:7;7707:23;7703:32;7700:119;;;7738:79;;:::i;:::-;7700:119;7858:1;7883:50;7925:7;7916:6;7905:9;7901:22;7883:50;:::i;:::-;7873:60;;7829:114;7627:323;;;;:::o;7956:474::-;8024:6;8032;8081:2;8069:9;8060:7;8056:23;8052:32;8049:119;;;8087:79;;:::i;:::-;8049:119;8207:1;8232:53;8277:7;8268:6;8257:9;8253:22;8232:53;:::i;:::-;8222:63;;8178:117;8334:2;8360:53;8405:7;8396:6;8385:9;8381:22;8360:53;:::i;:::-;8350:63;;8305:118;7956:474;;;;;:::o;8436:468::-;8501:6;8509;8558:2;8546:9;8537:7;8533:23;8529:32;8526:119;;;8564:79;;:::i;:::-;8526:119;8684:1;8709:53;8754:7;8745:6;8734:9;8730:22;8709:53;:::i;:::-;8699:63;;8655:117;8811:2;8837:50;8879:7;8870:6;8859:9;8855:22;8837:50;:::i;:::-;8827:60;;8782:115;8436:468;;;;;:::o;8910:181::-;9050:33;9046:1;9038:6;9034:14;9027:57;8910:181;:::o;9097:366::-;9239:3;9260:67;9324:2;9319:3;9260:67;:::i;:::-;9253:74;;9336:93;9425:3;9336:93;:::i;:::-;9454:2;9449:3;9445:12;9438:19;;9097:366;;;:::o;9469:419::-;9635:4;9673:2;9662:9;9658:18;9650:26;;9722:9;9716:4;9712:20;9708:1;9697:9;9693:17;9686:47;9750:131;9876:4;9750:131;:::i;:::-;9742:139;;9469:419;;;:::o;9894:227::-;10034:34;10030:1;10022:6;10018:14;10011:58;10103:10;10098:2;10090:6;10086:15;10079:35;9894:227;:::o;10127:366::-;10269:3;10290:67;10354:2;10349:3;10290:67;:::i;:::-;10283:74;;10366:93;10455:3;10366:93;:::i;:::-;10484:2;10479:3;10475:12;10468:19;;10127:366;;;:::o;10499:419::-;10665:4;10703:2;10692:9;10688:18;10680:26;;10752:9;10746:4;10742:20;10738:1;10727:9;10723:17;10716:47;10780:131;10906:4;10780:131;:::i;:::-;10772:139;;10499:419;;;:::o;10924:180::-;10972:77;10969:1;10962:88;11069:4;11066:1;11059:15;11093:4;11090:1;11083:15;11110:194;11150:4;11170:20;11188:1;11170:20;:::i;:::-;11165:25;;11204:20;11222:1;11204:20;:::i;:::-;11199:25;;11248:1;11245;11241:9;11233:17;;11272:1;11266:4;11263:11;11260:37;;;11277:18;;:::i;:::-;11260:37;11110:194;;;;:::o;11310:191::-;11350:3;11369:20;11387:1;11369:20;:::i;:::-;11364:25;;11403:20;11421:1;11403:20;:::i;:::-;11398:25;;11446:1;11443;11439:9;11432:16;;11467:3;11464:1;11461:10;11458:36;;;11474:18;;:::i;:::-;11458:36;11310:191;;;;:::o;11507:226::-;11647:34;11643:1;11635:6;11631:14;11624:58;11716:9;11711:2;11703:6;11699:15;11692:34;11507:226;:::o;11739:366::-;11881:3;11902:67;11966:2;11961:3;11902:67;:::i;:::-;11895:74;;11978:93;12067:3;11978:93;:::i;:::-;12096:2;12091:3;12087:12;12080:19;;11739:366;;;:::o;12111:419::-;12277:4;12315:2;12304:9;12300:18;12292:26;;12364:9;12358:4;12354:20;12350:1;12339:9;12335:17;12328:47;12392:131;12518:4;12392:131;:::i;:::-;12384:139;;12111:419;;;:::o;12536:174::-;12676:26;12672:1;12664:6;12660:14;12653:50;12536:174;:::o;12716:366::-;12858:3;12879:67;12943:2;12938:3;12879:67;:::i;:::-;12872:74;;12955:93;13044:3;12955:93;:::i;:::-;13073:2;13068:3;13064:12;13057:19;;12716:366;;;:::o;13088:419::-;13254:4;13292:2;13281:9;13277:18;13269:26;;13341:9;13335:4;13331:20;13327:1;13316:9;13312:17;13305:47;13369:131;13495:4;13369:131;:::i;:::-;13361:139;;13088:419;;;:::o;13513:174::-;13653:26;13649:1;13641:6;13637:14;13630:50;13513:174;:::o;13693:366::-;13835:3;13856:67;13920:2;13915:3;13856:67;:::i;:::-;13849:74;;13932:93;14021:3;13932:93;:::i;:::-;14050:2;14045:3;14041:12;14034:19;;13693:366;;;:::o;14065:419::-;14231:4;14269:2;14258:9;14254:18;14246:26;;14318:9;14312:4;14308:20;14304:1;14293:9;14289:17;14282:47;14346:131;14472:4;14346:131;:::i;:::-;14338:139;;14065:419;;;:::o;14490:182::-;14630:34;14626:1;14618:6;14614:14;14607:58;14490:182;:::o;14678:366::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:419::-;15216:4;15254:2;15243:9;15239:18;15231:26;;15303:9;15297:4;15293:20;15289:1;15278:9;15274:17;15267:47;15331:131;15457:4;15331:131;:::i;:::-;15323:139;;15050:419;;;:::o;15475:167::-;15615:19;15611:1;15603:6;15599:14;15592:43;15475:167;:::o;15648:366::-;15790:3;15811:67;15875:2;15870:3;15811:67;:::i;:::-;15804:74;;15887:93;15976:3;15887:93;:::i;:::-;16005:2;16000:3;15996:12;15989:19;;15648:366;;;:::o;16020:419::-;16186:4;16224:2;16213:9;16209:18;16201:26;;16273:9;16267:4;16263:20;16259:1;16248:9;16244:17;16237:47;16301:131;16427:4;16301:131;:::i;:::-;16293:139;;16020:419;;;:::o;16445:147::-;16546:11;16583:3;16568:18;;16445:147;;;;:::o;16598:114::-;;:::o;16718:398::-;16877:3;16898:83;16979:1;16974:3;16898:83;:::i;:::-;16891:90;;16990:93;17079:3;16990:93;:::i;:::-;17108:1;17103:3;17099:11;17092:18;;16718:398;;;:::o;17122:379::-;17306:3;17328:147;17471:3;17328:147;:::i;:::-;17321:154;;17492:3;17485:10;;17122:379;;;:::o;17507:165::-;17647:17;17643:1;17635:6;17631:14;17624:41;17507:165;:::o;17678:366::-;17820:3;17841:67;17905:2;17900:3;17841:67;:::i;:::-;17834:74;;17917:93;18006:3;17917:93;:::i;:::-;18035:2;18030:3;18026:12;18019:19;;17678:366;;;:::o;18050:419::-;18216:4;18254:2;18243:9;18239:18;18231:26;;18303:9;18297:4;18293:20;18289:1;18278:9;18274:17;18267:47;18331:131;18457:4;18331:131;:::i;:::-;18323:139;;18050:419;;;:::o;18475:223::-;18615:34;18611:1;18603:6;18599:14;18592:58;18684:6;18679:2;18671:6;18667:15;18660:31;18475:223;:::o;18704:366::-;18846:3;18867:67;18931:2;18926:3;18867:67;:::i;:::-;18860:74;;18943:93;19032:3;18943:93;:::i;:::-;19061:2;19056:3;19052:12;19045:19;;18704:366;;;:::o;19076:419::-;19242:4;19280:2;19269:9;19265:18;19257:26;;19329:9;19323:4;19319:20;19315:1;19304:9;19300:17;19293:47;19357:131;19483:4;19357:131;:::i;:::-;19349:139;;19076:419;;;:::o;19501:320::-;19616:4;19654:2;19643:9;19639:18;19631:26;;19667:71;19735:1;19724:9;19720:17;19711:6;19667:71;:::i;:::-;19748:66;19810:2;19799:9;19795:18;19786:6;19748:66;:::i;:::-;19501:320;;;;;:::o;19827:241::-;19967:34;19963:1;19955:6;19951:14;19944:58;20036:24;20031:2;20023:6;20019:15;20012:49;19827:241;:::o;20074:366::-;20216:3;20237:67;20301:2;20296:3;20237:67;:::i;:::-;20230:74;;20313:93;20402:3;20313:93;:::i;:::-;20431:2;20426:3;20422:12;20415:19;;20074:366;;;:::o;20446:419::-;20612:4;20650:2;20639:9;20635:18;20627:26;;20699:9;20693:4;20689:20;20685:1;20674:9;20670:17;20663:47;20727:131;20853:4;20727:131;:::i;:::-;20719:139;;20446:419;;;:::o;20871:134::-;20929:9;20962:37;20993:5;20962:37;:::i;:::-;20949:50;;20871:134;;;:::o;21011:147::-;21106:45;21145:5;21106:45;:::i;:::-;21101:3;21094:58;21011:147;;:::o;21164:348::-;21293:4;21331:2;21320:9;21316:18;21308:26;;21344:79;21420:1;21409:9;21405:17;21396:6;21344:79;:::i;:::-;21433:72;21501:2;21490:9;21486:18;21477:6;21433:72;:::i;:::-;21164:348;;;;;:::o;21518:137::-;21572:5;21603:6;21597:13;21588:22;;21619:30;21643:5;21619:30;:::i;:::-;21518:137;;;;:::o;21661:345::-;21728:6;21777:2;21765:9;21756:7;21752:23;21748:32;21745:119;;;21783:79;;:::i;:::-;21745:119;21903:1;21928:61;21981:7;21972:6;21961:9;21957:22;21928:61;:::i;:::-;21918:71;;21874:125;21661:345;;;;:::o;22012:225::-;22152:34;22148:1;22140:6;22136:14;22129:58;22221:8;22216:2;22208:6;22204:15;22197:33;22012:225;:::o;22243:366::-;22385:3;22406:67;22470:2;22465:3;22406:67;:::i;:::-;22399:74;;22482:93;22571:3;22482:93;:::i;:::-;22600:2;22595:3;22591:12;22584:19;;22243:366;;;:::o;22615:419::-;22781:4;22819:2;22808:9;22804:18;22796:26;;22868:9;22862:4;22858:20;22854:1;22843:9;22839:17;22832:47;22896:131;23022:4;22896:131;:::i;:::-;22888:139;;22615:419;;;:::o;23040:223::-;23180:34;23176:1;23168:6;23164:14;23157:58;23249:6;23244:2;23236:6;23232:15;23225:31;23040:223;:::o;23269:366::-;23411:3;23432:67;23496:2;23491:3;23432:67;:::i;:::-;23425:74;;23508:93;23597:3;23508:93;:::i;:::-;23626:2;23621:3;23617:12;23610:19;;23269:366;;;:::o;23641:419::-;23807:4;23845:2;23834:9;23830:18;23822:26;;23894:9;23888:4;23884:20;23880:1;23869:9;23865:17;23858:47;23922:131;24048:4;23922:131;:::i;:::-;23914:139;;23641:419;;;:::o;24066:221::-;24206:34;24202:1;24194:6;24190:14;24183:58;24275:4;24270:2;24262:6;24258:15;24251:29;24066:221;:::o;24293:366::-;24435:3;24456:67;24520:2;24515:3;24456:67;:::i;:::-;24449:74;;24532:93;24621:3;24532:93;:::i;:::-;24650:2;24645:3;24641:12;24634:19;;24293:366;;;:::o;24665:419::-;24831:4;24869:2;24858:9;24854:18;24846:26;;24918:9;24912:4;24908:20;24904:1;24893:9;24889:17;24882:47;24946:131;25072:4;24946:131;:::i;:::-;24938:139;;24665:419;;;:::o;25090:182::-;25230:34;25226:1;25218:6;25214:14;25207:58;25090:182;:::o;25278:366::-;25420:3;25441:67;25505:2;25500:3;25441:67;:::i;:::-;25434:74;;25517:93;25606:3;25517:93;:::i;:::-;25635:2;25630:3;25626:12;25619:19;;25278:366;;;:::o;25650:419::-;25816:4;25854:2;25843:9;25839:18;25831:26;;25903:9;25897:4;25893:20;25889:1;25878:9;25874:17;25867:47;25931:131;26057:4;25931:131;:::i;:::-;25923:139;;25650:419;;;:::o;26075:224::-;26215:34;26211:1;26203:6;26199:14;26192:58;26284:7;26279:2;26271:6;26267:15;26260:32;26075:224;:::o;26305:366::-;26447:3;26468:67;26532:2;26527:3;26468:67;:::i;:::-;26461:74;;26544:93;26633:3;26544:93;:::i;:::-;26662:2;26657:3;26653:12;26646:19;;26305:366;;;:::o;26677:419::-;26843:4;26881:2;26870:9;26866:18;26858:26;;26930:9;26924:4;26920:20;26916:1;26905:9;26901:17;26894:47;26958:131;27084:4;26958:131;:::i;:::-;26950:139;;26677:419;;;:::o;27102:222::-;27242:34;27238:1;27230:6;27226:14;27219:58;27311:5;27306:2;27298:6;27294:15;27287:30;27102:222;:::o;27330:366::-;27472:3;27493:67;27557:2;27552:3;27493:67;:::i;:::-;27486:74;;27569:93;27658:3;27569:93;:::i;:::-;27687:2;27682:3;27678:12;27671:19;;27330:366;;;:::o;27702:419::-;27868:4;27906:2;27895:9;27891:18;27883:26;;27955:9;27949:4;27945:20;27941:1;27930:9;27926:17;27919:47;27983:131;28109:4;27983:131;:::i;:::-;27975:139;;27702:419;;;:::o;28127:228::-;28267:34;28263:1;28255:6;28251:14;28244:58;28336:11;28331:2;28323:6;28319:15;28312:36;28127:228;:::o;28361:366::-;28503:3;28524:67;28588:2;28583:3;28524:67;:::i;:::-;28517:74;;28600:93;28689:3;28600:93;:::i;:::-;28718:2;28713:3;28709:12;28702:19;;28361:366;;;:::o;28733:419::-;28899:4;28937:2;28926:9;28922:18;28914:26;;28986:9;28980:4;28976:20;28972:1;28961:9;28957:17;28950:47;29014:131;29140:4;29014:131;:::i;:::-;29006:139;;28733:419;;;:::o;29158:225::-;29298:34;29294:1;29286:6;29282:14;29275:58;29367:8;29362:2;29354:6;29350:15;29343:33;29158:225;:::o;29389:366::-;29531:3;29552:67;29616:2;29611:3;29552:67;:::i;:::-;29545:74;;29628:93;29717:3;29628:93;:::i;:::-;29746:2;29741:3;29737:12;29730:19;;29389:366;;;:::o;29761:419::-;29927:4;29965:2;29954:9;29950:18;29942:26;;30014:9;30008:4;30004:20;30000:1;29989:9;29985:17;29978:47;30042:131;30168:4;30042:131;:::i;:::-;30034:139;;29761:419;;;:::o;30186:174::-;30326:26;30322:1;30314:6;30310:14;30303:50;30186:174;:::o;30366:366::-;30508:3;30529:67;30593:2;30588:3;30529:67;:::i;:::-;30522:74;;30605:93;30694:3;30605:93;:::i;:::-;30723:2;30718:3;30714:12;30707:19;;30366:366;;;:::o;30738:419::-;30904:4;30942:2;30931:9;30927:18;30919:26;;30991:9;30985:4;30981:20;30977:1;30966:9;30962:17;30955:47;31019:131;31145:4;31019:131;:::i;:::-;31011:139;;30738:419;;;:::o;31163:410::-;31203:7;31226:20;31244:1;31226:20;:::i;:::-;31221:25;;31260:20;31278:1;31260:20;:::i;:::-;31255:25;;31315:1;31312;31308:9;31337:30;31355:11;31337:30;:::i;:::-;31326:41;;31516:1;31507:7;31503:15;31500:1;31497:22;31477:1;31470:9;31450:83;31427:139;;31546:18;;:::i;:::-;31427:139;31211:362;31163:410;;;;:::o;31579:180::-;31627:77;31624:1;31617:88;31724:4;31721:1;31714:15;31748:4;31745:1;31738:15;31765:185;31805:1;31822:20;31840:1;31822:20;:::i;:::-;31817:25;;31856:20;31874:1;31856:20;:::i;:::-;31851:25;;31895:1;31885:35;;31900:18;;:::i;:::-;31885:35;31942:1;31939;31935:9;31930:14;;31765:185;;;;:::o;31956:180::-;32004:77;32001:1;31994:88;32101:4;32098:1;32091:15;32125:4;32122:1;32115:15;32142:180;32190:77;32187:1;32180:88;32287:4;32284:1;32277:15;32311:4;32308:1;32301:15;32328:85;32373:7;32402:5;32391:16;;32328:85;;;:::o;32419:158::-;32477:9;32510:61;32528:42;32537:32;32563:5;32537:32;:::i;:::-;32528:42;:::i;:::-;32510:61;:::i;:::-;32497:74;;32419:158;;;:::o;32583:147::-;32678:45;32717:5;32678:45;:::i;:::-;32673:3;32666:58;32583:147;;:::o;32736:114::-;32803:6;32837:5;32831:12;32821:22;;32736:114;;;:::o;32856:184::-;32955:11;32989:6;32984:3;32977:19;33029:4;33024:3;33020:14;33005:29;;32856:184;;;;:::o;33046:132::-;33113:4;33136:3;33128:11;;33166:4;33161:3;33157:14;33149:22;;33046:132;;;:::o;33184:108::-;33261:24;33279:5;33261:24;:::i;:::-;33256:3;33249:37;33184:108;;:::o;33298:179::-;33367:10;33388:46;33430:3;33422:6;33388:46;:::i;:::-;33466:4;33461:3;33457:14;33443:28;;33298:179;;;;:::o;33483:113::-;33553:4;33585;33580:3;33576:14;33568:22;;33483:113;;;:::o;33632:732::-;33751:3;33780:54;33828:5;33780:54;:::i;:::-;33850:86;33929:6;33924:3;33850:86;:::i;:::-;33843:93;;33960:56;34010:5;33960:56;:::i;:::-;34039:7;34070:1;34055:284;34080:6;34077:1;34074:13;34055:284;;;34156:6;34150:13;34183:63;34242:3;34227:13;34183:63;:::i;:::-;34176:70;;34269:60;34322:6;34269:60;:::i;:::-;34259:70;;34115:224;34102:1;34099;34095:9;34090:14;;34055:284;;;34059:14;34355:3;34348:10;;33756:608;;;33632:732;;;;:::o;34370:831::-;34633:4;34671:3;34660:9;34656:19;34648:27;;34685:71;34753:1;34742:9;34738:17;34729:6;34685:71;:::i;:::-;34766:80;34842:2;34831:9;34827:18;34818:6;34766:80;:::i;:::-;34893:9;34887:4;34883:20;34878:2;34867:9;34863:18;34856:48;34921:108;35024:4;35015:6;34921:108;:::i;:::-;34913:116;;35039:72;35107:2;35096:9;35092:18;35083:6;35039:72;:::i;:::-;35121:73;35189:3;35178:9;35174:19;35165:6;35121:73;:::i;:::-;34370:831;;;;;;;;:::o;35207:483::-;35378:4;35416:2;35405:9;35401:18;35393:26;;35429:71;35497:1;35486:9;35482:17;35473:6;35429:71;:::i;:::-;35547:9;35541:4;35537:20;35532:2;35521:9;35517:18;35510:48;35575:108;35678:4;35669:6;35575:108;:::i;:::-;35567:116;;35207:483;;;;;:::o;35696:166::-;35836:18;35832:1;35824:6;35820:14;35813:42;35696:166;:::o;35868:366::-;36010:3;36031:67;36095:2;36090:3;36031:67;:::i;:::-;36024:74;;36107:93;36196:3;36107:93;:::i;:::-;36225:2;36220:3;36216:12;36209:19;;35868:366;;;:::o;36240:419::-;36406:4;36444:2;36433:9;36429:18;36421:26;;36493:9;36487:4;36483:20;36479:1;36468:9;36464:17;36457:47;36521:131;36647:4;36521:131;:::i;:::-;36513:139;;36240:419;;;:::o

Swarm Source

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