ETH Price: $3,346.91 (+0.22%)

Token

BabyApeCoin (BAPE)
 

Overview

Max Total Supply

1,000,000,000 BAPE

Holders

54

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
90,909.00000000010878976 BAPE

Value
$0.00
0x220763fb8c7c7bce29194f0c8710ca05b98c51ef
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:
BabyApeCoin

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// https://t.me/BabyApeCoinChat

pragma solidity ^0.8.11;
//SPDX-License-Identifier: none

interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(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;
    }
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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");

        (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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

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

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

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

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

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

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

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

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1));

    int256 c = a * b;
    require((b == 0) || (c / b == a));
    return c;
  }

  function div(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && (b > 0));

    return a / b;
  }

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

    return a - b;
  }

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

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

contract BabyApeCoin is Context, ERC20, Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Address for address;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

	bool private trading;
    bool private starting;
    bool private sendTokens;
    bool public burning;
    bool public swapping;

    address private marketingWallet;
    address private developmentWallet1;
    address private developmentWallet2;
    address private liquidityWallet;

    uint256 public swapTokensAtAmount;

    uint256 private _buyMarketingFee;
    uint256 private _buyDevelopmentFee;
    uint256 private _buyLiquidityFee;

    uint256 private buyMarketingFee;
    uint256 private buyDevelopmentFee;
    uint256 private buyLiquidityFee;

    uint256 private _sellMarketingFee;
    uint256 private _sellDevelopmentFee;
    uint256 private _sellLiquidityFee;

    uint256 private sellMarketingFee;
    uint256 private sellDevelopmentFee;
    uint256 private sellLiquidityFee;

    uint256 private swapPercent;
    uint256 private maxWalletPercent;
    uint256 private maxBuyPercent;
    uint256 private maxSellPercent;

    uint256 public _maxWallet;
    uint256 public _maxBuy;
    uint256 public _maxSell;
    uint256 public TotalSupply;
    

    uint256 public totalBuyFees;
    uint256 public totalSellFees;

    uint256 private constant DefaultTime = 30 days;

    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public _isBlacklisted;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event isElon(address indexed account, bool isExcluded);
    event blacklist(address indexed account, bool isBlacklisted);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event tradingUpdated(bool _enabled);
    event burningUpdated(bool _enabled);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event ProductiongWalletUpdated(address indexed newbuybackWallet, address indexed oldbuybackWallet);
    event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet);
    event DevelopmentWalletUpdated(address indexed newDevelopmentWallet, address indexed oldDevelopmentWallet);
    event appWalletUpdated(address indexed newAppWallet, address indexed oldAppWallet);
    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    constructor() ERC20 ("BabyApeCoin", "BAPE") {
        
        //Only edit this section for tokenomics
        //===============================================================

        //divisor is 100, 2 = 2%
        buyMarketingFee = 4;
        buyDevelopmentFee = 2;
        buyLiquidityFee = 3;

        sellMarketingFee = 5;
        sellDevelopmentFee = 3;
        sellLiquidityFee = 3;

        //divisor is 1000, 200 = 2%
        swapPercent = 5; //0.05% of total supply to be swapped during contract sell
        maxWalletPercent = 200; //2% max wallet
        maxBuyPercent = 100; //1% max buy
        maxSellPercent = 100; //1% max sell

        TotalSupply = 1000000000; //Set the total token supply

        sendTokens = false; //False to send ETH to marketing, true to send tokens to marketing

        liquidityWallet = owner();
        marketingWallet = address(payable(0xd7cE2EeC83ce6015D2EE30acC46986EEaA9f1dcD));
        developmentWallet1 = address(payable(0xF7F2c1668e9e2818A571c8E09D1aC7A12EA64067));
        developmentWallet2 = address(payable(0x14A5114204b7a27a9d87de029cA16364cA0D72Da));

        //===============================================================

        swapTokensAtAmount = TotalSupply.mul(swapPercent).div(10000) * (10**18);
        _maxWallet = TotalSupply.mul(maxWalletPercent).div(10000) * (10**18);
        _maxBuy = TotalSupply.mul(maxBuyPercent).div(10000) * (10**18);
        _maxSell = TotalSupply.mul(maxSellPercent).div(10000) * (10**18);

        totalBuyFees = _buyMarketingFee.add(_buyDevelopmentFee).add(_buyLiquidityFee);
        totalSellFees = _sellMarketingFee.add(_sellDevelopmentFee).add(_sellLiquidityFee);

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    	//0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 Testnet
    	//0x10ED43C718714eb63d5aA57B78B54704E256024E BSC Mainnet
    	//0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D Ropsten
    	//0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F BakerySwap
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from paying fees
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(marketingWallet, true);
		excludeFromFees(developmentWallet1, true);
        excludeFromFees(developmentWallet2, true);
        excludeFromFees(address(this), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), TotalSupply * (10**18));
        
    }

    receive() external payable {

  	}

	function updateSwapAmount(uint256 amount) public onlyOwner {
	    swapTokensAtAmount = amount * (10**18);
	}

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "BabyApeCoin: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "BabyApeCoin: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function excludeMultipleFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        uint256 i = 0;
        while (i < accounts.length) {
            excludeFromFees(accounts[i], excluded);
            i++;
        }
    }

    function blacklistMultipleAccounts(address[] calldata accounts, bool blacklisted) public onlyOwner {
        uint256 i = 0;
        while (i < accounts.length) {
            _isBlacklisted[accounts[i]] = blacklisted;
            i++;
        }
    }
    
    function addToBlacklist(address account, bool blacklisted) public onlyOwner {
        require(_isBlacklisted[account] != blacklisted, "BabyApeCoin: Account is already the value of 'blacklisted'");
        _isBlacklisted[account] = blacklisted;

        emit blacklist(account, blacklisted);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "BabyApeCoin: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "BabyApeCoin: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    address private _liquidityTokenAddress;
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
        _liquidityUnlockTime=block.timestamp+DefaultTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
     uint256 private _liquidityUnlockTime;

    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release.
    //Should be called once start was successful.
    bool public liquidityRelease10Percent;
    function TeamlimitLiquidityReleaseTo20Percent() public onlyOwner{
        liquidityRelease10Percent=true;
    }

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");

        IERC20 liquidityToken = IERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease10Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultTime;
            //regular liquidity release, only releases 20% at a time and locks liquidity for another month
            amount=amount*1/10;
            liquidityToken.transfer(liquidityWallet, amount);
        }
        else
        {
            //Liquidity release if something goes wrong at start
            //liquidityRelease20Percent should be called once everything is clear
            liquidityToken.transfer(liquidityWallet, amount);
        }
    }

    function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner {
        require(newLiquidityWallet != liquidityWallet, "BabyApeCoin: The liquidity wallet is already this address");
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateMarketingWallet(address newMarketingWallet) public onlyOwner {
        require(newMarketingWallet != marketingWallet, "BabyApeCoin: The marketing wallet is already this address");
        excludeFromFees(newMarketingWallet, true);
        emit MarketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function isBlacklisted(address account) public view returns (bool) {
        return _isBlacklisted[account];
    }
	
	function tradingEnabled(bool _enabled) public onlyOwner {
        trading = _enabled;
        
        emit tradingUpdated(_enabled);
    }

    function burningEnabled(bool enabled) public onlyOwner {
        burning = enabled;
        emit burningUpdated(enabled);
    }

    function sendTokensToMarketing(bool enabled)  public onlyOwner {
        sendTokens = enabled;
    }

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

        if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && to != uniswapV2Pair && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) 
        {
            require(trading == true);
            require(amount <= _maxBuy, "Transfer amount exceeds the maxTxAmount.");
            uint256 contractBalanceRecepient = balanceOf(to);
            require(contractBalanceRecepient + amount <= _maxWallet, "Exceeds maximum wallet token amount.");
        }
            
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(!swapping && automatedMarketMakerPairs[to] && from != address(uniswapV2Router) && from != owner() && to != owner() && !_isExcludedFromFees[to] && !_isExcludedFromFees[from])
        {
            require(trading == true);

            require(amount <= _maxSell, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
		
		if(canSwap && !swapping && automatedMarketMakerPairs[to] && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) {
		    
		    contractTokenBalance = swapTokensAtAmount;
            if(burning) {
                if(balanceOf(address(this)).sub(swapTokensAtAmount) > swapTokensAtAmount) {
                    uint256 burningAmount = swapTokensAtAmount;
                    super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);

                    emit Transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);
                } else {
                    uint256 burningAmount = balanceOf(address(this)).sub(swapTokensAtAmount);
                    super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);

                    emit Transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);
                }
            }
		    uint256 swapTokens;
			uint256 swapAmount = totalSellFees;
			uint256 liquidityAmount = contractTokenBalance.mul(_sellLiquidityFee).div(swapAmount);
			uint256 half = liquidityAmount.div(2);
			uint256 otherHalf = liquidityAmount.sub(half);
            
            swapping = true;
			
			if (swapAmount > 0 && _sellLiquidityFee > 0 && !sendTokens) {
			swapTokens = contractTokenBalance;
            swapTokensForEth(swapTokens);
            swapAmount = totalSellFees;

                if (_sellMarketingFee > 0) {

                uint256 marketingAmount = address(this).balance.mul(_sellMarketingFee).div(swapAmount);
                (bool success, ) = marketingWallet.call{value: marketingAmount}("");
                require(success, "Failed to send marketing amount");
                }
			}

            else if (swapAmount > 0 && _sellLiquidityFee > 0 && sendTokens) {
			swapTokens = contractTokenBalance;
            uint256 marketingAmount = swapTokens.mul(_sellMarketingFee).div(100);
            swapTokens = swapTokens.sub(marketingAmount);
            swapAmount = totalSellFees.sub(_sellMarketingFee);

            swapTokensForEth(swapTokens);
            

                if (_sellMarketingFee > 0) {
                    super._transfer(address(this), marketingWallet, marketingAmount);
                
                
                }
			}

            if (_sellDevelopmentFee > 0) {

            uint256 developmentAmount = address(this).balance.mul(_sellDevelopmentFee).div(swapAmount);
            developmentAmount = developmentAmount.div(2);

            (bool success, ) = developmentWallet1.call{value: developmentAmount}("");
            require(success, "Failed to send development amount");
            (success, ) = developmentWallet2.call{value: developmentAmount}("");
            require(success, "Failed to send development amount");
            }

			if (_sellLiquidityFee > 0) {
			    
		    uint256 newBalance = address(this).balance.mul(_sellLiquidityFee).div(swapAmount);
			
            // add liquidity to uniswap
             addLiquidity(half, newBalance);

             emit SwapAndLiquify(otherHalf, newBalance, half);
            }
			
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
            super._transfer(from, to, amount);
        }

        else if(!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            takeFee = false;
            super._transfer(from, to, amount);
        }

        if(takeFee) {
            uint256 BuyFees = amount.mul(totalBuyFees).div(100);
            uint256 SellFees = amount.mul(totalSellFees).div(100);

            // if sell
            if(automatedMarketMakerPairs[to] && totalSellFees > 0) {
                amount = amount.sub(SellFees);
                super._transfer(from, address(this), SellFees);
                super._transfer(from, to, amount);
            }

            // if buy or wallet to wallet transfer
            else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) {
                amount = amount.sub(BuyFees);
                super._transfer(from, address(this), BuyFees);
                super._transfer(from, to, amount);

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

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = 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
        );
    }

    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
            address(this),
            block.timestamp
        );
    }

    function addLP() external onlyOwner() {
        updateBuyFees(0,0,0);
        updateSellFees(0,0,0);

		trading = false;

        updateMaxWallet(TotalSupply);
        updateMaxBuySell((TotalSupply), (TotalSupply));
    }
    
	function letsGoLive() external onlyOwner() {
        updateBuyFees(buyMarketingFee,buyDevelopmentFee,buyLiquidityFee);
        updateSellFees(sellMarketingFee,sellDevelopmentFee,sellLiquidityFee);

        updateMaxWallet(TotalSupply.mul(maxWalletPercent).div(10000));
        updateMaxBuySell(TotalSupply.mul(maxBuyPercent).div(10000), TotalSupply.mul(maxSellPercent).div(10000));

		trading = true;
        burning = false;
        starting = false;
    }
    
    function updateBuyFees(uint256 newBuyMarketingFee, uint256 newBuyDevelopmentFee, uint256 newBuyLiquidityFee) public onlyOwner {
        _buyMarketingFee = newBuyMarketingFee;
        _buyDevelopmentFee = newBuyDevelopmentFee;
        _buyLiquidityFee = newBuyLiquidityFee;
        
        totalFees();
    }

    function updateSellFees( uint256 newSellMarketingFee, uint256 newSellDevelopmentFee, uint256 newSellLiquidityFee) public onlyOwner {
        _sellMarketingFee = newSellMarketingFee;
        _sellDevelopmentFee = newSellDevelopmentFee;
        _sellLiquidityFee = newSellLiquidityFee;
        
        totalFees();
    }

    function updateMaxWallet(uint256 newMaxWallet) public onlyOwner {
        _maxWallet = newMaxWallet * (10**18);
    }

    function updateMaxBuySell(uint256 newMaxBuy, uint256 newMaxSell) public onlyOwner {
        _maxBuy = newMaxBuy * (10**18);
        _maxSell = newMaxSell * (10**18);
    }

    function totalFees() private {
        totalBuyFees = _buyMarketingFee.add(_buyDevelopmentFee).add(_buyLiquidityFee);
        totalSellFees = _sellMarketingFee.add(_sellDevelopmentFee).add(_sellLiquidityFee);
    }

    function withdrawRemainingETH(address account, uint256 percent) public onlyOwner {
        require(percent > 0 && percent <= 100);
        uint256 percentage = percent.div(100);
        uint256 balance = address(this).balance.mul(percentage);
        (bool success, ) = account.call{value: balance}("");
        require(success, "Failed to withdraw ETH");
    }

    function withdrawRemainingToken(address account) public onlyOwner {
        uint256 balance = balanceOf(address(this));
        super._transfer(address(this), account, balance);
    }

    function withdrawRemainingERC20Token(address token, address account) public onlyOwner {
        ERC20 Token = ERC20(token);
        uint256 balance = Token.balanceOf(address(this));
        Token.transfer(account, balance);
    }

    function burnTokenManual(uint256 amount) public onlyOwner {
        require(amount <= balanceOf(address(this)), "Amount cannot exceed tokens in contract");
        super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, amount * 10**18);
    }
}

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":"newDevelopmentWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldDevelopmentWallet","type":"address"}],"name":"DevelopmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newbuybackWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldbuybackWallet","type":"address"}],"name":"ProductiongWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAppWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldAppWallet","type":"address"}],"name":"appWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"burningUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"isElon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamlimitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"blacklistMultipleAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTokenManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burning","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"burningEnabled","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","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":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"letsGoLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityRelease10Percent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bool","name":"enabled","type":"bool"}],"name":"sendTokensToMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyMarketingFee","type":"uint256"},{"internalType":"uint256","name":"newBuyDevelopmentFee","type":"uint256"},{"internalType":"uint256","name":"newBuyLiquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"},{"internalType":"uint256","name":"newMaxSell","type":"uint256"}],"name":"updateMaxBuySell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSellMarketingFee","type":"uint256"},{"internalType":"uint256","name":"newSellDevelopmentFee","type":"uint256"},{"internalType":"uint256","name":"newSellLiquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"withdrawRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604080518082018252600b81526a2130b13ca0b832a1b7b4b760a91b6020808301918252835180850190945260048452634241504560e01b908401528151919291620000619160039162000a0b565b5080516200007790600490602084019062000a0b565b505050620000946200008e6200052f60201b60201c565b62000533565b6004600f5560026010556003601181905560056015819055601682905560179190915560185560c86019556064601a819055601b55633b9aca00601f556006805460ff60b01b19169055620000f16005546001600160a01b031690565b600a80546001600160a01b03929092166001600160a01b031992831617905560078054821673d7ce2eec83ce6015d2ee30acc46986eeaa9f1dcd17905560088054821673f7f2c1668e9e2818a571c8e09d1ac7a12ea64067179055600980549091167314a5114204b7a27a9d87de029ca16364ca0d72da179055601854601f54620001a89161271091620001949162001f0562000585602090811b91909117901c565b6200061960201b62001f8b1790919060201c565b620001bc90670de0b6b3a764000062000ac7565b600b81905550620001e761271062000194601954601f546200058560201b62001f051790919060201c565b620001fb90670de0b6b3a764000062000ac7565b601c819055506200022661271062000194601a54601f546200058560201b62001f051790919060201c565b6200023a90670de0b6b3a764000062000ac7565b601d819055506200026561271062000194601b54601f546200058560201b62001f051790919060201c565b6200027990670de0b6b3a764000062000ac7565b601e81905550620002b8600e54620002a4600d54600c546200067860201b62001fe61790919060201c565b6200067860201b62001fe61790919060201c565b6020908155601454601354601254620002e093620002a4929062001fe662000678821b17901c565b6021819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000340573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000366919062000ae9565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003da919062000ae9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000428573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044e919062000ae9565b600680546001600160a01b0319166001600160a01b03858116919091179091558116608052905062000482816001620006db565b600a546200049b906001600160a01b03166001620007d4565b600754620004b4906001600160a01b03166001620007d4565b600854620004cd906001600160a01b03166001620007d4565b600954620004e6906001600160a01b03166001620007d4565b620004f3306001620007d4565b620005276200050a6005546001600160a01b031690565b601f546200052190670de0b6b3a764000062000ac7565b62000926565b505062000b8f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082620005965750600062000613565b6000620005a4838562000ac7565b905082620005b3858362000b14565b14620006105760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b90505b92915050565b60008082116200066c5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015260640162000607565b62000610828462000b14565b60008062000687838562000b37565b905083811015620006105760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000607565b6001600160a01b03821660009081526023602052604090205460ff1615158115151415620007805760405162461bcd60e51b815260206004820152604560248201527f42616279417065436f696e3a204175746f6d61746564206d61726b6574206d6160448201527f6b6572207061697220697320616c72656164792073657420746f20746861742060648201526476616c756560d81b608482015260a40162000607565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620008305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000607565b6001600160a01b03821660009081526022602052604090205460ff1615158115151415620008c75760405162461bcd60e51b815260206004820152603760248201527f42616279417065436f696e3a204163636f756e7420697320616c72656164792060448201527f7468652076616c7565206f6620276578636c7564656427000000000000000000606482015260840162000607565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200097e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000607565b806002600082825462000992919062000b37565b90915550506001600160a01b03821660009081526020819052604081208054839290620009c190849062000b37565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b82805462000a199062000b52565b90600052602060002090601f01602090048101928262000a3d576000855562000a88565b82601f1062000a5857805160ff191683800117855562000a88565b8280016001018555821562000a88579182015b8281111562000a8857825182559160200191906001019062000a6b565b5062000a9692915062000a9a565b5090565b5b8082111562000a96576000815560010162000a9b565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000ae45762000ae462000ab1565b500290565b60006020828403121562000afc57600080fd5b81516001600160a01b03811681146200061057600080fd5b60008262000b3257634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000b4d5762000b4d62000ab1565b500190565b600181811c9082168062000b6757607f821691505b6020821081141562000b8957634e487b7160e01b600052602260045260246000fd5b50919050565b6080516136f662000bb9600039600081816105dd01528181611504015261221501526136f66000f3fe60806040526004361061037a5760003560e01c80638da5cb5b116101d1578063bea1cb2711610102578063d966bcf1116100a0578063f298f42c1161006f578063f298f42c14610a3a578063f2fde38b14610a5a578063f3ebe96514610a7a578063fe575a8714610a9457600080fd5b8063d966bcf11461099e578063dd62ed3e146109be578063e2f4560514610a04578063e37ba8f914610a1a57600080fd5b8063c23be47f116100dc578063c23be47f1461093e578063c3a3c0321461095e578063d0a3981414610973578063d63607d81461098957600080fd5b8063bea1cb27146108de578063c0246668146108fe578063c17b5b8c1461091e57600080fd5b8063a9dec4361161016f578063b62496f511610149578063b62496f514610863578063b9e9370014610893578063bc37e1a3146108a9578063be874c92146108be57600080fd5b8063a9dec4361461080d578063aacebbe314610823578063ab3b55451461084357600080fd5b8063a44b47f7116101ab578063a44b47f714610797578063a457c2d7146107ad578063a7b97fa9146107cd578063a9059cbb146107ed57600080fd5b80638da5cb5b1461074457806395d89b41146107625780639a7a23d61461077757600080fd5b8063313ce567116102ab578063553ad0dc11610249578063715018a611610223578063715018a6146106d95780637bbf8df9146106ee5780638095d5641461070e57806382247ec01461072e57600080fd5b8063553ad0dc1461067957806365b8dbc01461069957806370a08231146106b957600080fd5b806349bd5a5e1161028557806349bd5a5e146105cb5780634c12b33f146105ff5780634cdaf0ae146106205780634fbee1931461064057600080fd5b8063313ce5671461057a57806339509351146105965780633c7a309b146105b657600080fd5b80631c499ab011610318578063270924c7116102f2578063270924c714610505578063296d3de01461051a5780632c889d181461053a5780632de3f9561461055a57600080fd5b80631c499ab0146104955780631cdd3be3146104b557806323b872dd146104e557600080fd5b80631694505e116103545780631694505e146104055780631732cded1461043d57806318160ddd1461045e57806319fb3e7a1461047357600080fd5b806306fdde03146103865780630773d31d146103b1578063095ea7b3146103d557600080fd5b3661038157005b600080fd5b34801561039257600080fd5b5061039b610acd565b6040516103a8919061316b565b60405180910390f35b3480156103bd57600080fd5b506103c7601e5481565b6040519081526020016103a8565b3480156103e157600080fd5b506103f56103f03660046131d5565b610b5f565b60405190151581526020016103a8565b34801561041157600080fd5b50600654610425906001600160a01b031681565b6040516001600160a01b0390911681526020016103a8565b34801561044957600080fd5b506006546103f590600160c01b900460ff1681565b34801561046a57600080fd5b506002546103c7565b34801561047f57600080fd5b5061049361048e366004613201565b610b76565b005b3480156104a157600080fd5b506104936104b036600461323a565b610c94565b3480156104c157600080fd5b506103f56104d0366004613253565b60246020526000908152604090205460ff1681565b3480156104f157600080fd5b506103f5610500366004613270565b610cd6565b34801561051157600080fd5b50610493610d80565b34801561052657600080fd5b506104936105353660046132b1565b610e47565b34801561054657600080fd5b5061049361055536600461323a565b610e9f565b34801561056657600080fd5b506104936105753660046132e1565b610ede565b34801561058657600080fd5b50604051601281526020016103a8565b3480156105a257600080fd5b506103f56105b13660046131d5565b610f60565b3480156105c257600080fd5b50610493610f9c565b3480156105d757600080fd5b506104257f000000000000000000000000000000000000000000000000000000000000000081565b34801561060b57600080fd5b506006546103f590600160b81b900460ff1681565b34801561062c57600080fd5b5061049361063b366004613253565b61116d565b34801561064c57600080fd5b506103f561065b366004613253565b6001600160a01b031660009081526022602052604090205460ff1690565b34801561068557600080fd5b506104936106943660046132e1565b6111c5565b3480156106a557600080fd5b506104936106b4366004613253565b61123c565b3480156106c557600080fd5b506103c76106d4366004613253565b61133a565b3480156106e557600080fd5b50610493611355565b3480156106fa57600080fd5b506104936107093660046131d5565b61138b565b34801561071a57600080fd5b506104936107293660046132fe565b611488565b34801561073a57600080fd5b506103c7601c5481565b34801561075057600080fd5b506005546001600160a01b0316610425565b34801561076e57600080fd5b5061039b6114c9565b34801561078357600080fd5b5061049361079236600461332a565b6114d8565b3480156107a357600080fd5b506103c7601f5481565b3480156107b957600080fd5b506103f56107c83660046131d5565b6115cf565b3480156107d957600080fd5b506104936107e8366004613358565b611668565b3480156107f957600080fd5b506103f56108083660046131d5565b611709565b34801561081957600080fd5b506103c7601d5481565b34801561082f57600080fd5b5061049361083e366004613253565b611716565b34801561084f57600080fd5b5061049361085e36600461323a565b611828565b34801561086f57600080fd5b506103f561087e366004613253565b60236020526000908152604090205460ff1681565b34801561089f57600080fd5b506103c760205481565b3480156108b557600080fd5b5061049361186a565b3480156108ca57600080fd5b506104936108d936600461323a565b6118d5565b3480156108ea57600080fd5b506104936108f9366004613358565b611985565b34801561090a57600080fd5b5061049361091936600461332a565b6119fc565b34801561092a57600080fd5b506104936109393660046132fe565b611b1b565b34801561094a57600080fd5b50610493610959366004613253565b611b5c565b34801561096a57600080fd5b506103c7611b9e565b34801561097f57600080fd5b506103c760215481565b34801561099557600080fd5b50610493611bc3565b3480156109aa57600080fd5b506104936109b93660046132e1565b611bfc565b3480156109ca57600080fd5b506103c76109d9366004613201565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a1057600080fd5b506103c7600b5481565b348015610a2657600080fd5b50610493610a35366004613253565b611c44565b348015610a4657600080fd5b50610493610a5536600461332a565b611d56565b348015610a6657600080fd5b50610493610a75366004613253565b611e6d565b348015610a8657600080fd5b506027546103f59060ff1681565b348015610aa057600080fd5b506103f5610aaf366004613253565b6001600160a01b031660009081526024602052604090205460ff1690565b606060038054610adc906133de565b80601f0160208091040260200160405190810160405280929190818152602001828054610b08906133de565b8015610b555780601f10610b2a57610100808354040283529160200191610b55565b820191906000526020600020905b815481529060010190602001808311610b3857829003601f168201915b5050505050905090565b6000610b6c338484612045565b5060015b92915050565b6005546001600160a01b03163314610ba95760405162461bcd60e51b8152600401610ba090613419565b60405180910390fd5b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c16919061344e565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190613467565b5050505050565b6005546001600160a01b03163314610cbe5760405162461bcd60e51b8152600401610ba090613419565b610cd081670de0b6b3a764000061349a565b601c5550565b6000610ce3848484612169565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610d685760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ba0565b610d758533858403612045565b506001949350505050565b6005546001600160a01b03163314610daa5760405162461bcd60e51b8152600401610ba090613419565b610dbb600f54601054601154611488565b610dcc601554601654601754611b1b565b610df26104b0612710610dec601954601f54611f0590919063ffffffff16565b90611f8b565b610e2f610e12612710610dec601a54601f54611f0590919063ffffffff16565b610535612710610dec601b54601f54611f0590919063ffffffff16565b6006805463ff00ffff60a01b1916600160a01b179055565b6005546001600160a01b03163314610e715760405162461bcd60e51b8152600401610ba090613419565b610e8382670de0b6b3a764000061349a565b601d55610e9881670de0b6b3a764000061349a565b601e555050565b6005546001600160a01b03163314610ec95760405162461bcd60e51b8152600401610ba090613419565b610edb610ed642836134b9565b612c20565b50565b6005546001600160a01b03163314610f085760405162461bcd60e51b8152600401610ba090613419565b60068054821515600160a01b0260ff60a01b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb290610f5590831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b6c918590610f979086906134b9565b612045565b6005546001600160a01b03163314610fc65760405162461bcd60e51b8152600401610ba090613419565b60265442101561100b5760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610ba0565b6025546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c919061344e565b60275490915060ff16156111305761109762278d00426134b9565b602655600a6110a782600161349a565b6110b191906134d1565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af1158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190613467565b505050565b600a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016110e8565b5050565b6005546001600160a01b031633146111975760405162461bcd60e51b8152600401610ba090613419565b602580546001600160a01b0319166001600160a01b0383161790556111bf62278d00426134b9565b60265550565b6005546001600160a01b031633146111ef5760405162461bcd60e51b8152600401610ba090613419565b60068054821515600160b81b0260ff60b81b199091161790556040517f6225104598bca03a23e6426058f298b0ff0510d263e9c7c61317dbbf41da0eb090610f5590831515815260200190565b6005546001600160a01b031633146112665760405162461bcd60e51b8152600401610ba090613419565b6006546001600160a01b03828116911614156112dd5760405162461bcd60e51b815260206004820152603060248201527f42616279417065436f696e3a2054686520726f7574657220616c72656164792060448201526f6861732074686174206164647265737360801b6064820152608401610ba0565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461137f5760405162461bcd60e51b8152600401610ba090613419565b6113896000612c33565b565b6005546001600160a01b031633146113b55760405162461bcd60e51b8152600401610ba090613419565b6000811180156113c6575060648111155b6113cf57600080fd5b60006113dc826064611f8b565b905060006113ea4783611f05565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611439576040519150601f19603f3d011682016040523d82523d6000602084013e61143e565b606091505b5050905080610c8d5760405162461bcd60e51b815260206004820152601660248201527508cc2d2d8cac840e8de40eed2e8d0c8e4c2ee408aa8960531b6044820152606401610ba0565b6005546001600160a01b031633146114b25760405162461bcd60e51b8152600401610ba090613419565b600c839055600d829055600e81905561112b612c85565b606060048054610adc906133de565b6005546001600160a01b031633146115025760405162461bcd60e51b8152600401610ba090613419565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156115c55760405162461bcd60e51b815260206004820152605260248201527f42616279417065436f696e3a205468652050616e63616b65537761702070616960448201527f722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617460648201527165644d61726b65744d616b6572506169727360701b608482015260a401610ba0565b6111698282612cc8565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116515760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ba0565b61165e3385858403612045565b5060019392505050565b6005546001600160a01b031633146116925760405162461bcd60e51b8152600401610ba090613419565b60005b828110156117035781602460008686858181106116b4576116b46134f3565b90506020020160208101906116c99190613253565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806116fb81613509565b915050611695565b50505050565b6000610b6c338484612169565b6005546001600160a01b031633146117405760405162461bcd60e51b8152600401610ba090613419565b6007546001600160a01b03828116911614156117c05760405162461bcd60e51b815260206004820152603960248201527f42616279417065436f696e3a20546865206d61726b6574696e672077616c6c656044820152787420697320616c72656164792074686973206164647265737360381b6064820152608401610ba0565b6117cb8160016119fc565b6007546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146118525760405162461bcd60e51b8152600401610ba090613419565b61186481670de0b6b3a764000061349a565b600b5550565b6005546001600160a01b031633146118945760405162461bcd60e51b8152600401610ba090613419565b6118a16000806000611488565b6118ae6000806000611b1b565b6006805460ff60a01b19169055601f546118c790610c94565b611389601f54601f54610e47565b6005546001600160a01b031633146118ff5760405162461bcd60e51b8152600401610ba090613419565b6119083061133a565b8111156119675760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f742065786365656420746f6b656e7320696e20636044820152661bdb9d1c9858dd60ca1b6064820152608401610ba0565b610edb3061dead61198084670de0b6b3a764000061349a565b612dbf565b6005546001600160a01b031633146119af5760405162461bcd60e51b8152600401610ba090613419565b60005b82811015611703576119ea8484838181106119cf576119cf6134f3565b90506020020160208101906119e49190613253565b836119fc565b806119f481613509565b9150506119b2565b6005546001600160a01b03163314611a265760405162461bcd60e51b8152600401610ba090613419565b6001600160a01b03821660009081526022602052604090205460ff1615158115151415611abb5760405162461bcd60e51b815260206004820152603760248201527f42616279417065436f696e3a204163636f756e7420697320616c72656164792060448201527f7468652076616c7565206f6620276578636c75646564270000000000000000006064820152608401610ba0565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b03163314611b455760405162461bcd60e51b8152600401610ba090613419565b60128390556013829055601481905561112b612c85565b6005546001600160a01b03163314611b865760405162461bcd60e51b8152600401610ba090613419565b6000611b913061133a565b9050611169308383612dbf565b6000602654421015611bbd5742602654611bb89190613524565b905090565b50600090565b6005546001600160a01b03163314611bed5760405162461bcd60e51b8152600401610ba090613419565b6027805460ff19166001179055565b6005546001600160a01b03163314611c265760405162461bcd60e51b8152600401610ba090613419565b60068054911515600160b01b0260ff60b01b19909216919091179055565b6005546001600160a01b03163314611c6e5760405162461bcd60e51b8152600401610ba090613419565b600a546001600160a01b0382811691161415611cee5760405162461bcd60e51b815260206004820152603960248201527f42616279417065436f696e3a20546865206c69717569646974792077616c6c656044820152787420697320616c72656164792074686973206164647265737360381b6064820152608401610ba0565b611cf98160016119fc565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611d805760405162461bcd60e51b8152600401610ba090613419565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415611e155760405162461bcd60e51b815260206004820152603a60248201527f42616279417065436f696e3a204163636f756e7420697320616c72656164792060448201527f7468652076616c7565206f662027626c61636b6c6973746564270000000000006064820152608401610ba0565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c9101611b0f565b6005546001600160a01b03163314611e975760405162461bcd60e51b8152600401610ba090613419565b6001600160a01b038116611efc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba0565b610edb81612c33565b600082611f1457506000610b70565b6000611f20838561349a565b905082611f2d85836134d1565b14611f845760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ba0565b9392505050565b6000808211611fdc5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610ba0565b611f8482846134d1565b600080611ff383856134b9565b905083811015611f845760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ba0565b6001600160a01b0383166120a75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba0565b6001600160a01b0382166121085760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661218f5760405162461bcd60e51b8152600401610ba09061353b565b6001600160a01b0382166121b55760405162461bcd60e51b8152600401610ba090613580565b6005546001600160a01b038481169116148015906121e157506005546001600160a01b03838116911614155b80156121f557506001600160a01b03821615155b801561220c57506001600160a01b03821661dead14155b801561224a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561226f57506001600160a01b03821660009081526022602052604090205460ff16155b801561229457506001600160a01b03831660009081526022602052604090205460ff16155b1561238e57600654600160a01b900460ff1615156001146122b457600080fd5b601d548111156123175760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610ba0565b60006123228361133a565b601c5490915061233283836134b9565b111561238c5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610ba0565b505b8061239f5761112b83836000612dbf565b600654600160c01b900460ff161580156123d157506001600160a01b03821660009081526023602052604090205460ff165b80156123eb57506006546001600160a01b03848116911614155b801561240557506005546001600160a01b03848116911614155b801561241f57506005546001600160a01b03838116911614155b801561244457506001600160a01b03821660009081526022602052604090205460ff16155b801561246957506001600160a01b03831660009081526022602052604090205460ff16155b1561250157600654600160a01b900460ff16151560011461248957600080fd5b601e548111156125015760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610ba0565b600061250c3061133a565b600b549091508110801590819061252d5750600654600160c01b900460ff16155b801561255157506001600160a01b03841660009081526023602052604090205460ff165b801561257657506001600160a01b03841660009081526022602052604090205460ff16155b801561259b57506001600160a01b03851660009081526022602052604090205460ff16155b15612a2657600b54600654909250600160b81b900460ff161561267e57600b546125ce816125c83061133a565b90612f13565b111561262357600b546125e43061dead83612dbf565b60405181815261dead9030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35061267e565b6000612634600b546125c83061133a565b90506126433061dead83612dbf565b60405181815261dead9030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505b600080602154905060006126a182610dec60145488611f0590919063ffffffff16565b905060006126b0826002611f8b565b905060006126be8383612f13565b6006805460ff60c01b1916600160c01b179055905083158015906126e457506000601454115b80156126fa5750600654600160b01b900460ff16155b156127e45786945061270b85612f6f565b602154601254909450156127df57600061273485610dec60125447611f0590919063ffffffff16565b6007546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b50509050806127dc5760405162461bcd60e51b815260206004820152601f60248201527f4661696c656420746f2073656e64206d61726b6574696e6720616d6f756e74006044820152606401610ba0565b50505b612881565b6000841180156127f657506000601454115b801561280b5750600654600160b01b900460ff165b1561288157869450600061282f6064610dec60125489611f0590919063ffffffff16565b905061283b8682612f13565b9550612854601254602154612f1390919063ffffffff16565b945061285f86612f6f565b6012541561287f5760075461287f9030906001600160a01b031683612dbf565b505b601354156129a15760006128a485610dec60135447611f0590919063ffffffff16565b90506128b1816002611f8b565b6008546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612903576040519150601f19603f3d011682016040523d82523d6000602084013e612908565b606091505b50509050806129295760405162461bcd60e51b8152600401610ba0906135c3565b6009546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612976576040519150601f19603f3d011682016040523d82523d6000602084013e61297b565b606091505b5050809150508061299e5760405162461bcd60e51b8152600401610ba0906135c3565b50505b60145415612a135760006129c485610dec60145447611f0590919063ffffffff16565b90506129d083826130c1565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b50506006805460ff60c01b191690555050505b6006546001600160a01b03861660009081526022602052604090205460ff600160c01b909204821615911680612a7457506001600160a01b03851660009081526022602052604090205460ff165b15612a8c57506000612a87868686612dbf565b612b2b565b6001600160a01b03851660009081526023602052604090205460ff16158015612ace57506001600160a01b03861660009081526023602052604090205460ff16155b8015612af357506001600160a01b03861660009081526022602052604090205460ff16155b8015612b1857506001600160a01b03851660009081526022602052604090205460ff16155b15612b2b57506000612b2b868686612dbf565b8015612c18576000612b4d6064610dec60205488611f0590919063ffffffff16565b90506000612b6b6064610dec60215489611f0590919063ffffffff16565b6001600160a01b03881660009081526023602052604090205490915060ff168015612b9857506000602154115b15612bc457612ba78682612f13565b9550612bb4883083612dbf565b612bbf888888612dbf565b612c15565b6001600160a01b03881660009081526023602052604090205460ff168015612bee57506000602054115b15612c0a57612bfd8683612f13565b9550612bb4883084612dbf565b612c15888888612dbf565b50505b505050505050565b6026548111612c2e57600080fd5b602655565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612ca8600e54612ca2600d54600c54611fe690919063ffffffff16565b90611fe6565b602055601454601354601254612cc39291612ca29190611fe6565b602155565b6001600160a01b03821660009081526023602052604090205460ff1615158115151415612d6b5760405162461bcd60e51b815260206004820152604560248201527f42616279417065436f696e3a204175746f6d61746564206d61726b6574206d6160448201527f6b6572207061697220697320616c72656164792073657420746f20746861742060648201526476616c756560d81b608482015260a401610ba0565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316612de55760405162461bcd60e51b8152600401610ba09061353b565b6001600160a01b038216612e0b5760405162461bcd60e51b8152600401610ba090613580565b6001600160a01b03831660009081526020819052604090205481811015612e835760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba0565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612eba9084906134b9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f0691815260200190565b60405180910390a3611703565b600082821115612f655760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610ba0565b611f848284613524565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612fa457612fa46134f3565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612ffd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130219190613604565b81600181518110613034576130346134f3565b6001600160a01b03928316602091820292909201015260065461305a9130911684612045565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613093908590600090869030904290600401613621565b600060405180830381600087803b1580156130ad57600080fd5b505af1158015612c18573d6000803e3d6000fd5b6006546130d99030906001600160a01b031684612045565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613146573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c8d9190613692565b600060208083528351808285015260005b818110156131985785810183015185820160400152820161317c565b818111156131aa576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610edb57600080fd5b600080604083850312156131e857600080fd5b82356131f3816131c0565b946020939093013593505050565b6000806040838503121561321457600080fd5b823561321f816131c0565b9150602083013561322f816131c0565b809150509250929050565b60006020828403121561324c57600080fd5b5035919050565b60006020828403121561326557600080fd5b8135611f84816131c0565b60008060006060848603121561328557600080fd5b8335613290816131c0565b925060208401356132a0816131c0565b929592945050506040919091013590565b600080604083850312156132c457600080fd5b50508035926020909101359150565b8015158114610edb57600080fd5b6000602082840312156132f357600080fd5b8135611f84816132d3565b60008060006060848603121561331357600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561333d57600080fd5b8235613348816131c0565b9150602083013561322f816132d3565b60008060006040848603121561336d57600080fd5b833567ffffffffffffffff8082111561338557600080fd5b818601915086601f83011261339957600080fd5b8135818111156133a857600080fd5b8760208260051b85010111156133bd57600080fd5b602092830195509350508401356133d3816132d3565b809150509250925092565b600181811c908216806133f257607f821691505b6020821081141561341357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561346057600080fd5b5051919050565b60006020828403121561347957600080fd5b8151611f84816132d3565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156134b4576134b4613484565b500290565b600082198211156134cc576134cc613484565b500190565b6000826134ee57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060001982141561351d5761351d613484565b5060010190565b60008282101561353657613536613484565b500390565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526021908201527f4661696c656420746f2073656e6420646576656c6f706d656e7420616d6f756e6040820152601d60fa1b606082015260800190565b60006020828403121561361657600080fd5b8151611f84816131c0565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136715784516001600160a01b03168352938301939183019160010161364c565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156136a757600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c7792da47a20c4d7fc9a079fe29872591fc4f9845c701e9082b2283e3eff380564736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061037a5760003560e01c80638da5cb5b116101d1578063bea1cb2711610102578063d966bcf1116100a0578063f298f42c1161006f578063f298f42c14610a3a578063f2fde38b14610a5a578063f3ebe96514610a7a578063fe575a8714610a9457600080fd5b8063d966bcf11461099e578063dd62ed3e146109be578063e2f4560514610a04578063e37ba8f914610a1a57600080fd5b8063c23be47f116100dc578063c23be47f1461093e578063c3a3c0321461095e578063d0a3981414610973578063d63607d81461098957600080fd5b8063bea1cb27146108de578063c0246668146108fe578063c17b5b8c1461091e57600080fd5b8063a9dec4361161016f578063b62496f511610149578063b62496f514610863578063b9e9370014610893578063bc37e1a3146108a9578063be874c92146108be57600080fd5b8063a9dec4361461080d578063aacebbe314610823578063ab3b55451461084357600080fd5b8063a44b47f7116101ab578063a44b47f714610797578063a457c2d7146107ad578063a7b97fa9146107cd578063a9059cbb146107ed57600080fd5b80638da5cb5b1461074457806395d89b41146107625780639a7a23d61461077757600080fd5b8063313ce567116102ab578063553ad0dc11610249578063715018a611610223578063715018a6146106d95780637bbf8df9146106ee5780638095d5641461070e57806382247ec01461072e57600080fd5b8063553ad0dc1461067957806365b8dbc01461069957806370a08231146106b957600080fd5b806349bd5a5e1161028557806349bd5a5e146105cb5780634c12b33f146105ff5780634cdaf0ae146106205780634fbee1931461064057600080fd5b8063313ce5671461057a57806339509351146105965780633c7a309b146105b657600080fd5b80631c499ab011610318578063270924c7116102f2578063270924c714610505578063296d3de01461051a5780632c889d181461053a5780632de3f9561461055a57600080fd5b80631c499ab0146104955780631cdd3be3146104b557806323b872dd146104e557600080fd5b80631694505e116103545780631694505e146104055780631732cded1461043d57806318160ddd1461045e57806319fb3e7a1461047357600080fd5b806306fdde03146103865780630773d31d146103b1578063095ea7b3146103d557600080fd5b3661038157005b600080fd5b34801561039257600080fd5b5061039b610acd565b6040516103a8919061316b565b60405180910390f35b3480156103bd57600080fd5b506103c7601e5481565b6040519081526020016103a8565b3480156103e157600080fd5b506103f56103f03660046131d5565b610b5f565b60405190151581526020016103a8565b34801561041157600080fd5b50600654610425906001600160a01b031681565b6040516001600160a01b0390911681526020016103a8565b34801561044957600080fd5b506006546103f590600160c01b900460ff1681565b34801561046a57600080fd5b506002546103c7565b34801561047f57600080fd5b5061049361048e366004613201565b610b76565b005b3480156104a157600080fd5b506104936104b036600461323a565b610c94565b3480156104c157600080fd5b506103f56104d0366004613253565b60246020526000908152604090205460ff1681565b3480156104f157600080fd5b506103f5610500366004613270565b610cd6565b34801561051157600080fd5b50610493610d80565b34801561052657600080fd5b506104936105353660046132b1565b610e47565b34801561054657600080fd5b5061049361055536600461323a565b610e9f565b34801561056657600080fd5b506104936105753660046132e1565b610ede565b34801561058657600080fd5b50604051601281526020016103a8565b3480156105a257600080fd5b506103f56105b13660046131d5565b610f60565b3480156105c257600080fd5b50610493610f9c565b3480156105d757600080fd5b506104257f0000000000000000000000009abb2bb4ed59e37d3016f296d35aff603957c80881565b34801561060b57600080fd5b506006546103f590600160b81b900460ff1681565b34801561062c57600080fd5b5061049361063b366004613253565b61116d565b34801561064c57600080fd5b506103f561065b366004613253565b6001600160a01b031660009081526022602052604090205460ff1690565b34801561068557600080fd5b506104936106943660046132e1565b6111c5565b3480156106a557600080fd5b506104936106b4366004613253565b61123c565b3480156106c557600080fd5b506103c76106d4366004613253565b61133a565b3480156106e557600080fd5b50610493611355565b3480156106fa57600080fd5b506104936107093660046131d5565b61138b565b34801561071a57600080fd5b506104936107293660046132fe565b611488565b34801561073a57600080fd5b506103c7601c5481565b34801561075057600080fd5b506005546001600160a01b0316610425565b34801561076e57600080fd5b5061039b6114c9565b34801561078357600080fd5b5061049361079236600461332a565b6114d8565b3480156107a357600080fd5b506103c7601f5481565b3480156107b957600080fd5b506103f56107c83660046131d5565b6115cf565b3480156107d957600080fd5b506104936107e8366004613358565b611668565b3480156107f957600080fd5b506103f56108083660046131d5565b611709565b34801561081957600080fd5b506103c7601d5481565b34801561082f57600080fd5b5061049361083e366004613253565b611716565b34801561084f57600080fd5b5061049361085e36600461323a565b611828565b34801561086f57600080fd5b506103f561087e366004613253565b60236020526000908152604090205460ff1681565b34801561089f57600080fd5b506103c760205481565b3480156108b557600080fd5b5061049361186a565b3480156108ca57600080fd5b506104936108d936600461323a565b6118d5565b3480156108ea57600080fd5b506104936108f9366004613358565b611985565b34801561090a57600080fd5b5061049361091936600461332a565b6119fc565b34801561092a57600080fd5b506104936109393660046132fe565b611b1b565b34801561094a57600080fd5b50610493610959366004613253565b611b5c565b34801561096a57600080fd5b506103c7611b9e565b34801561097f57600080fd5b506103c760215481565b34801561099557600080fd5b50610493611bc3565b3480156109aa57600080fd5b506104936109b93660046132e1565b611bfc565b3480156109ca57600080fd5b506103c76109d9366004613201565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a1057600080fd5b506103c7600b5481565b348015610a2657600080fd5b50610493610a35366004613253565b611c44565b348015610a4657600080fd5b50610493610a5536600461332a565b611d56565b348015610a6657600080fd5b50610493610a75366004613253565b611e6d565b348015610a8657600080fd5b506027546103f59060ff1681565b348015610aa057600080fd5b506103f5610aaf366004613253565b6001600160a01b031660009081526024602052604090205460ff1690565b606060038054610adc906133de565b80601f0160208091040260200160405190810160405280929190818152602001828054610b08906133de565b8015610b555780601f10610b2a57610100808354040283529160200191610b55565b820191906000526020600020905b815481529060010190602001808311610b3857829003601f168201915b5050505050905090565b6000610b6c338484612045565b5060015b92915050565b6005546001600160a01b03163314610ba95760405162461bcd60e51b8152600401610ba090613419565b60405180910390fd5b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c16919061344e565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190613467565b5050505050565b6005546001600160a01b03163314610cbe5760405162461bcd60e51b8152600401610ba090613419565b610cd081670de0b6b3a764000061349a565b601c5550565b6000610ce3848484612169565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610d685760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ba0565b610d758533858403612045565b506001949350505050565b6005546001600160a01b03163314610daa5760405162461bcd60e51b8152600401610ba090613419565b610dbb600f54601054601154611488565b610dcc601554601654601754611b1b565b610df26104b0612710610dec601954601f54611f0590919063ffffffff16565b90611f8b565b610e2f610e12612710610dec601a54601f54611f0590919063ffffffff16565b610535612710610dec601b54601f54611f0590919063ffffffff16565b6006805463ff00ffff60a01b1916600160a01b179055565b6005546001600160a01b03163314610e715760405162461bcd60e51b8152600401610ba090613419565b610e8382670de0b6b3a764000061349a565b601d55610e9881670de0b6b3a764000061349a565b601e555050565b6005546001600160a01b03163314610ec95760405162461bcd60e51b8152600401610ba090613419565b610edb610ed642836134b9565b612c20565b50565b6005546001600160a01b03163314610f085760405162461bcd60e51b8152600401610ba090613419565b60068054821515600160a01b0260ff60a01b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb290610f5590831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b6c918590610f979086906134b9565b612045565b6005546001600160a01b03163314610fc65760405162461bcd60e51b8152600401610ba090613419565b60265442101561100b5760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610ba0565b6025546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c919061344e565b60275490915060ff16156111305761109762278d00426134b9565b602655600a6110a782600161349a565b6110b191906134d1565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af1158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190613467565b505050565b600a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016110e8565b5050565b6005546001600160a01b031633146111975760405162461bcd60e51b8152600401610ba090613419565b602580546001600160a01b0319166001600160a01b0383161790556111bf62278d00426134b9565b60265550565b6005546001600160a01b031633146111ef5760405162461bcd60e51b8152600401610ba090613419565b60068054821515600160b81b0260ff60b81b199091161790556040517f6225104598bca03a23e6426058f298b0ff0510d263e9c7c61317dbbf41da0eb090610f5590831515815260200190565b6005546001600160a01b031633146112665760405162461bcd60e51b8152600401610ba090613419565b6006546001600160a01b03828116911614156112dd5760405162461bcd60e51b815260206004820152603060248201527f42616279417065436f696e3a2054686520726f7574657220616c72656164792060448201526f6861732074686174206164647265737360801b6064820152608401610ba0565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461137f5760405162461bcd60e51b8152600401610ba090613419565b6113896000612c33565b565b6005546001600160a01b031633146113b55760405162461bcd60e51b8152600401610ba090613419565b6000811180156113c6575060648111155b6113cf57600080fd5b60006113dc826064611f8b565b905060006113ea4783611f05565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611439576040519150601f19603f3d011682016040523d82523d6000602084013e61143e565b606091505b5050905080610c8d5760405162461bcd60e51b815260206004820152601660248201527508cc2d2d8cac840e8de40eed2e8d0c8e4c2ee408aa8960531b6044820152606401610ba0565b6005546001600160a01b031633146114b25760405162461bcd60e51b8152600401610ba090613419565b600c839055600d829055600e81905561112b612c85565b606060048054610adc906133de565b6005546001600160a01b031633146115025760405162461bcd60e51b8152600401610ba090613419565b7f0000000000000000000000009abb2bb4ed59e37d3016f296d35aff603957c8086001600160a01b0316826001600160a01b031614156115c55760405162461bcd60e51b815260206004820152605260248201527f42616279417065436f696e3a205468652050616e63616b65537761702070616960448201527f722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617460648201527165644d61726b65744d616b6572506169727360701b608482015260a401610ba0565b6111698282612cc8565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116515760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ba0565b61165e3385858403612045565b5060019392505050565b6005546001600160a01b031633146116925760405162461bcd60e51b8152600401610ba090613419565b60005b828110156117035781602460008686858181106116b4576116b46134f3565b90506020020160208101906116c99190613253565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806116fb81613509565b915050611695565b50505050565b6000610b6c338484612169565b6005546001600160a01b031633146117405760405162461bcd60e51b8152600401610ba090613419565b6007546001600160a01b03828116911614156117c05760405162461bcd60e51b815260206004820152603960248201527f42616279417065436f696e3a20546865206d61726b6574696e672077616c6c656044820152787420697320616c72656164792074686973206164647265737360381b6064820152608401610ba0565b6117cb8160016119fc565b6007546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146118525760405162461bcd60e51b8152600401610ba090613419565b61186481670de0b6b3a764000061349a565b600b5550565b6005546001600160a01b031633146118945760405162461bcd60e51b8152600401610ba090613419565b6118a16000806000611488565b6118ae6000806000611b1b565b6006805460ff60a01b19169055601f546118c790610c94565b611389601f54601f54610e47565b6005546001600160a01b031633146118ff5760405162461bcd60e51b8152600401610ba090613419565b6119083061133a565b8111156119675760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f742065786365656420746f6b656e7320696e20636044820152661bdb9d1c9858dd60ca1b6064820152608401610ba0565b610edb3061dead61198084670de0b6b3a764000061349a565b612dbf565b6005546001600160a01b031633146119af5760405162461bcd60e51b8152600401610ba090613419565b60005b82811015611703576119ea8484838181106119cf576119cf6134f3565b90506020020160208101906119e49190613253565b836119fc565b806119f481613509565b9150506119b2565b6005546001600160a01b03163314611a265760405162461bcd60e51b8152600401610ba090613419565b6001600160a01b03821660009081526022602052604090205460ff1615158115151415611abb5760405162461bcd60e51b815260206004820152603760248201527f42616279417065436f696e3a204163636f756e7420697320616c72656164792060448201527f7468652076616c7565206f6620276578636c75646564270000000000000000006064820152608401610ba0565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b03163314611b455760405162461bcd60e51b8152600401610ba090613419565b60128390556013829055601481905561112b612c85565b6005546001600160a01b03163314611b865760405162461bcd60e51b8152600401610ba090613419565b6000611b913061133a565b9050611169308383612dbf565b6000602654421015611bbd5742602654611bb89190613524565b905090565b50600090565b6005546001600160a01b03163314611bed5760405162461bcd60e51b8152600401610ba090613419565b6027805460ff19166001179055565b6005546001600160a01b03163314611c265760405162461bcd60e51b8152600401610ba090613419565b60068054911515600160b01b0260ff60b01b19909216919091179055565b6005546001600160a01b03163314611c6e5760405162461bcd60e51b8152600401610ba090613419565b600a546001600160a01b0382811691161415611cee5760405162461bcd60e51b815260206004820152603960248201527f42616279417065436f696e3a20546865206c69717569646974792077616c6c656044820152787420697320616c72656164792074686973206164647265737360381b6064820152608401610ba0565b611cf98160016119fc565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611d805760405162461bcd60e51b8152600401610ba090613419565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415611e155760405162461bcd60e51b815260206004820152603a60248201527f42616279417065436f696e3a204163636f756e7420697320616c72656164792060448201527f7468652076616c7565206f662027626c61636b6c6973746564270000000000006064820152608401610ba0565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c9101611b0f565b6005546001600160a01b03163314611e975760405162461bcd60e51b8152600401610ba090613419565b6001600160a01b038116611efc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba0565b610edb81612c33565b600082611f1457506000610b70565b6000611f20838561349a565b905082611f2d85836134d1565b14611f845760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ba0565b9392505050565b6000808211611fdc5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610ba0565b611f8482846134d1565b600080611ff383856134b9565b905083811015611f845760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ba0565b6001600160a01b0383166120a75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba0565b6001600160a01b0382166121085760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661218f5760405162461bcd60e51b8152600401610ba09061353b565b6001600160a01b0382166121b55760405162461bcd60e51b8152600401610ba090613580565b6005546001600160a01b038481169116148015906121e157506005546001600160a01b03838116911614155b80156121f557506001600160a01b03821615155b801561220c57506001600160a01b03821661dead14155b801561224a57507f0000000000000000000000009abb2bb4ed59e37d3016f296d35aff603957c8086001600160a01b0316826001600160a01b031614155b801561226f57506001600160a01b03821660009081526022602052604090205460ff16155b801561229457506001600160a01b03831660009081526022602052604090205460ff16155b1561238e57600654600160a01b900460ff1615156001146122b457600080fd5b601d548111156123175760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610ba0565b60006123228361133a565b601c5490915061233283836134b9565b111561238c5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610ba0565b505b8061239f5761112b83836000612dbf565b600654600160c01b900460ff161580156123d157506001600160a01b03821660009081526023602052604090205460ff165b80156123eb57506006546001600160a01b03848116911614155b801561240557506005546001600160a01b03848116911614155b801561241f57506005546001600160a01b03838116911614155b801561244457506001600160a01b03821660009081526022602052604090205460ff16155b801561246957506001600160a01b03831660009081526022602052604090205460ff16155b1561250157600654600160a01b900460ff16151560011461248957600080fd5b601e548111156125015760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610ba0565b600061250c3061133a565b600b549091508110801590819061252d5750600654600160c01b900460ff16155b801561255157506001600160a01b03841660009081526023602052604090205460ff165b801561257657506001600160a01b03841660009081526022602052604090205460ff16155b801561259b57506001600160a01b03851660009081526022602052604090205460ff16155b15612a2657600b54600654909250600160b81b900460ff161561267e57600b546125ce816125c83061133a565b90612f13565b111561262357600b546125e43061dead83612dbf565b60405181815261dead9030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35061267e565b6000612634600b546125c83061133a565b90506126433061dead83612dbf565b60405181815261dead9030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505b600080602154905060006126a182610dec60145488611f0590919063ffffffff16565b905060006126b0826002611f8b565b905060006126be8383612f13565b6006805460ff60c01b1916600160c01b179055905083158015906126e457506000601454115b80156126fa5750600654600160b01b900460ff16155b156127e45786945061270b85612f6f565b602154601254909450156127df57600061273485610dec60125447611f0590919063ffffffff16565b6007546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b50509050806127dc5760405162461bcd60e51b815260206004820152601f60248201527f4661696c656420746f2073656e64206d61726b6574696e6720616d6f756e74006044820152606401610ba0565b50505b612881565b6000841180156127f657506000601454115b801561280b5750600654600160b01b900460ff165b1561288157869450600061282f6064610dec60125489611f0590919063ffffffff16565b905061283b8682612f13565b9550612854601254602154612f1390919063ffffffff16565b945061285f86612f6f565b6012541561287f5760075461287f9030906001600160a01b031683612dbf565b505b601354156129a15760006128a485610dec60135447611f0590919063ffffffff16565b90506128b1816002611f8b565b6008546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612903576040519150601f19603f3d011682016040523d82523d6000602084013e612908565b606091505b50509050806129295760405162461bcd60e51b8152600401610ba0906135c3565b6009546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612976576040519150601f19603f3d011682016040523d82523d6000602084013e61297b565b606091505b5050809150508061299e5760405162461bcd60e51b8152600401610ba0906135c3565b50505b60145415612a135760006129c485610dec60145447611f0590919063ffffffff16565b90506129d083826130c1565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b50506006805460ff60c01b191690555050505b6006546001600160a01b03861660009081526022602052604090205460ff600160c01b909204821615911680612a7457506001600160a01b03851660009081526022602052604090205460ff165b15612a8c57506000612a87868686612dbf565b612b2b565b6001600160a01b03851660009081526023602052604090205460ff16158015612ace57506001600160a01b03861660009081526023602052604090205460ff16155b8015612af357506001600160a01b03861660009081526022602052604090205460ff16155b8015612b1857506001600160a01b03851660009081526022602052604090205460ff16155b15612b2b57506000612b2b868686612dbf565b8015612c18576000612b4d6064610dec60205488611f0590919063ffffffff16565b90506000612b6b6064610dec60215489611f0590919063ffffffff16565b6001600160a01b03881660009081526023602052604090205490915060ff168015612b9857506000602154115b15612bc457612ba78682612f13565b9550612bb4883083612dbf565b612bbf888888612dbf565b612c15565b6001600160a01b03881660009081526023602052604090205460ff168015612bee57506000602054115b15612c0a57612bfd8683612f13565b9550612bb4883084612dbf565b612c15888888612dbf565b50505b505050505050565b6026548111612c2e57600080fd5b602655565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612ca8600e54612ca2600d54600c54611fe690919063ffffffff16565b90611fe6565b602055601454601354601254612cc39291612ca29190611fe6565b602155565b6001600160a01b03821660009081526023602052604090205460ff1615158115151415612d6b5760405162461bcd60e51b815260206004820152604560248201527f42616279417065436f696e3a204175746f6d61746564206d61726b6574206d6160448201527f6b6572207061697220697320616c72656164792073657420746f20746861742060648201526476616c756560d81b608482015260a401610ba0565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316612de55760405162461bcd60e51b8152600401610ba09061353b565b6001600160a01b038216612e0b5760405162461bcd60e51b8152600401610ba090613580565b6001600160a01b03831660009081526020819052604090205481811015612e835760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba0565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612eba9084906134b9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f0691815260200190565b60405180910390a3611703565b600082821115612f655760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610ba0565b611f848284613524565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612fa457612fa46134f3565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612ffd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130219190613604565b81600181518110613034576130346134f3565b6001600160a01b03928316602091820292909201015260065461305a9130911684612045565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613093908590600090869030904290600401613621565b600060405180830381600087803b1580156130ad57600080fd5b505af1158015612c18573d6000803e3d6000fd5b6006546130d99030906001600160a01b031684612045565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613146573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c8d9190613692565b600060208083528351808285015260005b818110156131985785810183015185820160400152820161317c565b818111156131aa576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610edb57600080fd5b600080604083850312156131e857600080fd5b82356131f3816131c0565b946020939093013593505050565b6000806040838503121561321457600080fd5b823561321f816131c0565b9150602083013561322f816131c0565b809150509250929050565b60006020828403121561324c57600080fd5b5035919050565b60006020828403121561326557600080fd5b8135611f84816131c0565b60008060006060848603121561328557600080fd5b8335613290816131c0565b925060208401356132a0816131c0565b929592945050506040919091013590565b600080604083850312156132c457600080fd5b50508035926020909101359150565b8015158114610edb57600080fd5b6000602082840312156132f357600080fd5b8135611f84816132d3565b60008060006060848603121561331357600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561333d57600080fd5b8235613348816131c0565b9150602083013561322f816132d3565b60008060006040848603121561336d57600080fd5b833567ffffffffffffffff8082111561338557600080fd5b818601915086601f83011261339957600080fd5b8135818111156133a857600080fd5b8760208260051b85010111156133bd57600080fd5b602092830195509350508401356133d3816132d3565b809150509250925092565b600181811c908216806133f257607f821691505b6020821081141561341357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561346057600080fd5b5051919050565b60006020828403121561347957600080fd5b8151611f84816132d3565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156134b4576134b4613484565b500290565b600082198211156134cc576134cc613484565b500190565b6000826134ee57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060001982141561351d5761351d613484565b5060010190565b60008282101561353657613536613484565b500390565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526021908201527f4661696c656420746f2073656e6420646576656c6f706d656e7420616d6f756e6040820152601d60fa1b606082015260800190565b60006020828403121561361657600080fd5b8151611f84816131c0565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136715784516001600160a01b03168352938301939183019160010161364c565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156136a757600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c7792da47a20c4d7fc9a079fe29872591fc4f9845c701e9082b2283e3eff380564736f6c634300080b0033

Deployed Bytecode Sourcemap

36670:22320:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2389:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37952:23;;;;;;;;;;;;;;;;;;;762:25:1;;;750:2;735:18;37952:23:0;616:177:1;4556:169:0;;;;;;;;;;-1:-1:-1;4556:169:0;;;;;:::i;:::-;;:::i;:::-;;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;4556:169:0;1254:187:1;36825:41:0;;;;;;;;;;-1:-1:-1;36825:41:0;;;;-1:-1:-1;;;;;36825:41:0;;;;;;-1:-1:-1;;;;;1637:32:1;;;1619:51;;1607:2;1592:18;36825:41:0;1446:230:1;37028:20:0;;;;;;;;;;-1:-1:-1;37028:20:0;;;;-1:-1:-1;;;37028:20:0;;;;;;3509:108;;;;;;;;;;-1:-1:-1;3597:12:0;;3509:108;;58481:233;;;;;;;;;;-1:-1:-1;58481:233:0;;;;;:::i;:::-;;:::i;:::-;;57378:119;;;;;;;;;;-1:-1:-1;57378:119:0;;;;;:::i;:::-;;:::i;38276:47::-;;;;;;;;;;-1:-1:-1;38276:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5207:492;;;;;;;;;;-1:-1:-1;5207:492:0;;;;;:::i;:::-;;:::i;56244:467::-;;;;;;;;;;;;;:::i;57505:174::-;;;;;;;;;;-1:-1:-1;57505:174:0;;;;;:::i;:::-;;:::i;45828:158::-;;;;;;;;;;-1:-1:-1;45828:158:0;;;;;:::i;:::-;;:::i;48454:143::-;;;;;;;;;;-1:-1:-1;48454:143:0;;;;;:::i;:::-;;:::i;3351:93::-;;;;;;;;;;-1:-1:-1;3351:93:0;;3434:2;3736:36:1;;3724:2;3709:18;3351:93:0;3594:184:1;6108:215:0;;;;;;;;;;-1:-1:-1;6108:215:0;;;;;:::i;:::-;;:::i;46287:904::-;;;;;;;;;;;;;:::i;36873:38::-;;;;;;;;;;;;;;;37002:19;;;;;;;;;;-1:-1:-1;37002:19:0;;;;-1:-1:-1;;;37002:19:0;;;;;;44878:205;;;;;;;;;;-1:-1:-1;44878:205:0;;;;;:::i;:::-;;:::i;48195:125::-;;;;;;;;;;-1:-1:-1;48195:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;48284:28:0;48260:4;48284:28;;;:19;:28;;;;;;;;;48195:125;48605:130;;;;;;;;;;-1:-1:-1;48605:130:0;;;;;:::i;:::-;;:::i;42699:320::-;;;;;;;;;;-1:-1:-1;42699:320:0;;;;;:::i;:::-;;:::i;3680:127::-;;;;;;;;;;-1:-1:-1;3680:127:0;;;;;:::i;:::-;;:::i;24700:94::-;;;;;;;;;;;;;:::i;57912:367::-;;;;;;;;;;-1:-1:-1;57912:367:0;;;;;:::i;:::-;;:::i;56723:314::-;;;;;;;;;;-1:-1:-1;56723:314:0;;;;;:::i;:::-;;:::i;37891:25::-;;;;;;;;;;;;;;;;24049:87;;;;;;;;;;-1:-1:-1;24122:6:0;;-1:-1:-1;;;;;24122:6:0;24049:87;;2608:104;;;;;;;;;;;;;:::i;44169:269::-;;;;;;;;;;-1:-1:-1;44169:269:0;;;;;:::i;:::-;;:::i;37982:26::-;;;;;;;;;;;;;;;;6826:413;;;;;;;;;;-1:-1:-1;6826:413:0;;;;;:::i;:::-;;:::i;43593:255::-;;;;;;;;;;-1:-1:-1;43593:255:0;;;;;:::i;:::-;;:::i;4020:175::-;;;;;;;;;;-1:-1:-1;4020:175:0;;;;;:::i;:::-;;:::i;37923:22::-;;;;;;;;;;;;;;;;47583:376;;;;;;;;;;-1:-1:-1;47583:376:0;;;;;:::i;:::-;;:::i;42581:110::-;;;;;;;;;;-1:-1:-1;42581:110:0;;;;;:::i;:::-;;:::i;38211:58::-;;;;;;;;;;-1:-1:-1;38211:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38023:27;;;;;;;;;;;;;;;;56006:229;;;;;;;;;;;;;:::i;58722:265::-;;;;;;;;;;-1:-1:-1;58722:265:0;;;;;:::i;:::-;;:::i;43338:247::-;;;;;;;;;;-1:-1:-1;43338:247:0;;;;;:::i;:::-;;:::i;43027:303::-;;;;;;;;;;-1:-1:-1;43027:303:0;;;;;:::i;:::-;;:::i;57045:325::-;;;;;;;;;;-1:-1:-1;57045:325:0;;;;;:::i;:::-;;:::i;58287:186::-;;;;;;;;;;-1:-1:-1;58287:186:0;;;;;:::i;:::-;;:::i;47967:220::-;;;;;;;;;;;;;:::i;38057:28::-;;;;;;;;;;;;;;;;45707:113;;;;;;;;;;;;;:::i;48743:102::-;;;;;;;;;;-1:-1:-1;48743:102:0;;;;;:::i;:::-;;:::i;4258:151::-;;;;;;;;;;-1:-1:-1;4258:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;4374:18:0;;;4347:7;4374:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4258:151;37217:33;;;;;;;;;;;;;;;;47199:376;;;;;;;;;;-1:-1:-1;47199:376:0;;;;;:::i;:::-;;:::i;43860:301::-;;;;;;;;;;-1:-1:-1;43860:301:0;;;;;:::i;:::-;;:::i;24949:192::-;;;;;;;;;;-1:-1:-1;24949:192:0;;;;;:::i;:::-;;:::i;45663:37::-;;;;;;;;;;-1:-1:-1;45663:37:0;;;;;;;;48332:116;;;;;;;;;;-1:-1:-1;48332:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;48417:23:0;48393:4;48417:23;;;:14;:23;;;;;;;;;48332:116;2389:100;2443:13;2476:5;2469:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2389:100;:::o;4556:169::-;4639:4;4656:39;1342:10;4679:7;4688:6;4656:8;:39::i;:::-;-1:-1:-1;4713:4:0;4556:169;;;;;:::o;58481:233::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;;;;;;;;;58633:30:::1;::::0;-1:-1:-1;;;58633:30:0;;58657:4:::1;58633:30;::::0;::::1;1619:51:1::0;58598:5:0;;58578:11:::1;::::0;-1:-1:-1;;;;;58633:15:0;::::1;::::0;::::1;::::0;1592:18:1;;58633:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58674:32;::::0;-1:-1:-1;;;58674:32:0;;-1:-1:-1;;;;;6581:32:1;;;58674::0::1;::::0;::::1;6563:51:1::0;6630:18;;;6623:34;;;58615:48:0;;-1:-1:-1;58674:14:0;;::::1;::::0;::::1;::::0;6536:18:1;;58674:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58567:147;;58481:233:::0;;:::o;57378:119::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;57466:23:::1;:12:::0;57482:6:::1;57466:23;:::i;:::-;57453:10;:36:::0;-1:-1:-1;57378:119:0:o;5207:492::-;5347:4;5364:36;5374:6;5382:9;5393:6;5364:9;:36::i;:::-;-1:-1:-1;;;;;5440:19:0;;5413:24;5440:19;;;:11;:19;;;;;;;;1342:10;5440:33;;;;;;;;5492:26;;;;5484:79;;;;-1:-1:-1;;;5484:79:0;;7425:2:1;5484:79:0;;;7407:21:1;7464:2;7444:18;;;7437:30;7503:34;7483:18;;;7476:62;-1:-1:-1;;;7554:18:1;;;7547:38;7602:19;;5484:79:0;7223:404:1;5484:79:0;5599:57;5608:6;1342:10;5649:6;5630:16;:25;5599:8;:57::i;:::-;-1:-1:-1;5687:4:0;;5207:492;-1:-1:-1;;;;5207:492:0:o;56244:467::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;56298:64:::1;56312:15;;56328:17;;56346:15;;56298:13;:64::i;:::-;56373:68;56388:16;;56405:18;;56424:16;;56373:14;:68::i;:::-;56454:61;56470:44;56508:5;56470:33;56486:16;;56470:11;;:15;;:33;;;;:::i;:::-;:37:::0;::::1;:44::i;56454:61::-;56526:103;56543:41;56578:5;56543:30;56559:13;;56543:11;;:15;;:30;;;;:::i;:41::-;56586:42;56622:5;56586:31;56602:14;;56586:11;;:15;;:31;;;;:::i;56526:103::-;56636:7;:14:::0;;-1:-1:-1;;;;56687:16:0;-1:-1:-1;;;56687:16:0;;;56244:467::o;57505:174::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;57608:20:::1;:9:::0;57621:6:::1;57608:20;:::i;:::-;57598:7;:30:::0;57650:21:::1;:10:::0;57664:6:::1;57650:21;:::i;:::-;57639:8;:32:::0;-1:-1:-1;;57505:174:0:o;45828:158::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;45921:57:::1;45943:34;45962:15;45943:18:::0;:34:::1;:::i;:::-;45921:21;:57::i;:::-;45828:158:::0;:::o;48454:143::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;48521:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;48521:18:0::1;-1:-1:-1::0;;;;48521:18:0;;::::1;;::::0;;48565:24:::1;::::0;::::1;::::0;::::1;::::0;48531:8;1419:14:1;1412:22;1394:41;;1382:2;1367:18;;1254:187;48565:24:0::1;;;;;;;;48454:143:::0;:::o;6108:215::-;1342:10;6196:4;6245:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6245:34:0;;;;;;;;;;6196:4;;6213:80;;6236:7;;6245:47;;6282:10;;6245:47;:::i;:::-;6213:8;:80::i;46287:904::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;46432:20:::1;;46413:15;:39;;46405:68;;;::::0;-1:-1:-1;;;46405:68:0;;7967:2:1;46405:68:0::1;::::0;::::1;7949:21:1::0;8006:2;7986:18;;;7979:30;-1:-1:-1;;;8025:18:1;;;8018:46;8081:18;;46405:68:0::1;7765:340:1::0;46405:68:0::1;46517:22;::::0;46568:39:::1;::::0;-1:-1:-1;;;46568:39:0;;46601:4:::1;46568:39;::::0;::::1;1619:51:1::0;-1:-1:-1;;;;;46517:22:0;;::::1;::::0;46486:21:::1;::::0;46517:22;;46568:24:::1;::::0;1592:18:1;;46568:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46621:25;::::0;46551:56;;-1:-1:-1;46621:25:0::1;;46618:566;;;46693:27;38133:7;46693:15;:27;:::i;:::-;46672:20;:48:::0;46859:2:::1;46850:8;:6:::0;46857:1:::1;46850:8;:::i;:::-;:11;;;;:::i;:::-;46900:15;::::0;46876:48:::1;::::0;-1:-1:-1;;;46876:48:0;;-1:-1:-1;;;;;46900:15:0;;::::1;46876:48;::::0;::::1;6563:51:1::0;6630:18;;;6623:34;;;46843:18:0;;-1:-1:-1;46876:23:0;::::1;::::0;::::1;::::0;6536:18:1;;46876:48:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46336:855;;46287:904::o:0;46618:566::-:1;47148:15;::::0;47124:48:::1;::::0;-1:-1:-1;;;47124:48:0;;-1:-1:-1;;;;;47148:15:0;;::::1;47124:48;::::0;::::1;6563:51:1::0;6630:18;;;6623:34;;;47124:23:0;;::::1;::::0;::::1;::::0;6536:18:1;;47124:48:0::1;6389:274:1::0;46618:566:0::1;46336:855;;46287:904::o:0;44878:205::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;44972:22:::1;:44:::0;;-1:-1:-1;;;;;;44972:44:0::1;-1:-1:-1::0;;;;;44972:44:0;::::1;;::::0;;45048:27:::1;38133:7;45048:15;:27;:::i;:::-;45027:20;:48:::0;-1:-1:-1;44878:205:0:o;48605:130::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;48671:7:::1;:17:::0;;;::::1;;-1:-1:-1::0;;;48671:17:0::1;-1:-1:-1::0;;;;48671:17:0;;::::1;;::::0;;48704:23:::1;::::0;::::1;::::0;::::1;::::0;48681:7;1419:14:1;1412:22;1394:41;;1382:2;1367:18;;1254:187;42699:320:0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;42808:15:::1;::::0;-1:-1:-1;;;;;42786:38:0;;::::1;42808:15:::0;::::1;42786:38;;42778:99;;;::::0;-1:-1:-1;;;42778:99:0;;8534:2:1;42778:99:0::1;::::0;::::1;8516:21:1::0;8573:2;8553:18;;;8546:30;8612:34;8592:18;;;8585:62;-1:-1:-1;;;8663:18:1;;;8656:46;8719:19;;42778:99:0::1;8332:412:1::0;42778:99:0::1;42935:15;::::0;42893:59:::1;::::0;-1:-1:-1;;;;;42935:15:0;;::::1;::::0;42893:59;::::1;::::0;::::1;::::0;42935:15:::1;::::0;42893:59:::1;42963:15;:48:::0;;-1:-1:-1;;;;;;42963:48:0::1;-1:-1:-1::0;;;;;42963:48:0;;;::::1;::::0;;;::::1;::::0;;42699:320::o;3680:127::-;-1:-1:-1;;;;;3781:18:0;3754:7;3781:18;;;;;;;;;;;;3680:127::o;24700:94::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;24765:21:::1;24783:1;24765:9;:21::i;:::-;24700:94::o:0;57912:367::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;58022:1:::1;58012:7;:11;:29;;;;;58038:3;58027:7;:14;;58012:29;58004:38;;;::::0;::::1;;58053:18;58074:16;:7:::0;58086:3:::1;58074:11;:16::i;:::-;58053:37:::0;-1:-1:-1;58101:15:0::1;58119:37;:21;58053:37:::0;58119:25:::1;:37::i;:::-;58101:55;;58168:12;58186:7;-1:-1:-1::0;;;;;58186:12:0::1;58206:7;58186:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58167:51;;;58237:7;58229:42;;;::::0;-1:-1:-1;;;58229:42:0;;9161:2:1;58229:42:0::1;::::0;::::1;9143:21:1::0;9200:2;9180:18;;;9173:30;-1:-1:-1;;;9219:18:1;;;9212:52;9281:18;;58229:42:0::1;8959:346:1::0;56723:314:0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;56860:16:::1;:37:::0;;;56908:18:::1;:41:::0;;;56960:16:::1;:37:::0;;;57018:11:::1;:9;:11::i;2608:104::-:0;2664:13;2697:7;2690:14;;;;;:::i;44169:269::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;44276:13:::1;-1:-1:-1::0;;;;;44268:21:0::1;:4;-1:-1:-1::0;;;;;44268:21:0::1;;;44260:116;;;::::0;-1:-1:-1;;;44260:116:0;;9512:2:1;44260:116:0::1;::::0;::::1;9494:21:1::0;9551:2;9531:18;;;9524:30;9590:34;9570:18;;;9563:62;9661:34;9641:18;;;9634:62;-1:-1:-1;;;9712:19:1;;;9705:49;9771:19;;44260:116:0::1;9310:486:1::0;44260:116:0::1;44389:41;44418:4;44424:5;44389:28;:41::i;6826:413::-:0;1342:10;6919:4;6963:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6963:34:0;;;;;;;;;;7016:35;;;;7008:85;;;;-1:-1:-1;;;7008:85:0;;10003:2:1;7008:85:0;;;9985:21:1;10042:2;10022:18;;;10015:30;10081:34;10061:18;;;10054:62;-1:-1:-1;;;10132:18:1;;;10125:35;10177:19;;7008:85:0;9801:401:1;7008:85:0;7129:67;1342:10;7152:7;7180:15;7161:16;:34;7129:8;:67::i;:::-;-1:-1:-1;7227:4:0;;6826:413;-1:-1:-1;;;6826:413:0:o;43593:255::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;43703:9:::1;43727:114;43734:19:::0;;::::1;43727:114;;;43800:11;43770:14;:27;43785:8;;43794:1;43785:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43770:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;43770:27:0;:41;;-1:-1:-1;;43770:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43826:3;::::1;::::0;::::1;:::i;:::-;;;;43727:114;;;43692:156;43593:255:::0;;;:::o;4020:175::-;4106:4;4123:42;1342:10;4147:9;4158:6;4123:9;:42::i;47583:376::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;47700:15:::1;::::0;-1:-1:-1;;;;;47678:37:0;;::::1;47700:15:::0;::::1;47678:37;;47670:107;;;::::0;-1:-1:-1;;;47670:107:0;;10681:2:1;47670:107:0::1;::::0;::::1;10663:21:1::0;10720:2;10700:18;;;10693:30;10759:34;10739:18;;;10732:62;-1:-1:-1;;;10810:18:1;;;10803:55;10875:19;;47670:107:0::1;10479:421:1::0;47670:107:0::1;47788:41;47804:18;47824:4;47788:15;:41::i;:::-;47888:15;::::0;47845:59:::1;::::0;-1:-1:-1;;;;;47888:15:0;;::::1;::::0;47845:59;::::1;::::0;::::1;::::0;47888:15:::1;::::0;47845:59:::1;47915:15;:36:::0;;-1:-1:-1;;;;;;47915:36:0::1;-1:-1:-1::0;;;;;47915:36:0;;;::::1;::::0;;;::::1;::::0;;47583:376::o;42581:110::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;42669:17:::1;:6:::0;42679::::1;42669:17;:::i;:::-;42648:18;:38:::0;-1:-1:-1;42581:110:0:o;56006:229::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;56055:20:::1;56069:1;56071::::0;56073::::1;56055:13;:20::i;:::-;56086:21;56101:1;56103::::0;56105::::1;56086:14;:21::i;:::-;56114:7;:15:::0;;-1:-1:-1;;;;56114:15:0::1;::::0;;56158:11:::1;::::0;56142:28:::1;::::0;:15:::1;:28::i;:::-;56181:46;56199:11;;56214;;56181:16;:46::i;58722:265::-:0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;58809:24:::1;58827:4;58809:9;:24::i;:::-;58799:6;:34;;58791:86;;;::::0;-1:-1:-1;;;58791:86:0;;11107:2:1;58791:86:0::1;::::0;::::1;11089:21:1::0;11146:2;11126:18;;;11119:30;11185:34;11165:18;;;11158:62;-1:-1:-1;;;11236:18:1;;;11229:37;11283:19;;58791:86:0::1;10905:403:1::0;58791:86:0::1;58888:91;58912:4;58919:42;58963:15;:6:::0;58972::::1;58963:15;:::i;:::-;58888;:91::i;43338:247::-:0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;43443:9:::1;43467:111;43474:19:::0;;::::1;43467:111;;;43510:38;43526:8;;43535:1;43526:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43539:8;43510:15;:38::i;:::-;43563:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43467:111;;43027:303:::0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43120:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;43112:108;;;::::0;-1:-1:-1;;;43112:108:0;;11515:2:1;43112:108:0::1;::::0;::::1;11497:21:1::0;11554:2;11534:18;;;11527:30;11593:34;11573:18;;;11566:62;11664:25;11644:18;;;11637:53;11707:19;;43112:108:0::1;11313:419:1::0;43112:108:0::1;-1:-1:-1::0;;;;;43231:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;43231:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43288:34;;1394:41:1;;;43288:34:0::1;::::0;1367:18:1;43288:34:0::1;;;;;;;;43027:303:::0;;:::o;57045:325::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;57187:17:::1;:39:::0;;;57237:19:::1;:43:::0;;;57291:17:::1;:39:::0;;;57351:11:::1;:9;:11::i;58287:186::-:0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;58364:15:::1;58382:24;58400:4;58382:9;:24::i;:::-;58364:42;;58417:48;58441:4;58448:7;58457;58417:15;:48::i;47967:220::-:0;48032:7;48070:20;;48054:15;:36;48051:110;;;48134:15;48113:20;;:36;;;;:::i;:::-;48106:43;;47967:220;:::o;48051:110::-;-1:-1:-1;48178:1:0;;47967:220::o;45707:113::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;45782:25:::1;:30:::0;;-1:-1:-1;;45782:30:0::1;45808:4;45782:30;::::0;;45707:113::o;48743:102::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;48817:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;48817:20:0::1;-1:-1:-1::0;;;;48817:20:0;;::::1;::::0;;;::::1;::::0;;48743:102::o;47199:376::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;47316:15:::1;::::0;-1:-1:-1;;;;;47294:37:0;;::::1;47316:15:::0;::::1;47294:37;;47286:107;;;::::0;-1:-1:-1;;;47286:107:0;;12069:2:1;47286:107:0::1;::::0;::::1;12051:21:1::0;12108:2;12088:18;;;12081:30;12147:34;12127:18;;;12120:62;-1:-1:-1;;;12198:18:1;;;12191:55;12263:19;;47286:107:0::1;11867:421:1::0;47286:107:0::1;47404:41;47420:18;47440:4;47404:15;:41::i;:::-;47504:15;::::0;47461:59:::1;::::0;-1:-1:-1;;;;;47504:15:0;;::::1;::::0;47461:59;::::1;::::0;::::1;::::0;47504:15:::1;::::0;47461:59:::1;47531:15;:36:::0;;-1:-1:-1;;;;;;47531:36:0::1;-1:-1:-1::0;;;;;47531:36:0;;;::::1;::::0;;;::::1;::::0;;47199:376::o;43860:301::-;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43955:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;:38;;::::0;::::1;;;;43947:109;;;::::0;-1:-1:-1;;;43947:109:0;;12495:2:1;43947:109:0::1;::::0;::::1;12477:21:1::0;12534:2;12514:18;;;12507:30;12573:34;12553:18;;;12546:62;12644:28;12624:18;;;12617:56;12690:19;;43947:109:0::1;12293:422:1::0;43947:109:0::1;-1:-1:-1::0;;;;;44067:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:37;;-1:-1:-1;;44067:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44122:31;;1394:41:1;;;44122:31:0::1;::::0;1367:18:1;44122:31:0::1;1254:187:1::0;24949:192:0;24122:6;;-1:-1:-1;;;;;24122:6:0;1342:10;24269:23;24261:68;;;;-1:-1:-1;;;24261:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25038:22:0;::::1;25030:73;;;::::0;-1:-1:-1;;;25030:73:0;;12922:2:1;25030:73:0::1;::::0;::::1;12904:21:1::0;12961:2;12941:18;;;12934:30;13000:34;12980:18;;;12973:62;-1:-1:-1;;;13051:18:1;;;13044:36;13097:19;;25030:73:0::1;12720:402:1::0;25030:73:0::1;25114:19;25124:8;25114:9;:19::i;35603:220::-:0;35661:7;35685:6;35681:20;;-1:-1:-1;35700:1:0;35693:8;;35681:20;35712:9;35724:5;35728:1;35724;:5;:::i;:::-;35712:17;-1:-1:-1;35757:1:0;35748:5;35752:1;35712:17;35748:5;:::i;:::-;:10;35740:56;;;;-1:-1:-1;;;35740:56:0;;13329:2:1;35740:56:0;;;13311:21:1;13368:2;13348:18;;;13341:30;13407:34;13387:18;;;13380:62;-1:-1:-1;;;13458:18:1;;;13451:31;13499:19;;35740:56:0;13127:397:1;35740:56:0;35814:1;35603:220;-1:-1:-1;;;35603:220:0:o;35831:153::-;35889:7;35921:1;35917;:5;35909:44;;;;-1:-1:-1;;;35909:44:0;;13731:2:1;35909:44:0;;;13713:21:1;13770:2;13750:18;;;13743:30;13809:28;13789:18;;;13782:56;13855:18;;35909:44:0;13529:350:1;35909:44:0;35971:5;35975:1;35971;:5;:::i;35250:179::-;35308:7;;35340:5;35344:1;35340;:5;:::i;:::-;35328:17;;35369:1;35364;:6;;35356:46;;;;-1:-1:-1;;;35356:46:0;;14086:2:1;35356:46:0;;;14068:21:1;14125:2;14105:18;;;14098:30;14164:29;14144:18;;;14137:57;14211:18;;35356:46:0;13884:351:1;10510:380:0;-1:-1:-1;;;;;10646:19:0;;10638:68;;;;-1:-1:-1;;;10638:68:0;;14442:2:1;10638:68:0;;;14424:21:1;14481:2;14461:18;;;14454:30;14520:34;14500:18;;;14493:62;-1:-1:-1;;;14571:18:1;;;14564:34;14615:19;;10638:68:0;14240:400:1;10638:68:0;-1:-1:-1;;;;;10725:21:0;;10717:68;;;;-1:-1:-1;;;10717:68:0;;14847:2:1;10717:68:0;;;14829:21:1;14886:2;14866:18;;;14859:30;14925:34;14905:18;;;14898:62;-1:-1:-1;;;14976:18:1;;;14969:32;15018:19;;10717:68:0;14645:398:1;10717:68:0;-1:-1:-1;;;;;10798:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10850:32;;762:25:1;;;10850:32:0;;735:18:1;10850:32:0;;;;;;;10510:380;;;:::o;48853:6018::-;-1:-1:-1;;;;;48985:18:0;;48977:68;;;;-1:-1:-1;;;48977:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49064:16:0;;49056:64;;;;-1:-1:-1;;;49056:64:0;;;;;;;:::i;:::-;24122:6;;-1:-1:-1;;;;;49137:15:0;;;24122:6;;49137:15;;;;:32;;-1:-1:-1;24122:6:0;;-1:-1:-1;;;;;49156:13:0;;;24122:6;;49156:13;;49137:32;:52;;;;-1:-1:-1;;;;;;49173:16:0;;;;49137:52;:77;;;;-1:-1:-1;;;;;;49193:21:0;;49207:6;49193:21;;49137:77;:100;;;;;49224:13;-1:-1:-1;;;;;49218:19:0;:2;-1:-1:-1;;;;;49218:19:0;;;49137:100;:128;;;;-1:-1:-1;;;;;;49242:23:0;;;;;;:19;:23;;;;;;;;49241:24;49137:128;:158;;;;-1:-1:-1;;;;;;49270:25:0;;;;;;:19;:25;;;;;;;;49269:26;49137:158;49133:484;;;49330:7;;-1:-1:-1;;;49330:7:0;;;;:15;;49341:4;49330:15;49322:24;;;;;;49379:7;;49369:6;:17;;49361:70;;;;-1:-1:-1;;;49361:70:0;;16060:2:1;49361:70:0;;;16042:21:1;16099:2;16079:18;;;16072:30;16138:34;16118:18;;;16111:62;-1:-1:-1;;;16189:18:1;;;16182:38;16237:19;;49361:70:0;15858:404:1;49361:70:0;49446:32;49481:13;49491:2;49481:9;:13::i;:::-;49554:10;;49446:48;;-1:-1:-1;49517:33:0;49544:6;49446:48;49517:33;:::i;:::-;:47;;49509:96;;;;-1:-1:-1;;;49509:96:0;;16469:2:1;49509:96:0;;;16451:21:1;16508:2;16488:18;;;16481:30;16547:34;16527:18;;;16520:62;-1:-1:-1;;;16598:18:1;;;16591:34;16642:19;;49509:96:0;16267:400:1;49509:96:0;49307:310;49133:484;49644:11;49641:92;;49672:28;49688:4;49694:2;49698:1;49672:15;:28::i;49641:92::-;49749:8;;-1:-1:-1;;;49749:8:0;;;;49748:9;:42;;;;-1:-1:-1;;;;;;49761:29:0;;;;;;:25;:29;;;;;;;;49748:42;:78;;;;-1:-1:-1;49810:15:0;;-1:-1:-1;;;;;49794:32:0;;;49810:15;;49794:32;;49748:78;:97;;;;-1:-1:-1;24122:6:0;;-1:-1:-1;;;;;49830:15:0;;;24122:6;;49830:15;;49748:97;:114;;;;-1:-1:-1;24122:6:0;;-1:-1:-1;;;;;49849:13:0;;;24122:6;;49849:13;;49748:114;:142;;;;-1:-1:-1;;;;;;49867:23:0;;;;;;:19;:23;;;;;;;;49866:24;49748:142;:172;;;;-1:-1:-1;;;;;;49895:25:0;;;;;;:19;:25;;;;;;;;49894:26;49748:172;49745:343;;;49954:7;;-1:-1:-1;;;49954:7:0;;;;:15;;49965:4;49954:15;49946:24;;;;;;50005:8;;49995:6;:18;;49987:89;;;;-1:-1:-1;;;49987:89:0;;16874:2:1;49987:89:0;;;16856:21:1;16913:2;16893:18;;;16886:30;16952:34;16932:18;;;16925:62;17023:28;17003:18;;;16996:56;17069:19;;49987:89:0;16672:422:1;49987:89:0;50094:28;50125:24;50143:4;50125:9;:24::i;:::-;50201:18;;50094:55;;-1:-1:-1;50177:42:0;;;;;;;50231:20;;-1:-1:-1;50243:8:0;;-1:-1:-1;;;50243:8:0;;;;50242:9;50231:20;:53;;;;-1:-1:-1;;;;;;50255:29:0;;;;;;:25;:29;;;;;;;;50231:53;:81;;;;-1:-1:-1;;;;;;50289:23:0;;;;;;:19;:23;;;;;;;;50288:24;50231:81;:111;;;;-1:-1:-1;;;;;;50317:25:0;;;;;;:19;:25;;;;;;;;50316:26;50231:111;50228:3258;;;50384:18;;50420:7;;50384:18;;-1:-1:-1;;;;50420:7:0;;;;50417:774;;;50502:18;;50451:48;50502:18;50451:24;50469:4;50451:9;:24::i;:::-;:28;;:48::i;:::-;:69;50448:728;;;50569:18;;50610:89;50634:4;50641:42;50569:18;50610:15;:89::i;:::-;50729:82;;762:25:1;;;50753:42:0;;50746:4;;50729:82;;750:2:1;735:18;50729:82:0;;;;;;;50522:309;50448:728;;;50860:21;50884:48;50913:18;;50884:24;50902:4;50884:9;:24::i;:48::-;50860:72;;50955:89;50979:4;50986:42;51030:13;50955:15;:89::i;:::-;51074:82;;762:25:1;;;51098:42:0;;51091:4;;51074:82;;750:2:1;735:18;51074:82:0;;;;;;;50837:339;50448:728;51199:18;51223;51244:13;;51223:34;;51263:23;51289:59;51337:10;51289:43;51314:17;;51289:20;:24;;:43;;;;:::i;:59::-;51263:85;-1:-1:-1;51354:12:0;51369:22;51263:85;51389:1;51369:19;:22::i;:::-;51354:37;-1:-1:-1;51397:17:0;51417:25;:15;51354:37;51417:19;:25::i;:::-;51471:8;:15;;-1:-1:-1;;;;51471:15:0;-1:-1:-1;;;51471:15:0;;;51397:45;-1:-1:-1;51501:14:0;;;;;:39;;;51539:1;51519:17;;:21;51501:39;:54;;;;-1:-1:-1;51545:10:0;;-1:-1:-1;;;51545:10:0;;;;51544:11;51501:54;51497:1101;;;51576:20;51563:33;;51611:28;51628:10;51611:16;:28::i;:::-;51667:13;;51705:17;;51667:13;;-1:-1:-1;51705:21:0;51701:310;;51749:23;51775:60;51824:10;51775:44;51801:17;;51775:21;:25;;:44;;;;:::i;:60::-;51873:15;;:48;;51749:86;;-1:-1:-1;51855:12:0;;-1:-1:-1;;;;;51873:15:0;;;;51749:86;;51855:12;51873:48;51855:12;51873:48;51749:86;51873:15;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51854:67;;;51948:7;51940:51;;;;-1:-1:-1;;;51940:51:0;;17301:2:1;51940:51:0;;;17283:21:1;17340:2;17320:18;;;17313:30;17379:33;17359:18;;;17352:61;17430:18;;51940:51:0;17099:355:1;51940:51:0;51728:283;;51701:310;51497:1101;;;52055:1;52042:10;:14;:39;;;;;52080:1;52060:17;;:21;52042:39;:53;;;;-1:-1:-1;52085:10:0;;-1:-1:-1;;;52085:10:0;;;;52042:53;52038:560;;;52116:20;52103:33;;52151:23;52177:42;52215:3;52177:33;52192:17;;52177:10;:14;;:33;;;;:::i;:42::-;52151:68;-1:-1:-1;52247:31:0;:10;52151:68;52247:14;:31::i;:::-;52234:44;;52306:36;52324:17;;52306:13;;:17;;:36;;;;:::i;:::-;52293:49;;52359:28;52376:10;52359:16;:28::i;:::-;52426:17;;:21;52422:170;;52503:15;;52472:64;;52496:4;;-1:-1:-1;;;;;52503:15:0;52520;52472;:64::i;:::-;52097:501;52038:560;52618:19;;:23;52614:518;;52660:25;52688:62;52739:10;52688:46;52714:19;;52688:21;:25;;:46;;;;:::i;:62::-;52660:90;-1:-1:-1;52785:24:0;52660:90;52807:1;52785:21;:24::i;:::-;52845:18;;:53;;52765:44;;-1:-1:-1;52827:12:0;;-1:-1:-1;;;;;52845:18:0;;;;52765:44;;52827:12;52845:53;52827:12;52845:53;52765:44;52845:18;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52826:72;;;52921:7;52913:53;;;;-1:-1:-1;;;52913:53:0;;;;;;;:::i;:::-;52995:18;;:53;;-1:-1:-1;;;;;52995:18:0;;;;53026:17;;52995:53;;;;53026:17;52995:18;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52981:67;;;;;53071:7;53063:53;;;;-1:-1:-1;;;53063:53:0;;;;;;;:::i;:::-;52643:489;;52614:518;53143:17;;:21;53139:300;;53184:18;53205:60;53254:10;53205:44;53231:17;;53205:21;:25;;:44;;;;:::i;:60::-;53184:81;;53327:30;53340:4;53346:10;53327:12;:30::i;:::-;53380:43;;;18063:25:1;;;18119:2;18104:18;;18097:34;;;18147:18;;;18140:34;;;53380:43:0;;18051:2:1;18036:18;53380:43:0;;;;;;;53166:273;53139:300;-1:-1:-1;;53458:8:0;:16;;-1:-1:-1;;;;53458:16:0;;;-1:-1:-1;;;50228:3258:0;53514:8;;-1:-1:-1;;;;;53623:25:0;;53498:12;53623:25;;;:19;:25;;;;;;53514:8;-1:-1:-1;;;53514:8:0;;;;;53513:9;;53623:25;;:52;;-1:-1:-1;;;;;;53652:23:0;;;;;;:19;:23;;;;;;;;53623:52;53620:383;;;-1:-1:-1;53702:5:0;53722:33;53738:4;53744:2;53748:6;53722:15;:33::i;:::-;53620:383;;;-1:-1:-1;;;;;53788:29:0;;;;;;:25;:29;;;;;;;;53787:30;:66;;;;-1:-1:-1;;;;;;53822:31:0;;;;;;:25;:31;;;;;;;;53821:32;53787:66;:96;;;;-1:-1:-1;;;;;;53858:25:0;;;;;;:19;:25;;;;;;;;53857:26;53787:96;:124;;;;-1:-1:-1;;;;;;53888:23:0;;;;;;:19;:23;;;;;;;;53887:24;53787:124;53784:219;;;-1:-1:-1;53938:5:0;53958:33;53974:4;53980:2;53984:6;53958:15;:33::i;:::-;54018:7;54015:849;;;54042:15;54060:33;54089:3;54060:24;54071:12;;54060:6;:10;;:24;;;;:::i;:33::-;54042:51;;54108:16;54127:34;54157:3;54127:25;54138:13;;54127:6;:10;;:25;;;;:::i;:34::-;-1:-1:-1;;;;;54205:29:0;;;;;;:25;:29;;;;;;54108:53;;-1:-1:-1;54205:29:0;;:50;;;;;54254:1;54238:13;;:17;54205:50;54202:651;;;54285:20;:6;54296:8;54285:10;:20::i;:::-;54276:29;;54324:46;54340:4;54354;54361:8;54324:15;:46::i;:::-;54389:33;54405:4;54411:2;54415:6;54389:15;:33::i;:::-;54202:651;;;-1:-1:-1;;;;;54514:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;54564:1;54549:12;;:16;54514:51;54511:342;;;54595:19;:6;54606:7;54595:10;:19::i;:::-;54586:28;;54633:45;54649:4;54663;54670:7;54633:15;:45::i;54511:342::-;54804:33;54820:4;54826:2;54830:6;54804:15;:33::i;:::-;54027:837;;54015:849;48966:5905;;;48853:6018;;;:::o;45992:230::-;46148:20;;46134:13;:34;46126:43;;;;;;46180:20;:34;45992:230::o;25149:173::-;25224:6;;;-1:-1:-1;;;;;25241:17:0;;;-1:-1:-1;;;;;;25241:17:0;;;;;;;25274:40;;25224:6;;;25241:17;25224:6;;25274:40;;25205:16;;25274:40;25194:128;25149:173;:::o;57687:217::-;57742:62;57787:16;;57742:40;57763:18;;57742:16;;:20;;:40;;;;:::i;:::-;:44;;:62::i;:::-;57727:12;:77;57878:17;;57853:19;;57831:17;;:65;;57878:17;57831:42;;:17;:21;:42::i;:65::-;57815:13;:81;57687:217::o;44446:321::-;-1:-1:-1;;;;;44537:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;44529:122;;;;-1:-1:-1;;;44529:122:0;;18387:2:1;44529:122:0;;;18369:21:1;18426:2;18406:18;;;18399:30;18465:34;18445:18;;;18438:62;18536:34;18516:18;;;18509:62;-1:-1:-1;;;18587:19:1;;;18580:36;18633:19;;44529:122:0;18185:473:1;44529:122:0;-1:-1:-1;;;;;44662:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;44662:39:0;;;;;;;;;;44719:40;;44662:39;;:31;44719:40;;;44446:321;;:::o;7729:733::-;-1:-1:-1;;;;;7869:20:0;;7861:70;;;;-1:-1:-1;;;7861:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7950:23:0;;7942:71;;;;-1:-1:-1;;;7942:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8110:17:0;;8086:21;8110:17;;;;;;;;;;;8146:23;;;;8138:74;;;;-1:-1:-1;;;8138:74:0;;18865:2:1;8138:74:0;;;18847:21:1;18904:2;18884:18;;;18877:30;18943:34;18923:18;;;18916:62;-1:-1:-1;;;18994:18:1;;;18987:36;19040:19;;8138:74:0;18663:402:1;8138:74:0;-1:-1:-1;;;;;8248:17:0;;;:9;:17;;;;;;;;;;;8268:22;;;8248:42;;8312:20;;;;;;;;:30;;8284:6;;8248:9;8312:30;;8284:6;;8312:30;:::i;:::-;;;;;;;;8377:9;-1:-1:-1;;;;;8360:35:0;8369:6;-1:-1:-1;;;;;8360:35:0;;8388:6;8360:35;;;;762:25:1;;750:2;735:18;;616:177;8360:35:0;;;;;;;;8408:46;46287:904;35437:158;35495:7;35528:1;35523;:6;;35515:49;;;;-1:-1:-1;;;35515:49:0;;19272:2:1;35515:49:0;;;19254:21:1;19311:2;19291:18;;;19284:30;19350:32;19330:18;;;19323:60;19400:18;;35515:49:0;19070:354:1;35515:49:0;35582:5;35586:1;35582;:5;:::i;54879:591::-;55031:16;;;55045:1;55031:16;;;;;;;;55007:21;;55031:16;;;;;;;;;;-1:-1:-1;55031:16:0;55007:40;;55076:4;55058;55063:1;55058:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55058:23:0;;;:7;;;;;;;;;;:23;;;;55102:15;;:22;;;-1:-1:-1;;;55102:22:0;;;;:15;;;;;:20;;:22;;;;;55058:7;;55102:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55092:4;55097:1;55092:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55092:32:0;;;:7;;;;;;;;;:32;55169:15;;55137:62;;55154:4;;55169:15;55187:11;55137:8;:62::i;:::-;55238:15;;:224;;-1:-1:-1;;;55238:224:0;;-1:-1:-1;;;;;55238:15:0;;;;:66;;:224;;55319:11;;55238:15;;55389:4;;55416;;55436:15;;55238:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55478:520;55660:15;;55628:62;;55645:4;;-1:-1:-1;;;;;55660:15:0;55678:11;55628:8;:62::i;:::-;55732:15;;:258;;-1:-1:-1;;;55732:258:0;;55804:4;55732:258;;;21143:34:1;;;21193:18;;;21186:34;;;55732:15:0;21236:18:1;;;21229:34;;;21279:18;;;21272:34;21322:19;;;21315:44;55964:15:0;21375:19:1;;;21368:35;-1:-1:-1;;;;;55732:15:0;;;;:31;;55771:9;;21077:19:1;;55732:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:315;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;1239:2;1224:18;;;;1211:32;;-1:-1:-1;;;934:315:1:o;1681:388::-;1749:6;1757;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1865:9;1852:23;1884:31;1909:5;1884:31;:::i;:::-;1934:5;-1:-1:-1;1991:2:1;1976:18;;1963:32;2004:33;1963:32;2004:33;:::i;:::-;2056:7;2046:17;;;1681:388;;;;;:::o;2074:180::-;2133:6;2186:2;2174:9;2165:7;2161:23;2157:32;2154:52;;;2202:1;2199;2192:12;2154:52;-1:-1:-1;2225:23:1;;2074:180;-1:-1:-1;2074:180:1:o;2259:247::-;2318:6;2371:2;2359:9;2350:7;2346:23;2342:32;2339:52;;;2387:1;2384;2377:12;2339:52;2426:9;2413:23;2445:31;2470:5;2445:31;:::i;2511:456::-;2588:6;2596;2604;2657:2;2645:9;2636:7;2632:23;2628:32;2625:52;;;2673:1;2670;2663:12;2625:52;2712:9;2699:23;2731:31;2756:5;2731:31;:::i;:::-;2781:5;-1:-1:-1;2838:2:1;2823:18;;2810:32;2851:33;2810:32;2851:33;:::i;:::-;2511:456;;2903:7;;-1:-1:-1;;;2957:2:1;2942:18;;;;2929:32;;2511:456::o;2972:248::-;3040:6;3048;3101:2;3089:9;3080:7;3076:23;3072:32;3069:52;;;3117:1;3114;3107:12;3069:52;-1:-1:-1;;3140:23:1;;;3210:2;3195:18;;;3182:32;;-1:-1:-1;2972:248:1:o;3225:118::-;3311:5;3304:13;3297:21;3290:5;3287:32;3277:60;;3333:1;3330;3323:12;3348:241;3404:6;3457:2;3445:9;3436:7;3432:23;3428:32;3425:52;;;3473:1;3470;3463:12;3425:52;3512:9;3499:23;3531:28;3553:5;3531:28;:::i;3991:316::-;4068:6;4076;4084;4137:2;4125:9;4116:7;4112:23;4108:32;4105:52;;;4153:1;4150;4143:12;4105:52;-1:-1:-1;;4176:23:1;;;4246:2;4231:18;;4218:32;;-1:-1:-1;4297:2:1;4282:18;;;4269:32;;3991:316;-1:-1:-1;3991:316:1:o;4312:382::-;4377:6;4385;4438:2;4426:9;4417:7;4413:23;4409:32;4406:52;;;4454:1;4451;4444:12;4406:52;4493:9;4480:23;4512:31;4537:5;4512:31;:::i;:::-;4562:5;-1:-1:-1;4619:2:1;4604:18;;4591:32;4632:30;4591:32;4632:30;:::i;4699:750::-;4791:6;4799;4807;4860:2;4848:9;4839:7;4835:23;4831:32;4828:52;;;4876:1;4873;4866:12;4828:52;4916:9;4903:23;4945:18;4986:2;4978:6;4975:14;4972:34;;;5002:1;4999;4992:12;4972:34;5040:6;5029:9;5025:22;5015:32;;5085:7;5078:4;5074:2;5070:13;5066:27;5056:55;;5107:1;5104;5097:12;5056:55;5147:2;5134:16;5173:2;5165:6;5162:14;5159:34;;;5189:1;5186;5179:12;5159:34;5244:7;5237:4;5227:6;5224:1;5220:14;5216:2;5212:23;5208:34;5205:47;5202:67;;;5265:1;5262;5255:12;5202:67;5296:4;5288:13;;;;-1:-1:-1;5320:6:1;-1:-1:-1;;5361:20:1;;5348:34;5391:28;5348:34;5391:28;:::i;:::-;5438:5;5428:15;;;4699:750;;;;;:::o;5454:380::-;5533:1;5529:12;;;;5576;;;5597:61;;5651:4;5643:6;5639:17;5629:27;;5597:61;5704:2;5696:6;5693:14;5673:18;5670:38;5667:161;;;5750:10;5745:3;5741:20;5738:1;5731:31;5785:4;5782:1;5775:15;5813:4;5810:1;5803:15;5667:161;;5454:380;;;:::o;5839:356::-;6041:2;6023:21;;;6060:18;;;6053:30;6119:34;6114:2;6099:18;;6092:62;6186:2;6171:18;;5839:356::o;6200:184::-;6270:6;6323:2;6311:9;6302:7;6298:23;6294:32;6291:52;;;6339:1;6336;6329:12;6291:52;-1:-1:-1;6362:16:1;;6200:184;-1:-1:-1;6200:184:1:o;6668:245::-;6735:6;6788:2;6776:9;6767:7;6763:23;6759:32;6756:52;;;6804:1;6801;6794:12;6756:52;6836:9;6830:16;6855:28;6877:5;6855:28;:::i;6918:127::-;6979:10;6974:3;6970:20;6967:1;6960:31;7010:4;7007:1;7000:15;7034:4;7031:1;7024:15;7050:168;7090:7;7156:1;7152;7148:6;7144:14;7141:1;7138:21;7133:1;7126:9;7119:17;7115:45;7112:71;;;7163:18;;:::i;:::-;-1:-1:-1;7203:9:1;;7050:168::o;7632:128::-;7672:3;7703:1;7699:6;7696:1;7693:13;7690:39;;;7709:18;;:::i;:::-;-1:-1:-1;7745:9:1;;7632:128::o;8110:217::-;8150:1;8176;8166:132;;8220:10;8215:3;8211:20;8208:1;8201:31;8255:4;8252:1;8245:15;8283:4;8280:1;8273:15;8166:132;-1:-1:-1;8312:9:1;;8110:217::o;10207:127::-;10268:10;10263:3;10259:20;10256:1;10249:31;10299:4;10296:1;10289:15;10323:4;10320:1;10313:15;10339:135;10378:3;-1:-1:-1;;10399:17:1;;10396:43;;;10419:18;;:::i;:::-;-1:-1:-1;10466:1:1;10455:13;;10339:135::o;11737:125::-;11777:4;11805:1;11802;11799:8;11796:34;;;11810:18;;:::i;:::-;-1:-1:-1;11847:9:1;;11737:125::o;15048:401::-;15250:2;15232:21;;;15289:2;15269:18;;;15262:30;15328:34;15323:2;15308:18;;15301:62;-1:-1:-1;;;15394:2:1;15379:18;;15372:35;15439:3;15424:19;;15048:401::o;15454:399::-;15656:2;15638:21;;;15695:2;15675:18;;;15668:30;15734:34;15729:2;15714:18;;15707:62;-1:-1:-1;;;15800:2:1;15785:18;;15778:33;15843:3;15828:19;;15454:399::o;17459:397::-;17661:2;17643:21;;;17700:2;17680:18;;;17673:30;17739:34;17734:2;17719:18;;17712:62;-1:-1:-1;;;17805:2:1;17790:18;;17783:31;17846:3;17831:19;;17459:397::o;19561:251::-;19631:6;19684:2;19672:9;19663:7;19659:23;19655:32;19652:52;;;19700:1;19697;19690:12;19652:52;19732:9;19726:16;19751:31;19776:5;19751:31;:::i;19817:980::-;20079:4;20127:3;20116:9;20112:19;20158:6;20147:9;20140:25;20184:2;20222:6;20217:2;20206:9;20202:18;20195:34;20265:3;20260:2;20249:9;20245:18;20238:31;20289:6;20324;20318:13;20355:6;20347;20340:22;20393:3;20382:9;20378:19;20371:26;;20432:2;20424:6;20420:15;20406:29;;20453:1;20463:195;20477:6;20474:1;20471:13;20463:195;;;20542:13;;-1:-1:-1;;;;;20538:39:1;20526:52;;20633:15;;;;20598:12;;;;20574:1;20492:9;20463:195;;;-1:-1:-1;;;;;;;20714:32:1;;;;20709:2;20694:18;;20687:60;-1:-1:-1;;;20778:3:1;20763:19;20756:35;20675:3;19817:980;-1:-1:-1;;;19817:980:1:o;21414:306::-;21502:6;21510;21518;21571:2;21559:9;21550:7;21546:23;21542:32;21539:52;;;21587:1;21584;21577:12;21539:52;21616:9;21610:16;21600:26;;21666:2;21655:9;21651:18;21645:25;21635:35;;21710:2;21699:9;21695:18;21689:25;21679:35;;21414:306;;;;;:::o

Swarm Source

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