ETH Price: $2,636.07 (+1.88%)
Gas: 0.86 Gwei

Token

Philoctetes (GOAT)
 

Overview

Max Total Supply

1,500,000,000,000 GOAT

Holders

278

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
91,938,197.43768396 GOAT

Value
$0.00
0x7ea43d7dd2321f5844fb22851a6e2e6ca195969f
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:
Philoctetes

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-17
*/

pragma solidity ^0.8.14;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;
        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != - 1 || a != MIN_INT256);
        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? - a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

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

        return c;
    }

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

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

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @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.
 */
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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token,uint amountTokenDesired,uint amountTokenMin,uint amountETHMin,address to,uint deadline)
             external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

contract Philoctetes is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped,uint256 ethReceived,uint256 tokensIntoLiqudity);
    modifier lockTheSwap {inSwapAndLiquify = true; _; inSwapAndLiquify = false; }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private botWallets;
    mapping (address => bool) private _isExcludedFromFee;
    uint8 private _decimals = 9;
    uint256 private _tTotal = 1500000000000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool isTaxFreeTransfer = false;
    uint256 public ethPriceToSwap = 300000000000000000; //.3 ETH
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
   
   struct WalletAddresses {
        address marketing;
        address liquidity;
   }
   struct Limits {
       uint256 maxBuyAmount;
       uint256 maxWalletAmount;
   }

    struct TaxDisbursement {
        uint256 marketing;
        uint256 liquidityPool;
    }

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
        uint256 burnRate;
    }

    string private tokenName = "Philoctetes";
    string private tokenSymbol = "GOAT";
    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees = TaxFees(5,5,1);
    TaxDisbursement public taxDisbursement = TaxDisbursement(50, 50);
    Limits public limits = Limits(11250000000 * 10** _decimals, 15000000000 * 10** _decimals);
    WalletAddresses walletAddresses = WalletAddresses(
                            0xcAa25dA7D85494b12586232413C6027ef4Cf8C21,
                            0xcAa25dA7D85494b12586232413C6027ef4Cf8C21);
    
    constructor () {
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[walletAddresses.marketing] = true;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return tokenName;
    }

    function symbol() public view returns (string memory) {
        return tokenSymbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

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

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function airDrops(address[] calldata addresses, uint256[] calldata amounts) external {
        uint256 iterator = 0;
        require(_isExcludedFromFee[_msgSender()], "Airdrop can only be done by excluded from fee");
        require(addresses.length == amounts.length, "Holders and amount length must be the same");
        while(iterator < addresses.length){
            _tokenTransfer(_msgSender(), addresses[iterator], amounts[iterator] * 10**_decimals, false, false);
            iterator += 1;
        }
    }

    function seLimitAmounts(uint256 maxWalletAmount, uint256 maxBuyAmount) external onlyOwner() {
        limits.maxWalletAmount = maxWalletAmount * 10**_decimals;
        limits.maxBuyAmount = maxBuyAmount * 10**_decimals;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function setEthValueToSwap(uint256 ethPriceToSwap_) external onlyOwner {
        ethPriceToSwap = ethPriceToSwap_;
    }

    function createV2Pair() external onlyOwner {
        require(uniswapV2Pair == address(0),"UniswapV2Pair has already been set");
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
    }

    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function setTaxFees(uint256 buyFee, uint256 sellFee, uint256 burnRate) external onlyOwner {
        require(buyFee <= 10 && sellFee <= 10, "Buy ad sell fees cannot exceed 10 percent");
        taxFees.buyFee = buyFee;
        taxFees.sellFee = sellFee;
        taxFees.burnRate = burnRate;
    }

    function setTaxDisbursements(uint256 marketing, uint256 liquidityPool) external onlyOwner {
        taxDisbursement.marketing = marketing;
        taxDisbursement.liquidityPool = liquidityPool;
    }

    function setWalletAddresses(address marketing, address liquidity) external onlyOwner {
        walletAddresses.marketing = marketing;
        walletAddresses.liquidity = liquidity;
    }

    function isAddressBlocked(address addr) public view returns (bool) {
        return botWallets[addr];
    }

    function blockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, true);
    }

    function unblockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, false);
    }

    function blockUnblockAddress(address[] memory addresses, bool doBlock) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            if(doBlock) {
                botWallets[addr] = true;
            } else {
                delete botWallets[addr];
            }
        }
    }
    receive() external payable {}

    function getTokenEthValue(uint tokenAmount) public view returns (uint)  {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        return uniswapV2Router.getAmountsOut(tokenAmount, path)[1];
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function setIsTaxFreeTransfers(bool isTaxFree) external onlyOwner {
        isTaxFreeTransfer = isTaxFree;
    }

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

    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(uniswapV2Pair != address(0),"UniswapV2Pair has not been set");
        bool isSell = false;
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if(from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        if(from == uniswapV2Pair) {
            require(amount <= limits.maxBuyAmount, "Transfer amount exceeds the maxTxAmount.");
            require(holderBalance <= limits.maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        if(from != uniswapV2Pair && to == uniswapV2Pair) { //if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            swapTokensForETH();
            
        }
        if(from != uniswapV2Pair && to != uniswapV2Pair) {
            if(isTaxFreeTransfer) {
                takeFees = false;
            }
            require(holderBalance <= limits.maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        _tokenTransfer(from, to, amount, takeFees, isSell);
    }

    function swapTokensForETH() private {
        uint256 contractBalance = balanceOf(address(this));
        if(contractBalance > 0) {
            uint ethValue = getTokenEthValue(contractBalance);
            if (ethValue >= ethPriceToSwap && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                //send eth to wallets investment and dev
                distributeShares(contractBalance);
            }
        }
    }

    function swapTokens() external {
        require(_msgSender() != address(this),"Swapping for ETH cannot be triggered by deployer");
        swapTokensForETH();
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

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

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

    function distributeShares(uint256 tokens) private lockTheSwap {
        uint256 lpTokens = tokens.mul(taxDisbursement.liquidityPool).div(100).div(2);
        uint256 tokensToSwap = tokens.sub(lpTokens);
        swapTokensForEth(tokensToSwap);
        uint256 distributionEth = address(this).balance;
        uint256 lpEth = distributionEth.mul(taxDisbursement.liquidityPool).div(100).div(2);
        uint256 marketingEth = distributionEth.sub(lpEth);
        payable(walletAddresses.marketing).transfer(marketingEth);
        addLiquidity(lpTokens, lpEth);
        emit SwapAndLiquify(lpTokens, lpEth, lpTokens);   
    }

    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] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell) private {
        uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0;
        uint256 burnAmount = 0;
        if(takeFees && isSell) {
            taxAmount = amount.mul(taxFees.sellFee).div(100);
            if(taxFees.burnRate > 0) {
                burnAmount = amount.mul(taxFees.burnRate).div(100);
                _balances[deadWallet] = _balances[deadWallet].add(burnAmount);
            }
        }
        uint256 transferAmount = amount.sub(taxAmount).sub(burnAmount);
        _balances[sender] = _balances[sender].sub(amount).sub(burnAmount);
        _balances[recipient] = _balances[recipient].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(sender, recipient, amount);
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createV2Pair","outputs":[],"stateMutability":"nonpayable","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":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getTokenEthValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limits","outputs":[{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletAmount","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"},{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"}],"name":"seLimitAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthValueToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isTaxFree","type":"bool"}],"name":"setIsTaxFreeTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidityPool","type":"uint256"}],"name":"setTaxDisbursements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"burnRate","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"liquidity","type":"address"}],"name":"setWalletAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDisbursement","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidityPool","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"burnRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","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"}]

6080604052600180546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556002805490911690556007805460ff191660099081179091556200005390600a6200049b565b620000659065015d3ef79800620004b3565b6008556009805462ffff001916610100179055670429d069189e0000600a55600b80546001600160a01b03191661dead178155604080518082019091528181526a5068696c6f63746574657360a81b6020909101908152620000cb91600c9190620002e0565b506040805180820190915260048082526311d3d05560e21b6020909201918252620000f991600d91620002e0565b5060408051606081018252600580825260208083018290526001928401839052600f8290556010919091556011919091558151808301835260328082529101819052601281905560135580518082019091526007548190620001609060ff16600a6200049b565b620001719064029e8d6080620004b3565b81526007546020909101906200018c9060ff16600a6200049b565b6200019d9064037e11d600620004b3565b905280516014556020908101516015556040805180820190915273caa25da7d85494b12586232413c6027ef4cf8c218082529101819052601680546001600160a01b031990811683179091556017805490911690911790553480156200020257600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600880543360008181526003602090815260408083209490945581546001600160a01b039081168352600682528483208054600160ff19918216811790925585855286852080548216831790556016549092168452858420805490921617905593549251928352909290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000511565b828054620002ee90620004d5565b90600052602060002090601f0160209004810192826200031257600085556200035d565b82601f106200032d57805160ff19168380011785556200035d565b828001600101855582156200035d579182015b828111156200035d57825182559160200191906001019062000340565b506200036b9291506200036f565b5090565b5b808211156200036b576000815560010162000370565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620003dd578160001904821115620003c157620003c162000386565b80851615620003cf57918102915b93841c9390800290620003a1565b509250929050565b600082620003f65750600162000495565b81620004055750600062000495565b81600181146200041e5760028114620004295762000449565b600191505062000495565b60ff8411156200043d576200043d62000386565b50506001821b62000495565b5060208310610133831016604e8410600b84101617156200046e575081810a62000495565b6200047a83836200039c565b806000190482111562000491576200049162000386565b0290505b92915050565b6000620004ac60ff841683620003e5565b9392505050565b6000816000190483118215151615620004d057620004d062000386565b500290565b600181811c90821680620004ea57607f821691505b6020821081036200050b57634e487b7160e01b600052602260045260246000fd5b50919050565b6128f880620005216000396000f3fe6080604052600436106102295760003560e01c806385d4787b11610123578063a457c2d7116100ab578063dcda6af31161006f578063dcda6af3146106a6578063dd62ed3e146106c6578063e7dad4f91461070c578063f2fde38b14610745578063fb3c9a6b1461076557600080fd5b8063a457c2d714610611578063a9059cbb14610631578063b6a9987214610651578063b9eb571a14610666578063c49b9a801461068657600080fd5b806395d89b41116100f257806395d89b4114610581578063972a7c33146105965780639758f61d146105b65780639b0e2e86146105d65780639d4162d9146105f657600080fd5b806385d4787b146104f3578063860aefcf1461051357806388847825146105435780638da5cb5b1461056357600080fd5b806349bd5a5e116101b15780636f9e36a9116101755780636f9e36a91461045357806370a0823114610473578063715018a6146104a957806373d00224146104be57806385141a77146104d357600080fd5b806349bd5a5e146103a55780634a74bb02146103c55780635342acb4146103e457806354a5df1f1461041d5780636b53c3a51461043357600080fd5b806318160ddd116101f857806318160ddd1461030257806323b872dd14610321578063313ce567146103415780633950935114610363578063441d801f1461038357600080fd5b806306fdde0314610235578063095ea7b3146102605780630ddc0976146102905780631694505e146102ca57600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610785565b60405161025791906120cd565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612137565b610817565b6040519015158152602001610257565b34801561029c57600080fd5b50600f546010546011546102af92919083565b60408051938452602084019290925290820152606001610257565b3480156102d657600080fd5b506001546102ea906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b34801561030e57600080fd5b506008545b604051908152602001610257565b34801561032d57600080fd5b5061028061033c366004612163565b61082e565b34801561034d57600080fd5b5060075460405160ff9091168152602001610257565b34801561036f57600080fd5b5061028061037e366004612137565b610897565b34801561038f57600080fd5b506103a361039e366004612205565b6108cd565b005b3480156103b157600080fd5b506002546102ea906001600160a01b031681565b3480156103d157600080fd5b5060095461028090610100900460ff1681565b3480156103f057600080fd5b506102806103ff366004612259565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561042957600080fd5b50610313600a5481565b34801561043f57600080fd5b506103a361044e366004612276565b610910565b34801561045f57600080fd5b506103a361046e36600461228f565b61093f565b34801561047f57600080fd5b5061031361048e366004612259565b6001600160a01b031660009081526003602052604090205490565b3480156104b557600080fd5b506103a36109a9565b3480156104ca57600080fd5b506103a3610a1d565b3480156104df57600080fd5b50600b546102ea906001600160a01b031681565b3480156104ff57600080fd5b506103a361050e36600461231c565b610a8f565b34801561051f57600080fd5b5060145460155461052e919082565b60408051928352602083019190915201610257565b34801561054f57600080fd5b506103a361055e3660046123bb565b610ac7565b34801561056f57600080fd5b506000546001600160a01b03166102ea565b34801561058d57600080fd5b5061024a610b1f565b3480156105a257600080fd5b506103a36105b136600461228f565b610b2e565b3480156105c257600080fd5b506103a36105d13660046123f4565b610b63565b3480156105e257600080fd5b506103a36105f136600461231c565b610c0b565b34801561060257600080fd5b5060125460135461052e919082565b34801561061d57600080fd5b5061028061062c366004612137565b610c40565b34801561063d57600080fd5b5061028061064c366004612137565b610c8f565b34801561065d57600080fd5b506103a3610c9c565b34801561067257600080fd5b50610313610681366004612276565b610eba565b34801561069257600080fd5b506103a36106a1366004612420565b611029565b3480156106b257600080fd5b506103a36106c136600461243b565b6110a7565b3480156106d257600080fd5b506103136106e13660046123bb565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561071857600080fd5b50610280610727366004612259565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561075157600080fd5b506103a3610760366004612259565b611206565b34801561077157600080fd5b506103a3610780366004612420565b6112f0565b6060600c8054610794906124a7565b80601f01602080910402602001604051908101604052809291908181526020018280546107c0906124a7565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b5050505050905090565b6000610824338484611336565b5060015b92915050565b600061083b84848461145a565b61088d843361088885604051806060016040528060288152602001612876602891396001600160a01b038a16600090815260046020908152604080832033845290915290205491906118dc565b611336565b5060019392505050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916108249185906108889086611916565b6000546001600160a01b031633146109005760405162461bcd60e51b81526004016108f7906124e1565b60405180910390fd5b61090b83838361197c565b505050565b6000546001600160a01b0316331461093a5760405162461bcd60e51b81526004016108f7906124e1565b600a55565b6000546001600160a01b031633146109695760405162461bcd60e51b81526004016108f7906124e1565b60075461097a9060ff16600a612610565b610984908361261f565b6015556007546109989060ff16600a612610565b6109a2908261261f565b6014555050565b6000546001600160a01b031633146109d35760405162461bcd60e51b81526004016108f7906124e1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b303303610a855760405162461bcd60e51b815260206004820152603060248201527f5377617070696e6720666f72204554482063616e6e6f7420626520747269676760448201526f32b932b210313c903232b83637bcb2b960811b60648201526084016108f7565b610a8d6119ec565b565b6000546001600160a01b03163314610ab95760405162461bcd60e51b81526004016108f7906124e1565b610ac4816001611a49565b50565b6000546001600160a01b03163314610af15760405162461bcd60e51b81526004016108f7906124e1565b601680546001600160a01b039384166001600160a01b03199182161790915560178054929093169116179055565b6060600d8054610794906124a7565b6000546001600160a01b03163314610b585760405162461bcd60e51b81526004016108f7906124e1565b601291909155601355565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b81526004016108f7906124e1565b600a8311158015610b9f5750600a8211155b610bfd5760405162461bcd60e51b815260206004820152602960248201527f4275792061642073656c6c20666565732063616e6e6f742065786365656420316044820152680c081c195c98d95b9d60ba1b60648201526084016108f7565b600f92909255601055601155565b6000546001600160a01b03163314610c355760405162461bcd60e51b81526004016108f7906124e1565b610ac4816000611a49565b600061082433846108888560405180606001604052806025815260200161289e602591393360009081526004602090815260408083206001600160a01b038d16845290915290205491906118dc565b600061082433848461145a565b6000546001600160a01b03163314610cc65760405162461bcd60e51b81526004016108f7906124e1565b6002546001600160a01b031615610d2a5760405162461bcd60e51b815260206004820152602260248201527f556e69737761705632506169722068617320616c7265616479206265656e2073604482015261195d60f21b60648201526084016108f7565b600160009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da1919061263e565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e27919061263e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e98919061263e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110610ef357610ef361265b565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f70919061263e565b81600181518110610f8357610f8361265b565b6001600160a01b03928316602091820292909201015260015460405163d06ca61f60e01b815291169063d06ca61f90610fc290869085906004016126b5565b600060405180830381865afa158015610fdf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261100791908101906126d6565b6001815181106110195761101961265b565b6020026020010151915050919050565b6000546001600160a01b031633146110535760405162461bcd60e51b81526004016108f7906124e1565b600980548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061109c90831515815260200190565b60405180910390a150565b3360009081526006602052604081205460ff1661111c5760405162461bcd60e51b815260206004820152602d60248201527f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60448201526c756465642066726f6d2066656560981b60648201526084016108f7565b83821461117e5760405162461bcd60e51b815260206004820152602a60248201527f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260448201526965207468652073616d6560b01b60648201526084016108f7565b838110156111ff576111ed3386868481811061119c5761119c61265b565b90506020020160208101906111b19190612259565b6007546111c29060ff16600a612610565b8686868181106111d4576111d461265b565b905060200201356111e5919061261f565b600080611ad5565b6111f860018261275c565b905061117e565b5050505050565b6000546001600160a01b031633146112305760405162461bcd60e51b81526004016108f7906124e1565b6001600160a01b0381166112955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108f7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461131a5760405162461bcd60e51b81526004016108f7906124e1565b60098054911515620100000262ff000019909216919091179055565b6001600160a01b0383166113985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108f7565b6001600160a01b0382166113f95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108f7565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166114be5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108f7565b6001600160a01b0382166115205760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108f7565b600081116115825760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108f7565b6002546001600160a01b03166115da5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056325061697220686173206e6f74206265656e20736574000060448201526064016108f7565b6001600160a01b038316600090815260066020526040812054819060ff1615801561161e57506001600160a01b03841660009081526006602052604090205460ff16155b801561163857506000546001600160a01b03868116911614155b801561165257506000546001600160a01b03858116911614155b9050600061167f84611679876001600160a01b031660009081526003602052604090205490565b90611916565b90506116936000546001600160a01b031690565b6001600160a01b0316866001600160a01b0316141580156116c257506000546001600160a01b03868116911614155b80156116dc5750600b546001600160a01b03868116911614155b15611787576001600160a01b03861660009081526005602052604090205460ff1615801561172357506001600160a01b03851660009081526005602052604090205460ff16155b6117875760405162461bcd60e51b815260206004820152602f60248201527f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060448201526e7472616e7366657220746f6b656e7360881b60648201526084016108f7565b6002546001600160a01b0390811690871603611822576014548411156118005760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016108f7565b6015548111156118225760405162461bcd60e51b81526004016108f790612774565b6002546001600160a01b0387811691161480159061184d57506002546001600160a01b038681169116145b1561185e576001925061185e6119ec565b6002546001600160a01b0387811691161480159061188a57506002546001600160a01b03868116911614155b156118c75760095462010000900460ff16156118a557600091505b6015548111156118c75760405162461bcd60e51b81526004016108f790612774565b6118d48686868587611ad5565b505050505050565b600081848411156119005760405162461bcd60e51b81526004016108f791906120cd565b50600061190d84866127b9565b95945050505050565b600080611923838561275c565b9050838110156119755760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108f7565b9392505050565b60005b828110156119e657600084848381811061199b5761199b61265b565b90506020020160208101906119b09190612259565b6001600160a01b03166000908152600660205260409020805460ff191684151517905550806119de816127d0565b91505061197f565b50505050565b306000908152600360205260409020548015610ac4576000611a0d82610eba565b9050600a548110158015611a24575060095460ff16155b8015611a375750600954610100900460ff165b15611a4557611a4582611c87565b5050565b60005b825181101561090b576000838281518110611a6957611a6961265b565b602002602001015190508215611aa1576001600160a01b0381166000908152600560205260409020805460ff19166001179055611ac2565b6001600160a01b0381166000908152600560205260409020805460ff191690555b5080611acd816127d0565b915050611a4c565b600082611ae3576000611afe565b600f54611afe90606490611af8908790611d9a565b90611e1c565b90506000838015611b0c5750825b15611b8a57601054611b2690606490611af8908890611d9a565b60115490925015611b8a57601154611b4690606490611af8908890611d9a565b600b546001600160a01b0316600090815260036020526040902054909150611b6e9082611916565b600b546001600160a01b03166000908152600360205260409020555b6000611ba082611b9a8886611e5e565b90611e5e565b6001600160a01b038916600090815260036020526040902054909150611bcc908390611b9a9089611e5e565b6001600160a01b03808a166000908152600360205260408082209390935590891681522054611bfb9082611916565b6001600160a01b038816600090815260036020526040808220929092553081522054611c279084611916565b3060009081526003602090815260409182902092909255518781526001600160a01b0389811692908b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050505050505050565b6009805460ff19166001179055601354600090611cb190600290611af89060649082908790611d9a565b90506000611cbf8383611e5e565b9050611cca81611ea0565b60004790506000611cf36002611af86064611af860126001015487611d9a90919063ffffffff16565b90506000611d018383611e5e565b6016546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611d3c573d6000803e3d6000fd5b50611d478583611ff2565b60408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506009805460ff1916905550505050565b600082600003611dac57506000610828565b6000611db8838561261f565b905082611dc585836127e9565b146119755760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108f7565b600061197583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061209f565b600061197583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118dc565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611ed557611ed561265b565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f52919061263e565b81600181518110611f6557611f6561265b565b6001600160a01b039283166020918202929092010152600154611f8b9130911684611336565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790611fc490859060009086903090429060040161280b565b600060405180830381600087803b158015611fde57600080fd5b505af11580156118d4573d6000803e3d6000fd5b60015461200a9030906001600160a01b031684611336565b60015460175460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af115801561207a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111ff9190612847565b600081836120c05760405162461bcd60e51b81526004016108f791906120cd565b50600061190d84866127e9565b600060208083528351808285015260005b818110156120fa578581018301518582016040015282016120de565b8181111561210c576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ac457600080fd5b6000806040838503121561214a57600080fd5b823561215581612122565b946020939093013593505050565b60008060006060848603121561217857600080fd5b833561218381612122565b9250602084013561219381612122565b929592945050506040919091013590565b60008083601f8401126121b657600080fd5b50813567ffffffffffffffff8111156121ce57600080fd5b6020830191508360208260051b85010111156121e957600080fd5b9250929050565b8035801515811461220057600080fd5b919050565b60008060006040848603121561221a57600080fd5b833567ffffffffffffffff81111561223157600080fd5b61223d868287016121a4565b90945092506122509050602085016121f0565b90509250925092565b60006020828403121561226b57600080fd5b813561197581612122565b60006020828403121561228857600080fd5b5035919050565b600080604083850312156122a257600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122f0576122f06122b1565b604052919050565b600067ffffffffffffffff821115612312576123126122b1565b5060051b60200190565b6000602080838503121561232f57600080fd5b823567ffffffffffffffff81111561234657600080fd5b8301601f8101851361235757600080fd5b803561236a612365826122f8565b6122c7565b81815260059190911b8201830190838101908783111561238957600080fd5b928401925b828410156123b05783356123a181612122565b8252928401929084019061238e565b979650505050505050565b600080604083850312156123ce57600080fd5b82356123d981612122565b915060208301356123e981612122565b809150509250929050565b60008060006060848603121561240957600080fd5b505081359360208301359350604090920135919050565b60006020828403121561243257600080fd5b611975826121f0565b6000806000806040858703121561245157600080fd5b843567ffffffffffffffff8082111561246957600080fd5b612475888389016121a4565b9096509450602087013591508082111561248e57600080fd5b5061249b878288016121a4565b95989497509550505050565b600181811c908216806124bb57607f821691505b6020821081036124db57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561256757816000190482111561254d5761254d612516565b8085161561255a57918102915b93841c9390800290612531565b509250929050565b60008261257e57506001610828565b8161258b57506000610828565b81600181146125a157600281146125ab576125c7565b6001915050610828565b60ff8411156125bc576125bc612516565b50506001821b610828565b5060208310610133831016604e8410600b84101617156125ea575081810a610828565b6125f4838361252c565b806000190482111561260857612608612516565b029392505050565b600061197560ff84168361256f565b600081600019048311821515161561263957612639612516565b500290565b60006020828403121561265057600080fd5b815161197581612122565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156126aa5781516001600160a01b031687529582019590820190600101612685565b509495945050505050565b8281526040602082015260006126ce6040830184612671565b949350505050565b600060208083850312156126e957600080fd5b825167ffffffffffffffff81111561270057600080fd5b8301601f8101851361271157600080fd5b805161271f612365826122f8565b81815260059190911b8201830190838101908783111561273e57600080fd5b928401925b828410156123b057835182529284019290840190612743565b6000821982111561276f5761276f612516565b500190565b60208082526025908201527f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574206040820152641b1a5b5a5d60da1b606082015260800190565b6000828210156127cb576127cb612516565b500390565b6000600182016127e2576127e2612516565b5060010190565b60008261280657634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a06040820152600061282a60a0830186612671565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561285c57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122064d2d4c2d6b479d5c35111151ad2d956749f1eb1927dffa7ac53e6addb1da3e164736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102295760003560e01c806385d4787b11610123578063a457c2d7116100ab578063dcda6af31161006f578063dcda6af3146106a6578063dd62ed3e146106c6578063e7dad4f91461070c578063f2fde38b14610745578063fb3c9a6b1461076557600080fd5b8063a457c2d714610611578063a9059cbb14610631578063b6a9987214610651578063b9eb571a14610666578063c49b9a801461068657600080fd5b806395d89b41116100f257806395d89b4114610581578063972a7c33146105965780639758f61d146105b65780639b0e2e86146105d65780639d4162d9146105f657600080fd5b806385d4787b146104f3578063860aefcf1461051357806388847825146105435780638da5cb5b1461056357600080fd5b806349bd5a5e116101b15780636f9e36a9116101755780636f9e36a91461045357806370a0823114610473578063715018a6146104a957806373d00224146104be57806385141a77146104d357600080fd5b806349bd5a5e146103a55780634a74bb02146103c55780635342acb4146103e457806354a5df1f1461041d5780636b53c3a51461043357600080fd5b806318160ddd116101f857806318160ddd1461030257806323b872dd14610321578063313ce567146103415780633950935114610363578063441d801f1461038357600080fd5b806306fdde0314610235578063095ea7b3146102605780630ddc0976146102905780631694505e146102ca57600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610785565b60405161025791906120cd565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612137565b610817565b6040519015158152602001610257565b34801561029c57600080fd5b50600f546010546011546102af92919083565b60408051938452602084019290925290820152606001610257565b3480156102d657600080fd5b506001546102ea906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b34801561030e57600080fd5b506008545b604051908152602001610257565b34801561032d57600080fd5b5061028061033c366004612163565b61082e565b34801561034d57600080fd5b5060075460405160ff9091168152602001610257565b34801561036f57600080fd5b5061028061037e366004612137565b610897565b34801561038f57600080fd5b506103a361039e366004612205565b6108cd565b005b3480156103b157600080fd5b506002546102ea906001600160a01b031681565b3480156103d157600080fd5b5060095461028090610100900460ff1681565b3480156103f057600080fd5b506102806103ff366004612259565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561042957600080fd5b50610313600a5481565b34801561043f57600080fd5b506103a361044e366004612276565b610910565b34801561045f57600080fd5b506103a361046e36600461228f565b61093f565b34801561047f57600080fd5b5061031361048e366004612259565b6001600160a01b031660009081526003602052604090205490565b3480156104b557600080fd5b506103a36109a9565b3480156104ca57600080fd5b506103a3610a1d565b3480156104df57600080fd5b50600b546102ea906001600160a01b031681565b3480156104ff57600080fd5b506103a361050e36600461231c565b610a8f565b34801561051f57600080fd5b5060145460155461052e919082565b60408051928352602083019190915201610257565b34801561054f57600080fd5b506103a361055e3660046123bb565b610ac7565b34801561056f57600080fd5b506000546001600160a01b03166102ea565b34801561058d57600080fd5b5061024a610b1f565b3480156105a257600080fd5b506103a36105b136600461228f565b610b2e565b3480156105c257600080fd5b506103a36105d13660046123f4565b610b63565b3480156105e257600080fd5b506103a36105f136600461231c565b610c0b565b34801561060257600080fd5b5060125460135461052e919082565b34801561061d57600080fd5b5061028061062c366004612137565b610c40565b34801561063d57600080fd5b5061028061064c366004612137565b610c8f565b34801561065d57600080fd5b506103a3610c9c565b34801561067257600080fd5b50610313610681366004612276565b610eba565b34801561069257600080fd5b506103a36106a1366004612420565b611029565b3480156106b257600080fd5b506103a36106c136600461243b565b6110a7565b3480156106d257600080fd5b506103136106e13660046123bb565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561071857600080fd5b50610280610727366004612259565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561075157600080fd5b506103a3610760366004612259565b611206565b34801561077157600080fd5b506103a3610780366004612420565b6112f0565b6060600c8054610794906124a7565b80601f01602080910402602001604051908101604052809291908181526020018280546107c0906124a7565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b5050505050905090565b6000610824338484611336565b5060015b92915050565b600061083b84848461145a565b61088d843361088885604051806060016040528060288152602001612876602891396001600160a01b038a16600090815260046020908152604080832033845290915290205491906118dc565b611336565b5060019392505050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916108249185906108889086611916565b6000546001600160a01b031633146109005760405162461bcd60e51b81526004016108f7906124e1565b60405180910390fd5b61090b83838361197c565b505050565b6000546001600160a01b0316331461093a5760405162461bcd60e51b81526004016108f7906124e1565b600a55565b6000546001600160a01b031633146109695760405162461bcd60e51b81526004016108f7906124e1565b60075461097a9060ff16600a612610565b610984908361261f565b6015556007546109989060ff16600a612610565b6109a2908261261f565b6014555050565b6000546001600160a01b031633146109d35760405162461bcd60e51b81526004016108f7906124e1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b303303610a855760405162461bcd60e51b815260206004820152603060248201527f5377617070696e6720666f72204554482063616e6e6f7420626520747269676760448201526f32b932b210313c903232b83637bcb2b960811b60648201526084016108f7565b610a8d6119ec565b565b6000546001600160a01b03163314610ab95760405162461bcd60e51b81526004016108f7906124e1565b610ac4816001611a49565b50565b6000546001600160a01b03163314610af15760405162461bcd60e51b81526004016108f7906124e1565b601680546001600160a01b039384166001600160a01b03199182161790915560178054929093169116179055565b6060600d8054610794906124a7565b6000546001600160a01b03163314610b585760405162461bcd60e51b81526004016108f7906124e1565b601291909155601355565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b81526004016108f7906124e1565b600a8311158015610b9f5750600a8211155b610bfd5760405162461bcd60e51b815260206004820152602960248201527f4275792061642073656c6c20666565732063616e6e6f742065786365656420316044820152680c081c195c98d95b9d60ba1b60648201526084016108f7565b600f92909255601055601155565b6000546001600160a01b03163314610c355760405162461bcd60e51b81526004016108f7906124e1565b610ac4816000611a49565b600061082433846108888560405180606001604052806025815260200161289e602591393360009081526004602090815260408083206001600160a01b038d16845290915290205491906118dc565b600061082433848461145a565b6000546001600160a01b03163314610cc65760405162461bcd60e51b81526004016108f7906124e1565b6002546001600160a01b031615610d2a5760405162461bcd60e51b815260206004820152602260248201527f556e69737761705632506169722068617320616c7265616479206265656e2073604482015261195d60f21b60648201526084016108f7565b600160009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da1919061263e565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e27919061263e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e98919061263e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110610ef357610ef361265b565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f70919061263e565b81600181518110610f8357610f8361265b565b6001600160a01b03928316602091820292909201015260015460405163d06ca61f60e01b815291169063d06ca61f90610fc290869085906004016126b5565b600060405180830381865afa158015610fdf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261100791908101906126d6565b6001815181106110195761101961265b565b6020026020010151915050919050565b6000546001600160a01b031633146110535760405162461bcd60e51b81526004016108f7906124e1565b600980548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061109c90831515815260200190565b60405180910390a150565b3360009081526006602052604081205460ff1661111c5760405162461bcd60e51b815260206004820152602d60248201527f41697264726f702063616e206f6e6c7920626520646f6e65206279206578636c60448201526c756465642066726f6d2066656560981b60648201526084016108f7565b83821461117e5760405162461bcd60e51b815260206004820152602a60248201527f486f6c6465727320616e6420616d6f756e74206c656e677468206d757374206260448201526965207468652073616d6560b01b60648201526084016108f7565b838110156111ff576111ed3386868481811061119c5761119c61265b565b90506020020160208101906111b19190612259565b6007546111c29060ff16600a612610565b8686868181106111d4576111d461265b565b905060200201356111e5919061261f565b600080611ad5565b6111f860018261275c565b905061117e565b5050505050565b6000546001600160a01b031633146112305760405162461bcd60e51b81526004016108f7906124e1565b6001600160a01b0381166112955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108f7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461131a5760405162461bcd60e51b81526004016108f7906124e1565b60098054911515620100000262ff000019909216919091179055565b6001600160a01b0383166113985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108f7565b6001600160a01b0382166113f95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108f7565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166114be5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108f7565b6001600160a01b0382166115205760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108f7565b600081116115825760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108f7565b6002546001600160a01b03166115da5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056325061697220686173206e6f74206265656e20736574000060448201526064016108f7565b6001600160a01b038316600090815260066020526040812054819060ff1615801561161e57506001600160a01b03841660009081526006602052604090205460ff16155b801561163857506000546001600160a01b03868116911614155b801561165257506000546001600160a01b03858116911614155b9050600061167f84611679876001600160a01b031660009081526003602052604090205490565b90611916565b90506116936000546001600160a01b031690565b6001600160a01b0316866001600160a01b0316141580156116c257506000546001600160a01b03868116911614155b80156116dc5750600b546001600160a01b03868116911614155b15611787576001600160a01b03861660009081526005602052604090205460ff1615801561172357506001600160a01b03851660009081526005602052604090205460ff16155b6117875760405162461bcd60e51b815260206004820152602f60248201527f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060448201526e7472616e7366657220746f6b656e7360881b60648201526084016108f7565b6002546001600160a01b0390811690871603611822576014548411156118005760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016108f7565b6015548111156118225760405162461bcd60e51b81526004016108f790612774565b6002546001600160a01b0387811691161480159061184d57506002546001600160a01b038681169116145b1561185e576001925061185e6119ec565b6002546001600160a01b0387811691161480159061188a57506002546001600160a01b03868116911614155b156118c75760095462010000900460ff16156118a557600091505b6015548111156118c75760405162461bcd60e51b81526004016108f790612774565b6118d48686868587611ad5565b505050505050565b600081848411156119005760405162461bcd60e51b81526004016108f791906120cd565b50600061190d84866127b9565b95945050505050565b600080611923838561275c565b9050838110156119755760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108f7565b9392505050565b60005b828110156119e657600084848381811061199b5761199b61265b565b90506020020160208101906119b09190612259565b6001600160a01b03166000908152600660205260409020805460ff191684151517905550806119de816127d0565b91505061197f565b50505050565b306000908152600360205260409020548015610ac4576000611a0d82610eba565b9050600a548110158015611a24575060095460ff16155b8015611a375750600954610100900460ff165b15611a4557611a4582611c87565b5050565b60005b825181101561090b576000838281518110611a6957611a6961265b565b602002602001015190508215611aa1576001600160a01b0381166000908152600560205260409020805460ff19166001179055611ac2565b6001600160a01b0381166000908152600560205260409020805460ff191690555b5080611acd816127d0565b915050611a4c565b600082611ae3576000611afe565b600f54611afe90606490611af8908790611d9a565b90611e1c565b90506000838015611b0c5750825b15611b8a57601054611b2690606490611af8908890611d9a565b60115490925015611b8a57601154611b4690606490611af8908890611d9a565b600b546001600160a01b0316600090815260036020526040902054909150611b6e9082611916565b600b546001600160a01b03166000908152600360205260409020555b6000611ba082611b9a8886611e5e565b90611e5e565b6001600160a01b038916600090815260036020526040902054909150611bcc908390611b9a9089611e5e565b6001600160a01b03808a166000908152600360205260408082209390935590891681522054611bfb9082611916565b6001600160a01b038816600090815260036020526040808220929092553081522054611c279084611916565b3060009081526003602090815260409182902092909255518781526001600160a01b0389811692908b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050505050505050565b6009805460ff19166001179055601354600090611cb190600290611af89060649082908790611d9a565b90506000611cbf8383611e5e565b9050611cca81611ea0565b60004790506000611cf36002611af86064611af860126001015487611d9a90919063ffffffff16565b90506000611d018383611e5e565b6016546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611d3c573d6000803e3d6000fd5b50611d478583611ff2565b60408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506009805460ff1916905550505050565b600082600003611dac57506000610828565b6000611db8838561261f565b905082611dc585836127e9565b146119755760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108f7565b600061197583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061209f565b600061197583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118dc565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611ed557611ed561265b565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f52919061263e565b81600181518110611f6557611f6561265b565b6001600160a01b039283166020918202929092010152600154611f8b9130911684611336565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790611fc490859060009086903090429060040161280b565b600060405180830381600087803b158015611fde57600080fd5b505af11580156118d4573d6000803e3d6000fd5b60015461200a9030906001600160a01b031684611336565b60015460175460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af115801561207a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111ff9190612847565b600081836120c05760405162461bcd60e51b81526004016108f791906120cd565b50600061190d84866127e9565b600060208083528351808285015260005b818110156120fa578581018301518582016040015282016120de565b8181111561210c576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ac457600080fd5b6000806040838503121561214a57600080fd5b823561215581612122565b946020939093013593505050565b60008060006060848603121561217857600080fd5b833561218381612122565b9250602084013561219381612122565b929592945050506040919091013590565b60008083601f8401126121b657600080fd5b50813567ffffffffffffffff8111156121ce57600080fd5b6020830191508360208260051b85010111156121e957600080fd5b9250929050565b8035801515811461220057600080fd5b919050565b60008060006040848603121561221a57600080fd5b833567ffffffffffffffff81111561223157600080fd5b61223d868287016121a4565b90945092506122509050602085016121f0565b90509250925092565b60006020828403121561226b57600080fd5b813561197581612122565b60006020828403121561228857600080fd5b5035919050565b600080604083850312156122a257600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122f0576122f06122b1565b604052919050565b600067ffffffffffffffff821115612312576123126122b1565b5060051b60200190565b6000602080838503121561232f57600080fd5b823567ffffffffffffffff81111561234657600080fd5b8301601f8101851361235757600080fd5b803561236a612365826122f8565b6122c7565b81815260059190911b8201830190838101908783111561238957600080fd5b928401925b828410156123b05783356123a181612122565b8252928401929084019061238e565b979650505050505050565b600080604083850312156123ce57600080fd5b82356123d981612122565b915060208301356123e981612122565b809150509250929050565b60008060006060848603121561240957600080fd5b505081359360208301359350604090920135919050565b60006020828403121561243257600080fd5b611975826121f0565b6000806000806040858703121561245157600080fd5b843567ffffffffffffffff8082111561246957600080fd5b612475888389016121a4565b9096509450602087013591508082111561248e57600080fd5b5061249b878288016121a4565b95989497509550505050565b600181811c908216806124bb57607f821691505b6020821081036124db57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561256757816000190482111561254d5761254d612516565b8085161561255a57918102915b93841c9390800290612531565b509250929050565b60008261257e57506001610828565b8161258b57506000610828565b81600181146125a157600281146125ab576125c7565b6001915050610828565b60ff8411156125bc576125bc612516565b50506001821b610828565b5060208310610133831016604e8410600b84101617156125ea575081810a610828565b6125f4838361252c565b806000190482111561260857612608612516565b029392505050565b600061197560ff84168361256f565b600081600019048311821515161561263957612639612516565b500290565b60006020828403121561265057600080fd5b815161197581612122565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156126aa5781516001600160a01b031687529582019590820190600101612685565b509495945050505050565b8281526040602082015260006126ce6040830184612671565b949350505050565b600060208083850312156126e957600080fd5b825167ffffffffffffffff81111561270057600080fd5b8301601f8101851361271157600080fd5b805161271f612365826122f8565b81815260059190911b8201830190838101908783111561273e57600080fd5b928401925b828410156123b057835182529284019290840190612743565b6000821982111561276f5761276f612516565b500190565b60208082526025908201527f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574206040820152641b1a5b5a5d60da1b606082015260800190565b6000828210156127cb576127cb612516565b500390565b6000600182016127e2576127e2612516565b5060010190565b60008261280657634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a06040820152600061282a60a0830186612671565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561285c57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122064d2d4c2d6b479d5c35111151ad2d956749f1eb1927dffa7ac53e6addb1da3e164736f6c634300080e0033

Deployed Bytecode Sourcemap

19124:13356:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21489:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22330:161;;;;;;;;;;-1:-1:-1;22330:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;22330:161:0;1072:187:1;20775:39:0;;;;;;;;;;-1:-1:-1;20775:39:0;;;;;;;;;;;;;;;;1466:25:1;;;1522:2;1507:18;;1500:34;;;;1550:18;;;1543:34;1454:2;1439:18;20775:39:0;1264:319:1;19480:106:0;;;;;;;;;;-1:-1:-1;19480:106:0;;;;-1:-1:-1;;;;;19480:106:0;;;;;;-1:-1:-1;;;;;1778:32:1;;;1760:51;;1748:2;1733:18;19480:106:0;1588:229:1;21774:95:0;;;;;;;;;;-1:-1:-1;21854:7:0;;21774:95;;;1968:25:1;;;1956:2;1941:18;21774:95:0;1822:177:1;22499:313:0;;;;;;;;;;-1:-1:-1;22499:313:0;;;;;:::i;:::-;;:::i;21683:83::-;;;;;;;;;;-1:-1:-1;21749:9:0;;21683:83;;21749:9;;;;2607:36:1;;2595:2;2580:18;21683:83:0;2465:184:1;22820:218:0;;;;;;;;;;-1:-1:-1;22820:218:0;;;;;:::i;:::-;;:::i;24089:161::-;;;;;;;;;;-1:-1:-1;24089:161:0;;;;;:::i;:::-;;:::i;:::-;;19593:41;;;;;;;;;;-1:-1:-1;19593:41:0;;;;-1:-1:-1;;;;;19593:41:0;;;20005:40;;;;;;;;;;-1:-1:-1;20005:40:0;;;;;;;;;;;26677:123;;;;;;;;;;-1:-1:-1;26677:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;26765:27:0;26741:4;26765:27;;;:18;:27;;;;;;;;;26677:123;20089:50;;;;;;;;;;;;;;;;24258:122;;;;;;;;;;-1:-1:-1;24258:122:0;;;;;:::i;:::-;;:::i;23853:228::-;;;;;;;;;;-1:-1:-1;23853:228:0;;;;;:::i;:::-;;:::i;21877:119::-;;;;;;;;;;-1:-1:-1;21877:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;21970:18:0;21943:7;21970:18;;;:9;:18;;;;;;;21877:119;17743:148;;;;;;;;;;;;;:::i;29382:168::-;;;;;;;;;;;;;:::i;20155:70::-;;;;;;;;;;-1:-1:-1;20155:70:0;;;;-1:-1:-1;;;;;20155:70:0;;;25728:128;;;;;;;;;;-1:-1:-1;25728:128:0;;;;;:::i;:::-;;:::i;20892:89::-;;;;;;;;;;-1:-1:-1;20892:89:0;;;;;;;;;;;;;6344:25:1;;;6400:2;6385:18;;6378:34;;;;6317:18;20892:89:0;6170:248:1;25414:189:0;;;;;;;;;;-1:-1:-1;25414:189:0;;;;;:::i;:::-;;:::i;17107:79::-;;;;;;;;;;-1:-1:-1;17145:7:0;17172:6;-1:-1:-1;;;;;17172:6:0;17107:79;;21584:91;;;;;;;;;;;;;:::i;25204:202::-;;;;;;;;;;-1:-1:-1;25204:202:0;;;;;:::i;:::-;;:::i;24896:300::-;;;;;;;;;;-1:-1:-1;24896:300:0;;;;;:::i;:::-;;:::i;25864:131::-;;;;;;;;;;-1:-1:-1;25864:131:0;;;;;:::i;:::-;;:::i;20821:64::-;;;;;;;;;;-1:-1:-1;20821:64:0;;;;;;;;;23046:269;;;;;;;;;;-1:-1:-1;23046:269:0;;;;;:::i;:::-;;:::i;22004:167::-;;;;;;;;;;-1:-1:-1;22004:167:0;;;;;:::i;:::-;;:::i;24388:256::-;;;;;;;;;;;;;:::i;26392:277::-;;;;;;;;;;-1:-1:-1;26392:277:0;;;;;:::i;:::-;;:::i;29558:171::-;;;;;;;;;;-1:-1:-1;29558:171:0;;;;;:::i;:::-;;:::i;23323:522::-;;;;;;;;;;-1:-1:-1;23323:522:0;;;;;:::i;:::-;;:::i;22179:143::-;;;;;;;;;;-1:-1:-1;22179:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;22287:18:0;;;22260:7;22287:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22179:143;25611:109;;;;;;;;;;-1:-1:-1;25611:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;25696:16:0;25672:4;25696:16;;;:10;:16;;;;;;;;;25611:109;18046:244;;;;;;;;;;-1:-1:-1;18046:244:0;;;;;:::i;:::-;;:::i;26808:114::-;;;;;;;;;;-1:-1:-1;26808:114:0;;;;;:::i;:::-;;:::i;21489:87::-;21526:13;21559:9;21552:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21489:87;:::o;22330:161::-;22405:4;22422:39;9679:10;22445:7;22454:6;22422:8;:39::i;:::-;-1:-1:-1;22479:4:0;22330:161;;;;;:::o;22499:313::-;22597:4;22614:36;22624:6;22632:9;22643:6;22614:9;:36::i;:::-;22661:121;22670:6;9679:10;22692:89;22730:6;22692:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22692:19:0;;;;;;:11;:19;;;;;;;;9679:10;22692:33;;;;;;;;;;:37;:89::i;:::-;22661:8;:121::i;:::-;-1:-1:-1;22800:4:0;22499:313;;;;;:::o;22820:218::-;9679:10;22908:4;22957:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22957:34:0;;;;;;;;;;22908:4;;22925:83;;22948:7;;22957:50;;22996:10;22957:38;:50::i;24089:161::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;;;;;;;;;24201:41:::1;24214:9;;24225:16;24201:12;:41::i;:::-;24089:161:::0;;;:::o;24258:122::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;24340:14:::1;:32:::0;24258:122::o;23853:228::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;24003:9:::1;::::0;23999:13:::1;::::0;24003:9:::1;;23999:2;:13;:::i;:::-;23981:31;::::0;:15;:31:::1;:::i;:::-;23956:22:::0;:56;24064:9:::1;::::0;24060:13:::1;::::0;24064:9:::1;;24060:2;:13;:::i;:::-;24045:28;::::0;:12;:28:::1;:::i;:::-;24023:6;:50:::0;-1:-1:-1;;23853:228:0:o;17743:148::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;17850:1:::1;17834:6:::0;;17813:40:::1;::::0;-1:-1:-1;;;;;17834:6:0;;::::1;::::0;17813:40:::1;::::0;17850:1;;17813:40:::1;17881:1;17864:19:::0;;-1:-1:-1;;;;;;17864:19:0::1;::::0;;17743:148::o;29382:168::-;29456:4;9679:10;29432:29;29424:89;;;;-1:-1:-1;;;29424:89:0;;10736:2:1;29424:89:0;;;10718:21:1;10775:2;10755:18;;;10748:30;10814:34;10794:18;;;10787:62;-1:-1:-1;;;10865:18:1;;;10858:46;10921:19;;29424:89:0;10534:412:1;29424:89:0;29524:18;:16;:18::i;:::-;29382:168::o;25728:128::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;25812:36:::1;25832:9;25843:4;25812:19;:36::i;:::-;25728:128:::0;:::o;25414:189::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;25510:15:::1;:37:::0;;-1:-1:-1;;;;;25510:37:0;;::::1;-1:-1:-1::0;;;;;;25510:37:0;;::::1;;::::0;;;25558:25;:37;;;;;::::1;::::0;::::1;;::::0;;25414:189::o;21584:91::-;21623:13;21656:11;21649:18;;;;;:::i;25204:202::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;25305:15:::1;:37:::0;;;;25353:29;:45;25204:202::o;24896:300::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;25015:2:::1;25005:6;:12;;:29;;;;;25032:2;25021:7;:13;;25005:29;24997:83;;;::::0;-1:-1:-1;;;24997:83:0;;11153:2:1;24997:83:0::1;::::0;::::1;11135:21:1::0;11192:2;11172:18;;;11165:30;11231:34;11211:18;;;11204:62;-1:-1:-1;;;11282:18:1;;;11275:39;11331:19;;24997:83:0::1;10951:405:1::0;24997:83:0::1;25091:7;:23:::0;;;;25125:15;:25;25161:16;:27;24896:300::o;25864:131::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;25950:37:::1;25970:9;25981:5;25950:19;:37::i;23046:269::-:0;23139:4;23156:129;9679:10;23179:7;23188:96;23227:15;23188:96;;;;;;;;;;;;;;;;;9679:10;23188:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23188:34:0;;;;;;;;;;;;:38;:96::i;22004:167::-;22082:4;22099:42;9679:10;22123:9;22134:6;22099:9;:42::i;24388:256::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;24450:13:::1;::::0;-1:-1:-1;;;;;24450:13:0::1;:27:::0;24442:73:::1;;;::::0;-1:-1:-1;;;24442:73:0;;11563:2:1;24442:73:0::1;::::0;::::1;11545:21:1::0;11602:2;11582:18;;;11575:30;11641:34;11621:18;;;11614:62;-1:-1:-1;;;11692:18:1;;;11685:32;11734:19;;24442:73:0::1;11361:398:1::0;24442:73:0::1;24560:15;;;;;;;;;-1:-1:-1::0;;;;;24560:15:0::1;-1:-1:-1::0;;;;;24560:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24542:55:0::1;;24606:4;24613:15;;;;;;;;;-1:-1:-1::0;;;;;24613:15:0::1;-1:-1:-1::0;;;;;24613:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24542:94;::::0;-1:-1:-1;;;;;;24542:94:0::1;::::0;;;;;;-1:-1:-1;;;;;12250:15:1;;;24542:94:0::1;::::0;::::1;12232:34:1::0;12302:15;;12282:18;;;12275:43;12167:18;;24542:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24526:13;:110:::0;;-1:-1:-1;;;;;;24526:110:0::1;-1:-1:-1::0;;;;;24526:110:0;;;::::1;::::0;;;::::1;::::0;;24388:256::o;26392:277::-;26499:16;;;26513:1;26499:16;;;;;;;;26457:4;;;;26499:16;26513:1;26499:16;;;;;;;;;;-1:-1:-1;26499:16:0;26475:40;;26544:4;26526;26531:1;26526:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26526:23:0;;;:7;;;;;;;;;;:23;;;;26570:15;;:22;;;-1:-1:-1;;;26570:22:0;;;;:15;;;;;:20;;:22;;;;;26526:7;;26570:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26560:4;26565:1;26560:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26560:32:0;;;:7;;;;;;;;;:32;26610:15;;:48;;-1:-1:-1;;;26610:48:0;;:15;;;:29;;:48;;26640:11;;26653:4;;26610:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26610:48:0;;;;;;;;;;;;:::i;:::-;26659:1;26610:51;;;;;;;;:::i;:::-;;;;;;;26603:58;;;26392:277;;;:::o;29558:171::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;29635:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;29635:32:0;;::::1;;::::0;;29683:38:::1;::::0;::::1;::::0;::::1;::::0;29659:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;29683:38:0::1;;;;;;;;29558:171:::0;:::o;23323:522::-;9679:10;23419:16;23458:32;;;:18;:32;;;;;;;;23450:90;;;;-1:-1:-1;;;23450:90:0;;14352:2:1;23450:90:0;;;14334:21:1;14391:2;14371:18;;;14364:30;14430:34;14410:18;;;14403:62;-1:-1:-1;;;14481:18:1;;;14474:43;14534:19;;23450:90:0;14150:409:1;23450:90:0;23559:34;;;23551:89;;;;-1:-1:-1;;;23551:89:0;;14766:2:1;23551:89:0;;;14748:21:1;14805:2;14785:18;;;14778:30;14844:34;14824:18;;;14817:62;-1:-1:-1;;;14895:18:1;;;14888:40;14945:19;;23551:89:0;14564:406:1;23551:89:0;23657:27;;;23651:187;;;23700:98;9679:10;23729:9;;23739:8;23729:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;23774:9;;23770:13;;23774:9;;23770:2;:13;:::i;:::-;23750:7;;23758:8;23750:17;;;;;;;:::i;:::-;;;;;;;:33;;;;:::i;:::-;23785:5;23792;23700:14;:98::i;:::-;23813:13;23825:1;23813:13;;:::i;:::-;;;23651:187;;;23408:437;23323:522;;;;:::o;18046:244::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18135:22:0;::::1;18127:73;;;::::0;-1:-1:-1;;;18127:73:0;;15310:2:1;18127:73:0::1;::::0;::::1;15292:21:1::0;15349:2;15329:18;;;15322:30;15388:34;15368:18;;;15361:62;-1:-1:-1;;;15439:18:1;;;15432:36;15485:19;;18127:73:0::1;15108:402:1::0;18127:73:0::1;18237:6;::::0;;18216:38:::1;::::0;-1:-1:-1;;;;;18216:38:0;;::::1;::::0;18237:6;::::1;::::0;18216:38:::1;::::0;::::1;18265:6;:17:::0;;-1:-1:-1;;;;;;18265:17:0::1;-1:-1:-1::0;;;;;18265:17:0;;;::::1;::::0;;;::::1;::::0;;18046:244::o;26808:114::-;17319:6;;-1:-1:-1;;;;;17319:6:0;9679:10;17319:22;17311:67;;;;-1:-1:-1;;;17311:67:0;;;;;;;:::i;:::-;26885:17:::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;26885:29:0;;::::1;::::0;;;::::1;::::0;;26808:114::o;26930:337::-;-1:-1:-1;;;;;27023:19:0;;27015:68;;;;-1:-1:-1;;;27015:68:0;;15717:2:1;27015:68:0;;;15699:21:1;15756:2;15736:18;;;15729:30;15795:34;15775:18;;;15768:62;-1:-1:-1;;;15846:18:1;;;15839:34;15890:19;;27015:68:0;15515:400:1;27015:68:0;-1:-1:-1;;;;;27102:21:0;;27094:68;;;;-1:-1:-1;;;27094:68:0;;16122:2:1;27094:68:0;;;16104:21:1;16161:2;16141:18;;;16134:30;16200:34;16180:18;;;16173:62;-1:-1:-1;;;16251:18:1;;;16244:32;16293:19;;27094:68:0;15920:398:1;27094:68:0;-1:-1:-1;;;;;27175:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27227:32;;1968:25:1;;;27227:32:0;;1941:18:1;27227:32:0;;;;;;;26930:337;;;:::o;27275:1658::-;-1:-1:-1;;;;;27363:18:0;;27355:68;;;;-1:-1:-1;;;27355:68:0;;16525:2:1;27355:68:0;;;16507:21:1;16564:2;16544:18;;;16537:30;16603:34;16583:18;;;16576:62;-1:-1:-1;;;16654:18:1;;;16647:35;16699:19;;27355:68:0;16323:401:1;27355:68:0;-1:-1:-1;;;;;27442:16:0;;27434:64;;;;-1:-1:-1;;;27434:64:0;;16931:2:1;27434:64:0;;;16913:21:1;16970:2;16950:18;;;16943:30;17009:34;16989:18;;;16982:62;-1:-1:-1;;;17060:18:1;;;17053:33;17103:19;;27434:64:0;16729:399:1;27434:64:0;27526:1;27517:6;:10;27509:64;;;;-1:-1:-1;;;27509:64:0;;17335:2:1;27509:64:0;;;17317:21:1;17374:2;17354:18;;;17347:30;17413:34;17393:18;;;17386:62;-1:-1:-1;;;17464:18:1;;;17457:39;17513:19;;27509:64:0;17133:405:1;27509:64:0;27592:13;;-1:-1:-1;;;;;27592:13:0;27584:69;;;;-1:-1:-1;;;27584:69:0;;17745:2:1;27584:69:0;;;17727:21:1;17784:2;17764:18;;;17757:30;17823:32;17803:18;;;17796:60;17873:18;;27584:69:0;17543:354:1;27584:69:0;-1:-1:-1;;;;;27711:24:0;;27664:11;27711:24;;;:18;:24;;;;;;27664:11;;27711:24;;27710:25;:52;;;;-1:-1:-1;;;;;;27740:22:0;;;;;;:18;:22;;;;;;;;27739:23;27710:52;:71;;;;-1:-1:-1;17145:7:0;17172:6;-1:-1:-1;;;;;27766:15:0;;;17172:6;;27766:15;;27710:71;:88;;;;-1:-1:-1;17145:7:0;17172:6;-1:-1:-1;;;;;27785:13:0;;;17172:6;;27785:13;;27710:88;27694:104;;27809:21;27833:25;27851:6;27833:13;27843:2;-1:-1:-1;;;;;21970:18:0;21943:7;21970:18;;;:9;:18;;;;;;;21877:119;27833:13;:17;;:25::i;:::-;27809:49;;27969:7;17145;17172:6;-1:-1:-1;;;;;17172:6:0;;17107:79;27969:7;-1:-1:-1;;;;;27961:15:0;:4;-1:-1:-1;;;;;27961:15:0;;;:32;;;;-1:-1:-1;17145:7:0;17172:6;-1:-1:-1;;;;;27980:13:0;;;17172:6;;27980:13;;27961:32;:52;;;;-1:-1:-1;28003:10:0;;-1:-1:-1;;;;;27997:16:0;;;28003:10;;27997:16;;27961:52;27958:180;;;-1:-1:-1;;;;;28039:16:0;;;;;;:10;:16;;;;;;;;28038:17;:36;;;;-1:-1:-1;;;;;;28060:14:0;;;;;;:10;:14;;;;;;;;28059:15;28038:36;28030:96;;;;-1:-1:-1;;;28030:96:0;;18104:2:1;28030:96:0;;;18086:21:1;18143:2;18123:18;;;18116:30;18182:34;18162:18;;;18155:62;-1:-1:-1;;;18233:18:1;;;18226:45;18288:19;;28030:96:0;17902:411:1;28030:96:0;28159:13;;-1:-1:-1;;;;;28159:13:0;;;28151:21;;;;28148:239;;28207:6;:19;28197:29;;;28189:82;;;;-1:-1:-1;;;28189:82:0;;18520:2:1;28189:82:0;;;18502:21:1;18559:2;18539:18;;;18532:30;18598:34;18578:18;;;18571:62;-1:-1:-1;;;18649:18:1;;;18642:38;18697:19;;28189:82:0;18318:404:1;28189:82:0;28311:22;;28294:39;;;28286:89;;;;-1:-1:-1;;;28286:89:0;;;;;;;:::i;:::-;28408:13;;-1:-1:-1;;;;;28400:21:0;;;28408:13;;28400:21;;;;:44;;-1:-1:-1;28431:13:0;;-1:-1:-1;;;;;28425:19:0;;;28431:13;;28425:19;28400:44;28397:206;;;28540:4;28531:13;;28559:18;:16;:18::i;:::-;28624:13;;-1:-1:-1;;;;;28616:21:0;;;28624:13;;28616:21;;;;:44;;-1:-1:-1;28647:13:0;;-1:-1:-1;;;;;28641:19:0;;;28647:13;;28641:19;;28616:44;28613:252;;;28680:17;;;;;;;28677:73;;;28729:5;28718:16;;28677:73;28789:22;;28772:39;;;28764:89;;;;-1:-1:-1;;;28764:89:0;;;;;;;:::i;:::-;28875:50;28890:4;28896:2;28900:6;28908:8;28918:6;28875:14;:50::i;:::-;27344:1589;;;27275:1658;;;:::o;5930:192::-;6016:7;6052:12;6044:6;;;;6036:29;;;;-1:-1:-1;;;6036:29:0;;;;;;;;:::i;:::-;-1:-1:-1;6076:9:0;6088:5;6092:1;6088;:5;:::i;:::-;6076:17;5930:192;-1:-1:-1;;;;;5930:192:0:o;5027:181::-;5085:7;;5117:5;5121:1;5117;:5;:::i;:::-;5105:17;;5146:1;5141;:6;;5133:46;;;;-1:-1:-1;;;5133:46:0;;19465:2:1;5133:46:0;;;19447:21:1;19504:2;19484:18;;;19477:30;19543:29;19523:18;;;19516:57;19590:18;;5133:46:0;19263:351:1;5133:46:0;5199:1;5027:181;-1:-1:-1;;;5027:181:0:o;24652:236::-;24739:9;24734:147;24754:20;;;24734:147;;;24796:12;24811:9;;24821:1;24811:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24838:24:0;;;;;:18;:24;;;;;:31;;-1:-1:-1;;24838:31:0;;;;;;;-1:-1:-1;24776:3:0;;;;:::i;:::-;;;;24734:147;;;;24652:236;;;:::o;28941:433::-;29032:4;28988:23;21970:18;;;:9;:18;;;;;;29052:19;;29049:318;;29088:13;29104:33;29121:15;29104:16;:33::i;:::-;29088:49;;29168:14;;29156:8;:26;;:47;;;;-1:-1:-1;29187:16:0;;;;29186:17;29156:47;:72;;;;-1:-1:-1;29207:21:0;;;;;;;29156:72;29152:204;;;29307:33;29324:15;29307:16;:33::i;:::-;29073:294;28977:397;28941:433::o;26003:346::-;26098:9;26093:249;26117:9;:16;26113:1;:20;26093:249;;;26155:12;26170:9;26180:1;26170:12;;;;;;;;:::i;:::-;;;;;;;26155:27;;26200:7;26197:134;;;-1:-1:-1;;;;;26228:16:0;;;;;;:10;:16;;;;;:23;;-1:-1:-1;;26228:23:0;26247:4;26228:23;;;26197:134;;;-1:-1:-1;;;;;26299:16:0;;;;;;:10;:16;;;;;26292:23;;-1:-1:-1;;26292:23:0;;;26197:134;-1:-1:-1;26135:3:0;;;;:::i;:::-;;;;26093:249;;31581:896;31703:17;31723:8;:50;;31772:1;31723:50;;;31745:7;:14;31734:35;;31765:3;;31734:26;;:6;;:10;:26::i;:::-;:30;;:35::i;:::-;31703:70;;31784:18;31820:8;:18;;;;;31832:6;31820:18;31817:302;;;31878:15;;31867:36;;31899:3;;31867:27;;:6;;:10;:27::i;:36::-;31921:16;;31855:48;;-1:-1:-1;31921:20:0;31918:190;;31986:16;;31975:37;;32008:3;;31975:28;;:6;;:10;:28::i;:37::-;32065:10;;-1:-1:-1;;;;;32065:10:0;32055:21;;;;:9;:21;;;;;;31962:50;;-1:-1:-1;32055:37:0;;31962:50;32055:25;:37::i;:::-;32041:10;;-1:-1:-1;;;;;32041:10:0;32031:21;;;;:9;:21;;;;;:61;31918:190;32129:22;32154:37;32180:10;32154:21;:6;32165:9;32154:10;:21::i;:::-;:25;;:37::i;:::-;-1:-1:-1;;;;;32222:17:0;;;;;;:9;:17;;;;;;32129:62;;-1:-1:-1;32222:45:0;;32256:10;;32222:29;;32244:6;32222:21;:29::i;:45::-;-1:-1:-1;;;;;32202:17:0;;;;;;;:9;:17;;;;;;:65;;;;32301:20;;;;;;;:40;;32326:14;32301:24;:40::i;:::-;-1:-1:-1;;;;;32278:20:0;;;;;;:9;:20;;;;;;:63;;;;32397:4;32379:24;;;;:39;;32408:9;32379:28;:39::i;:::-;32370:4;32352:24;;;;:9;:24;;;;;;;;;:66;;;;32434:35;1968:25:1;;;-1:-1:-1;;;;;32434:35:0;;;;;;;;;;1941:18:1;32434:35:0;;;;;;;31692:785;;;31581:896;;;;;:::o;30276:631::-;19419:16;:23;;-1:-1:-1;;19419:23:0;19438:4;19419:23;;;30379:29;;19419:16;;30368:57:::1;::::0;30423:1:::1;::::0;30368:50:::1;::::0;30414:3:::1;::::0;30368:50;;:6;;:10:::1;:41::i;:57::-;30349:76:::0;-1:-1:-1;30436:20:0::1;30459;:6:::0;30349:76;30459:10:::1;:20::i;:::-;30436:43;;30490:30;30507:12;30490:16;:30::i;:::-;30531:23;30557:21;30531:47;;30589:13;30605:66;30669:1;30605:59;30660:3;30605:50;30625:15;:29;;;30605:15;:19;;:50;;;;:::i;:66::-;30589:82:::0;-1:-1:-1;30682:20:0::1;30705:26;:15:::0;30589:82;30705:19:::1;:26::i;:::-;30750:15;:25:::0;30742:57:::1;::::0;30682:49;;-1:-1:-1;;;;;;30750:25:0::1;::::0;30742:57;::::1;;;::::0;30682:49;;30750:25:::1;30742:57:::0;30750:25;30742:57;30682:49;30750:25;30742:57;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;30810:29;30823:8;30833:5;30810:12;:29::i;:::-;30855:41;::::0;;1466:25:1;;;1522:2;1507:18;;1500:34;;;1550:18;;;1543:34;;;30855:41:0::1;::::0;1454:2:1;1439:18;30855:41:0::1;;;;;;;-1:-1:-1::0;;19447:16:0;:24;;-1:-1:-1;;19447:24:0;;;-1:-1:-1;;;;30276:631:0:o;6381:471::-;6439:7;6684:1;6689;6684:6;6680:47;;-1:-1:-1;6714:1:0;6707:8;;6680:47;6739:9;6751:5;6755:1;6751;:5;:::i;:::-;6739:17;-1:-1:-1;6784:1:0;6775:5;6779:1;6739:17;6775:5;:::i;:::-;:10;6767:56;;;;-1:-1:-1;;;6767:56:0;;20183:2:1;6767:56:0;;;20165:21:1;20222:2;20202:18;;;20195:30;20261:34;20241:18;;;20234:62;-1:-1:-1;;;20312:18:1;;;20305:31;20353:19;;6767:56:0;19981:397:1;7328:132:0;7386:7;7413:39;7417:1;7420;7413:39;;;;;;;;;;;;;;;;;:3;:39::i;5491:136::-;5549:7;5576:43;5580:1;5583;5576:43;;;;;;;;;;;;;;;;;:3;:43::i;30915:585::-;31065:16;;;31079:1;31065:16;;;;;;;;31041:21;;31065:16;;;;;;;;;;-1:-1:-1;31065:16:0;31041:40;;31110:4;31092;31097:1;31092:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31092:23:0;;;:7;;;;;;;;;;:23;;;;31136:15;;:22;;;-1:-1:-1;;;31136:22:0;;;;:15;;;;;:20;;:22;;;;;31092:7;;31136:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31126:4;31131:1;31126:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31126:32:0;;;:7;;;;;;;;;:32;31201:15;;31169:62;;31186:4;;31201:15;31219:11;31169:8;:62::i;:::-;31268:15;;:224;;-1:-1:-1;;;31268:224:0;;-1:-1:-1;;;;;31268:15:0;;;;:66;;:224;;31349:11;;31268:15;;31419:4;;31446;;31466:15;;31268:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29737:531;29917:15;;29885:62;;29902:4;;-1:-1:-1;;;;;29917:15:0;29935:11;29885:8;:62::i;:::-;29990:15;;30194:25;;29990:270;;-1:-1:-1;;;29990:270:0;;30062:4;29990:270;;;21311:34:1;21361:18;;;21354:34;;;29990:15:0;21404:18:1;;;21397:34;;;21447:18;;;21440:34;-1:-1:-1;;;;;30194:25:0;;;21490:19:1;;;21483:44;30234:15:0;21543:19:1;;;21536:35;29990:15:0;;;:31;;30029:9;;21245:19:1;;29990:270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7956:278::-;8042:7;8077:12;8070:5;8062:28;;;;-1:-1:-1;;;8062:28:0;;;;;;;;:::i;:::-;-1:-1:-1;8101:9:0;8113:5;8117:1;8113;:5;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;2004:456::-;2081:6;2089;2097;2150:2;2138:9;2129:7;2125:23;2121:32;2118:52;;;2166:1;2163;2156:12;2118:52;2205:9;2192:23;2224:31;2249:5;2224:31;:::i;:::-;2274:5;-1:-1:-1;2331:2:1;2316:18;;2303:32;2344:33;2303:32;2344:33;:::i;:::-;2004:456;;2396:7;;-1:-1:-1;;;2450:2:1;2435:18;;;;2422:32;;2004:456::o;2654:367::-;2717:8;2727:6;2781:3;2774:4;2766:6;2762:17;2758:27;2748:55;;2799:1;2796;2789:12;2748:55;-1:-1:-1;2822:20:1;;2865:18;2854:30;;2851:50;;;2897:1;2894;2887:12;2851:50;2934:4;2926:6;2922:17;2910:29;;2994:3;2987:4;2977:6;2974:1;2970:14;2962:6;2958:27;2954:38;2951:47;2948:67;;;3011:1;3008;3001:12;2948:67;2654:367;;;;;:::o;3026:160::-;3091:20;;3147:13;;3140:21;3130:32;;3120:60;;3176:1;3173;3166:12;3120:60;3026:160;;;:::o;3191:505::-;3283:6;3291;3299;3352:2;3340:9;3331:7;3327:23;3323:32;3320:52;;;3368:1;3365;3358:12;3320:52;3408:9;3395:23;3441:18;3433:6;3430:30;3427:50;;;3473:1;3470;3463:12;3427:50;3512:70;3574:7;3565:6;3554:9;3550:22;3512:70;:::i;:::-;3601:8;;-1:-1:-1;3486:96:1;-1:-1:-1;3655:35:1;;-1:-1:-1;3686:2:1;3671:18;;3655:35;:::i;:::-;3645:45;;3191:505;;;;;:::o;3909:247::-;3968:6;4021:2;4009:9;4000:7;3996:23;3992:32;3989:52;;;4037:1;4034;4027:12;3989:52;4076:9;4063:23;4095:31;4120:5;4095:31;:::i;4161:180::-;4220:6;4273:2;4261:9;4252:7;4248:23;4244:32;4241:52;;;4289:1;4286;4279:12;4241:52;-1:-1:-1;4312:23:1;;4161:180;-1:-1:-1;4161:180:1:o;4346:248::-;4414:6;4422;4475:2;4463:9;4454:7;4450:23;4446:32;4443:52;;;4491:1;4488;4481:12;4443:52;-1:-1:-1;;4514:23:1;;;4584:2;4569:18;;;4556:32;;-1:-1:-1;4346:248:1:o;4599:127::-;4660:10;4655:3;4651:20;4648:1;4641:31;4691:4;4688:1;4681:15;4715:4;4712:1;4705:15;4731:275;4802:2;4796:9;4867:2;4848:13;;-1:-1:-1;;4844:27:1;4832:40;;4902:18;4887:34;;4923:22;;;4884:62;4881:88;;;4949:18;;:::i;:::-;4985:2;4978:22;4731:275;;-1:-1:-1;4731:275:1:o;5011:183::-;5071:4;5104:18;5096:6;5093:30;5090:56;;;5126:18;;:::i;:::-;-1:-1:-1;5171:1:1;5167:14;5183:4;5163:25;;5011:183::o;5199:966::-;5283:6;5314:2;5357;5345:9;5336:7;5332:23;5328:32;5325:52;;;5373:1;5370;5363:12;5325:52;5413:9;5400:23;5446:18;5438:6;5435:30;5432:50;;;5478:1;5475;5468:12;5432:50;5501:22;;5554:4;5546:13;;5542:27;-1:-1:-1;5532:55:1;;5583:1;5580;5573:12;5532:55;5619:2;5606:16;5642:60;5658:43;5698:2;5658:43;:::i;:::-;5642:60;:::i;:::-;5736:15;;;5818:1;5814:10;;;;5806:19;;5802:28;;;5767:12;;;;5842:19;;;5839:39;;;5874:1;5871;5864:12;5839:39;5898:11;;;;5918:217;5934:6;5929:3;5926:15;5918:217;;;6014:3;6001:17;6031:31;6056:5;6031:31;:::i;:::-;6075:18;;5951:12;;;;6113;;;;5918:217;;;6154:5;5199:966;-1:-1:-1;;;;;;;5199:966:1:o;6423:388::-;6491:6;6499;6552:2;6540:9;6531:7;6527:23;6523:32;6520:52;;;6568:1;6565;6558:12;6520:52;6607:9;6594:23;6626:31;6651:5;6626:31;:::i;:::-;6676:5;-1:-1:-1;6733:2:1;6718:18;;6705:32;6746:33;6705:32;6746:33;:::i;:::-;6798:7;6788:17;;;6423:388;;;;;:::o;6816:316::-;6893:6;6901;6909;6962:2;6950:9;6941:7;6937:23;6933:32;6930:52;;;6978:1;6975;6968:12;6930:52;-1:-1:-1;;7001:23:1;;;7071:2;7056:18;;7043:32;;-1:-1:-1;7122:2:1;7107:18;;;7094:32;;6816:316;-1:-1:-1;6816:316:1:o;7137:180::-;7193:6;7246:2;7234:9;7225:7;7221:23;7217:32;7214:52;;;7262:1;7259;7252:12;7214:52;7285:26;7301:9;7285:26;:::i;7322:773::-;7444:6;7452;7460;7468;7521:2;7509:9;7500:7;7496:23;7492:32;7489:52;;;7537:1;7534;7527:12;7489:52;7577:9;7564:23;7606:18;7647:2;7639:6;7636:14;7633:34;;;7663:1;7660;7653:12;7633:34;7702:70;7764:7;7755:6;7744:9;7740:22;7702:70;:::i;:::-;7791:8;;-1:-1:-1;7676:96:1;-1:-1:-1;7879:2:1;7864:18;;7851:32;;-1:-1:-1;7895:16:1;;;7892:36;;;7924:1;7921;7914:12;7892:36;;7963:72;8027:7;8016:8;8005:9;8001:24;7963:72;:::i;:::-;7322:773;;;;-1:-1:-1;8054:8:1;-1:-1:-1;;;;7322:773:1:o;8100:380::-;8179:1;8175:12;;;;8222;;;8243:61;;8297:4;8289:6;8285:17;8275:27;;8243:61;8350:2;8342:6;8339:14;8319:18;8316:38;8313:161;;8396:10;8391:3;8387:20;8384:1;8377:31;8431:4;8428:1;8421:15;8459:4;8456:1;8449:15;8313:161;;8100:380;;;:::o;8485:356::-;8687:2;8669:21;;;8706:18;;;8699:30;8765:34;8760:2;8745:18;;8738:62;8832:2;8817:18;;8485:356::o;8846:127::-;8907:10;8902:3;8898:20;8895:1;8888:31;8938:4;8935:1;8928:15;8962:4;8959:1;8952:15;8978:422;9067:1;9110:5;9067:1;9124:270;9145:7;9135:8;9132:21;9124:270;;;9204:4;9200:1;9196:6;9192:17;9186:4;9183:27;9180:53;;;9213:18;;:::i;:::-;9263:7;9253:8;9249:22;9246:55;;;9283:16;;;;9246:55;9362:22;;;;9322:15;;;;9124:270;;;9128:3;8978:422;;;;;:::o;9405:806::-;9454:5;9484:8;9474:80;;-1:-1:-1;9525:1:1;9539:5;;9474:80;9573:4;9563:76;;-1:-1:-1;9610:1:1;9624:5;;9563:76;9655:4;9673:1;9668:59;;;;9741:1;9736:130;;;;9648:218;;9668:59;9698:1;9689:10;;9712:5;;;9736:130;9773:3;9763:8;9760:17;9757:43;;;9780:18;;:::i;:::-;-1:-1:-1;;9836:1:1;9822:16;;9851:5;;9648:218;;9950:2;9940:8;9937:16;9931:3;9925:4;9922:13;9918:36;9912:2;9902:8;9899:16;9894:2;9888:4;9885:12;9881:35;9878:77;9875:159;;;-1:-1:-1;9987:19:1;;;10019:5;;9875:159;10066:34;10091:8;10085:4;10066:34;:::i;:::-;10136:6;10132:1;10128:6;10124:19;10115:7;10112:32;10109:58;;;10147:18;;:::i;:::-;10185:20;;9405:806;-1:-1:-1;;;9405:806:1:o;10216:140::-;10274:5;10303:47;10344:4;10334:8;10330:19;10324:4;10303:47;:::i;10361:168::-;10401:7;10467:1;10463;10459:6;10455:14;10452:1;10449:21;10444:1;10437:9;10430:17;10426:45;10423:71;;;10474:18;;:::i;:::-;-1:-1:-1;10514:9:1;;10361:168::o;11764:251::-;11834:6;11887:2;11875:9;11866:7;11862:23;11858:32;11855:52;;;11903:1;11900;11893:12;11855:52;11935:9;11929:16;11954:31;11979:5;11954:31;:::i;12329:127::-;12390:10;12385:3;12381:20;12378:1;12371:31;12421:4;12418:1;12411:15;12445:4;12442:1;12435:15;12461:461;12514:3;12552:5;12546:12;12579:6;12574:3;12567:19;12605:4;12634:2;12629:3;12625:12;12618:19;;12671:2;12664:5;12660:14;12692:1;12702:195;12716:6;12713:1;12710:13;12702:195;;;12781:13;;-1:-1:-1;;;;;12777:39:1;12765:52;;12837:12;;;;12872:15;;;;12813:1;12731:9;12702:195;;;-1:-1:-1;12913:3:1;;12461:461;-1:-1:-1;;;;;12461:461:1:o;12927:332::-;13134:6;13123:9;13116:25;13177:2;13172;13161:9;13157:18;13150:30;13097:4;13197:56;13249:2;13238:9;13234:18;13226:6;13197:56;:::i;:::-;13189:64;12927:332;-1:-1:-1;;;;12927:332:1:o;13264:881::-;13359:6;13390:2;13433;13421:9;13412:7;13408:23;13404:32;13401:52;;;13449:1;13446;13439:12;13401:52;13482:9;13476:16;13515:18;13507:6;13504:30;13501:50;;;13547:1;13544;13537:12;13501:50;13570:22;;13623:4;13615:13;;13611:27;-1:-1:-1;13601:55:1;;13652:1;13649;13642:12;13601:55;13681:2;13675:9;13704:60;13720:43;13760:2;13720:43;:::i;13704:60::-;13798:15;;;13880:1;13876:10;;;;13868:19;;13864:28;;;13829:12;;;;13904:19;;;13901:39;;;13936:1;13933;13926:12;13901:39;13960:11;;;;13980:135;13996:6;13991:3;13988:15;13980:135;;;14062:10;;14050:23;;14013:12;;;;14093;;;;13980:135;;14975:128;15015:3;15046:1;15042:6;15039:1;15036:13;15033:39;;;15052:18;;:::i;:::-;-1:-1:-1;15088:9:1;;14975:128::o;18727:401::-;18929:2;18911:21;;;18968:2;18948:18;;;18941:30;19007:34;19002:2;18987:18;;18980:62;-1:-1:-1;;;19073:2:1;19058:18;;19051:35;19118:3;19103:19;;18727:401::o;19133:125::-;19173:4;19201:1;19198;19195:8;19192:34;;;19206:18;;:::i;:::-;-1:-1:-1;19243:9:1;;19133:125::o;19619:135::-;19658:3;19679:17;;;19676:43;;19699:18;;:::i;:::-;-1:-1:-1;19746:1:1;19735:13;;19619:135::o;19759:217::-;19799:1;19825;19815:132;;19869:10;19864:3;19860:20;19857:1;19850:31;19904:4;19901:1;19894:15;19932:4;19929:1;19922:15;19815:132;-1:-1:-1;19961:9:1;;19759:217::o;20383:582::-;20682:6;20671:9;20664:25;20725:6;20720:2;20709:9;20705:18;20698:34;20768:3;20763:2;20752:9;20748:18;20741:31;20645:4;20789:57;20841:3;20830:9;20826:19;20818:6;20789:57;:::i;:::-;-1:-1:-1;;;;;20882:32:1;;;;20877:2;20862:18;;20855:60;-1:-1:-1;20946:3:1;20931:19;20924:35;20781:65;20383:582;-1:-1:-1;;;20383:582:1:o;21582:306::-;21670:6;21678;21686;21739:2;21727:9;21718:7;21714:23;21710:32;21707:52;;;21755:1;21752;21745:12;21707:52;21784:9;21778:16;21768:26;;21834:2;21823:9;21819:18;21813:25;21803:35;;21878:2;21867:9;21863:18;21857:25;21847:35;;21582:306;;;;;:::o

Swarm Source

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