ETH Price: $3,482.26 (+2.68%)

Token

Shibnobi (SHINJA)
 

Overview

Max Total Supply

73,839,782,278.914857114 SHINJA

Holders

12,185

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
asbond.eth
Balance
10,427 SHINJA

Value
$0.00
0xff37fb7baf20699f5f3f39ca325acabf3506b4c7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Shibnobi provides a full ecosystem including a Dex, bridge, social media/gaming platform, DAO and others.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Shibnobiv2

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-05
*/

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

// Shibnobi V2
// Version: 20221104001
// Website: www.shibnobi.com
// Twitter: https://twitter.com/Shib_nobi (@Shib_nobi)
// TG: https://t.me/ShibnobiCommunity
// Facebook: https://www.facebook.com/Shibnobi
// Instagram: https://www.instagram.com/shibnobi/
// Medium: https://medium.com/@Shibnobi
// Reddit: https://www.reddit.com/r/Shibnobi/
// Discord: https://discord.gg/shibnobi

pragma solidity ^0.8.17;
// SPDX-License-Identifier: Unlicensed
interface IUniswapRouter01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

interface IUniswapRouter02 is IUniswapRouter01 {

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

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

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

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

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

}

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(msg.sender, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(msg.sender, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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(
            msg.sender,
            spender,
            allowance(msg.sender, 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 = allowance(msg.sender, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(msg.sender, 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - 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 {}
}

interface IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract Shibnobiv2 is ERC20, Ownable {
    address payable public marketingFeeAddress;
    address payable public stakingFeeAddress;

    uint16 constant feeDenominator = 1000;
    uint16 constant lpDenominator = 1000;
    uint16 constant maxFeeLimit = 300;

    bool public tradingActive;

    mapping(address => bool) public isExcludedFromFee;

    uint16 public buyBurnFee = 10;
    uint16 public buyLiquidityFee = 10;
    uint16 public buyMarketingFee = 35;
    uint16 public buyStakingFee = 20;

    uint16 public sellBurnFee = 10;
    uint16 public sellLiquidityFee = 20;
    uint16 public sellMarketingFee = 40;
    uint16 public sellStakingFee = 30;

    uint16 public transferBurnFee = 10;
    uint16 public transferLiquidityFee = 5;
    uint16 public transferMarketingFee = 5;
    uint16 public transferStakingFee = 20;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingFeeTokensToSwap;
    uint256 private _burnFeeTokens;
    uint256 private _stakingFeeTokens;

    uint256 private lpTokens;

    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) public botWallet;
    address[] public botWallets;
    uint256 public minLpBeforeSwapping;

    IUniswapRouter02 public immutable uniswapRouter;
    address public immutable uniswapPair;
    address public bridgeAddress;

    bool inSwapAndLiquify;

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

    constructor() ERC20("Shibnobi", "SHINJA") {
        _mint(msg.sender, 1e11 * 10**decimals());

        marketingFeeAddress = payable(
            0xb8F9d14060e7e73eed1e98c23a732BE11345a2dB
        );
        stakingFeeAddress = payable(0x142080A32EE52cFE573Abf0C42798D63A20da8cD);

        minLpBeforeSwapping = 10; // this means: 10 / 1000 = 1% of the liquidity pool is the threshold before swapping

        address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH Mainnet
        // address routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC Mainnet
        uniswapRouter = IUniswapRouter02(payable(routerAddress));

        uniswapPair = IFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        isExcludedFromFee[msg.sender] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingFeeAddress] = true;
        isExcludedFromFee[stakingFeeAddress] = true;

        _limits[msg.sender].isExcluded = true;
        _limits[address(this)].isExcluded = true;
        _limits[routerAddress].isExcluded = true;

        // Limits Configuration
        globalLimit = 25 ether;
        globalLimitPeriod = 24 hours;
        limitsActive = true;

        _approve(msg.sender, routerAddress, ~uint256(0));
        _setAutomatedMarketMakerPair(uniswapPair, true);
        bridgeAddress = 0x4c03Cf0301F2ef59CC2687b82f982A2A01C00Ee2;
        isExcludedFromFee[bridgeAddress] = true;
        _limits[bridgeAddress].isExcluded = true;
        _approve(address(this), address(uniswapRouter), type(uint256).max);
    }

    function increaseRouterAllowance(address routerAddress) external onlyOwner {
        _approve(address(this), routerAddress, type(uint256).max);
    }

    function migrateBridge(address newAddress) external onlyOwner {
        require(
            newAddress != address(0) && !automatedMarketMakerPairs[newAddress],
            "Can't set this address"
        );
        bridgeAddress = newAddress;
        isExcludedFromFee[newAddress] = true;
        _limits[newAddress].isExcluded = true;
    }

    function decimals() public pure override returns (uint8) {
        return 9;
    }

    function addBotWallet(address wallet) external onlyOwner {
        require(!botWallet[wallet], "Wallet already added");
        botWallet[wallet] = true;
        botWallets.push(wallet);
    }

    function addBotWalletBulk(address[] memory wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            require(!botWallet[wallets[i]], "Wallet already added");
            botWallet[wallets[i]] = true;
            botWallets.push(wallets[i]);
        }
    }

    function getBotWallets() external view returns (address[] memory) {
        return botWallets;
    }

    function removeBotWallet(address wallet) external onlyOwner {
        require(botWallet[wallet], "Wallet not added");
        botWallet[wallet] = false;
        for (uint256 i = 0; i < botWallets.length; i++) {
            if (botWallets[i] == wallet) {
                botWallets[i] = botWallets[botWallets.length - 1];
                botWallets.pop();
                break;
            }
        }
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    function disableTrading() external onlyOwner {
        tradingActive = false;
    }

    function totalSupply() public view override returns (uint256) {
        return super.totalSupply() - bridgeBalance();
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (account == bridgeAddress) return 0;
        return super.balanceOf(account);
    }

    function bridgeBalance() public view returns (uint256) {
        return super.balanceOf(bridgeAddress);
    }

    function updateMinLpBeforeSwapping(uint256 minLpBeforeSwapping_)
        external
        onlyOwner
    {
        minLpBeforeSwapping = minLpBeforeSwapping_;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(pair != uniswapPair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function excludeFromFee(address account) external onlyOwner {
        isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        isExcludedFromFee[account] = false;
    }

    function updateBuyFee(
        uint16 _buyBurnFee,
        uint16 _buyLiquidityFee,
        uint16 _buyMarketingFee,
        uint16 _buyStakingFee
    ) external onlyOwner {
        buyBurnFee = _buyBurnFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyMarketingFee = _buyMarketingFee;
        buyStakingFee = _buyStakingFee;
        require(
            _buyBurnFee +
                _buyLiquidityFee +
                _buyMarketingFee +
                _buyStakingFee <=
                maxFeeLimit,
            "Must keep fees below 30%"
        );
    }

    function updateSellFee(
        uint16 _sellBurnFee,
        uint16 _sellLiquidityFee,
        uint16 _sellMarketingFee,
        uint16 _sellStakingFee
    ) external onlyOwner {
        sellBurnFee = _sellBurnFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellMarketingFee = _sellMarketingFee;
        sellStakingFee = _sellStakingFee;
        require(
            _sellBurnFee +
                _sellLiquidityFee +
                _sellMarketingFee +
                _sellStakingFee <=
                maxFeeLimit,
            "Must keep fees <= 30%"
        );
    }

    function updateTransferFee(
        uint16 _transferBurnFee,
        uint16 _transferLiquidityFee,
        uint16 _transferMarketingFee,
        uint16 _transferStakingfee
    ) external onlyOwner {
        transferBurnFee = _transferBurnFee;
        transferLiquidityFee = _transferLiquidityFee;
        transferMarketingFee = _transferMarketingFee;
        transferStakingFee = _transferStakingfee;
        require(
            _transferBurnFee +
                _transferLiquidityFee +
                _transferMarketingFee +
                _transferStakingfee <=
                maxFeeLimit,
            "Must keep fees <= 30%"
        );
    }

    function updateMarketingFeeAddress(address marketingFeeAddress_)
        external
        onlyOwner
    {
        require(marketingFeeAddress_ != address(0), "Can't set 0");
        marketingFeeAddress = payable(marketingFeeAddress_);
    }

    function updateStakingAddress(address stakingFeeAddress_)
        external
        onlyOwner
    {
        require(stakingFeeAddress_ != address(0), "Can't set 0");
        stakingFeeAddress = payable(stakingFeeAddress_);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (!tradingActive) {
            require(
                isExcludedFromFee[from] || isExcludedFromFee[to],
                "Trading is not active yet."
            );
        }
        require(!botWallet[from] && !botWallet[to], "Bot wallet");
        checkLiquidity();

        if (
            hasLiquidity && !inSwapAndLiquify && automatedMarketMakerPairs[to]
        ) {
            uint256 contractTokenBalance = balanceOf(address(this));
            if (
                contractTokenBalance >=
                (lpTokens * minLpBeforeSwapping) / lpDenominator
            ) takeFee(contractTokenBalance);
        }

        uint256 _burnFee;
        uint256 _liquidityFee;
        uint256 _marketingFee;
        uint256 _stakingFee;

        if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _burnFee = (amount * buyBurnFee) / feeDenominator;
                _liquidityFee = (amount * buyLiquidityFee) / feeDenominator;
                _marketingFee = (amount * buyMarketingFee) / feeDenominator;
                _stakingFee = (amount * buyStakingFee) / feeDenominator;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _burnFee = (amount * sellBurnFee) / feeDenominator;
                _liquidityFee = (amount * sellLiquidityFee) / feeDenominator;
                _marketingFee = (amount * sellMarketingFee) / feeDenominator;
                _stakingFee = (amount * sellStakingFee) / feeDenominator;
            } else {
                _burnFee = (amount * transferBurnFee) / feeDenominator;
                _liquidityFee =
                    (amount * transferLiquidityFee) /
                    feeDenominator;
                _marketingFee =
                    (amount * transferMarketingFee) /
                    feeDenominator;
                _stakingFee = (amount * transferStakingFee) / feeDenominator;
            }

            _handleLimited(
                from,
                to,
                amount - _burnFee - _liquidityFee - _marketingFee - _stakingFee
            );
        }

        uint256 _transferAmount = amount -
            _burnFee -
            _liquidityFee -
            _marketingFee -
            _stakingFee;
        super._transfer(from, to, _transferAmount);
        uint256 _feeTotal = _burnFee +
            _liquidityFee +
            _marketingFee +
            _stakingFee;
        if (_feeTotal > 0) {
            super._transfer(from, address(this), _feeTotal);
            _liquidityTokensToSwap += _liquidityFee;
            _marketingFeeTokensToSwap += _marketingFee;
            _burnFeeTokens += _burnFee;
            _stakingFeeTokens += _stakingFee;
        }
    }

    function takeFee(uint256 contractBalance) private lockTheSwap {
        uint256 totalTokensTaken = _liquidityTokensToSwap +
            _marketingFeeTokensToSwap +
            _burnFeeTokens +
            _stakingFeeTokens;
        if (totalTokensTaken == 0 || contractBalance < totalTokensTaken) {
            return;
        }

        uint256 tokensForLiquidity = _liquidityTokensToSwap / 2;
        uint256 initialETHBalance = address(this).balance;
        uint256 toSwap = tokensForLiquidity +
            _marketingFeeTokensToSwap +
            _stakingFeeTokens;
        swapTokensForETH(toSwap);
        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMarketing = (ethBalance * _marketingFeeTokensToSwap) /
            toSwap;
        uint256 ethForLiquidity = (ethBalance * tokensForLiquidity) / toSwap;
        uint256 ethForStaking = (ethBalance * _stakingFeeTokens) / toSwap;

        if (tokensForLiquidity > 0 && ethForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, ethForLiquidity);
        }
        bool success;

        (success, ) = address(marketingFeeAddress).call{
            value: ethForMarketing,
            gas: 50000
        }("");
        (success, ) = address(stakingFeeAddress).call{
            value: ethForStaking,
            gas: 50000
        }("");

        if (_burnFeeTokens > 0) {
            _burn(address(this), _burnFeeTokens);
        }

        _liquidityTokensToSwap = 0;
        _marketingFeeTokensToSwap = 0;
        _burnFeeTokens = 0;
        _stakingFeeTokens = 0;
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    receive() external payable {}

    // Limits
    event LimitSet(address indexed user, uint256 limitETH, uint256 period);

    mapping(address => LimitedWallet) private _limits;

    uint256 public globalLimit; // limit over timeframe for all
    uint256 public globalLimitPeriod; // timeframe for all

    bool public limitsActive;

    bool private hasLiquidity;

    struct LimitedWallet {
        uint256[] sellAmounts;
        uint256[] sellTimestamps;
        uint256 limitPeriod; // ability to set custom values for individual wallets
        uint256 limitETH; // ability to set custom values for individual wallets
        bool isExcluded;
    }

    function setGlobalLimit(uint256 newLimit) external onlyOwner {
        require(newLimit >= 1 ether, "Too low");
        globalLimit = newLimit;
    }

    function setGlobalLimitPeriod(uint256 newPeriod) external onlyOwner {
        require(newPeriod <= 2 weeks, "Too long");
        globalLimitPeriod = newPeriod;
    }

    function setLimitsActiveStatus(bool status) external onlyOwner {
        limitsActive = status;
    }

    function getLimits(address _address)
        external
        view
        returns (LimitedWallet memory)
    {
        return _limits[_address];
    }

    function removeLimits(address[] calldata addresses) external onlyOwner {
        for (uint256 i; i < addresses.length; i++) {
            address account = addresses[i];
            _limits[account].limitPeriod = 0;
            _limits[account].limitETH = 0;
            emit LimitSet(account, 0, 0);
        }
    }

    // Set custom limits for an address. Defaults to 0, thus will use the "globalLimitPeriod" and "globalLimitETH" if we don't set them
    function setLimits(
        address[] calldata addresses,
        uint256[] calldata limitPeriods,
        uint256[] calldata limitsETH
    ) external onlyOwner {
        require(
            addresses.length == limitPeriods.length &&
                limitPeriods.length == limitsETH.length,
            "Array lengths don't match"
        );

        for (uint256 i = 0; i < addresses.length; i++) {
            if (limitPeriods[i] == 0 && limitsETH[i] == 0) continue;
            _limits[addresses[i]].limitPeriod = limitPeriods[i];
            _limits[addresses[i]].limitETH = limitsETH[i];
            emit LimitSet(addresses[i], limitsETH[i], limitPeriods[i]);
        }
    }

    function addExcludedFromLimits(address[] calldata addresses)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < addresses.length; i++) {
            _limits[addresses[i]].isExcluded = true;
        }
    }

    function removeExcludedFromLimits(address[] calldata addresses)
        external
        onlyOwner
    {
        require(addresses.length <= 500, "Array too long");
        for (uint256 i = 0; i < addresses.length; i++) {
            _limits[addresses[i]].isExcluded = false;
        }
    }

    // Can be used to check how much a wallet sold in their timeframe
    function getSoldLastPeriod(address _address)
        public
        view
        returns (uint256 sellAmount)
    {
        LimitedWallet memory __limits = _limits[_address];
        uint256 numberOfSells = __limits.sellAmounts.length;

        if (numberOfSells == 0) {
            return sellAmount;
        }

        uint256 limitPeriod = __limits.limitPeriod == 0
            ? globalLimitPeriod
            : __limits.limitPeriod;
        while (true) {
            if (numberOfSells == 0) {
                break;
            }
            numberOfSells--;
            uint256 sellTimestamp = __limits.sellTimestamps[numberOfSells];
            if (block.timestamp - limitPeriod <= sellTimestamp) {
                sellAmount += __limits.sellAmounts[numberOfSells];
            } else {
                break;
            }
        }
    }

    function checkLiquidity() internal {
        (uint256 r1, uint256 r2, ) = IUniswapV2Pair(uniswapPair).getReserves();

        lpTokens = balanceOf(uniswapPair); // this is not a problem, since contract sell will get that unsynced balance as if we sold it, so we just get more ETH.
        hasLiquidity = r1 > 0 && r2 > 0 ? true : false;
    }

    function getETHValue(uint256 tokenAmount)
        public
        view
        returns (uint256 ethValue)
    {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        ethValue = uniswapRouter.getAmountsOut(tokenAmount, path)[1];
    }

    // Handle private sale wallets
    function _handleLimited(
        address from,
        address to,
        uint256 taxedAmount
    ) private {
        LimitedWallet memory _from = _limits[from];
        if (
            _from.isExcluded ||
            _limits[to].isExcluded ||
            !hasLiquidity ||
            automatedMarketMakerPairs[from] ||
            inSwapAndLiquify ||
            (!limitsActive && _from.limitETH == 0) // if limits are disabled and the wallet doesn't have a custom limit, we don't need to check
        ) {
            return;
        }
        uint256 ethValue = getETHValue(taxedAmount);
        _limits[from].sellTimestamps.push(block.timestamp);
        _limits[from].sellAmounts.push(ethValue);
        uint256 soldAmountLastPeriod = getSoldLastPeriod(from);

        uint256 limit = _from.limitETH == 0 ? globalLimit : _from.limitETH;
        require(
            soldAmountLastPeriod <= limit,
            "Amount over the limit for time period"
        );
    }

    function withdrawETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function withdrawTokens(IERC20 tokenAddress, address walletAddress)
        external
        onlyOwner
    {
        require(
            walletAddress != address(0),
            "walletAddress can't be 0 address"
        );
        SafeERC20.safeTransfer(
            tokenAddress,
            walletAddress,
            tokenAddress.balanceOf(address(this))
        );
    }
}

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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"limitETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"LimitSet","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addBotWalletBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addExcludedFromLimits","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":"","type":"address"}],"name":"botWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"botWallets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyStakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBotWallets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getETHValue","outputs":[{"internalType":"uint256","name":"ethValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getLimits","outputs":[{"components":[{"internalType":"uint256[]","name":"sellAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"sellTimestamps","type":"uint256[]"},{"internalType":"uint256","name":"limitPeriod","type":"uint256"},{"internalType":"uint256","name":"limitETH","type":"uint256"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"internalType":"struct Shibnobiv2.LimitedWallet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getSoldLastPeriod","outputs":[{"internalType":"uint256","name":"sellAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLimitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","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":"routerAddress","type":"address"}],"name":"increaseRouterAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"migrateBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minLpBeforeSwapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellStakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setGlobalLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"setGlobalLimitPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"limitPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"limitsETH","type":"uint256[]"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setLimitsActiveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferStakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyBurnFee","type":"uint16"},{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyStakingFee","type":"uint16"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingFeeAddress_","type":"address"}],"name":"updateMarketingFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minLpBeforeSwapping_","type":"uint256"}],"name":"updateMinLpBeforeSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellBurnFee","type":"uint16"},{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_sellStakingFee","type":"uint16"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakingFeeAddress_","type":"address"}],"name":"updateStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferBurnFee","type":"uint16"},{"internalType":"uint16","name":"_transferLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_transferMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_transferStakingfee","type":"uint16"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600980546001600160c01b031916761400050005000a001e00280014000a00140023000a000a1790553480156200003a57600080fd5b5060405180604001604052806008815260200167536869626e6f626960c01b815250604051806040016040528060068152602001655348494e4a4160d01b81525081600390816200008c91906200073a565b5060046200009b82826200073a565b505050620000b8620000b26200042a60201b60201c565b6200042e565b620000e233620000cb6009600a6200091b565b620000dc9064174876e80062000933565b62000480565b600680546001600160a01b031990811673b8f9d14060e7e73eed1e98c23a732be11345a2db179091556007805490911673142080a32ee52cfe573abf0c42798d63a20da8cd179055600a601255737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b81529051829163c45a01559160048083019260209291908290030181865afa15801562000186573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ac91906200094d565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022291906200094d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029691906200094d565b6001600160a01b0390811660a0523360008181526008602090815260408083208054600160ff199182168117909255308086528386208054831684179055600654881686528386208054831684179055600754881686528386208054831684179055868652601490945282852060049081018054831684179055938552828520840180548216831790559587168452922001805484168217905568015af1d78b58c400006015556201518060165560178054909316179091556200035e908260001962000569565b60a0516001600160a01b03166000908152600f60205260409020805460ff19166001179055601380546001600160a01b031916734c03cf0301f2ef59cc2687b82f982a2a01c00ee29081179091556000527f91f2c16508ca2f7cbb40f86b9fb73d369a088eeec211a37a06f8a5c16d47e41f805460ff19908116600190811790925560146020527fd66b500dd5b29c5061e3f605b0e57f33a511865d9ad472ee640d6aa8ce6c8eeb805490911690911790556080516200042390309060001962000569565b506200098e565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004dc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004f0919062000978565b90915550506001600160a01b038216600090815260208190526040812080548392906200051f90849062000978565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316620005cd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620004d3565b6001600160a01b038216620006305760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620004d3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006c157607f821691505b602082108103620006e257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200069157600081815260208120601f850160051c81016020861015620007115750805b601f850160051c820191505b8181101562000732578281556001016200071d565b505050505050565b81516001600160401b0381111562000756576200075662000696565b6200076e81620007678454620006ac565b84620006e8565b602080601f831160018114620007a657600084156200078d5750858301515b600019600386901b1c1916600185901b17855562000732565b600085815260208120601f198616915b82811015620007d757888601518255948401946001909101908401620007b6565b5085821015620007f65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200085d57816000190482111562000841576200084162000806565b808516156200084f57918102915b93841c939080029062000821565b509250929050565b600082620008765750600162000915565b81620008855750600062000915565b81600181146200089e5760028114620008a957620008c9565b600191505062000915565b60ff841115620008bd57620008bd62000806565b50506001821b62000915565b5060208310610133831016604e8410600b8410161715620008ee575081810a62000915565b620008fa83836200081c565b806000190482111562000911576200091162000806565b0290505b92915050565b60006200092c60ff84168362000865565b9392505050565b808202811582820484141762000915576200091562000806565b6000602082840312156200096057600080fd5b81516001600160a01b03811681146200092c57600080fd5b8082018082111562000915576200091562000806565b60805160a0516144e2620009ec60003960008181610be101528181611dd80152818161305901526130f5015260008181610881015281816120f7015281816121af015281816138c10152818161397901526139f101526144e26000f3fe6080604052600436106104145760003560e01c8063802af5bc1161021e578063a9059cbb11610123578063dc9c30ca116100ab578063ea2f0b371161007a578063ea2f0b3714610cc9578063f064321f14610ce9578063f11a24d314610d09578063f2fde38b14610d2a578063f637434214610d4a57600080fd5b8063dc9c30ca14610c59578063dd62ed3e14610c79578063e086e5ec14610c99578063e71dc3f514610cae57600080fd5b8063bbc0c742116100f2578063bbc0c74214610bae578063c816841b14610bcf578063d5bda32d14610c03578063d7f5b35914610c23578063dbf1cd1314610c4357600080fd5b8063a9059cbb14610b1c578063adb873bd14610b3c578063b498412314610b5e578063b62496f514610b7e57600080fd5b806395d89b41116101a65780639d5710d1116101755780639d5710d114610a86578063a2ece63614610a9c578063a3c573eb14610abc578063a457c2d714610adc578063a522ad2514610afc57600080fd5b806395d89b41146109ff5780639a7a23d614610a145780639bb19a3214610a345780639cbc1ad614610a5657600080fd5b8063867a1dc2116101ed578063867a1dc21461096a5780638a8c523c1461098a5780638b16549a1461099f5780638da5cb5b146109bf57806392136913146109dd57600080fd5b8063802af5bc146108e857806382d58ce91461090857806385c5b31914610928578063863c4a321461094a57600080fd5b80633b1f6a01116103245780636199d05e116102ac57806371074de21161027b57806371074de21461083a578063715018a61461085a578063735de9f71461086f578063742bd2a5146108a35780637bce5a04146108c557600080fd5b80636199d05e146107ad57806361a13b4a146107cd578063660d0af4146107fa57806370a082311461081a57600080fd5b8063439be351116102f3578063439be351146106f95780634866bad11461071b5780634f46b2c31461073b5780635342acb41461075d5780635b06a1d11461078d57600080fd5b80633b1f6a011461067657806342966c68146106a3578063437823ec146106c3578063437d9840146106e357600080fd5b80631cce34ee116103a7578063269b171711610376578063269b1717146105d85780632a360631146105fa578063313ce5671461061a578063392d6af714610636578063395093511461065657600080fd5b80631cce34ee1461055e578063232898b414610578578063239bda491461059857806323b872dd146105b857600080fd5b80630e460b73116103e35780630e460b73146104d157806317700f01146104f157806318160ddd146105065780631c8a6adc1461052957600080fd5b80630305caff14610420578063053e39a31461044257806306fdde031461047f578063095ea7b3146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b5061044061043b366004613c60565b610d6c565b005b34801561044e57600080fd5b50600654610462906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048b57600080fd5b50610494610f23565b6040516104769190613ca1565b3480156104ad57600080fd5b506104c16104bc366004613cd4565b610fb5565b6040519015158152602001610476565b3480156104dd57600080fd5b506104406104ec366004613d6b565b610fcc565b3480156104fd57600080fd5b5061044061113b565b34801561051257600080fd5b5061051b611174565b604051908152602001610476565b34801561053557600080fd5b5060095461054b90600160801b900461ffff1681565b60405161ffff9091168152602001610476565b34801561056a57600080fd5b506017546104c19060ff1681565b34801561058457600080fd5b50610440610593366004613e4b565b6111a1565b3480156105a457600080fd5b506104406105b3366004613ea4565b611245565b3480156105c457600080fd5b506104c16105d3366004613ef8565b611340565b3480156105e457600080fd5b506105ed611366565b6040516104769190613f7d565b34801561060657600080fd5b50610440610615366004613c60565b6113c7565b34801561062657600080fd5b5060405160098152602001610476565b34801561064257600080fd5b50610440610651366004613ea4565b6114b7565b34801561066257600080fd5b506104c1610671366004613cd4565b6115a6565b34801561068257600080fd5b506013546001600160a01b031660009081526020819052604090205461051b565b3480156106af57600080fd5b506104406106be366004613f90565b6115c7565b3480156106cf57600080fd5b506104406106de366004613c60565b6115d4565b3480156106ef57600080fd5b5061051b60165481565b34801561070557600080fd5b5060095461054b90600160301b900461ffff1681565b34801561072757600080fd5b50610440610736366004613c60565b611622565b34801561074757600080fd5b5060095461054b90600160b01b900461ffff1681565b34801561076957600080fd5b506104c1610778366004613c60565b60086020526000908152604090205460ff1681565b34801561079957600080fd5b506104406107a8366004613c60565b611659565b3480156107b957600080fd5b506104406107c8366004613f90565b6116e9565b3480156107d957600080fd5b506107ed6107e8366004613c60565b61175a565b6040516104769190613fd9565b34801561080657600080fd5b50610440610815366004613c60565b611883565b34801561082657600080fd5b5061051b610835366004613c60565b611913565b34801561084657600080fd5b50610440610855366004613e4b565b611952565b34801561086657600080fd5b50610440611a2d565b34801561087b57600080fd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b3480156108af57600080fd5b5060095461054b90600160701b900461ffff1681565b3480156108d157600080fd5b5060095461054b90640100000000900461ffff1681565b3480156108f457600080fd5b5061044061090336600461404d565b611a63565b34801561091457600080fd5b50610440610923366004613f90565b611aa0565b34801561093457600080fd5b5060095461054b90600160a01b900461ffff1681565b34801561095657600080fd5b50600754610462906001600160a01b031681565b34801561097657600080fd5b50610440610985366004613e4b565b611acf565b34801561099657600080fd5b50610440611bb1565b3480156109ab57600080fd5b5061051b6109ba366004613c60565b611bf0565b3480156109cb57600080fd5b506005546001600160a01b0316610462565b3480156109e957600080fd5b5060095461054b90600160601b900461ffff1681565b348015610a0b57600080fd5b50610494611d9d565b348015610a2057600080fd5b50610440610a2f36600461406a565b611dac565b348015610a4057600080fd5b5060095461054b90600160901b900461ffff1681565b348015610a6257600080fd5b506104c1610a71366004613c60565b60106020526000908152604090205460ff1681565b348015610a9257600080fd5b5061051b60155481565b348015610aa857600080fd5b50610462610ab7366004613f90565b611e7f565b348015610ac857600080fd5b50601354610462906001600160a01b031681565b348015610ae857600080fd5b506104c1610af7366004613cd4565b611ea9565b348015610b0857600080fd5b50610440610b173660046140a3565b611f2d565b348015610b2857600080fd5b506104c1610b37366004613cd4565b612022565b348015610b4857600080fd5b5060095461054b90600160401b900461ffff1681565b348015610b6a57600080fd5b50610440610b79366004613f90565b61202f565b348015610b8a57600080fd5b506104c1610b99366004613c60565b600f6020526000908152604090205460ff1681565b348015610bba57600080fd5b506007546104c190600160a01b900460ff1681565b348015610bdb57600080fd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b348015610c0f57600080fd5b5061051b610c1e366004613f90565b61209c565b348015610c2f57600080fd5b50610440610c3e366004613c60565b61224f565b348015610c4f57600080fd5b5061051b60125481565b348015610c6557600080fd5b50610440610c74366004613ea4565b612345565b348015610c8557600080fd5b5061051b610c943660046140a3565b6123e1565b348015610ca557600080fd5b5061044061240c565b348015610cba57600080fd5b5060095461054b9061ffff1681565b348015610cd557600080fd5b50610440610ce4366004613c60565b61246f565b348015610cf557600080fd5b50610440610d043660046140d1565b6124ba565b348015610d1557600080fd5b5060095461054b9062010000900461ffff1681565b348015610d3657600080fd5b50610440610d45366004613c60565b61270d565b348015610d5657600080fd5b5060095461054b90600160501b900461ffff1681565b6005546001600160a01b03163314610d9f5760405162461bcd60e51b8152600401610d969061416b565b60405180910390fd5b6001600160a01b03811660009081526010602052604090205460ff16610dfa5760405162461bcd60e51b815260206004820152601060248201526f15d85b1b195d081b9bdd08185919195960821b6044820152606401610d96565b6001600160a01b0381166000908152601060205260408120805460ff191690555b601154811015610f1f57816001600160a01b031660118281548110610e4257610e426141a0565b6000918252602090912001546001600160a01b031603610f0d5760118054610e6c906001906141cc565b81548110610e7c57610e7c6141a0565b600091825260209091200154601180546001600160a01b039092169183908110610ea857610ea86141a0565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506011805480610ee757610ee76141df565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f17816141f5565b915050610e1b565b5050565b606060038054610f329061420e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5e9061420e565b8015610fab5780601f10610f8057610100808354040283529160200191610fab565b820191906000526020600020905b815481529060010190602001808311610f8e57829003601f168201915b5050505050905090565b6000610fc23384846127a5565b5060015b92915050565b6005546001600160a01b03163314610ff65760405162461bcd60e51b8152600401610d969061416b565b60005b8151811015610f1f5760106000838381518110611018576110186141a0565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156110835760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610d96565b60016010600084848151811061109b5761109b6141a0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060118282815181106110ee576110ee6141a0565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580611133816141f5565b915050610ff9565b6005546001600160a01b031633146111655760405162461bcd60e51b8152600401610d969061416b565b6007805460ff60a01b19169055565b6013546001600160a01b031660009081526020819052604081205460025461119c91906141cc565b905090565b6005546001600160a01b031633146111cb5760405162461bcd60e51b8152600401610d969061416b565b60005b81811015611240576001601460008585858181106111ee576111ee6141a0565b90506020020160208101906112039190613c60565b6001600160a01b031681526020810191909152604001600020600401805460ff191691151591909117905580611238816141f5565b9150506111ce565b505050565b6005546001600160a01b0316331461126f5760405162461bcd60e51b8152600401610d969061416b565b6009805463ffffffff60801b1916600160801b61ffff8781169190910261ffff60901b191691909117600160901b868316021763ffffffff60a01b1916600160a01b8583160261ffff60b01b191617600160b01b9184169190910217905561012c81836112dc8688614248565b6112e69190614248565b6112f09190614248565b61ffff16111561133a5760405162461bcd60e51b81526020600482015260156024820152744d757374206b6565702066656573203c3d2033302560581b6044820152606401610d96565b50505050565b60003361134e8582856128c9565b61135985858561293d565b60019150505b9392505050565b60606011805480602002602001604051908101604052809291908181526020018280548015610fab57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113a0575050505050905090565b6005546001600160a01b031633146113f15760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03811660009081526010602052604090205460ff16156114515760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610d96565b6001600160a01b03166000818152601060205260408120805460ff191660019081179091556011805491820181559091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319169091179055565b6005546001600160a01b031633146114e15760405162461bcd60e51b8152600401610d969061416b565b6009805461ffff86811663ffffffff199092169190911762010000868316021767ffffffff0000000019166401000000008583160267ffff000000000000191617600160301b9184169190910217905561012c81836115408688614248565b61154a9190614248565b6115549190614248565b61ffff16111561133a5760405162461bcd60e51b815260206004820152601860248201527f4d757374206b65657020666565732062656c6f772033302500000000000000006044820152606401610d96565b6000610fc23384846115b833886123e1565b6115c2919061426a565b6127a5565b6115d13382612e62565b50565b6005546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6005546001600160a01b0316331461164c5760405162461bcd60e51b8152600401610d969061416b565b6115d130826000196127a5565b6005546001600160a01b031633146116835760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b0381166116c75760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610d96565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146117135760405162461bcd60e51b8152600401610d969061416b565b670de0b6b3a76400008110156117555760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610d96565b601555565b61178e6040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b0382166000908152601460209081526040918290208251815460c09381028201840190945260a0810184815290939192849284918401828280156117f857602002820191906000526020600020905b8154815260200190600101908083116117e4575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561185057602002820191906000526020600020905b81548152602001906001019080831161183c575b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015292915050565b6005546001600160a01b031633146118ad5760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b0381166118f15760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610d96565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6013546000906001600160a01b039081169083160361193457506000919050565b6001600160a01b038216600090815260208190526040902054610fc6565b6005546001600160a01b0316331461197c5760405162461bcd60e51b8152600401610d969061416b565b60005b8181101561124057600083838381811061199b5761199b6141a0565b90506020020160208101906119b09190613c60565b6001600160a01b038116600081815260146020526040808220600281018390556003018290555192935090917f17a5b9995cdddd48a6eb45c963be9c85b9e5e57a824c0b8b1791b3339d6223d991611a12918190918252602082015260400190565b60405180910390a25080611a25816141f5565b91505061197f565b6005546001600160a01b03163314611a575760405162461bcd60e51b8152600401610d969061416b565b611a616000612fb0565b565b6005546001600160a01b03163314611a8d5760405162461bcd60e51b8152600401610d969061416b565b6017805460ff1916911515919091179055565b6005546001600160a01b03163314611aca5760405162461bcd60e51b8152600401610d969061416b565b601255565b6005546001600160a01b03163314611af95760405162461bcd60e51b8152600401610d969061416b565b6101f4811115611b3c5760405162461bcd60e51b815260206004820152600e60248201526d417272617920746f6f206c6f6e6760901b6044820152606401610d96565b60005b8181101561124057600060146000858585818110611b5f57611b5f6141a0565b9050602002016020810190611b749190613c60565b6001600160a01b031681526020810191909152604001600020600401805460ff191691151591909117905580611ba9816141f5565b915050611b3f565b6005546001600160a01b03163314611bdb5760405162461bcd60e51b8152600401610d969061416b565b6007805460ff60a01b1916600160a01b179055565b6001600160a01b03811660009081526014602090815260408083208151815460c09481028201850190935260a08101838152859491938492849190840182828015611c5a57602002820191906000526020600020905b815481526020019060010190808311611c46575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611cb257602002820191906000526020600020905b815481526020019060010190808311611c9e575b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101528051519091506000819003611cf5575050919050565b60008260400151600014611d0d578260400151611d11565b6016545b90505b8115611d955781611d248161427d565b925050600083602001518381518110611d3f57611d3f6141a0565b60200260200101519050808242611d5691906141cc565b11611d89578351805184908110611d6f57611d6f6141a0565b602002602001015185611d82919061426a565b9450611d8f565b50611d95565b50611d14565b505050919050565b606060048054610f329061420e565b6005546001600160a01b03163314611dd65760405162461bcd60e51b8152600401610d969061416b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611e575760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610d96565b6001600160a01b0382166000908152600f60205260409020805460ff19168215151790555050565b60118181548110611e8f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600080611eb633856123e1565b905082811015611f165760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d96565b611f2333858584036127a5565b5060019392505050565b6005546001600160a01b03163314611f575760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b038116611fad5760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610d96565b6040516370a0823160e01b8152306004820152610f1f90839083906001600160a01b038316906370a0823190602401602060405180830381865afa158015611ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201d9190614294565b613002565b6000610fc233848461293d565b6005546001600160a01b031633146120595760405162461bcd60e51b8152600401610d969061416b565b621275008111156120975760405162461bcd60e51b8152602060048201526008602482015267546f6f206c6f6e6760c01b6044820152606401610d96565b601655565b6040805160028082526060820183526000928392919060208301908036833701905050905030816000815181106120d5576120d56141a0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217791906142ad565b8160018151811061218a5761218a6141a0565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063d06ca61f906121e890869085906004016142ca565b600060405180830381865afa158015612205573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261222d91908101906142e3565b60018151811061223f5761223f6141a0565b6020026020010151915050919050565b6005546001600160a01b031633146122795760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b038116158015906122aa57506001600160a01b0381166000908152600f602052604090205460ff16155b6122ef5760405162461bcd60e51b815260206004820152601660248201527543616e2774207365742074686973206164647265737360501b6044820152606401610d96565b601380546001600160a01b039092166001600160a01b0319909216821790556000908152600860209081526040808320805460ff1990811660019081179092556014909352922060040180549091169091179055565b6005546001600160a01b0316331461236f5760405162461bcd60e51b8152600401610d969061416b565b600980546bffffffff00000000000000001916600160401b61ffff8781169190910261ffff60501b191691909117600160501b868316021763ffffffff60601b1916600160601b8583160261ffff60701b191617600160701b9184169190910217905561012c81836112dc8688614248565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146124365760405162461bcd60e51b8152600401610d969061416b565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156115d1573d6000803e3d6000fd5b6005546001600160a01b031633146124995760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546001600160a01b031633146124e45760405162461bcd60e51b8152600401610d969061416b565b84831480156124f257508281145b61253e5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e6774687320646f6e2774206d61746368000000000000006044820152606401610d96565b60005b858110156127045784848281811061255b5761255b6141a0565b905060200201356000148015612589575082828281811061257e5761257e6141a0565b905060200201356000145b6126f25784848281811061259f5761259f6141a0565b90506020020135601460008989858181106125bc576125bc6141a0565b90506020020160208101906125d19190613c60565b6001600160a01b03168152602081019190915260400160002060020155828282818110612600576126006141a0565b905060200201356014600089898581811061261d5761261d6141a0565b90506020020160208101906126329190613c60565b6001600160a01b03168152602081019190915260400160002060030155868682818110612661576126616141a0565b90506020020160208101906126769190613c60565b6001600160a01b03167f17a5b9995cdddd48a6eb45c963be9c85b9e5e57a824c0b8b1791b3339d6223d98484848181106126b2576126b26141a0565b905060200201358787858181106126cb576126cb6141a0565b905060200201356040516126e9929190918252602082015260400190565b60405180910390a25b806126fc816141f5565b915050612541565b50505050505050565b6005546001600160a01b031633146127375760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03811661279c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d96565b6115d181612fb0565b6001600160a01b0383166128075760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d96565b6001600160a01b0382166128685760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d96565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006128d584846123e1565b9050600019811461133a57818110156129305760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d96565b61133a84848484036127a5565b600754600160a01b900460ff166129d9576001600160a01b03831660009081526008602052604090205460ff168061298d57506001600160a01b03821660009081526008602052604090205460ff165b6129d95760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610d96565b6001600160a01b03831660009081526010602052604090205460ff16158015612a1b57506001600160a01b03821660009081526010602052604090205460ff16155b612a545760405162461bcd60e51b815260206004820152600a602482015269109bdd081dd85b1b195d60b21b6044820152606401610d96565b612a5c613054565b601754610100900460ff168015612a7d5750601354600160a01b900460ff16155b8015612aa157506001600160a01b0382166000908152600f602052604090205460ff165b15612ae5576000612ab130611913565b90506103e861ffff16601254600e54612aca9190614369565b612ad49190614380565b8110612ae357612ae381613155565b505b6001600160a01b03831660009081526008602052604081205481908190819060ff16158015612b2d57506001600160a01b03861660009081526008602052604090205460ff16155b15612d85576001600160a01b0387166000908152600f602052604090205460ff1615612bf4576009546103e890612b689061ffff1687614369565b612b729190614380565b6009549094506103e890612b909062010000900461ffff1687614369565b612b9a9190614380565b6009549093506103e890612bba90640100000000900461ffff1687614369565b612bc49190614380565b6009549092506103e890612be390600160301b900461ffff1687614369565b612bed9190614380565b9050612d50565b6001600160a01b0386166000908152600f602052604090205460ff1615612cac576009546103e890612c3190600160401b900461ffff1687614369565b612c3b9190614380565b6009549094506103e890612c5a90600160501b900461ffff1687614369565b612c649190614380565b6009549093506103e890612c8390600160601b900461ffff1687614369565b612c8d9190614380565b6009549092506103e890612be390600160701b900461ffff1687614369565b6009546103e890612cc890600160801b900461ffff1687614369565b612cd29190614380565b6009549094506103e890612cf190600160901b900461ffff1687614369565b612cfb9190614380565b6009549093506103e890612d1a90600160a01b900461ffff1687614369565b612d249190614380565b6009549092506103e890612d4390600160b01b900461ffff1687614369565b612d4d9190614380565b90505b612d858787838587612d628a8c6141cc565b612d6c91906141cc565b612d7691906141cc565b612d8091906141cc565b613367565b6000818385612d94888a6141cc565b612d9e91906141cc565b612da891906141cc565b612db291906141cc565b9050612dbf8888836135ca565b60008284612dcd878961426a565b612dd7919061426a565b612de1919061426a565b90508015612e5757612df48930836135ca565b84600a6000828254612e06919061426a565b9250508190555083600b6000828254612e1f919061426a565b9250508190555085600c6000828254612e38919061426a565b9250508190555082600d6000828254612e51919061426a565b90915550505b505050505050505050565b6001600160a01b038216612ec25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d96565b6001600160a01b03821660009081526020819052604090205481811015612f365760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d96565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612f659084906141cc565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611240908490613798565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156130b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d991906143b9565b506001600160701b031691506001600160701b031691506131197f0000000000000000000000000000000000000000000000000000000000000000611913565b600e55811580159061312b5750600081115b613136576000613139565b60015b601780549115156101000261ff00199092169190911790555050565b6013805460ff60a01b1916600160a01b179055600d54600c54600b54600a5460009392916131829161426a565b61318c919061426a565b613196919061426a565b90508015806131a457508082105b156131af5750613357565b60006002600a546131c09190614380565b905060004790506000600d54600b54846131da919061426a565b6131e4919061426a565b90506131ef8161386a565b60006131fb83476141cc565b9050600082600b548361320e9190614369565b6132189190614380565b90506000836132278785614369565b6132319190614380565b9050600084600d54856132449190614369565b61324e9190614380565b90506000871180156132605750600082115b1561326f5761326f87836139ef565b6006546040516000916001600160a01b03169061c35090869084818181858888f193505050503d80600081146132c1576040519150601f19603f3d011682016040523d82523d6000602084013e6132c6565b606091505b50506007546040519192506001600160a01b03169061c3509084906000818181858888f193505050503d806000811461331b576040519150601f19603f3d011682016040523d82523d6000602084013e613320565b606091505b5050600c54909150156133395761333930600c54612e62565b50506000600a819055600b819055600c819055600d55505050505050505b506013805460ff60a01b19169055565b6001600160a01b03831660009081526014602090815260408083208151815460c09481028201850190935260a081018381529093919284928491908401828280156133d157602002820191906000526020600020905b8154815260200190600101908083116133bd575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561342957602002820191906000526020600020905b815481526020019060010190808311613415575b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015260808101519091508061348457506001600160a01b03831660009081526014602052604090206004015460ff165b806134975750601754610100900460ff16155b806134ba57506001600160a01b0384166000908152600f602052604090205460ff165b806134ce5750601354600160a01b900460ff165b806134e9575060175460ff161580156134e957506060810151155b156134f45750505050565b60006134ff8361209c565b6001600160a01b0386166000908152601460209081526040822060018082018054808301825590855283852042910155815490810182559083529082200182905590915061354c86611bf0565b90506000836060015160001461356657836060015161356a565b6015545b9050808211156127045760405162461bcd60e51b815260206004820152602560248201527f416d6f756e74206f76657220746865206c696d697420666f722074696d652070604482015264195c9a5bd960da1b6064820152608401610d96565b6001600160a01b03831661362e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d96565b6001600160a01b0382166136905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d96565b6001600160a01b038316600090815260208190526040902054818110156137085760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d96565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061373f90849061426a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161378b91815260200190565b60405180910390a361133a565b60006137ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613aca9092919063ffffffff16565b805190915015611240578080602001905181019061380b9190614409565b6112405760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d96565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061389f5761389f6141a0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561391d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394191906142ad565b81600181518110613954576139546141a0565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906139b9908590600090869030904290600401614426565b600060405180830381600087803b1580156139d357600080fd5b505af11580156139e7573d6000803e3d6000fd5b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d719823085600080613a366005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613a9e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613ac39190614462565b5050505050565b6060613ad98484600085613ae1565b949350505050565b606082471015613b425760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d96565b6001600160a01b0385163b613b995760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d96565b600080866001600160a01b03168587604051613bb59190614490565b60006040518083038185875af1925050503d8060008114613bf2576040519150601f19603f3d011682016040523d82523d6000602084013e613bf7565b606091505b5091509150613c07828286613c12565b979650505050505050565b60608315613c2157508161135f565b825115613c315782518084602001fd5b8160405162461bcd60e51b8152600401610d969190613ca1565b6001600160a01b03811681146115d157600080fd5b600060208284031215613c7257600080fd5b813561135f81613c4b565b60005b83811015613c98578181015183820152602001613c80565b50506000910152565b6020815260008251806020840152613cc0816040850160208701613c7d565b601f01601f19169190910160400192915050565b60008060408385031215613ce757600080fd5b8235613cf281613c4b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d3f57613d3f613d00565b604052919050565b600067ffffffffffffffff821115613d6157613d61613d00565b5060051b60200190565b60006020808385031215613d7e57600080fd5b823567ffffffffffffffff811115613d9557600080fd5b8301601f81018513613da657600080fd5b8035613db9613db482613d47565b613d16565b81815260059190911b82018301908381019087831115613dd857600080fd5b928401925b82841015613c07578335613df081613c4b565b82529284019290840190613ddd565b60008083601f840112613e1157600080fd5b50813567ffffffffffffffff811115613e2957600080fd5b6020830191508360208260051b8501011115613e4457600080fd5b9250929050565b60008060208385031215613e5e57600080fd5b823567ffffffffffffffff811115613e7557600080fd5b613e8185828601613dff565b90969095509350505050565b803561ffff81168114613e9f57600080fd5b919050565b60008060008060808587031215613eba57600080fd5b613ec385613e8d565b9350613ed160208601613e8d565b9250613edf60408601613e8d565b9150613eed60608601613e8d565b905092959194509250565b600080600060608486031215613f0d57600080fd5b8335613f1881613c4b565b92506020840135613f2881613c4b565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613f725781516001600160a01b031687529582019590820190600101613f4d565b509495945050505050565b60208152600061135f6020830184613f39565b600060208284031215613fa257600080fd5b5035919050565b600081518084526020808501945080840160005b83811015613f7257815187529582019590820190600101613fbd565b602081526000825160a06020840152613ff560c0840182613fa9565b90506020840151601f198483030160408501526140128282613fa9565b91505060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b80151581146115d157600080fd5b60006020828403121561405f57600080fd5b813561135f8161403f565b6000806040838503121561407d57600080fd5b823561408881613c4b565b915060208301356140988161403f565b809150509250929050565b600080604083850312156140b657600080fd5b82356140c181613c4b565b9150602083013561409881613c4b565b600080600080600080606087890312156140ea57600080fd5b863567ffffffffffffffff8082111561410257600080fd5b61410e8a838b01613dff565b9098509650602089013591508082111561412757600080fd5b6141338a838b01613dff565b9096509450604089013591508082111561414c57600080fd5b5061415989828a01613dff565b979a9699509497509295939492505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610fc657610fc66141b6565b634e487b7160e01b600052603160045260246000fd5b600060018201614207576142076141b6565b5060010190565b600181811c9082168061422257607f821691505b60208210810361424257634e487b7160e01b600052602260045260246000fd5b50919050565b61ffff818116838216019080821115614263576142636141b6565b5092915050565b80820180821115610fc657610fc66141b6565b60008161428c5761428c6141b6565b506000190190565b6000602082840312156142a657600080fd5b5051919050565b6000602082840312156142bf57600080fd5b815161135f81613c4b565b828152604060208201526000613ad96040830184613f39565b600060208083850312156142f657600080fd5b825167ffffffffffffffff81111561430d57600080fd5b8301601f8101851361431e57600080fd5b805161432c613db482613d47565b81815260059190911b8201830190838101908783111561434b57600080fd5b928401925b82841015613c0757835182529284019290840190614350565b8082028115828204841417610fc657610fc66141b6565b60008261439d57634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b0381168114613e9f57600080fd5b6000806000606084860312156143ce57600080fd5b6143d7846143a2565b92506143e5602085016143a2565b9150604084015163ffffffff811681146143fe57600080fd5b809150509250925092565b60006020828403121561441b57600080fd5b815161135f8161403f565b85815284602082015260a06040820152600061444560a0830186613f39565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561447757600080fd5b8351925060208401519150604084015190509250925092565b600082516144a2818460208701613c7d565b919091019291505056fea2646970667358221220708d966861dd75438f87dc4cc5028c0d5a9bf9e235104ec99a3cd5a81e81392d64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104145760003560e01c8063802af5bc1161021e578063a9059cbb11610123578063dc9c30ca116100ab578063ea2f0b371161007a578063ea2f0b3714610cc9578063f064321f14610ce9578063f11a24d314610d09578063f2fde38b14610d2a578063f637434214610d4a57600080fd5b8063dc9c30ca14610c59578063dd62ed3e14610c79578063e086e5ec14610c99578063e71dc3f514610cae57600080fd5b8063bbc0c742116100f2578063bbc0c74214610bae578063c816841b14610bcf578063d5bda32d14610c03578063d7f5b35914610c23578063dbf1cd1314610c4357600080fd5b8063a9059cbb14610b1c578063adb873bd14610b3c578063b498412314610b5e578063b62496f514610b7e57600080fd5b806395d89b41116101a65780639d5710d1116101755780639d5710d114610a86578063a2ece63614610a9c578063a3c573eb14610abc578063a457c2d714610adc578063a522ad2514610afc57600080fd5b806395d89b41146109ff5780639a7a23d614610a145780639bb19a3214610a345780639cbc1ad614610a5657600080fd5b8063867a1dc2116101ed578063867a1dc21461096a5780638a8c523c1461098a5780638b16549a1461099f5780638da5cb5b146109bf57806392136913146109dd57600080fd5b8063802af5bc146108e857806382d58ce91461090857806385c5b31914610928578063863c4a321461094a57600080fd5b80633b1f6a01116103245780636199d05e116102ac57806371074de21161027b57806371074de21461083a578063715018a61461085a578063735de9f71461086f578063742bd2a5146108a35780637bce5a04146108c557600080fd5b80636199d05e146107ad57806361a13b4a146107cd578063660d0af4146107fa57806370a082311461081a57600080fd5b8063439be351116102f3578063439be351146106f95780634866bad11461071b5780634f46b2c31461073b5780635342acb41461075d5780635b06a1d11461078d57600080fd5b80633b1f6a011461067657806342966c68146106a3578063437823ec146106c3578063437d9840146106e357600080fd5b80631cce34ee116103a7578063269b171711610376578063269b1717146105d85780632a360631146105fa578063313ce5671461061a578063392d6af714610636578063395093511461065657600080fd5b80631cce34ee1461055e578063232898b414610578578063239bda491461059857806323b872dd146105b857600080fd5b80630e460b73116103e35780630e460b73146104d157806317700f01146104f157806318160ddd146105065780631c8a6adc1461052957600080fd5b80630305caff14610420578063053e39a31461044257806306fdde031461047f578063095ea7b3146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b5061044061043b366004613c60565b610d6c565b005b34801561044e57600080fd5b50600654610462906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048b57600080fd5b50610494610f23565b6040516104769190613ca1565b3480156104ad57600080fd5b506104c16104bc366004613cd4565b610fb5565b6040519015158152602001610476565b3480156104dd57600080fd5b506104406104ec366004613d6b565b610fcc565b3480156104fd57600080fd5b5061044061113b565b34801561051257600080fd5b5061051b611174565b604051908152602001610476565b34801561053557600080fd5b5060095461054b90600160801b900461ffff1681565b60405161ffff9091168152602001610476565b34801561056a57600080fd5b506017546104c19060ff1681565b34801561058457600080fd5b50610440610593366004613e4b565b6111a1565b3480156105a457600080fd5b506104406105b3366004613ea4565b611245565b3480156105c457600080fd5b506104c16105d3366004613ef8565b611340565b3480156105e457600080fd5b506105ed611366565b6040516104769190613f7d565b34801561060657600080fd5b50610440610615366004613c60565b6113c7565b34801561062657600080fd5b5060405160098152602001610476565b34801561064257600080fd5b50610440610651366004613ea4565b6114b7565b34801561066257600080fd5b506104c1610671366004613cd4565b6115a6565b34801561068257600080fd5b506013546001600160a01b031660009081526020819052604090205461051b565b3480156106af57600080fd5b506104406106be366004613f90565b6115c7565b3480156106cf57600080fd5b506104406106de366004613c60565b6115d4565b3480156106ef57600080fd5b5061051b60165481565b34801561070557600080fd5b5060095461054b90600160301b900461ffff1681565b34801561072757600080fd5b50610440610736366004613c60565b611622565b34801561074757600080fd5b5060095461054b90600160b01b900461ffff1681565b34801561076957600080fd5b506104c1610778366004613c60565b60086020526000908152604090205460ff1681565b34801561079957600080fd5b506104406107a8366004613c60565b611659565b3480156107b957600080fd5b506104406107c8366004613f90565b6116e9565b3480156107d957600080fd5b506107ed6107e8366004613c60565b61175a565b6040516104769190613fd9565b34801561080657600080fd5b50610440610815366004613c60565b611883565b34801561082657600080fd5b5061051b610835366004613c60565b611913565b34801561084657600080fd5b50610440610855366004613e4b565b611952565b34801561086657600080fd5b50610440611a2d565b34801561087b57600080fd5b506104627f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156108af57600080fd5b5060095461054b90600160701b900461ffff1681565b3480156108d157600080fd5b5060095461054b90640100000000900461ffff1681565b3480156108f457600080fd5b5061044061090336600461404d565b611a63565b34801561091457600080fd5b50610440610923366004613f90565b611aa0565b34801561093457600080fd5b5060095461054b90600160a01b900461ffff1681565b34801561095657600080fd5b50600754610462906001600160a01b031681565b34801561097657600080fd5b50610440610985366004613e4b565b611acf565b34801561099657600080fd5b50610440611bb1565b3480156109ab57600080fd5b5061051b6109ba366004613c60565b611bf0565b3480156109cb57600080fd5b506005546001600160a01b0316610462565b3480156109e957600080fd5b5060095461054b90600160601b900461ffff1681565b348015610a0b57600080fd5b50610494611d9d565b348015610a2057600080fd5b50610440610a2f36600461406a565b611dac565b348015610a4057600080fd5b5060095461054b90600160901b900461ffff1681565b348015610a6257600080fd5b506104c1610a71366004613c60565b60106020526000908152604090205460ff1681565b348015610a9257600080fd5b5061051b60155481565b348015610aa857600080fd5b50610462610ab7366004613f90565b611e7f565b348015610ac857600080fd5b50601354610462906001600160a01b031681565b348015610ae857600080fd5b506104c1610af7366004613cd4565b611ea9565b348015610b0857600080fd5b50610440610b173660046140a3565b611f2d565b348015610b2857600080fd5b506104c1610b37366004613cd4565b612022565b348015610b4857600080fd5b5060095461054b90600160401b900461ffff1681565b348015610b6a57600080fd5b50610440610b79366004613f90565b61202f565b348015610b8a57600080fd5b506104c1610b99366004613c60565b600f6020526000908152604090205460ff1681565b348015610bba57600080fd5b506007546104c190600160a01b900460ff1681565b348015610bdb57600080fd5b506104627f00000000000000000000000057ebc28df00ed93552af8fd81439700a95647b8d81565b348015610c0f57600080fd5b5061051b610c1e366004613f90565b61209c565b348015610c2f57600080fd5b50610440610c3e366004613c60565b61224f565b348015610c4f57600080fd5b5061051b60125481565b348015610c6557600080fd5b50610440610c74366004613ea4565b612345565b348015610c8557600080fd5b5061051b610c943660046140a3565b6123e1565b348015610ca557600080fd5b5061044061240c565b348015610cba57600080fd5b5060095461054b9061ffff1681565b348015610cd557600080fd5b50610440610ce4366004613c60565b61246f565b348015610cf557600080fd5b50610440610d043660046140d1565b6124ba565b348015610d1557600080fd5b5060095461054b9062010000900461ffff1681565b348015610d3657600080fd5b50610440610d45366004613c60565b61270d565b348015610d5657600080fd5b5060095461054b90600160501b900461ffff1681565b6005546001600160a01b03163314610d9f5760405162461bcd60e51b8152600401610d969061416b565b60405180910390fd5b6001600160a01b03811660009081526010602052604090205460ff16610dfa5760405162461bcd60e51b815260206004820152601060248201526f15d85b1b195d081b9bdd08185919195960821b6044820152606401610d96565b6001600160a01b0381166000908152601060205260408120805460ff191690555b601154811015610f1f57816001600160a01b031660118281548110610e4257610e426141a0565b6000918252602090912001546001600160a01b031603610f0d5760118054610e6c906001906141cc565b81548110610e7c57610e7c6141a0565b600091825260209091200154601180546001600160a01b039092169183908110610ea857610ea86141a0565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506011805480610ee757610ee76141df565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f17816141f5565b915050610e1b565b5050565b606060038054610f329061420e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5e9061420e565b8015610fab5780601f10610f8057610100808354040283529160200191610fab565b820191906000526020600020905b815481529060010190602001808311610f8e57829003601f168201915b5050505050905090565b6000610fc23384846127a5565b5060015b92915050565b6005546001600160a01b03163314610ff65760405162461bcd60e51b8152600401610d969061416b565b60005b8151811015610f1f5760106000838381518110611018576110186141a0565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156110835760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610d96565b60016010600084848151811061109b5761109b6141a0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060118282815181106110ee576110ee6141a0565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580611133816141f5565b915050610ff9565b6005546001600160a01b031633146111655760405162461bcd60e51b8152600401610d969061416b565b6007805460ff60a01b19169055565b6013546001600160a01b031660009081526020819052604081205460025461119c91906141cc565b905090565b6005546001600160a01b031633146111cb5760405162461bcd60e51b8152600401610d969061416b565b60005b81811015611240576001601460008585858181106111ee576111ee6141a0565b90506020020160208101906112039190613c60565b6001600160a01b031681526020810191909152604001600020600401805460ff191691151591909117905580611238816141f5565b9150506111ce565b505050565b6005546001600160a01b0316331461126f5760405162461bcd60e51b8152600401610d969061416b565b6009805463ffffffff60801b1916600160801b61ffff8781169190910261ffff60901b191691909117600160901b868316021763ffffffff60a01b1916600160a01b8583160261ffff60b01b191617600160b01b9184169190910217905561012c81836112dc8688614248565b6112e69190614248565b6112f09190614248565b61ffff16111561133a5760405162461bcd60e51b81526020600482015260156024820152744d757374206b6565702066656573203c3d2033302560581b6044820152606401610d96565b50505050565b60003361134e8582856128c9565b61135985858561293d565b60019150505b9392505050565b60606011805480602002602001604051908101604052809291908181526020018280548015610fab57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113a0575050505050905090565b6005546001600160a01b031633146113f15760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03811660009081526010602052604090205460ff16156114515760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610d96565b6001600160a01b03166000818152601060205260408120805460ff191660019081179091556011805491820181559091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319169091179055565b6005546001600160a01b031633146114e15760405162461bcd60e51b8152600401610d969061416b565b6009805461ffff86811663ffffffff199092169190911762010000868316021767ffffffff0000000019166401000000008583160267ffff000000000000191617600160301b9184169190910217905561012c81836115408688614248565b61154a9190614248565b6115549190614248565b61ffff16111561133a5760405162461bcd60e51b815260206004820152601860248201527f4d757374206b65657020666565732062656c6f772033302500000000000000006044820152606401610d96565b6000610fc23384846115b833886123e1565b6115c2919061426a565b6127a5565b6115d13382612e62565b50565b6005546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6005546001600160a01b0316331461164c5760405162461bcd60e51b8152600401610d969061416b565b6115d130826000196127a5565b6005546001600160a01b031633146116835760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b0381166116c75760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610d96565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146117135760405162461bcd60e51b8152600401610d969061416b565b670de0b6b3a76400008110156117555760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610d96565b601555565b61178e6040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b0382166000908152601460209081526040918290208251815460c09381028201840190945260a0810184815290939192849284918401828280156117f857602002820191906000526020600020905b8154815260200190600101908083116117e4575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561185057602002820191906000526020600020905b81548152602001906001019080831161183c575b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015292915050565b6005546001600160a01b031633146118ad5760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b0381166118f15760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610d96565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6013546000906001600160a01b039081169083160361193457506000919050565b6001600160a01b038216600090815260208190526040902054610fc6565b6005546001600160a01b0316331461197c5760405162461bcd60e51b8152600401610d969061416b565b60005b8181101561124057600083838381811061199b5761199b6141a0565b90506020020160208101906119b09190613c60565b6001600160a01b038116600081815260146020526040808220600281018390556003018290555192935090917f17a5b9995cdddd48a6eb45c963be9c85b9e5e57a824c0b8b1791b3339d6223d991611a12918190918252602082015260400190565b60405180910390a25080611a25816141f5565b91505061197f565b6005546001600160a01b03163314611a575760405162461bcd60e51b8152600401610d969061416b565b611a616000612fb0565b565b6005546001600160a01b03163314611a8d5760405162461bcd60e51b8152600401610d969061416b565b6017805460ff1916911515919091179055565b6005546001600160a01b03163314611aca5760405162461bcd60e51b8152600401610d969061416b565b601255565b6005546001600160a01b03163314611af95760405162461bcd60e51b8152600401610d969061416b565b6101f4811115611b3c5760405162461bcd60e51b815260206004820152600e60248201526d417272617920746f6f206c6f6e6760901b6044820152606401610d96565b60005b8181101561124057600060146000858585818110611b5f57611b5f6141a0565b9050602002016020810190611b749190613c60565b6001600160a01b031681526020810191909152604001600020600401805460ff191691151591909117905580611ba9816141f5565b915050611b3f565b6005546001600160a01b03163314611bdb5760405162461bcd60e51b8152600401610d969061416b565b6007805460ff60a01b1916600160a01b179055565b6001600160a01b03811660009081526014602090815260408083208151815460c09481028201850190935260a08101838152859491938492849190840182828015611c5a57602002820191906000526020600020905b815481526020019060010190808311611c46575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611cb257602002820191906000526020600020905b815481526020019060010190808311611c9e575b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101528051519091506000819003611cf5575050919050565b60008260400151600014611d0d578260400151611d11565b6016545b90505b8115611d955781611d248161427d565b925050600083602001518381518110611d3f57611d3f6141a0565b60200260200101519050808242611d5691906141cc565b11611d89578351805184908110611d6f57611d6f6141a0565b602002602001015185611d82919061426a565b9450611d8f565b50611d95565b50611d14565b505050919050565b606060048054610f329061420e565b6005546001600160a01b03163314611dd65760405162461bcd60e51b8152600401610d969061416b565b7f00000000000000000000000057ebc28df00ed93552af8fd81439700a95647b8d6001600160a01b0316826001600160a01b031603611e575760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610d96565b6001600160a01b0382166000908152600f60205260409020805460ff19168215151790555050565b60118181548110611e8f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600080611eb633856123e1565b905082811015611f165760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d96565b611f2333858584036127a5565b5060019392505050565b6005546001600160a01b03163314611f575760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b038116611fad5760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610d96565b6040516370a0823160e01b8152306004820152610f1f90839083906001600160a01b038316906370a0823190602401602060405180830381865afa158015611ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201d9190614294565b613002565b6000610fc233848461293d565b6005546001600160a01b031633146120595760405162461bcd60e51b8152600401610d969061416b565b621275008111156120975760405162461bcd60e51b8152602060048201526008602482015267546f6f206c6f6e6760c01b6044820152606401610d96565b601655565b6040805160028082526060820183526000928392919060208301908036833701905050905030816000815181106120d5576120d56141a0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217791906142ad565b8160018151811061218a5761218a6141a0565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063d06ca61f906121e890869085906004016142ca565b600060405180830381865afa158015612205573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261222d91908101906142e3565b60018151811061223f5761223f6141a0565b6020026020010151915050919050565b6005546001600160a01b031633146122795760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b038116158015906122aa57506001600160a01b0381166000908152600f602052604090205460ff16155b6122ef5760405162461bcd60e51b815260206004820152601660248201527543616e2774207365742074686973206164647265737360501b6044820152606401610d96565b601380546001600160a01b039092166001600160a01b0319909216821790556000908152600860209081526040808320805460ff1990811660019081179092556014909352922060040180549091169091179055565b6005546001600160a01b0316331461236f5760405162461bcd60e51b8152600401610d969061416b565b600980546bffffffff00000000000000001916600160401b61ffff8781169190910261ffff60501b191691909117600160501b868316021763ffffffff60601b1916600160601b8583160261ffff60701b191617600160701b9184169190910217905561012c81836112dc8688614248565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146124365760405162461bcd60e51b8152600401610d969061416b565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156115d1573d6000803e3d6000fd5b6005546001600160a01b031633146124995760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546001600160a01b031633146124e45760405162461bcd60e51b8152600401610d969061416b565b84831480156124f257508281145b61253e5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e6774687320646f6e2774206d61746368000000000000006044820152606401610d96565b60005b858110156127045784848281811061255b5761255b6141a0565b905060200201356000148015612589575082828281811061257e5761257e6141a0565b905060200201356000145b6126f25784848281811061259f5761259f6141a0565b90506020020135601460008989858181106125bc576125bc6141a0565b90506020020160208101906125d19190613c60565b6001600160a01b03168152602081019190915260400160002060020155828282818110612600576126006141a0565b905060200201356014600089898581811061261d5761261d6141a0565b90506020020160208101906126329190613c60565b6001600160a01b03168152602081019190915260400160002060030155868682818110612661576126616141a0565b90506020020160208101906126769190613c60565b6001600160a01b03167f17a5b9995cdddd48a6eb45c963be9c85b9e5e57a824c0b8b1791b3339d6223d98484848181106126b2576126b26141a0565b905060200201358787858181106126cb576126cb6141a0565b905060200201356040516126e9929190918252602082015260400190565b60405180910390a25b806126fc816141f5565b915050612541565b50505050505050565b6005546001600160a01b031633146127375760405162461bcd60e51b8152600401610d969061416b565b6001600160a01b03811661279c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d96565b6115d181612fb0565b6001600160a01b0383166128075760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d96565b6001600160a01b0382166128685760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d96565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006128d584846123e1565b9050600019811461133a57818110156129305760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d96565b61133a84848484036127a5565b600754600160a01b900460ff166129d9576001600160a01b03831660009081526008602052604090205460ff168061298d57506001600160a01b03821660009081526008602052604090205460ff165b6129d95760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610d96565b6001600160a01b03831660009081526010602052604090205460ff16158015612a1b57506001600160a01b03821660009081526010602052604090205460ff16155b612a545760405162461bcd60e51b815260206004820152600a602482015269109bdd081dd85b1b195d60b21b6044820152606401610d96565b612a5c613054565b601754610100900460ff168015612a7d5750601354600160a01b900460ff16155b8015612aa157506001600160a01b0382166000908152600f602052604090205460ff165b15612ae5576000612ab130611913565b90506103e861ffff16601254600e54612aca9190614369565b612ad49190614380565b8110612ae357612ae381613155565b505b6001600160a01b03831660009081526008602052604081205481908190819060ff16158015612b2d57506001600160a01b03861660009081526008602052604090205460ff16155b15612d85576001600160a01b0387166000908152600f602052604090205460ff1615612bf4576009546103e890612b689061ffff1687614369565b612b729190614380565b6009549094506103e890612b909062010000900461ffff1687614369565b612b9a9190614380565b6009549093506103e890612bba90640100000000900461ffff1687614369565b612bc49190614380565b6009549092506103e890612be390600160301b900461ffff1687614369565b612bed9190614380565b9050612d50565b6001600160a01b0386166000908152600f602052604090205460ff1615612cac576009546103e890612c3190600160401b900461ffff1687614369565b612c3b9190614380565b6009549094506103e890612c5a90600160501b900461ffff1687614369565b612c649190614380565b6009549093506103e890612c8390600160601b900461ffff1687614369565b612c8d9190614380565b6009549092506103e890612be390600160701b900461ffff1687614369565b6009546103e890612cc890600160801b900461ffff1687614369565b612cd29190614380565b6009549094506103e890612cf190600160901b900461ffff1687614369565b612cfb9190614380565b6009549093506103e890612d1a90600160a01b900461ffff1687614369565b612d249190614380565b6009549092506103e890612d4390600160b01b900461ffff1687614369565b612d4d9190614380565b90505b612d858787838587612d628a8c6141cc565b612d6c91906141cc565b612d7691906141cc565b612d8091906141cc565b613367565b6000818385612d94888a6141cc565b612d9e91906141cc565b612da891906141cc565b612db291906141cc565b9050612dbf8888836135ca565b60008284612dcd878961426a565b612dd7919061426a565b612de1919061426a565b90508015612e5757612df48930836135ca565b84600a6000828254612e06919061426a565b9250508190555083600b6000828254612e1f919061426a565b9250508190555085600c6000828254612e38919061426a565b9250508190555082600d6000828254612e51919061426a565b90915550505b505050505050505050565b6001600160a01b038216612ec25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d96565b6001600160a01b03821660009081526020819052604090205481811015612f365760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d96565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612f659084906141cc565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611240908490613798565b6000807f00000000000000000000000057ebc28df00ed93552af8fd81439700a95647b8d6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156130b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d991906143b9565b506001600160701b031691506001600160701b031691506131197f00000000000000000000000057ebc28df00ed93552af8fd81439700a95647b8d611913565b600e55811580159061312b5750600081115b613136576000613139565b60015b601780549115156101000261ff00199092169190911790555050565b6013805460ff60a01b1916600160a01b179055600d54600c54600b54600a5460009392916131829161426a565b61318c919061426a565b613196919061426a565b90508015806131a457508082105b156131af5750613357565b60006002600a546131c09190614380565b905060004790506000600d54600b54846131da919061426a565b6131e4919061426a565b90506131ef8161386a565b60006131fb83476141cc565b9050600082600b548361320e9190614369565b6132189190614380565b90506000836132278785614369565b6132319190614380565b9050600084600d54856132449190614369565b61324e9190614380565b90506000871180156132605750600082115b1561326f5761326f87836139ef565b6006546040516000916001600160a01b03169061c35090869084818181858888f193505050503d80600081146132c1576040519150601f19603f3d011682016040523d82523d6000602084013e6132c6565b606091505b50506007546040519192506001600160a01b03169061c3509084906000818181858888f193505050503d806000811461331b576040519150601f19603f3d011682016040523d82523d6000602084013e613320565b606091505b5050600c54909150156133395761333930600c54612e62565b50506000600a819055600b819055600c819055600d55505050505050505b506013805460ff60a01b19169055565b6001600160a01b03831660009081526014602090815260408083208151815460c09481028201850190935260a081018381529093919284928491908401828280156133d157602002820191906000526020600020905b8154815260200190600101908083116133bd575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561342957602002820191906000526020600020905b815481526020019060010190808311613415575b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015260808101519091508061348457506001600160a01b03831660009081526014602052604090206004015460ff165b806134975750601754610100900460ff16155b806134ba57506001600160a01b0384166000908152600f602052604090205460ff165b806134ce5750601354600160a01b900460ff165b806134e9575060175460ff161580156134e957506060810151155b156134f45750505050565b60006134ff8361209c565b6001600160a01b0386166000908152601460209081526040822060018082018054808301825590855283852042910155815490810182559083529082200182905590915061354c86611bf0565b90506000836060015160001461356657836060015161356a565b6015545b9050808211156127045760405162461bcd60e51b815260206004820152602560248201527f416d6f756e74206f76657220746865206c696d697420666f722074696d652070604482015264195c9a5bd960da1b6064820152608401610d96565b6001600160a01b03831661362e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d96565b6001600160a01b0382166136905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d96565b6001600160a01b038316600090815260208190526040902054818110156137085760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d96565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061373f90849061426a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161378b91815260200190565b60405180910390a361133a565b60006137ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613aca9092919063ffffffff16565b805190915015611240578080602001905181019061380b9190614409565b6112405760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d96565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061389f5761389f6141a0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561391d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394191906142ad565b81600181518110613954576139546141a0565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906139b9908590600090869030904290600401614426565b600060405180830381600087803b1580156139d357600080fd5b505af11580156139e7573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d719823085600080613a366005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613a9e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613ac39190614462565b5050505050565b6060613ad98484600085613ae1565b949350505050565b606082471015613b425760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d96565b6001600160a01b0385163b613b995760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d96565b600080866001600160a01b03168587604051613bb59190614490565b60006040518083038185875af1925050503d8060008114613bf2576040519150601f19603f3d011682016040523d82523d6000602084013e613bf7565b606091505b5091509150613c07828286613c12565b979650505050505050565b60608315613c2157508161135f565b825115613c315782518084602001fd5b8160405162461bcd60e51b8152600401610d969190613ca1565b6001600160a01b03811681146115d157600080fd5b600060208284031215613c7257600080fd5b813561135f81613c4b565b60005b83811015613c98578181015183820152602001613c80565b50506000910152565b6020815260008251806020840152613cc0816040850160208701613c7d565b601f01601f19169190910160400192915050565b60008060408385031215613ce757600080fd5b8235613cf281613c4b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d3f57613d3f613d00565b604052919050565b600067ffffffffffffffff821115613d6157613d61613d00565b5060051b60200190565b60006020808385031215613d7e57600080fd5b823567ffffffffffffffff811115613d9557600080fd5b8301601f81018513613da657600080fd5b8035613db9613db482613d47565b613d16565b81815260059190911b82018301908381019087831115613dd857600080fd5b928401925b82841015613c07578335613df081613c4b565b82529284019290840190613ddd565b60008083601f840112613e1157600080fd5b50813567ffffffffffffffff811115613e2957600080fd5b6020830191508360208260051b8501011115613e4457600080fd5b9250929050565b60008060208385031215613e5e57600080fd5b823567ffffffffffffffff811115613e7557600080fd5b613e8185828601613dff565b90969095509350505050565b803561ffff81168114613e9f57600080fd5b919050565b60008060008060808587031215613eba57600080fd5b613ec385613e8d565b9350613ed160208601613e8d565b9250613edf60408601613e8d565b9150613eed60608601613e8d565b905092959194509250565b600080600060608486031215613f0d57600080fd5b8335613f1881613c4b565b92506020840135613f2881613c4b565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613f725781516001600160a01b031687529582019590820190600101613f4d565b509495945050505050565b60208152600061135f6020830184613f39565b600060208284031215613fa257600080fd5b5035919050565b600081518084526020808501945080840160005b83811015613f7257815187529582019590820190600101613fbd565b602081526000825160a06020840152613ff560c0840182613fa9565b90506020840151601f198483030160408501526140128282613fa9565b91505060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b80151581146115d157600080fd5b60006020828403121561405f57600080fd5b813561135f8161403f565b6000806040838503121561407d57600080fd5b823561408881613c4b565b915060208301356140988161403f565b809150509250929050565b600080604083850312156140b657600080fd5b82356140c181613c4b565b9150602083013561409881613c4b565b600080600080600080606087890312156140ea57600080fd5b863567ffffffffffffffff8082111561410257600080fd5b61410e8a838b01613dff565b9098509650602089013591508082111561412757600080fd5b6141338a838b01613dff565b9096509450604089013591508082111561414c57600080fd5b5061415989828a01613dff565b979a9699509497509295939492505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610fc657610fc66141b6565b634e487b7160e01b600052603160045260246000fd5b600060018201614207576142076141b6565b5060010190565b600181811c9082168061422257607f821691505b60208210810361424257634e487b7160e01b600052602260045260246000fd5b50919050565b61ffff818116838216019080821115614263576142636141b6565b5092915050565b80820180821115610fc657610fc66141b6565b60008161428c5761428c6141b6565b506000190190565b6000602082840312156142a657600080fd5b5051919050565b6000602082840312156142bf57600080fd5b815161135f81613c4b565b828152604060208201526000613ad96040830184613f39565b600060208083850312156142f657600080fd5b825167ffffffffffffffff81111561430d57600080fd5b8301601f8101851361431e57600080fd5b805161432c613db482613d47565b81815260059190911b8201830190838101908783111561434b57600080fd5b928401925b82841015613c0757835182529284019290840190614350565b8082028115828204841417610fc657610fc66141b6565b60008261439d57634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b0381168114613e9f57600080fd5b6000806000606084860312156143ce57600080fd5b6143d7846143a2565b92506143e5602085016143a2565b9150604084015163ffffffff811681146143fe57600080fd5b809150509250925092565b60006020828403121561441b57600080fd5b815161135f8161403f565b85815284602082015260a06040820152600061444560a0830186613f39565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561447757600080fd5b8351925060208401519150604084015190509250925092565b600082516144a2818460208701613c7d565b919091019291505056fea2646970667358221220708d966861dd75438f87dc4cc5028c0d5a9bf9e235104ec99a3cd5a81e81392d64736f6c63430008110033

Deployed Bytecode Sourcemap

33573:20330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38035:417;;;;;;;;;;-1:-1:-1;38035:417:0;;;;;:::i;:::-;;:::i;:::-;;33618:42;;;;;;;;;;-1:-1:-1;33618:42:0;;;;-1:-1:-1;;;;;33618:42:0;;;;;;-1:-1:-1;;;;;582:32:1;;;564:51;;552:2;537:18;33618:42:0;;;;;;;;22260:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24718:208::-;;;;;;;;;;-1:-1:-1;24718:208:0;;;;;:::i;:::-;;:::i;:::-;;;1767:14:1;;1760:22;1742:41;;1730:2;1715:18;24718:208:0;1602:187:1;37616:301:0;;;;;;;;;;-1:-1:-1;37616:301:0;;;;;:::i;:::-;;:::i;38642:85::-;;;;;;;;;;;;;:::i;38735:125::-;;;;;;;;;;;;;:::i;:::-;;;3511:25:1;;;3499:2;3484:18;38735:125:0;3365:177:1;34259:34:0;;;;;;;;;;-1:-1:-1;34259:34:0;;;;-1:-1:-1;;;34259:34:0;;;;;;;;;3721:6:1;3709:19;;;3691:38;;3679:2;3664:18;34259:34:0;3547:188:1;48020:24:0;;;;;;;;;;-1:-1:-1;48020:24:0;;;;;;;;50170:234;;;;;;;;;;-1:-1:-1;50170:234:0;;;;;:::i;:::-;;:::i;41166:667::-;;;;;;;;;;-1:-1:-1;41166:667:0;;;;;:::i;:::-;;:::i;25506:295::-;;;;;;;;;;-1:-1:-1;25506:295:0;;;;;:::i;:::-;;:::i;37925:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37412:196::-;;;;;;;;;;-1:-1:-1;37412:196:0;;;;;:::i;:::-;;:::i;37320:84::-;;;;;;;;;;-1:-1:-1;37320:84:0;;37395:1;6459:36:1;;6447:2;6432:18;37320:84:0;6317:184:1;39966:585:0;;;;;;;;;;-1:-1:-1;39966:585:0;;;;;:::i;:::-;;:::i;26210:291::-;;;;;;;;;;-1:-1:-1;26210:291:0;;;;;:::i;:::-;;:::i;39050:111::-;;;;;;;;;;-1:-1:-1;39139:13:0;;-1:-1:-1;;;;;39139:13:0;39096:7;23702:18;;;;;;;;;;;39050:111;38735:125;38460:83;;;;;;;;;;-1:-1:-1;38460:83:0;;;;;:::i;:::-;;:::i;39727:112::-;;;;;;;;;;-1:-1:-1;39727:112:0;;;;;:::i;:::-;;:::i;47958:32::-;;;;;;;;;;;;;;;;34055;;;;;;;;;;-1:-1:-1;34055:32:0;;;;-1:-1:-1;;;34055:32:0;;;;;;36802:151;;;;;;;;;;-1:-1:-1;36802:151:0;;;;;:::i;:::-;;:::i;34390:37::-;;;;;;;;;;-1:-1:-1;34390:37:0;;;;-1:-1:-1;;;34390:37:0;;;;;;33879:49;;;;;;;;;;-1:-1:-1;33879:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42095:233;;;;;;;;;;-1:-1:-1;42095:233:0;;;;;:::i;:::-;;:::i;48384:152::-;;;;;;;;;;-1:-1:-1;48384:152:0;;;;;:::i;:::-;;:::i;48831:157::-;;;;;;;;;;-1:-1:-1;48831:157:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41841:246::-;;;;;;;;;;-1:-1:-1;41841:246:0;;;;;:::i;:::-;;:::i;38868:174::-;;;;;;;;;;-1:-1:-1;38868:174:0;;;;;:::i;:::-;;:::i;48996:323::-;;;;;;;;;;-1:-1:-1;48996:323:0;;;;;:::i;:::-;;:::i;4920:103::-;;;;;;;;;;;;;:::i;34830:47::-;;;;;;;;;;;;;;;34217:33;;;;;;;;;;-1:-1:-1;34217:33:0;;;;-1:-1:-1;;;34217:33:0;;;;;;34014:34;;;;;;;;;;-1:-1:-1;34014:34:0;;;;;;;;;;;48720:103;;;;;;;;;;-1:-1:-1;48720:103:0;;;;;:::i;:::-;;:::i;39169:168::-;;;;;;;;;;-1:-1:-1;39169:168:0;;;;;:::i;:::-;;:::i;34345:38::-;;;;;;;;;;-1:-1:-1;34345:38:0;;;;-1:-1:-1;;;34345:38:0;;;;;;33667:40;;;;;;;;;;-1:-1:-1;33667:40:0;;;;-1:-1:-1;;;;;33667:40:0;;;50412:299;;;;;;;;;;-1:-1:-1;50412:299:0;;;;;:::i;:::-;;:::i;38551:83::-;;;;;;;;;;;;;:::i;50790:873::-;;;;;;;;;;-1:-1:-1;50790:873:0;;;;;:::i;:::-;;:::i;4269:87::-;;;;;;;;;;-1:-1:-1;4342:6:0;;-1:-1:-1;;;;;4342:6:0;4269:87;;34175:35;;;;;;;;;;-1:-1:-1;34175:35:0;;;;-1:-1:-1;;;34175:35:0;;;;;;22479:104;;;;;;;;;;;;;:::i;39345:236::-;;;;;;;;;;-1:-1:-1;39345:236:0;;;;;:::i;:::-;;:::i;34300:38::-;;;;;;;;;;-1:-1:-1;34300:38:0;;;;-1:-1:-1;;;34300:38:0;;;;;;34705:41;;;;;;;;;;-1:-1:-1;34705:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47893:26;;;;;;;;;;;;;;;;34753:27;;;;;;;;;;-1:-1:-1;34753:27:0;;;;;:::i;:::-;;:::i;34927:28::-;;;;;;;;;;-1:-1:-1;34927:28:0;;;;-1:-1:-1;;;;;34927:28:0;;;27004:476;;;;;;;;;;-1:-1:-1;27004:476:0;;;;;:::i;:::-;;:::i;53511:389::-;;;;;;;;;;-1:-1:-1;53511:389:0;;;;;:::i;:::-;;:::i;23934:200::-;;;;;;;;;;-1:-1:-1;23934:200:0;;;;;:::i;:::-;;:::i;34096:30::-;;;;;;;;;;-1:-1:-1;34096:30:0;;;;-1:-1:-1;;;34096:30:0;;;;;;48544:168;;;;;;;;;;-1:-1:-1;48544:168:0;;;;;:::i;:::-;;:::i;34641:57::-;;;;;;;;;;-1:-1:-1;34641:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33845:25;;;;;;;;;;-1:-1:-1;33845:25:0;;;;-1:-1:-1;;;33845:25:0;;;;;;34884:36;;;;;;;;;;;;;;;52026:318;;;;;;;;;;-1:-1:-1;52026:318:0;;;;;:::i;:::-;;:::i;36961:351::-;;;;;;;;;;-1:-1:-1;36961:351:0;;;;;:::i;:::-;;:::i;34787:34::-;;;;;;;;;;;;;;;;40559:599;;;;;;;;;;-1:-1:-1;40559:599:0;;;;;:::i;:::-;;:::i;24197:201::-;;;;;;;;;;-1:-1:-1;24197:201:0;;;;;:::i;:::-;;:::i;53394:109::-;;;;;;;;;;;;;:::i;33937:29::-;;;;;;;;;;-1:-1:-1;33937:29:0;;;;;;;;39847:111;;;;;;;;;;-1:-1:-1;39847:111:0;;;;;:::i;:::-;;:::i;49464:698::-;;;;;;;;;;-1:-1:-1;49464:698:0;;;;;:::i;:::-;;:::i;33973:34::-;;;;;;;;;;-1:-1:-1;33973:34:0;;;;;;;;;;;5178:238;;;;;;;;;;-1:-1:-1;5178:238:0;;;;;:::i;:::-;;:::i;34133:35::-;;;;;;;;;;-1:-1:-1;34133:35:0;;;;-1:-1:-1;;;34133:35:0;;;;;;38035:417;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;38114:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;::::1;;38106:46;;;::::0;-1:-1:-1;;;38106:46:0;;11577:2:1;38106:46:0::1;::::0;::::1;11559:21:1::0;11616:2;11596:18;;;11589:30;-1:-1:-1;;;11635:18:1;;;11628:46;11691:18;;38106:46:0::1;11375:340:1::0;38106:46:0::1;-1:-1:-1::0;;;;;38163:17:0;::::1;38183:5;38163:17:::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;38163:25:0::1;::::0;;38199:246:::1;38223:10;:17:::0;38219:21;::::1;38199:246;;;38283:6;-1:-1:-1::0;;;;;38266:23:0::1;:10;38277:1;38266:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38266:13:0::1;:23:::0;38262:172:::1;;38326:10;38337:17:::0;;:21:::1;::::0;38357:1:::1;::::0;38337:21:::1;:::i;:::-;38326:33;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;38310:10:::1;:13:::0;;-1:-1:-1;;;;;38326:33:0;;::::1;::::0;38321:1;;38310:13;::::1;;;;;:::i;:::-;;;;;;;;;:49;;;;;-1:-1:-1::0;;;;;38310:49:0::1;;;;;-1:-1:-1::0;;;;;38310:49:0::1;;;;;;38378:10;:16;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;38378:16:0;;;;;-1:-1:-1;;;;;;38378:16:0::1;::::0;;;;;38199:246:::1;38035:417:::0;:::o;38262:172::-:1;38242:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38199:246;;;;38035:417:::0;:::o;22260:100::-;22314:13;22347:5;22340:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22260:100;:::o;24718:208::-;24837:4;24859:37;24868:10;24880:7;24889:6;24859:8;:37::i;:::-;-1:-1:-1;24914:4:0;24718:208;;;;;:::o;37616:301::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;37703:9:::1;37698:212;37722:7;:14;37718:1;:18;37698:212;;;37767:9;:21;37777:7;37785:1;37777:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;37767:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;37767:21:0;;::::1;;37766:22;37758:55;;;::::0;-1:-1:-1;;;37758:55:0;;12976:2:1;37758:55:0::1;::::0;::::1;12958:21:1::0;13015:2;12995:18;;;12988:30;-1:-1:-1;;;13034:18:1;;;13027:50;13094:18;;37758:55:0::1;12774:344:1::0;37758:55:0::1;37852:4;37828:9;:21;37838:7;37846:1;37838:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;37828:21:0::1;-1:-1:-1::0;;;;;37828:21:0::1;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;37871:10;37887:7;37895:1;37887:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;37871:27;;::::1;::::0;::::1;::::0;;-1:-1:-1;37871:27:0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37871:27:0::1;-1:-1:-1::0;;;;;37871:27:0;;::::1;::::0;;;::::1;::::0;;37738:3;::::1;::::0;::::1;:::i;:::-;;;;37698:212;;38642:85:::0;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;38698:13:::1;:21:::0;;-1:-1:-1;;;;38698:21:0::1;::::0;;38642:85::o;38735:125::-;39139:13;;-1:-1:-1;;;;;39139:13:0;38788:7;23702:18;;;;;;;;;;;23468:12;;38815:37;;;;:::i;:::-;38808:44;;38735:125;:::o;50170:234::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;50289:9:::1;50284:113;50304:20:::0;;::::1;50284:113;;;50381:4;50346:7;:21;50354:9;;50364:1;50354:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50346:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50346:21:0;:32:::1;;:39:::0;;-1:-1:-1;;50346:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50326:3;::::1;::::0;::::1;:::i;:::-;;;;50284:113;;;;50170:234:::0;;:::o;41166:667::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;41379:15:::1;:34:::0;;-1:-1:-1;;;;41424:44:0;-1:-1:-1;;;41379:34:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;41424:44:0;;;;;-1:-1:-1;;;41424:44:0;;::::1;;;-1:-1:-1::0;;;;41534:40:0;-1:-1:-1;;;41479:44:0;;::::1;;-1:-1:-1::0;;;;41534:40:0;;-1:-1:-1;;;41534:40:0;;::::1;::::0;;;::::1;;::::0;;33833:3:::1;41534:40:::0;41479:44;41607:57:::1;41424:44:::0;41379:34;41607:57:::1;:::i;:::-;:98;;;;:::i;:::-;:137;;;;:::i;:::-;:169;;;;41585:240;;;::::0;-1:-1:-1;;;41585:240:0;;13498:2:1;41585:240:0::1;::::0;::::1;13480:21:1::0;13537:2;13517:18;;;13510:30;-1:-1:-1;;;13556:18:1;;;13549:51;13617:18;;41585:240:0::1;13296:345:1::0;41585:240:0::1;41166:667:::0;;;;:::o;25506:295::-;25637:4;3566:10;25695:38;25711:4;3566:10;25726:6;25695:15;:38::i;:::-;25744:27;25754:4;25760:2;25764:6;25744:9;:27::i;:::-;25789:4;25782:11;;;25506:295;;;;;;:::o;37925:102::-;37973:16;38009:10;38002:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38002:17:0;;;;;;;;;;;;;;;;;;;;;;37925:102;:::o;37412:196::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37489:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;::::1;;37488:18;37480:51;;;::::0;-1:-1:-1;;;37480:51:0;;12976:2:1;37480:51:0::1;::::0;::::1;12958:21:1::0;13015:2;12995:18;;;12988:30;-1:-1:-1;;;13034:18:1;;;13027:50;13094:18;;37480:51:0::1;12774:344:1::0;37480:51:0::1;-1:-1:-1::0;;;;;37542:17:0::1;;::::0;;;:9:::1;:17;::::0;;;;:24;;-1:-1:-1;;37542:24:0::1;37562:4;37542:24:::0;;::::1;::::0;;;37577:10:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37577:23:0::1;::::0;;::::1;::::0;;37412:196::o;39966:585::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;40154:10:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;40189:34:0;;;;;;;;;;::::1;;;-1:-1:-1::0;;40279:30:0;40234:34;;;::::1;;-1:-1:-1::0;;40279:30:0;;-1:-1:-1;;;40279:30:0;;::::1;::::0;;;::::1;;::::0;;33833:3:::1;40279:30:::0;40234:34;40342:47:::1;40189:34:::0;40154:24;40342:47:::1;:::i;:::-;:83;;;;:::i;:::-;:117;;;;:::i;:::-;:149;;;;40320:223;;;::::0;-1:-1:-1;;;40320:223:0;;13848:2:1;40320:223:0::1;::::0;::::1;13830:21:1::0;13887:2;13867:18;;;13860:30;13926:26;13906:18;;;13899:54;13970:18;;40320:223:0::1;13646:348:1::0;26210:291:0;26325:4;26347:124;26370:10;26395:7;26450:10;26417:30;26427:10;26439:7;26417:9;:30::i;:::-;:43;;;;:::i;:::-;26347:8;:124::i;38460:83::-;38510:25;38516:10;38528:6;38510:5;:25::i;:::-;38460:83;:::o;39727:112::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39798:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;39798:33:0::1;39827:4;39798:33;::::0;;39727:112::o;36802:151::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;36888:57:::1;36905:4;36912:13;-1:-1:-1::0;;36888:8:0::1;:57::i;42095:233::-:0;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42214:32:0;::::1;42206:56;;;::::0;-1:-1:-1;;;42206:56:0;;14331:2:1;42206:56:0::1;::::0;::::1;14313:21:1::0;14370:2;14350:18;;;14343:30;-1:-1:-1;;;14389:18:1;;;14382:41;14440:18;;42206:56:0::1;14129:335:1::0;42206:56:0::1;42273:17;:47:::0;;-1:-1:-1;;;;;;42273:47:0::1;-1:-1:-1::0;;;;;42273:47:0;;;::::1;::::0;;;::::1;::::0;;42095:233::o;48384:152::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;48476:7:::1;48464:8;:19;;48456:39;;;::::0;-1:-1:-1;;;48456:39:0;;14671:2:1;48456:39:0::1;::::0;::::1;14653:21:1::0;14710:1;14690:18;;;14683:29;-1:-1:-1;;;14728:18:1;;;14721:37;14775:18;;48456:39:0::1;14469:330:1::0;48456:39:0::1;48506:11;:22:::0;48384:152::o;48831:157::-;48918:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48918:20:0;-1:-1:-1;;;;;48963:17:0;;;;;;:7;:17;;;;;;;;;48956:24;;;;;;;;;;;;;;;;;;;;;;;48963:17;;48956:24;;48963:17;;48956:24;;48963:17;48956:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48956:24:0;;;-1:-1:-1;;48956:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48831:157;-1:-1:-1;;48831:157:0:o;41841:246::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41967:34:0;::::1;41959:58;;;::::0;-1:-1:-1;;;41959:58:0;;14331:2:1;41959:58:0::1;::::0;::::1;14313:21:1::0;14370:2;14350:18;;;14343:30;-1:-1:-1;;;14389:18:1;;;14382:41;14440:18;;41959:58:0::1;14129:335:1::0;41959:58:0::1;42028:19;:51:::0;;-1:-1:-1;;;;;;42028:51:0::1;-1:-1:-1::0;;;;;42028:51:0;;;::::1;::::0;;;::::1;::::0;;41841:246::o;38868:174::-;38969:13;;38934:7;;-1:-1:-1;;;;;38969:13:0;;;38958:24;;;;38954:38;;-1:-1:-1;38991:1:0;;38868:174;-1:-1:-1;38868:174:0:o;38954:38::-;-1:-1:-1;;;;;23702:18:0;;23670:7;23702:18;;;;;;;;;;;39010:24;23551:177;48996:323;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;49083:9:::1;49078:234;49094:20:::0;;::::1;49078:234;;;49136:15;49154:9;;49164:1;49154:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49181:16:0;::::1;49212:1;49181:16:::0;;;:7:::1;:16;::::0;;;;;:28:::1;::::0;::::1;:32:::0;;;49228:25:::1;;:29:::0;;;49277:23;49136:30;;-1:-1:-1;49181:16:0;;49277:23:::1;::::0;::::1;::::0;49212:1;;14994:25:1;;;15050:2;15035:18;;15028:34;14982:2;14967:18;;14804:264;49277:23:0::1;;;;;;;;-1:-1:-1::0;49116:3:0;::::1;::::0;::::1;:::i;:::-;;;;49078:234;;4920:103:::0;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;4985:30:::1;5012:1;4985:18;:30::i;:::-;4920:103::o:0;48720:::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;48794:12:::1;:21:::0;;-1:-1:-1;;48794:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48720:103::o;39169:168::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;39287:19:::1;:42:::0;39169:168::o;50412:299::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;50557:3:::1;50537:23:::0;::::1;;50529:50;;;::::0;-1:-1:-1;;;50529:50:0;;15275:2:1;50529:50:0::1;::::0;::::1;15257:21:1::0;15314:2;15294:18;;;15287:30;-1:-1:-1;;;15333:18:1;;;15326:44;15387:18;;50529:50:0::1;15073:338:1::0;50529:50:0::1;50595:9;50590:114;50610:20:::0;;::::1;50590:114;;;50687:5;50652:7;:21;50660:9;;50670:1;50660:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50652:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50652:21:0;:32:::1;;:40:::0;;-1:-1:-1;;50652:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50632:3;::::1;::::0;::::1;:::i;:::-;;;;50590:114;;38551:83:::0;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;38606:13:::1;:20:::0;;-1:-1:-1;;;;38606:20:0::1;-1:-1:-1::0;;;38606:20:0::1;::::0;;38551:83::o;50790:873::-;-1:-1:-1;;;;;50951:17:0;;50883:18;50951:17;;;:7;:17;;;;;;;;50919:49;;;;;;;;;;;;;;;;;;;;;50883:18;;50919:49;;;;50951:17;;50919:49;;;50951:17;50919:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50919:49:0;;;-1:-1:-1;;50919:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51003:20;;:27;50919:49;;-1:-1:-1;;51047:18:0;;;51043:68;;51082:17;;50790:873;;;:::o;51043:68::-;51123:19;51145:8;:20;;;51169:1;51145:25;:94;;51219:8;:20;;;51145:94;;;51186:17;;51145:94;51123:116;;51250:406;51278:64;;51321:5;51278:64;51356:15;;;;:::i;:::-;;;;51386:21;51410:8;:23;;;51434:13;51410:38;;;;;;;;:::i;:::-;;;;;;;51386:62;;51500:13;51485:11;51467:15;:29;;;;:::i;:::-;:46;51463:182;;51548:20;;:35;;51569:13;;51548:35;;;;;;:::i;:::-;;;;;;;51534:49;;;;;:::i;:::-;;;51463:182;;;51624:5;;;51463:182;51263:393;51250:406;;;50908:755;;;50790:873;;;:::o;22479:104::-;22535:13;22568:7;22561:14;;;;;:::i;39345:236::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;39477:11:::1;-1:-1:-1::0;;;;;39469:19:0::1;:4;-1:-1:-1::0;;;;;39469:19:0::1;::::0;39461:58:::1;;;::::0;-1:-1:-1;;;39461:58:0;;15759:2:1;39461:58:0::1;::::0;::::1;15741:21:1::0;15798:2;15778:18;;;15771:30;15837:28;15817:18;;;15810:56;15883:18;;39461:58:0::1;15557:350:1::0;39461:58:0::1;-1:-1:-1::0;;;;;39672:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;39672:39:0;;;;;;;38199:246:::1;38035:417:::0;:::o;34753:27::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34753:27:0;;-1:-1:-1;34753:27:0;:::o;27004:476::-;27124:4;27146:24;27173:30;27183:10;27195:7;27173:9;:30::i;:::-;27146:57;;27256:15;27236:16;:35;;27214:122;;;;-1:-1:-1;;;27214:122:0;;16114:2:1;27214:122:0;;;16096:21:1;16153:2;16133:18;;;16126:30;16192:34;16172:18;;;16165:62;-1:-1:-1;;;16243:18:1;;;16236:35;16288:19;;27214:122:0;15912:401:1;27214:122:0;27372:65;27381:10;27393:7;27421:15;27402:16;:34;27372:8;:65::i;:::-;-1:-1:-1;27468:4:0;;27004:476;-1:-1:-1;;;27004:476:0:o;53511:389::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53654:27:0;::::1;53632:109;;;::::0;-1:-1:-1;;;53632:109:0;;16520:2:1;53632:109:0::1;::::0;::::1;16502:21:1::0;;;16539:18;;;16532:30;16598:34;16578:18;;;16571:62;16650:18;;53632:109:0::1;16318:356:1::0;53632:109:0::1;53844:37;::::0;-1:-1:-1;;;53844:37:0;;53875:4:::1;53844:37;::::0;::::1;564:51:1::0;53752:140:0::1;::::0;53789:12;;53816:13;;-1:-1:-1;;;;;53844:22:0;::::1;::::0;::::1;::::0;537:18:1;;53844:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53752:22;:140::i;23934:200::-:0;24049:4;24071:33;24081:10;24093:2;24097:6;24071:9;:33::i;48544:168::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;48644:7:::1;48631:9;:20;;48623:41;;;::::0;-1:-1:-1;;;48623:41:0;;17070:2:1;48623:41:0::1;::::0;::::1;17052:21:1::0;17109:1;17089:18;;;17082:29;-1:-1:-1;;;17127:18:1;;;17120:38;17175:18;;48623:41:0::1;16868:331:1::0;48623:41:0::1;48675:17;:29:::0;48544:168::o;52026:318::-;52174:16;;;52188:1;52174:16;;;;;;;;52116;;;;52174;52188:1;52174:16;;;;;;;;;;-1:-1:-1;52174:16:0;52150:40;;52219:4;52201;52206:1;52201:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;52201:23:0;;;-1:-1:-1;;;;;52201:23:0;;;;;52245:13;-1:-1:-1;;;;;52245:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52235:4;52240:1;52235:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52235:30:0;;;:7;;;;;;;;;:30;52287:46;;-1:-1:-1;;;52287:46:0;;:13;:27;;;;;;:46;;52315:11;;52328:4;;52287:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52287:46:0;;;;;;;;;;;;:::i;:::-;52334:1;52287:49;;;;;;;;:::i;:::-;;;;;;;52276:60;;52139:205;52026:318;;;:::o;36961:351::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37056:24:0;::::1;::::0;;::::1;::::0;:66:::1;;-1:-1:-1::0;;;;;;37085:37:0;::::1;;::::0;;;:25:::1;:37;::::0;;;;;::::1;;37084:38;37056:66;37034:138;;;::::0;-1:-1:-1;;;37034:138:0;;18885:2:1;37034:138:0::1;::::0;::::1;18867:21:1::0;18924:2;18904:18;;;18897:30;-1:-1:-1;;;18943:18:1;;;18936:52;19005:18;;37034:138:0::1;18683:346:1::0;37034:138:0::1;37183:13;:26:::0;;-1:-1:-1;;;;;37183:26:0;;::::1;-1:-1:-1::0;;;;;;37183:26:0;;::::1;::::0;::::1;::::0;;:13:::1;37220:29:::0;;;:17:::1;:29;::::0;;;;;;;:36;;-1:-1:-1;;37220:36:0;;::::1;37183:26:::0;37220:36;;::::1;::::0;;;37267:7:::1;:19:::0;;;;;:30:::1;;:37:::0;;;;::::1;::::0;;::::1;::::0;;36961:351::o;40559:599::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;40752:11:::1;:26:::0;;-1:-1:-1;;40789:36:0;-1:-1:-1;;;40752:26:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;40789:36:0;;;;;-1:-1:-1;;;40789:36:0;;::::1;;;-1:-1:-1::0;;;;40883:32:0;-1:-1:-1;;;40836:36:0;;::::1;;-1:-1:-1::0;;;;40883:32:0;;-1:-1:-1;;;40883:32:0;;::::1;::::0;;;::::1;;::::0;;33833:3:::1;40883:32:::0;40836:36;40948:49:::1;40789:36:::0;40752:26;40948:49:::1;:::i;24197:201::-:0;-1:-1:-1;;;;;24363:18:0;;;24331:7;24363:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;24197:201::o;53394:109::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;4342:6;;53447:48:::1;::::0;-1:-1:-1;;;;;4342:6:0;;;;53473:21:::1;53447:48:::0;::::1;;;::::0;::::1;::::0;;;53473:21;4342:6;53447:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;39847:111:::0;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39916:26:0::1;39945:5;39916:26:::0;;;:17:::1;:26;::::0;;;;:34;;-1:-1:-1;;39916:34:0::1;::::0;;39847:111::o;49464:698::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;49662:39;;::::1;:99:::0;::::1;;;-1:-1:-1::0;49722:39:0;;::::1;49662:99;49640:174;;;::::0;-1:-1:-1;;;49640:174:0;;19236:2:1;49640:174:0::1;::::0;::::1;19218:21:1::0;19275:2;19255:18;;;19248:30;19314:27;19294:18;;;19287:55;19359:18;;49640:174:0::1;19034:349:1::0;49640:174:0::1;49832:9;49827:328;49847:20:::0;;::::1;49827:328;;;49893:12;;49906:1;49893:15;;;;;;;:::i;:::-;;;;;;;49912:1;49893:20;:41;;;;;49917:9;;49927:1;49917:12;;;;;;;:::i;:::-;;;;;;;49933:1;49917:17;49893:41;49936:8;49889:55;49995:12;;50008:1;49995:15;;;;;;;:::i;:::-;;;;;;;49959:7;:21;49967:9;;49977:1;49967:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49959:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49959:21:0;:33:::1;;:51:::0;50058:9;;50068:1;50058:12;;::::1;;;;;:::i;:::-;;;;;;;50025:7;:21;50033:9;;50043:1;50033:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50025:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50025:21:0;:30:::1;;:45:::0;50099:9;;50109:1;50099:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50090:53:0::1;;50113:9;;50123:1;50113:12;;;;;;;:::i;:::-;;;;;;;50127;;50140:1;50127:15;;;;;;;:::i;:::-;;;;;;;50090:53;;;;;;14994:25:1::0;;;15050:2;15035:18;;15028:34;14982:2;14967:18;;14804:264;50090:53:0::1;;;;;;;;49827:328;49869:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49827:328;;;;49464:698:::0;;;;;;:::o;5178:238::-;4342:6;;-1:-1:-1;;;;;4342:6:0;3566:10;4489:23;4481:68;;;;-1:-1:-1;;;4481:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5281:22:0;::::1;5259:110;;;::::0;-1:-1:-1;;;5259:110:0;;19843:2:1;5259:110:0::1;::::0;::::1;19825:21:1::0;19882:2;19862:18;;;19855:30;19921:34;19901:18;;;19894:62;-1:-1:-1;;;19972:18:1;;;19965:36;20018:19;;5259:110:0::1;19641:402:1::0;5259:110:0::1;5380:28;5399:8;5380:18;:28::i;30715:380::-:0;-1:-1:-1;;;;;30851:19:0;;30843:68;;;;-1:-1:-1;;;30843:68:0;;20250:2:1;30843:68:0;;;20232:21:1;20289:2;20269:18;;;20262:30;20328:34;20308:18;;;20301:62;-1:-1:-1;;;20379:18:1;;;20372:34;20423:19;;30843:68:0;20048:400:1;30843:68:0;-1:-1:-1;;;;;30930:21:0;;30922:68;;;;-1:-1:-1;;;30922:68:0;;20655:2:1;30922:68:0;;;20637:21:1;20694:2;20674:18;;;20667:30;20733:34;20713:18;;;20706:62;-1:-1:-1;;;20784:18:1;;;20777:32;20826:19;;30922:68:0;20453:398:1;30922:68:0;-1:-1:-1;;;;;31003:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31055:32;;3511:25:1;;;31055:32:0;;3484:18:1;31055:32:0;;;;;;;30715:380;;;:::o;31386:502::-;31521:24;31548:25;31558:5;31565:7;31548:9;:25::i;:::-;31521:52;;-1:-1:-1;;31588:16:0;:37;31584:297;;31688:6;31668:16;:26;;31642:117;;;;-1:-1:-1;;;31642:117:0;;21058:2:1;31642:117:0;;;21040:21:1;21097:2;21077:18;;;21070:30;21136:31;21116:18;;;21109:59;21185:18;;31642:117:0;20856:353:1;31642:117:0;31803:51;31812:5;31819:7;31847:6;31828:16;:25;31803:8;:51::i;42336:2980::-;42465:13;;-1:-1:-1;;;42465:13:0;;;;42460:183;;-1:-1:-1;;;;;42521:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;42548:21:0;;;;;;:17;:21;;;;;;;;42521:48;42495:136;;;;-1:-1:-1;;;42495:136:0;;21416:2:1;42495:136:0;;;21398:21:1;21455:2;21435:18;;;21428:30;21494:28;21474:18;;;21467:56;21540:18;;42495:136:0;21214:350:1;42495:136:0;-1:-1:-1;;;;;42662:15:0;;;;;;:9;:15;;;;;;;;42661:16;:34;;;;-1:-1:-1;;;;;;42682:13:0;;;;;;:9;:13;;;;;;;;42681:14;42661:34;42653:57;;;;-1:-1:-1;;;42653:57:0;;21771:2:1;42653:57:0;;;21753:21:1;21810:2;21790:18;;;21783:30;-1:-1:-1;;;21829:18:1;;;21822:40;21879:18;;42653:57:0;21569:334:1;42653:57:0;42721:16;:14;:16::i;:::-;42768:12;;;;;;;:33;;;;-1:-1:-1;42785:16:0;;-1:-1:-1;;;42785:16:0;;;;42784:17;42768:33;:66;;;;-1:-1:-1;;;;;;42805:29:0;;;;;;:25;:29;;;;;;;;42768:66;42750:349;;;42861:28;42892:24;42910:4;42892:9;:24::i;:::-;42861:55;;33792:4;42994:48;;43006:19;;42995:8;;:30;;;;:::i;:::-;42994:48;;;;:::i;:::-;42953:20;:89;42931:156;;43058:29;43066:20;43058:7;:29::i;:::-;42846:253;42750:349;-1:-1:-1;;;;;43239:23:0;;43111:16;43239:23;;;:17;:23;;;;;;43111:16;;;;;;43239:23;;43238:24;:50;;;;-1:-1:-1;;;;;;43267:21:0;;;;;;:17;:21;;;;;;;;43266:22;43238:50;43234:1442;;;-1:-1:-1;;;;;43329:31:0;;;;;;:25;:31;;;;;;;;43325:1168;;;43402:10;;33749:4;;43393:19;;43392:38;43402:10;43393:6;:19;:::i;:::-;43392:38;;;;:::i;:::-;43475:15;;43381:49;;-1:-1:-1;33749:4:0;;43466:24;;43475:15;;;43465:43;43475:15;43466:6;:24;:::i;:::-;43465:43;;;;:::i;:::-;43553:15;;43449:59;;-1:-1:-1;33749:4:0;;43544:24;;43553:15;;;43543:43;43553:15;43544:6;:24;:::i;:::-;43543:43;;;;:::i;:::-;43629:13;;43527:59;;-1:-1:-1;33749:4:0;;43620:22;;-1:-1:-1;;;43629:13:0;;43619:41;43629:13;43620:6;:22;:::i;:::-;43619:41;;;;:::i;:::-;43605:55;;43325:1168;;;-1:-1:-1;;;;;43720:29:0;;;;;;:25;:29;;;;;;;;43716:777;;;43791:11;;33749:4;;43782:20;;-1:-1:-1;;;43791:11:0;;43781:39;43791:11;43782:6;:20;:::i;:::-;43781:39;;;;:::i;:::-;43865:16;;43770:50;;-1:-1:-1;33749:4:0;;43856:25;;-1:-1:-1;;;43865:16:0;;43855:44;43865:16;43856:6;:25;:::i;:::-;43855:44;;;;:::i;:::-;43944:16;;43839:60;;-1:-1:-1;33749:4:0;;43935:25;;-1:-1:-1;;;43944:16:0;;43934:44;43944:16;43935:6;:25;:::i;:::-;43934:44;;;;:::i;:::-;44021:14;;43918:60;;-1:-1:-1;33749:4:0;;44012:23;;-1:-1:-1;;;44021:14:0;;44011:42;44021:14;44012:6;:23;:::i;43716:777::-;44115:15;;33749:4;;44106:24;;-1:-1:-1;;;44115:15:0;;44105:43;44115:15;44106:6;:24;:::i;:::-;44105:43;;;;:::i;:::-;44214:20;;44094:54;;-1:-1:-1;33749:4:0;;44205:29;;-1:-1:-1;;;44214:20:0;;44204:69;44214:20;44205:6;:29;:::i;:::-;44204:69;;;;:::i;:::-;44339:20;;44167:106;;-1:-1:-1;33749:4:0;;44330:29;;-1:-1:-1;;;44339:20:0;;44329:69;44339:20;44330:6;:29;:::i;:::-;44329:69;;;;:::i;:::-;44441:18;;44292:106;;-1:-1:-1;33749:4:0;;44432:27;;-1:-1:-1;;;44441:18:0;;44431:46;44441:18;44432:6;:27;:::i;:::-;44431:46;;;;:::i;:::-;44417:60;;43716:777;44509:155;44542:4;44565:2;44638:11;44622:13;44606;44586:17;44595:8;44586:6;:17;:::i;:::-;:33;;;;:::i;:::-;:49;;;;:::i;:::-;:63;;;;:::i;:::-;44509:14;:155::i;:::-;44688:23;44818:11;44789:13;44760;44714:30;44736:8;44714:6;:30;:::i;:::-;:59;;;;:::i;:::-;:88;;;;:::i;:::-;:115;;;;:::i;:::-;44688:141;;44840:42;44856:4;44862:2;44866:15;44840;:42::i;:::-;44893:17;44995:11;44966:13;44913:37;44937:13;44913:8;:37;:::i;:::-;:66;;;;:::i;:::-;:93;;;;:::i;:::-;44893:113;-1:-1:-1;45021:13:0;;45017:292;;45051:47;45067:4;45081;45088:9;45051:15;:47::i;:::-;45139:13;45113:22;;:39;;;;;;;:::i;:::-;;;;;;;;45196:13;45167:25;;:42;;;;;;;:::i;:::-;;;;;;;;45242:8;45224:14;;:26;;;;;;;:::i;:::-;;;;;;;;45286:11;45265:17;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;45017:292:0;42449:2867;;;;;;42336:2980;;;:::o;29686:591::-;-1:-1:-1;;;;;29770:21:0;;29762:67;;;;-1:-1:-1;;;29762:67:0;;22505:2:1;29762:67:0;;;22487:21:1;22544:2;22524:18;;;22517:30;22583:34;22563:18;;;22556:62;-1:-1:-1;;;22634:18:1;;;22627:31;22675:19;;29762:67:0;22303:397:1;29762:67:0;-1:-1:-1;;;;;29929:18:0;;29904:22;29929:18;;;;;;;;;;;29966:24;;;;29958:71;;;;-1:-1:-1;;;29958:71:0;;22907:2:1;29958:71:0;;;22889:21:1;22946:2;22926:18;;;22919:30;22985:34;22965:18;;;22958:62;-1:-1:-1;;;23036:18:1;;;23029:32;23078:19;;29958:71:0;22705:398:1;29958:71:0;-1:-1:-1;;;;;30065:18:0;;:9;:18;;;;;;;;;;30086:23;;;30065:44;;30131:12;:22;;30103:6;;30065:9;30131:22;;30103:6;;30131:22;:::i;:::-;;;;-1:-1:-1;;30171:37:0;;3511:25:1;;;30197:1:0;;-1:-1:-1;;;;;30171:37:0;;;;;3499:2:1;3484:18;30171:37:0;;;;;;;50284:113:::1;50170:234:::0;;:::o;5576:191::-;5669:6;;;-1:-1:-1;;;;;5686:17:0;;;-1:-1:-1;;;;;;5686:17:0;;;;;;;5719:40;;5669:6;;;5686:17;5669:6;;5719:40;;5650:16;;5719:40;5639:128;5576:191;:::o;14578:248::-;14749:58;;;-1:-1:-1;;;;;23300:32:1;;14749:58:0;;;23282:51:1;23349:18;;;;23342:34;;;14749:58:0;;;;;;;;;;23255:18:1;;;;14749:58:0;;;;;;;;-1:-1:-1;;;;;14749:58:0;-1:-1:-1;;;14749:58:0;;;14695:123;;14729:5;;14695:19;:123::i;51671:347::-;51718:10;51730;51761:11;-1:-1:-1;;;;;51746:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51717:70;-1:-1:-1;;;;;51717:70:0;;;-1:-1:-1;;;;;51717:70:0;;;51811:22;51821:11;51811:9;:22::i;:::-;51800:8;:33;51979:6;;;;;:16;;;51994:1;51989:2;:6;51979:16;:31;;52005:5;51979:31;;;51998:4;51979:31;51964:12;:46;;;;;;;-1:-1:-1;;51964:46:0;;;;;;;;;-1:-1:-1;;51671:347:0:o;45324:1623::-;35028:16;:23;;-1:-1:-1;;;;35028:23:0;-1:-1:-1;;;35028:23:0;;;45533:17:::1;::::0;45503:14:::1;::::0;45462:25:::1;::::0;45424:22:::1;::::0;35028:23;;45533:17;45503:14;45424:63:::1;::::0;::::1;:::i;:::-;:93;;;;:::i;:::-;:126;;;;:::i;:::-;45397:153:::0;-1:-1:-1;45565:21:0;;;:59:::1;;;45608:16;45590:15;:34;45565:59;45561:98;;;45641:7;;;45561:98;45671:26;45725:1;45700:22;;:26;;;;:::i;:::-;45671:55;;45737:25;45765:21;45737:49;;45797:14;45889:17;;45848:25;;45814:18;:59;;;;:::i;:::-;:92;;;;:::i;:::-;45797:109;;45917:24;45934:6;45917:16;:24::i;:::-;45952:18;45973:41;45997:17:::0;45973:21:::1;:41;:::i;:::-;45952:62;;46027:23;46109:6;46067:25;;46054:10;:38;;;;:::i;:::-;46053:62;;;;:::i;:::-;46027:88:::0;-1:-1:-1;46126:23:0::1;46188:6:::0;46153:31:::1;46166:18:::0;46153:10;:31:::1;:::i;:::-;46152:42;;;;:::i;:::-;46126:68;;46205:21;46264:6;46243:17;;46230:10;:30;;;;:::i;:::-;46229:41;;;;:::i;:::-;46205:65;;46308:1;46287:18;:22;:45;;;;;46331:1;46313:15;:19;46287:45;46283:127;;;46349:49;46362:18;46382:15;46349:12;:49::i;:::-;46467:19;::::0;46459:110:::1;::::0;46420:12:::1;::::0;-1:-1:-1;;;;;46467:19:0::1;::::0;46549:5:::1;::::0;46514:15;;46420:12;46459:110;46420:12;46459:110;46514:15;46467:19;46549:5;46459:110:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;46602:17:0::1;::::0;46594:106:::1;::::0;46445:124;;-1:-1:-1;;;;;;46602:17:0::1;::::0;46680:5:::1;::::0;46647:13;;46594:106:::1;::::0;;;46647:13;46602:17;46680:5;46594:106:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;46717:14:0::1;::::0;46580:120;;-1:-1:-1;46717:18:0;46713:87:::1;;46752:36;46766:4;46773:14;;46752:5;:36::i;:::-;-1:-1:-1::0;;46837:1:0::1;46812:22;:26:::0;;;46849:25:::1;:29:::0;;;46889:14:::1;:18:::0;;;46918:17:::1;:21:::0;-1:-1:-1;;;;;;;35062:1:0::1;-1:-1:-1::0;35074:16:0;:24;;-1:-1:-1;;;;35074:24:0;;;45324:1623::o;52388:998::-;-1:-1:-1;;;;;52541:13:0;;52512:26;52541:13;;;:7;:13;;;;;;;;52512:42;;;;;;;;;;;;;;;;;;;;;;;52541:13;;52512:42;;52541:13;;52512:42;;;52541:13;52512:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52512:42:0;;;-1:-1:-1;;52512:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52583:16;;;;52512:42;;-1:-1:-1;52583:16:0;:55;;-1:-1:-1;;;;;;52616:11:0;;;;;;:7;:11;;;;;:22;;;;;52583:55;:85;;;-1:-1:-1;52656:12:0;;;;;;;52655:13;52583:85;:133;;;-1:-1:-1;;;;;;52685:31:0;;;;;;:25;:31;;;;;;;;52583:133;:166;;;-1:-1:-1;52733:16:0;;-1:-1:-1;;;52733:16:0;;;;52583:166;:221;;;-1:-1:-1;52768:12:0;;;;52767:13;:36;;;;-1:-1:-1;52784:14:0;;;;:19;52767:36;52565:377;;;52924:7;52388:998;;;:::o;52565:377::-;52952:16;52971:24;52983:11;52971;:24::i;:::-;-1:-1:-1;;;;;53006:13:0;;;;;;:7;:13;;;;;;;:28;;;;:50;;;;;;;;;;;;;53040:15;53006:50;;;53067:40;;;;;;;;;;;;;;;;;52952:43;;-1:-1:-1;53149:23:0;53014:4;53149:17;:23::i;:::-;53118:54;;53185:13;53201:5;:14;;;53219:1;53201:19;:50;;53237:5;:14;;;53201:50;;;53223:11;;53201:50;53185:66;;53308:5;53284:20;:29;;53262:116;;;;-1:-1:-1;;;53262:116:0;;24447:2:1;53262:116:0;;;24429:21:1;24486:2;24466:18;;;24459:30;24525:34;24505:18;;;24498:62;-1:-1:-1;;;24576:18:1;;;24569:35;24621:19;;53262:116:0;24245:401:1;27959:708:0;-1:-1:-1;;;;;28090:18:0;;28082:68;;;;-1:-1:-1;;;28082:68:0;;24853:2:1;28082:68:0;;;24835:21:1;24892:2;24872:18;;;24865:30;24931:34;24911:18;;;24904:62;-1:-1:-1;;;24982:18:1;;;24975:35;25027:19;;28082:68:0;24651:401:1;28082:68:0;-1:-1:-1;;;;;28169:16:0;;28161:64;;;;-1:-1:-1;;;28161:64:0;;25259:2:1;28161:64:0;;;25241:21:1;25298:2;25278:18;;;25271:30;25337:34;25317:18;;;25310:62;-1:-1:-1;;;25388:18:1;;;25381:33;25431:19;;28161:64:0;25057:399:1;28161:64:0;-1:-1:-1;;;;;28311:15:0;;28289:19;28311:15;;;;;;;;;;;28359:21;;;;28337:109;;;;-1:-1:-1;;;28337:109:0;;25663:2:1;28337:109:0;;;25645:21:1;25702:2;25682:18;;;25675:30;25741:34;25721:18;;;25714:62;-1:-1:-1;;;25792:18:1;;;25785:36;25838:19;;28337:109:0;25461:402:1;28337:109:0;-1:-1:-1;;;;;28482:15:0;;;:9;:15;;;;;;;;;;;28500:20;;;28482:38;;28542:13;;;;;;;;:23;;28514:6;;28482:9;28542:23;;28514:6;;28542:23;:::i;:::-;;;;;;;;28598:2;-1:-1:-1;;;;;28583:26:0;28592:4;-1:-1:-1;;;;;28583:26:0;;28602:6;28583:26;;;;3511:25:1;;3499:2;3484:18;;3365:177;28583:26:0;;;;;;;;28622:37;50170:234;17545:802;17969:23;17995:106;18037:4;17995:106;;;;;;;;;;;;;;;;;18003:5;-1:-1:-1;;;;;17995:27:0;;;:106;;;;;:::i;:::-;18116:17;;17969:132;;-1:-1:-1;18116:21:0;18112:228;;18231:10;18220:30;;;;;;;;;;;;:::i;:::-;18194:134;;;;-1:-1:-1;;;18194:134:0;;26320:2:1;18194:134:0;;;26302:21:1;26359:2;26339:18;;;26332:30;26398:34;26378:18;;;26371:62;-1:-1:-1;;;26449:18:1;;;26442:40;26499:19;;18194:134:0;26118:406:1;46955:394:0;47045:16;;;47059:1;47045:16;;;;;;;;47021:21;;47045:16;;;;;;;;;;-1:-1:-1;47045:16:0;47021:40;;47090:4;47072;47077:1;47072:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;47072:23:0;;;-1:-1:-1;;;;;47072:23:0;;;;;47116:13;-1:-1:-1;;;;;47116:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47106:4;47111:1;47106:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47106:30:0;;;:7;;;;;;;;;:30;47147:194;;-1:-1:-1;;;47147:194:0;;:13;:64;;;;;;:194;;47226:11;;47252:1;;47268:4;;47295;;47315:15;;47147:194;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47010:339;46955:394;:::o;47357:339::-;47438:13;-1:-1:-1;;;;;47438:29:0;;47475:9;47508:4;47528:11;47554:1;47597;47640:7;4342:6;;-1:-1:-1;;;;;4342:6:0;;4269:87;47640:7;47438:250;;;;;;-1:-1:-1;;;;;;47438:250:0;;;-1:-1:-1;;;;;27475:15:1;;;47438:250:0;;;27457:34:1;27507:18;;;27500:34;;;;27550:18;;;27543:34;;;;27593:18;;;27586:34;27657:15;;;27636:19;;;27629:44;47662:15:0;27689:19:1;;;27682:35;27391:19;;47438:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;47357:339;;:::o;9624:229::-;9761:12;9793:52;9815:6;9823:4;9829:1;9832:12;9793:21;:52::i;:::-;9786:59;9624:229;-1:-1:-1;;;;9624:229:0:o;10840:571::-;11010:12;11082:5;11057:21;:30;;11035:118;;;;-1:-1:-1;;;11035:118:0;;28241:2:1;11035:118:0;;;28223:21:1;28280:2;28260:18;;;28253:30;28319:34;28299:18;;;28292:62;-1:-1:-1;;;28370:18:1;;;28363:36;28416:19;;11035:118:0;28039:402:1;11035:118:0;-1:-1:-1;;;;;7077:19:0;;;11164:60;;;;-1:-1:-1;;;11164:60:0;;28648:2:1;11164:60:0;;;28630:21:1;28687:2;28667:18;;;28660:30;28726:31;28706:18;;;28699:59;28775:18;;11164:60:0;28446:353:1;11164:60:0;11238:12;11252:23;11279:6;-1:-1:-1;;;;;11279:11:0;11298:5;11319:4;11279:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11237:97;;;;11352:51;11369:7;11378:10;11390:12;11352:16;:51::i;:::-;11345:58;10840:571;-1:-1:-1;;;;;;;10840:571:0:o;13800:712::-;13950:12;13979:7;13975:530;;;-1:-1:-1;14010:10:0;14003:17;;13975:530;14124:17;;:21;14120:374;;14322:10;14316:17;14383:15;14370:10;14366:2;14362:19;14355:44;14120:374;14465:12;14458:20;;-1:-1:-1;;;14458:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;626:250::-;711:1;721:113;735:6;732:1;729:13;721:113;;;811:11;;;805:18;792:11;;;785:39;757:2;750:10;721:113;;;-1:-1:-1;;868:1:1;850:16;;843:27;626:250::o;881:396::-;1030:2;1019:9;1012:21;993:4;1062:6;1056:13;1105:6;1100:2;1089:9;1085:18;1078:34;1121:79;1193:6;1188:2;1177:9;1173:18;1168:2;1160:6;1156:15;1121:79;:::i;:::-;1261:2;1240:15;-1:-1:-1;;1236:29:1;1221:45;;;;1268:2;1217:54;;881:396;-1:-1:-1;;881:396:1:o;1282:315::-;1350:6;1358;1411:2;1399:9;1390:7;1386:23;1382:32;1379:52;;;1427:1;1424;1417:12;1379:52;1466:9;1453:23;1485:31;1510:5;1485:31;:::i;:::-;1535:5;1587:2;1572:18;;;;1559:32;;-1:-1:-1;;;1282:315:1:o;1794:127::-;1855:10;1850:3;1846:20;1843:1;1836:31;1886:4;1883:1;1876:15;1910:4;1907:1;1900:15;1926:275;1997:2;1991:9;2062:2;2043:13;;-1:-1:-1;;2039:27:1;2027:40;;2097:18;2082:34;;2118:22;;;2079:62;2076:88;;;2144:18;;:::i;:::-;2180:2;2173:22;1926:275;;-1:-1:-1;1926:275:1:o;2206:183::-;2266:4;2299:18;2291:6;2288:30;2285:56;;;2321:18;;:::i;:::-;-1:-1:-1;2366:1:1;2362:14;2378:4;2358:25;;2206:183::o;2394:966::-;2478:6;2509:2;2552;2540:9;2531:7;2527:23;2523:32;2520:52;;;2568:1;2565;2558:12;2520:52;2608:9;2595:23;2641:18;2633:6;2630:30;2627:50;;;2673:1;2670;2663:12;2627:50;2696:22;;2749:4;2741:13;;2737:27;-1:-1:-1;2727:55:1;;2778:1;2775;2768:12;2727:55;2814:2;2801:16;2837:60;2853:43;2893:2;2853:43;:::i;:::-;2837:60;:::i;:::-;2931:15;;;3013:1;3009:10;;;;3001:19;;2997:28;;;2962:12;;;;3037:19;;;3034:39;;;3069:1;3066;3059:12;3034:39;3093:11;;;;3113:217;3129:6;3124:3;3121:15;3113:217;;;3209:3;3196:17;3226:31;3251:5;3226:31;:::i;:::-;3270:18;;3146:12;;;;3308;;;;3113:217;;3740:367;3803:8;3813:6;3867:3;3860:4;3852:6;3848:17;3844:27;3834:55;;3885:1;3882;3875:12;3834:55;-1:-1:-1;3908:20:1;;3951:18;3940:30;;3937:50;;;3983:1;3980;3973:12;3937:50;4020:4;4012:6;4008:17;3996:29;;4080:3;4073:4;4063:6;4060:1;4056:14;4048:6;4044:27;4040:38;4037:47;4034:67;;;4097:1;4094;4087:12;4034:67;3740:367;;;;;:::o;4112:437::-;4198:6;4206;4259:2;4247:9;4238:7;4234:23;4230:32;4227:52;;;4275:1;4272;4265:12;4227:52;4315:9;4302:23;4348:18;4340:6;4337:30;4334:50;;;4380:1;4377;4370:12;4334:50;4419:70;4481:7;4472:6;4461:9;4457:22;4419:70;:::i;:::-;4508:8;;4393:96;;-1:-1:-1;4112:437:1;-1:-1:-1;;;;4112:437:1:o;4554:159::-;4621:20;;4681:6;4670:18;;4660:29;;4650:57;;4703:1;4700;4693:12;4650:57;4554:159;;;:::o;4718:401::-;4800:6;4808;4816;4824;4877:3;4865:9;4856:7;4852:23;4848:33;4845:53;;;4894:1;4891;4884:12;4845:53;4917:28;4935:9;4917:28;:::i;:::-;4907:38;;4964:37;4997:2;4986:9;4982:18;4964:37;:::i;:::-;4954:47;;5020:37;5053:2;5042:9;5038:18;5020:37;:::i;:::-;5010:47;;5076:37;5109:2;5098:9;5094:18;5076:37;:::i;:::-;5066:47;;4718:401;;;;;;;:::o;5124:456::-;5201:6;5209;5217;5270:2;5258:9;5249:7;5245:23;5241:32;5238:52;;;5286:1;5283;5276:12;5238:52;5325:9;5312:23;5344:31;5369:5;5344:31;:::i;:::-;5394:5;-1:-1:-1;5451:2:1;5436:18;;5423:32;5464:33;5423:32;5464:33;:::i;:::-;5124:456;;5516:7;;-1:-1:-1;;;5570:2:1;5555:18;;;;5542:32;;5124:456::o;5585:461::-;5638:3;5676:5;5670:12;5703:6;5698:3;5691:19;5729:4;5758:2;5753:3;5749:12;5742:19;;5795:2;5788:5;5784:14;5816:1;5826:195;5840:6;5837:1;5834:13;5826:195;;;5905:13;;-1:-1:-1;;;;;5901:39:1;5889:52;;5961:12;;;;5996:15;;;;5937:1;5855:9;5826:195;;;-1:-1:-1;6037:3:1;;5585:461;-1:-1:-1;;;;;5585:461:1:o;6051:261::-;6230:2;6219:9;6212:21;6193:4;6250:56;6302:2;6291:9;6287:18;6279:6;6250:56;:::i;6506:180::-;6565:6;6618:2;6606:9;6597:7;6593:23;6589:32;6586:52;;;6634:1;6631;6624:12;6586:52;-1:-1:-1;6657:23:1;;6506:180;-1:-1:-1;6506:180:1:o;6691:435::-;6744:3;6782:5;6776:12;6809:6;6804:3;6797:19;6835:4;6864:2;6859:3;6855:12;6848:19;;6901:2;6894:5;6890:14;6922:1;6932:169;6946:6;6943:1;6940:13;6932:169;;;7007:13;;6995:26;;7041:12;;;;7076:15;;;;6968:1;6961:9;6932:169;;7131:790;7322:2;7311:9;7304:21;7285:4;7360:6;7354:13;7403:4;7398:2;7387:9;7383:18;7376:32;7431:63;7489:3;7478:9;7474:19;7460:12;7431:63;:::i;:::-;7417:77;;7543:2;7535:6;7531:15;7525:22;7615:2;7611:7;7599:9;7591:6;7587:22;7583:36;7578:2;7567:9;7563:18;7556:64;7643:52;7688:6;7672:14;7643:52;:::i;:::-;7629:66;;;7749:2;7741:6;7737:15;7731:22;7726:2;7715:9;7711:18;7704:50;7809:2;7801:6;7797:15;7791:22;7785:3;7774:9;7770:19;7763:51;7884:3;7876:6;7872:16;7866:23;7859:31;7852:39;7845:4;7834:9;7830:20;7823:69;7909:6;7901:14;;;7131:790;;;;:::o;8157:118::-;8243:5;8236:13;8229:21;8222:5;8219:32;8209:60;;8265:1;8262;8255:12;8280:241;8336:6;8389:2;8377:9;8368:7;8364:23;8360:32;8357:52;;;8405:1;8402;8395:12;8357:52;8444:9;8431:23;8463:28;8485:5;8463:28;:::i;8734:382::-;8799:6;8807;8860:2;8848:9;8839:7;8835:23;8831:32;8828:52;;;8876:1;8873;8866:12;8828:52;8915:9;8902:23;8934:31;8959:5;8934:31;:::i;:::-;8984:5;-1:-1:-1;9041:2:1;9026:18;;9013:32;9054:30;9013:32;9054:30;:::i;:::-;9103:7;9093:17;;;8734:382;;;;;:::o;9121:402::-;9203:6;9211;9264:2;9252:9;9243:7;9239:23;9235:32;9232:52;;;9280:1;9277;9270:12;9232:52;9319:9;9306:23;9338:31;9363:5;9338:31;:::i;:::-;9388:5;-1:-1:-1;9445:2:1;9430:18;;9417:32;9458:33;9417:32;9458:33;:::i;9921:1088::-;10079:6;10087;10095;10103;10111;10119;10172:2;10160:9;10151:7;10147:23;10143:32;10140:52;;;10188:1;10185;10178:12;10140:52;10228:9;10215:23;10257:18;10298:2;10290:6;10287:14;10284:34;;;10314:1;10311;10304:12;10284:34;10353:70;10415:7;10406:6;10395:9;10391:22;10353:70;:::i;:::-;10442:8;;-1:-1:-1;10327:96:1;-1:-1:-1;10530:2:1;10515:18;;10502:32;;-1:-1:-1;10546:16:1;;;10543:36;;;10575:1;10572;10565:12;10543:36;10614:72;10678:7;10667:8;10656:9;10652:24;10614:72;:::i;:::-;10705:8;;-1:-1:-1;10588:98:1;-1:-1:-1;10793:2:1;10778:18;;10765:32;;-1:-1:-1;10809:16:1;;;10806:36;;;10838:1;10835;10828:12;10806:36;;10877:72;10941:7;10930:8;10919:9;10915:24;10877:72;:::i;:::-;9921:1088;;;;-1:-1:-1;9921:1088:1;;-1:-1:-1;9921:1088:1;;10968:8;;9921:1088;-1:-1:-1;;;9921:1088:1:o;11014:356::-;11216:2;11198:21;;;11235:18;;;11228:30;11294:34;11289:2;11274:18;;11267:62;11361:2;11346:18;;11014:356::o;11720:127::-;11781:10;11776:3;11772:20;11769:1;11762:31;11812:4;11809:1;11802:15;11836:4;11833:1;11826:15;11852:127;11913:10;11908:3;11904:20;11901:1;11894:31;11944:4;11941:1;11934:15;11968:4;11965:1;11958:15;11984:128;12051:9;;;12072:11;;;12069:37;;;12086:18;;:::i;12117:127::-;12178:10;12173:3;12169:20;12166:1;12159:31;12209:4;12206:1;12199:15;12233:4;12230:1;12223:15;12249:135;12288:3;12309:17;;;12306:43;;12329:18;;:::i;:::-;-1:-1:-1;12376:1:1;12365:13;;12249:135::o;12389:380::-;12468:1;12464:12;;;;12511;;;12532:61;;12586:4;12578:6;12574:17;12564:27;;12532:61;12639:2;12631:6;12628:14;12608:18;12605:38;12602:161;;12685:10;12680:3;12676:20;12673:1;12666:31;12720:4;12717:1;12710:15;12748:4;12745:1;12738:15;12602:161;;12389:380;;;:::o;13123:168::-;13190:6;13216:10;;;13228;;;13212:27;;13251:11;;;13248:37;;;13265:18;;:::i;:::-;13248:37;13123:168;;;;:::o;13999:125::-;14064:9;;;14085:10;;;14082:36;;;14098:18;;:::i;15416:136::-;15455:3;15483:5;15473:39;;15492:18;;:::i;:::-;-1:-1:-1;;;15528:18:1;;15416:136::o;16679:184::-;16749:6;16802:2;16790:9;16781:7;16777:23;16773:32;16770:52;;;16818:1;16815;16808:12;16770:52;-1:-1:-1;16841:16:1;;16679:184;-1:-1:-1;16679:184:1:o;17204:251::-;17274:6;17327:2;17315:9;17306:7;17302:23;17298:32;17295:52;;;17343:1;17340;17333:12;17295:52;17375:9;17369:16;17394:31;17419:5;17394:31;:::i;17460:332::-;17667:6;17656:9;17649:25;17710:2;17705;17694:9;17690:18;17683:30;17630:4;17730:56;17782:2;17771:9;17767:18;17759:6;17730:56;:::i;17797:881::-;17892:6;17923:2;17966;17954:9;17945:7;17941:23;17937:32;17934:52;;;17982:1;17979;17972:12;17934:52;18015:9;18009:16;18048:18;18040:6;18037:30;18034:50;;;18080:1;18077;18070:12;18034:50;18103:22;;18156:4;18148:13;;18144:27;-1:-1:-1;18134:55:1;;18185:1;18182;18175:12;18134:55;18214:2;18208:9;18237:60;18253:43;18293:2;18253:43;:::i;18237:60::-;18331:15;;;18413:1;18409:10;;;;18401:19;;18397:28;;;18362:12;;;;18437:19;;;18434:39;;;18469:1;18466;18459:12;18434:39;18493:11;;;;18513:135;18529:6;18524:3;18521:15;18513:135;;;18595:10;;18583:23;;18546:12;;;;18626;;;;18513:135;;21908:168;21981:9;;;22012;;22029:15;;;22023:22;;22009:37;21999:71;;22050:18;;:::i;22081:217::-;22121:1;22147;22137:132;;22191:10;22186:3;22182:20;22179:1;22172:31;22226:4;22223:1;22216:15;22254:4;22251:1;22244:15;22137:132;-1:-1:-1;22283:9:1;;22081:217::o;23387:188::-;23466:13;;-1:-1:-1;;;;;23508:42:1;;23498:53;;23488:81;;23565:1;23562;23555:12;23580:450;23667:6;23675;23683;23736:2;23724:9;23715:7;23711:23;23707:32;23704:52;;;23752:1;23749;23742:12;23704:52;23775:40;23805:9;23775:40;:::i;:::-;23765:50;;23834:49;23879:2;23868:9;23864:18;23834:49;:::i;:::-;23824:59;;23926:2;23915:9;23911:18;23905:25;23970:10;23963:5;23959:22;23952:5;23949:33;23939:61;;23996:1;23993;23986:12;23939:61;24019:5;24009:15;;;23580:450;;;;;:::o;25868:245::-;25935:6;25988:2;25976:9;25967:7;25963:23;25959:32;25956:52;;;26004:1;26001;25994:12;25956:52;26036:9;26030:16;26055:28;26077:5;26055:28;:::i;26529:582::-;26828:6;26817:9;26810:25;26871:6;26866:2;26855:9;26851:18;26844:34;26914:3;26909:2;26898:9;26894:18;26887:31;26791:4;26935:57;26987:3;26976:9;26972:19;26964:6;26935:57;:::i;:::-;-1:-1:-1;;;;;27028:32:1;;;;27023:2;27008:18;;27001:60;-1:-1:-1;27092:3:1;27077:19;27070:35;26927:65;26529:582;-1:-1:-1;;;26529:582:1:o;27728:306::-;27816:6;27824;27832;27885:2;27873:9;27864:7;27860:23;27856:32;27853:52;;;27901:1;27898;27891:12;27853:52;27930:9;27924:16;27914:26;;27980:2;27969:9;27965:18;27959:25;27949:35;;28024:2;28013:9;28009:18;28003:25;27993:35;;27728:306;;;;;:::o;28804:287::-;28933:3;28971:6;28965:13;28987:66;29046:6;29041:3;29034:4;29026:6;29022:17;28987:66;:::i;:::-;29069:16;;;;;28804:287;-1:-1:-1;;28804:287:1:o

Swarm Source

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