ETH Price: $3,093.27 (-1.30%)

Token

JPEG MORGAN (JPG)
 

Overview

Max Total Supply

10,000,000 JPG

Holders

468

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,057.215729570539816288 JPG

Value
$0.00
0x764f4909251f81976a0a2dcebce95333e4c27517
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
jpegMorgan

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-13
*/

/*
   Find us on Twitter https://twitter.com/JPEGMorganCap
   https://jpegmorgan.capital/
   https://t.me/jpegmorgan

   A labor of love for @sodefi from Misa. 
   WGMI
    
*/

// SPDX-License-Identifier: MIT

pragma solidity =0.8.10 >=0.8.0 <0.9.0;
pragma experimental ABIEncoderV2;


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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @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);
    }
}

interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

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

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

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

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

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

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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


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

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

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

contract jpegMorgan is Ownable, IERC20 {
    address UNISWAPROUTER = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    string private _name = "JPEG MORGAN";
    string private _symbol = "JPG";

    uint256 public jpgBankFee = 800;
    uint256 private previousJPGBankFee = jpgBankFee;

    uint256 public liquidityFee = 200;
    uint256 private previousLiquidityFee = liquidityFee;

    uint256 public dividendFee = 300;
    uint256 private previousDividendFee = dividendFee;

    uint256 public totalFee = 1300;
    uint256 private previousTotalFee = totalFee;

    uint256 public swapTokensAtAmount = 1000 * 1e18;
    uint256 public lastSwapTime;
    bool swapAllToken = true;

    bool public misa = true;
    bool public taxEnabled = true; //check
    bool public compoundingEnabled = false;

    bool private boughtEarly = true; //added
    mapping(address => uint256) private _lastTrans;
    uint256 private _firstBlock;
    uint256 private _botBlocks;
    bool public timeRugEnabled = true;

    uint256 private _totalSupply;
    bool private swapping;

    address payable jpgBankWallet;
    address payable liquidityWallet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _whiteList;
    mapping(address => bool) isBlacklisted;
    mapping (address => bool) private snipe; //added


    event SwapAndAddLiquidity(
        uint256 tokensSwapped,
        uint256 nativeReceived,
        uint256 tokensIntoLiquidity
    );
    event SendDividends(uint256 tokensSwapped, uint256 amount);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event Misa(bool enabled);
    event TaxEnabled(bool enabled);
    event CompoundingEnabled(bool enabled);
    event BlacklistEnabled(bool enabled);
    event EndedBoughtEarly(bool boughtEarly); //added


    DividendTracker public dividendTracker;
    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;

    uint256 public maxTx = 9991 * 1e18;
    uint256 public maxWallet = 50000 * 1e18;

    bool isOpen = false;

    mapping(address => bool) private _isExcludedFromMaxTx;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    constructor(
        address payable _jpgBankWallet,
        address[] memory whitelistAddress
    ) {
        jpgBankWallet = _jpgBankWallet;
        liquidityWallet = payable(0x0B9d6b075e2e8816545d8b24e4651F4C8643f234); 
        includeToWhiteList(whitelistAddress);

        dividendTracker = new DividendTracker(address(this), UNISWAPROUTER);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPROUTER);

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router), true);

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(dividendTracker), true);
        excludeFromFees(address(jpgBankWallet), true);


        excludeFromMaxTx(owner(), true);
        excludeFromMaxTx(address(this), true);
        excludeFromMaxTx(address(dividendTracker), true);
        excludeFromMaxTx(address(jpgBankWallet), true);
        excludeFromMaxTx(address(liquidityWallet), true);


        excludeFromMaxWallet(owner(), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(dividendTracker), true);
        excludeFromMaxWallet(address(jpgBankWallet), true);
        excludeFromMaxWallet(address(liquidityWallet), true);

        _mint(owner(), 10000000 * 1e18); // 10,000,000
    }

    receive() external payable {}

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

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

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

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

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

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

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "JPG: decreased allowance below zero"
        );
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        return true;
    }

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "JPG: transfer amount exceeds allowance"
        );
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    function partyBegins(uint256 botBlocks) private {
        _firstBlock = block.number;
        _botBlocks = botBlocks;
    }

    function addFizz(uint256 botBlocks) external onlyOwner {
        require(botBlocks < 1, "don't catch humans");
        isOpen = true;
        require(boughtEarly == true, "done");
        boughtEarly = false;
        partyBegins(botBlocks);
        emit EndedBoughtEarly(boughtEarly);
    }

    function setSnipeFee() private {
        previousJPGBankFee = jpgBankFee;
        previousLiquidityFee = liquidityFee;
        previousDividendFee = dividendFee;
        previousTotalFee = totalFee;
        
        jpgBankFee = 9000; // block 0
        liquidityFee = 0; // divided by 10000
        dividendFee = 0;
        totalFee = 9000; //snipers get rekt
    }

    function removeFee() private {
        previousJPGBankFee = jpgBankFee;
        previousLiquidityFee = liquidityFee;
        previousDividendFee = dividendFee;
        previousTotalFee = totalFee;

        jpgBankFee = 0; // removes fees for transfers
        liquidityFee = 0; // and those excluded from taxes
        dividendFee = 0; // divided by 10000
        totalFee = 0;
    }

    function restoreAllFee() private {
        jpgBankFee = previousJPGBankFee;
        liquidityFee = previousLiquidityFee;
        dividendFee = previousDividendFee;
        totalFee = previousTotalFee;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTimeRug() external onlyOwner returns (bool){
        timeRugEnabled = false;
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(
            isOpen ||
                sender == owner() ||
                recipient == owner() ||
                _whiteList[sender] ||
                _whiteList[recipient],
            "Not Open"
        );

        require(!isBlacklisted[sender], "JPG: Sender is blacklisted");
        require(!isBlacklisted[recipient], "JPG: Recipient is blacklisted");

        require(sender != address(0), "JPG: transfer from the zero address");
        require(recipient != address(0), "JPG: transfer to the zero address");

        uint256 _maxTxAmount = maxTx;
        uint256 _maxWallet = maxWallet;
        require(
            amount <= _maxTxAmount || _isExcludedFromMaxTx[sender],
            "TX Limit Exceeded"
        );

        if (
                sender != owner() &&
                recipient != owner() &&
                recipient != address(0) &&
                recipient != address(0xdead) &&
                !swapping
            ){
                if (sender == uniswapV2Pair && sender != address(uniswapV2Router)) {
                
                    if (block.number <= _firstBlock + (_botBlocks)) {
                        snipe[recipient] = true;
                    }                        

                }

                if (timeRugEnabled){
                    if (recipient != owner() && recipient != address(uniswapV2Router) && recipient != address(uniswapV2Pair)){
                        require(_lastTrans[tx.origin] < block.number, "One buy per block allowed.");
                        _lastTrans[tx.origin] = block.number;
                    }
                }
        }

        if (
            sender != owner() &&
            recipient != address(this) &&
            recipient != address(DEAD) &&
            recipient != uniswapV2Pair
         ) {
            uint256 currentBalance = balanceOf(recipient);
            require(
                _isExcludedFromMaxWallet[recipient] ||
                    (currentBalance + amount <= _maxWallet)
            );
        }

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "JPG: transfer amount exceeds balance"
        );

        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 contractNativeBalance = address(this).balance;

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            misa && // True
            canSwap && // true
            !swapping && // swapping=false !false true
            !automatedMarketMakerPairs[sender] && // no swap on remove liquidity step 1 or DEX buy
            sender != address(uniswapV2Router) && // no swap on remove liquidity step 2
            sender != owner() &&
            recipient != owner()
         ) {
            swapping = true;

            if (!swapAllToken) {
                contractTokenBalance = swapTokensAtAmount;
            }
            _executeSwap(contractTokenBalance, contractNativeBalance);

            lastSwapTime = block.timestamp;
            swapping = false;
        }

        bool takeFee;

        if (sender == address(uniswapV2Pair)) { //buy
            takeFee = true;
        }

        if (recipient == address(uniswapV2Pair)) { //sell
            takeFee = true;
        }

        if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) {
            takeFee = false;
        }

        if (swapping || !taxEnabled) {
            takeFee = false;
        }

        uint256 fees = 0;

        if (takeFee && snipe[recipient]) {
            setSnipeFee();
            fees = (amount * totalFee) / 10000;
            amount -= fees;
            _executeTransfer(sender, address(this), fees);
        }

        if(takeFee && !snipe[recipient]){
            fees = (amount * totalFee) / 10000;
            amount -= fees;
            _executeTransfer(sender, address(this), fees);
        }

        _executeTransfer(sender, recipient, amount);

        dividendTracker.setBalance(payable(sender), balanceOf(sender));
        dividendTracker.setBalance(payable(recipient), balanceOf(recipient));

        restoreAllFee();
    }

    function _executeTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "JPG: transfer from the zero address");
        require(recipient != address(0), "JPG: transfer to the zero address");
        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "JPG: transfer amount exceeds balance"
        );
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
        restoreAllFee();
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "JPG: approve from the zero address");
        require(spender != address(0), "JPG: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _mint(address account, uint256 amount) private {
        require(account != address(0), "JPG: mint to the zero address");
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) private {
        require(account != address(0), "JPG: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "JPG: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }

    function swapTokensForNative(uint256 tokens) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0, // accept any amount of native
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokens, uint256 native) private {
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.addLiquidityETH{value: native}(
            address(this),
            tokens,
            0, // slippage unavoidable
            0, // slippage unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    function includeToWhiteList(address[] memory _users) private {
        for (uint8 i = 0; i < _users.length; i++) {
            _whiteList[_users[i]] = true;
        }
    }

    function _executeSwap(uint256 tokens, uint256 native) private {
        if (tokens <= 0) {
            return;
        }

        uint256 swapTokensMarketing;
        if (address(jpgBankWallet) != address(0)) {
            swapTokensMarketing = (tokens * jpgBankFee) / totalFee;
        }

        uint256 swapTokensDividends;
        if (dividendTracker.totalSupply() > 0) {
            swapTokensDividends = (tokens * dividendFee) / totalFee;
        }

        uint256 tokensForLiquidity = tokens -
            swapTokensMarketing -
            swapTokensDividends;
        uint256 swapTokensLiquidity = tokensForLiquidity / 2;
        uint256 addTokensLiquidity = tokensForLiquidity - swapTokensLiquidity;
        uint256 swapTokensTotal = swapTokensMarketing +
            swapTokensDividends +
            swapTokensLiquidity;

        uint256 initNativeBal = address(this).balance;
        swapTokensForNative(swapTokensTotal);
        uint256 nativeSwapped = (address(this).balance - initNativeBal) +
            native;

        uint256 nativeMarketing = (nativeSwapped * swapTokensMarketing) /
            swapTokensTotal;
        uint256 nativeDividends = (nativeSwapped * swapTokensDividends) /
            swapTokensTotal;
        uint256 nativeLiquidity = nativeSwapped -
            nativeMarketing -
            nativeDividends;

        if (nativeMarketing > 0) {
            payable(jpgBankWallet).transfer(nativeMarketing);
        }

        addLiquidity(addTokensLiquidity, nativeLiquidity);
        emit SwapAndAddLiquidity(
            swapTokensLiquidity,
            nativeLiquidity,
            addTokensLiquidity
        );

        if (nativeDividends > 0) {
            (bool success, ) = address(dividendTracker).call{
                value: nativeDividends
            }("");
            if (success) {
                emit SendDividends(swapTokensDividends, nativeDividends);
            }
        }
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "JPG: account is already set to requested state"
        );
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function manualSendDividend(uint256 amount, address holder)
        external
        onlyOwner
    {
        dividendTracker.manualSendDividend(amount, holder);
    }

    function excludeFromDividends(address account, bool excluded)
        public
        onlyOwner
    {
        dividendTracker.excludeFromDividends(account, excluded);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromDividends(account);
    }

    function setWallet(
        address payable _jpgBankWallet,
        address payable _liquidityWallet
    ) external onlyOwner {
        jpgBankWallet = _jpgBankWallet;
        liquidityWallet = _liquidityWallet;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(pair != uniswapV2Pair, "JPG: DEX pair can not be removed");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setFee(
        uint256 _treasuryFee,
        uint256 _liquidityFee,
        uint256 _dividendFee
    ) external onlyOwner {
        jpgBankFee = _treasuryFee;
        liquidityFee = _liquidityFee;
        dividendFee = _dividendFee;
        totalFee = _treasuryFee + _liquidityFee + _dividendFee;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "JPG: automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            dividendTracker.excludeFromDividends(pair, true);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "JPG: the router is already set to the new address"
        );
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function claim() public {
        dividendTracker.processAccount(payable(_msgSender()));
    }

    function compound() public {
        require(compoundingEnabled, "JPG: compounding is not enabled");
        dividendTracker.compoundAccount(payable(_msgSender()));
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function withdrawnDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawnDividendOf(account);
    }

    function accumulativeDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.accumulativeDividendOf(account);
    }

    function getAccountInfo(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountInfo(account);
    }

    function getLastClaimTime(address account) public view returns (uint256) {
        return dividendTracker.getLastClaimTime(account);
    }

    function setMisa(bool _enabled) external onlyOwner {
        misa = _enabled;
        emit Misa(_enabled);
    }

    function setTaxEnabled(bool _enabled) external onlyOwner {
        taxEnabled = _enabled;
        emit TaxEnabled(_enabled);
    }

    function setCompoundingEnabled(bool _enabled) external onlyOwner {
        compoundingEnabled = _enabled;
        emit CompoundingEnabled(_enabled);
    }

    function updateDividendSettings(
        bool _misa,
        uint256 _swapTokensAtAmount,
        bool _swapAllToken
    ) external onlyOwner {
        misa = _misa;
        swapTokensAtAmount = _swapTokensAtAmount;
        swapAllToken = _swapAllToken;
    }

    function setMaxTx(uint256 amount) external onlyOwner {
        maxTx = amount;
    }

    function excludeFromMaxTx(address account, bool excluded) public onlyOwner {
        _isExcludedFromMaxTx[account] = excluded;
    }

    function isExcludedFromMaxTx(address account) public view returns (bool) {
        return _isExcludedFromMaxTx[account];
    }

    function setMaxWallet(uint256 amount) external onlyOwner {
        maxWallet = amount;
    }

    function excludeFromMaxWallet(address account, bool excluded)
        public
        onlyOwner
    {
        _isExcludedFromMaxWallet[account] = excluded;
    }

    function isExcludedFromMaxWallet(address account)
        public
        view
        returns (bool)
    {
        return _isExcludedFromMaxWallet[account];
    }

    function rescueToken(address _token, uint256 _amount) external onlyOwner {
        IERC20(_token).transfer(msg.sender, _amount);
    }

    function rescueETH(uint256 _amount) external onlyOwner {
        payable(msg.sender).transfer(_amount);
    }

    function blackList(address _user) public onlyOwner {
        require(!isBlacklisted[_user], "user already blacklisted");
        isBlacklisted[_user] = true;
        // events?
    }

    function removeFromBlacklist(address _user) public onlyOwner {
        require(isBlacklisted[_user], "user already whitelisted");
        isBlacklisted[_user] = false;
        //events?
    }

    function openTrading(address[] memory _users) public onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            isBlacklisted[_users[i]] = true;
        }
    }

    function unBlackListMany(address[] memory _users) public onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            isBlacklisted[_users[i]] = false;
        }
    }

    function airdrop(address[] memory airdropWallets, uint256[] memory amounts) external onlyOwner {
        require(airdropWallets.length < 200, "Can only airdrop 200 wallets per txn due to gas limits"); // allows for airdrop
        for(uint256 i = 0; i < airdropWallets.length; i++){
            address wallet = airdropWallets[i];
            uint256 amount = amounts[i];
            _transfer(msg.sender, wallet, amount);
        }
    }

    
}

contract DividendTracker is Ownable, IERC20 {
    address UNISWAPROUTER;

    string private _name = "JPG_DividendTracker";
    string private _symbol = "JPG_DT";

    uint256 public lastProcessedIndex;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    uint256 private constant magnitude = 2**128;
    uint256 public immutable minTokenBalanceForDividends;
    uint256 private magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    uint256 public totalDividendsWithdrawn;

    address public tokenAddress;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => int256) private magnifiedDividendCorrections;
    mapping(address => uint256) private withdrawnDividends;
    mapping(address => uint256) private lastClaimTimes;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
    event ExcludeFromDividends(address indexed account, bool excluded);
    event Claim(address indexed account, uint256 amount);
    event Compound(address indexed account, uint256 amount, uint256 tokens);

    struct AccountInfo {
        address account;
        uint256 withdrawableDividends;
        uint256 totalDividends;
        uint256 lastClaimTime;
    }

    constructor(address _tokenAddress, address _uniswapRouter) {
        minTokenBalanceForDividends = 100 * (1e18);
        tokenAddress = _tokenAddress;
        UNISWAPROUTER = _uniswapRouter;
    }

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable {
        require(_totalSupply > 0);
        if (msg.value > 0) {
            magnifiedDividendPerShare =
                magnifiedDividendPerShare +
                ((msg.value * magnitude) / _totalSupply);
            emit DividendsDistributed(msg.sender, msg.value);
            totalDividendsDistributed += msg.value;
        }
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minTokenBalanceForDividends) {
            _setBalance(account, newBalance);
        } else {
            _setBalance(account, 0);
        }
    }

    function excludeFromDividends(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            excludedFromDividends[account] != excluded,
            "JPG_DividendTracker: account already set to requested state"
        );
        excludedFromDividends[account] = excluded;
        if (excluded) {
            _setBalance(account, 0);
        } else {
            uint256 newBalance = IERC20(tokenAddress).balanceOf(account);
            if (newBalance >= minTokenBalanceForDividends) {
                _setBalance(account, newBalance);
            } else {
                _setBalance(account, 0);
            }
        }
        emit ExcludeFromDividends(account, excluded);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return excludedFromDividends[account];
    }

    function manualSendDividend(uint256 amount, address holder)
        external
        onlyOwner
    {
        uint256 contractETHBalance = address(this).balance;
        payable(holder).transfer(amount > 0 ? amount : contractETHBalance);
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = _balances[account];
        if (newBalance > currentBalance) {
            uint256 addAmount = newBalance - currentBalance;
            _mint(account, addAmount);
        } else if (newBalance < currentBalance) {
            uint256 subAmount = currentBalance - newBalance;
            _burn(account, subAmount);
        }
    }

    function _mint(address account, uint256 amount) private {
        require(
            account != address(0),
            "JPG_DividendTracker: mint to the zero address"
        );
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
        magnifiedDividendCorrections[account] =
            magnifiedDividendCorrections[account] -
            int256(magnifiedDividendPerShare * amount);
    }

    function _burn(address account, uint256 amount) private {
        require(
            account != address(0),
            "JPG_DividendTracker: burn from the zero address"
        );
        uint256 accountBalance = _balances[account];
        require(
            accountBalance >= amount,
            "JPG_DividendTracker: burn amount exceeds balance"
        );
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
        magnifiedDividendCorrections[account] =
            magnifiedDividendCorrections[account] +
            int256(magnifiedDividendPerShare * amount);
    }

    function processAccount(address payable account)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount);
            return true;
        }
        return false;
    }

    function _withdrawDividendOfUser(address payable account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[account] += _withdrawableDividend;
            totalDividendsWithdrawn += _withdrawableDividend;
            emit DividendWithdrawn(account, _withdrawableDividend);
            (bool success, ) = account.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");
            if (!success) {
                withdrawnDividends[account] -= _withdrawableDividend;
                totalDividendsWithdrawn -= _withdrawableDividend;
                return 0;
            }
            return _withdrawableDividend;
        }
        return 0;
    }

    function compoundAccount(address payable account)
        public
        onlyOwner
        returns (bool)
    {
        (uint256 amount, uint256 tokens) = _compoundDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Compound(account, amount, tokens);
            return true;
        }
        return false;
    }

    function _compoundDividendOfUser(address payable account)
        private
        returns (uint256, uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[account] += _withdrawableDividend;
            totalDividendsWithdrawn += _withdrawableDividend;
            emit DividendWithdrawn(account, _withdrawableDividend);

            IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(
                UNISWAPROUTER
            );

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(tokenAddress);

            bool success;
            uint256 tokens;

            uint256 initTokenBal = IERC20(tokenAddress).balanceOf(account);
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(0, path, address(account), block.timestamp)
            {
                success = true;
                tokens = IERC20(tokenAddress).balanceOf(account) - initTokenBal;
            } catch Error(
                string memory /*err*/
            ) {
                success = false;
            }

            if (!success) {
                withdrawnDividends[account] -= _withdrawableDividend;
                totalDividendsWithdrawn -= _withdrawableDividend;
                return (0, 0);
            }

            return (_withdrawableDividend, tokens);
        }
        return (0, 0);
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return accumulativeDividendOf(account) - withdrawnDividends[account];
    }

    function withdrawnDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return withdrawnDividends[account];
    }

    function accumulativeDividendOf(address account)
        public
        view
        returns (uint256)
    {
        int256 a = int256(magnifiedDividendPerShare * balanceOf(account));
        int256 b = magnifiedDividendCorrections[account]; // this is an explicit int256 (signed)
        return uint256(a + b) / magnitude;
    }

    function getAccountInfo(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableDividends = withdrawableDividendOf(account);
        info.totalDividends = accumulativeDividendOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableDividends,
            info.totalDividends,
            info.lastClaimTime,
            totalDividendsWithdrawn
        );
    }

    function getLastClaimTime(address account) public view returns (uint256) {
        return lastClaimTimes[account];
    }

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

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

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

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

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

    function transfer(address, uint256) public pure override returns (bool) {
        revert("JPG_DividendTracker: method not implemented");
    }

    function allowance(address, address)
        public
        pure
        override
        returns (uint256)
    {
        revert("JPG_DividendTracker: method not implemented");
    }

    function approve(address, uint256) public pure override returns (bool) {
        revert("JPG_DividendTracker: method not implemented");
    }

    function transferFrom(
        address,
        address,
        uint256
    ) public pure override returns (bool) {
        revert("JPG_DividendTracker: method not implemented");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_jpgBankWallet","type":"address"},{"internalType":"address[]","name":"whitelistAddress","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BlacklistEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CompoundingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"boughtEarly","type":"bool"}],"name":"EndedBoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"Misa","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndAddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"botBlocks","type":"uint256"}],"name":"addFizz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","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":"_user","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"disableTimeRug","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jpgBankFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"manualSendDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"misa","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCompoundingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_dividendFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setMisa","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_jpgBankWallet","type":"address"},{"internalType":"address payable","name":"_liquidityWallet","type":"address"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeRugEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"unBlackListMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_misa","type":"bool"},{"internalType":"uint256","name":"_swapTokensAtAmount","type":"uint256"},{"internalType":"bool","name":"_swapAllToken","type":"bool"}],"name":"updateDividendSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

600180546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560028054821661dead17905560038054909116905560c0604052600b60808190526a252822a39026a7a923a0a760a91b60a09081526200006c916004919062000c3a565b50604080518082019091526003808252624a504760e81b6020909201918252620000999160059162000c3a565b50610320600681905560075560c8600881905560095561012c600a819055600b55610514600c819055600d55683635c9adc5dea00000600e556010805464ffffffffff19166401000101011790556014805460ff1990811660011790915569021d9cfa5d69cfbc0000602255690a968163f0a57b4000006023556024805490911690553480156200012957600080fd5b5060405162007395380380620073958339810160408190526200014c9162000d2f565b6200015733620006f2565b601680546001600160a01b03841661010002610100600160a81b0319909116179055601780546001600160a01b031916730b9d6b075e2e8816545d8b24e4651f4c8643f234179055620001aa8162000742565b60015460405130916001600160a01b031690620001c79062000cc9565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015620001fb573d6000803e3d6000fd5b50601f80546001600160a01b0319166001600160a01b039283161790556001546040805163c45a015560e01b815290519190921691600091839163c45a01559160048083019260209291908290030181865afa15801562000260573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000286919062000e1a565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fa919062000e1a565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000348573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036e919062000e1a565b602080546001600160a01b038086166001600160a01b03199283161790925560218054928416929091169190911790559050620003ad816001620007bb565b601f5460405162241fbd60e51b81526001600160a01b03909116600482018190526001602483015290630483f7a090604401600060405180830381600087803b158015620003fa57600080fd5b505af11580156200040f573d6000803e3d6000fd5b5050601f5460405162241fbd60e51b8152306004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200045f57600080fd5b505af115801562000474573d6000803e3d6000fd5b5050601f546001600160a01b03169150630483f7a090506200049e6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620004e757600080fd5b505af1158015620004fc573d6000803e3d6000fd5b5050601f5460405162241fbd60e51b81526001600160a01b038681166004830152600160248301529091169250630483f7a09150604401600060405180830381600087803b1580156200054e57600080fd5b505af115801562000563573d6000803e3d6000fd5b50505050620005836200057b6200092860201b60201c565b600162000937565b6200059030600162000937565b601f54620005a9906001600160a01b0316600162000937565b601654620005c79061010090046001600160a01b0316600162000937565b620005e6620005de6000546001600160a01b031690565b600162000a69565b620005f330600162000a69565b601f546200060c906001600160a01b0316600162000a69565b6016546200062a9061010090046001600160a01b0316600162000a69565b60175462000643906001600160a01b0316600162000a69565b620006626200065a6000546001600160a01b031690565b600162000adf565b6200066f30600162000adf565b601f5462000688906001600160a01b0316600162000adf565b601654620006a69061010090046001600160a01b0316600162000adf565b601754620006bf906001600160a01b0316600162000adf565b620006e8620006d66000546001600160a01b031690565b6a084595161401484a00000062000b55565b5050505062000ee8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b81518160ff161015620007b7576001601c6000848460ff168151811062000770576200077062000e41565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620007ae8162000e6d565b91505062000745565b5050565b6001600160a01b0382166000908152601b602052604090205460ff1615158115151415620008565760405162461bcd60e51b815260206004820152603d60248201527f4a50473a206175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c756500000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601b60205260409020805460ff19168215801591909117909155620008ec57601f5460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b158015620008d257600080fd5b505af1158015620008e7573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000546001600160a01b031690565b6000546001600160a01b03163314620009825760405162461bcd60e51b815260206004820181905260248201526000805160206200737583398151915260448201526064016200084d565b6001600160a01b0382166000908152601a602052604090205460ff161515811515141562000a0a5760405162461bcd60e51b815260206004820152602e60248201527f4a50473a206163636f756e7420697320616c72656164792073657420746f207260448201526d657175657374656420737461746560901b60648201526084016200084d565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b0316331462000ab45760405162461bcd60e51b815260206004820181905260248201526000805160206200737583398151915260448201526064016200084d565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331462000b2a5760405162461bcd60e51b815260206004820181905260248201526000805160206200737583398151915260448201526064016200084d565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6001600160a01b03821662000bad5760405162461bcd60e51b815260206004820152601d60248201527f4a50473a206d696e7420746f20746865207a65726f206164647265737300000060448201526064016200084d565b806015600082825462000bc1919062000e90565b90915550506001600160a01b0382166000908152601860205260408120805483929062000bf090849062000e90565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b82805462000c489062000eab565b90600052602060002090601f01602090048101928262000c6c576000855562000cb7565b82601f1062000c8757805160ff191683800117855562000cb7565b8280016001018555821562000cb7579182015b8281111562000cb757825182559160200191906001019062000c9a565b5062000cc592915062000cd7565b5090565b6120cd80620052a883390190565b5b8082111562000cc5576000815560010162000cd8565b6001600160a01b038116811462000d0457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000d2a8162000cee565b919050565b6000806040838503121562000d4357600080fd5b825162000d508162000cee565b602084810151919350906001600160401b038082111562000d7057600080fd5b818601915086601f83011262000d8557600080fd5b81518181111562000d9a5762000d9a62000d07565b8060051b604051601f19603f8301168101818110858211171562000dc25762000dc262000d07565b60405291825284820192508381018501918983111562000de157600080fd5b938501935b8285101562000e0a5762000dfa8562000d1d565b8452938501939285019262000de6565b8096505050505050509250929050565b60006020828403121562000e2d57600080fd5b815162000e3a8162000cee565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81141562000e875762000e8762000e57565b60010192915050565b6000821982111562000ea65762000ea662000e57565b500190565b600181811c9082168062000ec057607f821691505b6020821081141562000ee257634e487b7160e01b600052602260045260246000fd5b50919050565b6143b08062000ef86000396000f3fe6080604052600436106103c75760003560e01c80637437681e116101f2578063bbc5453c1161010d578063e2f45605116100a0578063f4571c491161006f578063f4571c4914610beb578063f69e204614610c0b578063f8b45b0514610c20578063fe33b10814610c3657600080fd5b8063e2f4560514610b75578063e4956ce214610b8b578063f1b234ad14610bab578063f2fde38b14610bcb57600080fd5b8063c705c569116100dc578063c705c56914610acf578063d2fcc00114610aef578063d4c989d314610b0f578063dd62ed3e14610b2f57600080fd5b8063bbc5453c14610a4f578063bc33718214610a6f578063c024666814610a8f578063c6af580b14610aaf57600080fd5b80639a7a23d611610185578063a8b9d24011610154578063a8b9d240146109bf578063a9059cbb146109df578063aafd847a146109ff578063b62496f514610a1f57600080fd5b80639a7a23d61461093f5780639e252f001461095f578063a457c2d71461097f578063a680e0bc1461099f57600080fd5b80638da5cb5b116101c15780638da5cb5b146108d65780638e126944146108f457806395d89b411461091457806398118cb41461092957600080fd5b80637437681e146108345780637845008f1461084a5780637b510fe814610864578063870bd30b146108b657600080fd5b80633b7c8056116102e25780635e843ad21161027557806365b8dbc01161024457806365b8dbc01461078557806367243482146107a55780636dd3d39f146107c557806370a08231146107fe57600080fd5b80635e843ad2146106f8578063609aab0a14610718578063657c0d8014610737578063658c27a91461074c57600080fd5b80634fbee193116102b15780634fbee1931461065f578063537df3b6146106985780635b65b9ab146106b85780635d0044ca146106d857600080fd5b80633b7c8056146105f45780634838d1651461060a57806349bd5a5e1461062a5780634e71d92d1461064a57600080fd5b806323b872dd1161035a578063313ce56711610329578063313ce5671461057857806333f3d628146105945780633546f6c1146105b457806339509351146105d457600080fd5b806323b872dd146104f757806327ce0147146105175780632c1f5216146105375780632f4504ae1461055757600080fd5b806312d0ecb51161039657806312d0ecb5146104745780631694505e1461049457806318160ddd146104cc5780631df4ccfc146104e157600080fd5b80630483f7a0146103d357806306fdde03146103f5578063095ea7b3146104205780630dd871571461045057600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103f36103ee366004613c4b565b610c4c565b005b34801561040157600080fd5b5061040a610d30565b6040516104179190613c84565b60405180910390f35b34801561042c57600080fd5b5061044061043b366004613cf7565b610dc2565b6040519015158152602001610417565b34801561045c57600080fd5b50610466600f5481565b604051908152602001610417565b34801561048057600080fd5b506103f361048f366004613e39565b610dd8565b3480156104a057600080fd5b506020546104b4906001600160a01b031681565b6040516001600160a01b039091168152602001610417565b3480156104d857600080fd5b50601554610466565b3480156104ed57600080fd5b50610466600c5481565b34801561050357600080fd5b50610440610512366004613e76565b610ea4565b34801561052357600080fd5b50610466610532366004613eb7565b610f6a565b34801561054357600080fd5b50601f546104b4906001600160a01b031681565b34801561056357600080fd5b50601054610440906301000000900460ff1681565b34801561058457600080fd5b5060405160128152602001610417565b3480156105a057600080fd5b506103f36105af366004613cf7565b610ff9565b3480156105c057600080fd5b506103f36105cf366004613edb565b6110e2565b3480156105e057600080fd5b506104406105ef366004613cf7565b6111ad565b34801561060057600080fd5b5061046660065481565b34801561061657600080fd5b506103f3610625366004613eb7565b6111e4565b34801561063657600080fd5b506021546104b4906001600160a01b031681565b34801561065657600080fd5b506103f36112cb565b34801561066b57600080fd5b5061044061067a366004613eb7565b6001600160a01b03166000908152601a602052604090205460ff1690565b3480156106a457600080fd5b506103f36106b3366004613eb7565b611363565b3480156106c457600080fd5b506103f36106d3366004613ef8565b611446565b3480156106e457600080fd5b506103f36106f3366004613f24565b6114cc565b34801561070457600080fd5b506103f3610713366004613f3d565b61152b565b34801561072457600080fd5b5060105461044090610100900460ff1681565b34801561074357600080fd5b506104406115d0565b34801561075857600080fd5b50610440610767366004613eb7565b6001600160a01b031660009081526025602052604090205460ff1690565b34801561079157600080fd5b506103f36107a0366004613eb7565b61163b565b3480156107b157600080fd5b506103f36107c0366004613f7f565b61194a565b3480156107d157600080fd5b506104406107e0366004613eb7565b6001600160a01b031660009081526026602052604090205460ff1690565b34801561080a57600080fd5b50610466610819366004613eb7565b6001600160a01b031660009081526018602052604090205490565b34801561084057600080fd5b5061046660225481565b34801561085657600080fd5b506014546104409060ff1681565b34801561087057600080fd5b5061088461087f366004613eb7565b611a83565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610417565b3480156108c257600080fd5b506010546104409062010000900460ff1681565b3480156108e257600080fd5b506000546001600160a01b03166104b4565b34801561090057600080fd5b506103f361090f36600461403a565b611b26565b34801561092057600080fd5b5061040a611bd2565b34801561093557600080fd5b5061046660085481565b34801561094b57600080fd5b506103f361095a366004613c4b565b611be1565b34801561096b57600080fd5b506103f361097a366004613f24565b611ca3565b34801561098b57600080fd5b5061044061099a366004613cf7565b611d2a565b3480156109ab57600080fd5b506104666109ba366004613eb7565b611ddd565b3480156109cb57600080fd5b506104666109da366004613eb7565b611e29565b3480156109eb57600080fd5b506104406109fa366004613cf7565b611e75565b348015610a0b57600080fd5b50610466610a1a366004613eb7565b611e82565b348015610a2b57600080fd5b50610440610a3a366004613eb7565b601b6020526000908152604090205460ff1681565b348015610a5b57600080fd5b506103f3610a6a366004613f24565b611ece565b348015610a7b57600080fd5b506103f3610a8a366004613f24565b61205c565b348015610a9b57600080fd5b506103f3610aaa366004613c4b565b6120bb565b348015610abb57600080fd5b506103f3610aca366004613edb565b612209565b348015610adb57600080fd5b50610440610aea366004613eb7565b6122ca565b348015610afb57600080fd5b506103f3610b0a366004613c4b565b612352565b348015610b1b57600080fd5b506103f3610b2a366004613c4b565b6123d7565b348015610b3b57600080fd5b50610466610b4a36600461405f565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b348015610b8157600080fd5b50610466600e5481565b348015610b9757600080fd5b506103f3610ba6366004613edb565b61245c565b348015610bb757600080fd5b506103f3610bc636600461405f565b61251e565b348015610bd757600080fd5b506103f3610be6366004613eb7565b6125df565b348015610bf757600080fd5b506103f3610c06366004613e39565b6126be565b348015610c1757600080fd5b506103f3612786565b348015610c2c57600080fd5b5061046660235481565b348015610c4257600080fd5b50610466600a5481565b6000546001600160a01b03163314610cab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601f546040517f0483f7a00000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610d1457600080fd5b505af1158015610d28573d6000803e3d6000fd5b505050505050565b606060048054610d3f9061408d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6b9061408d565b8015610db85780601f10610d8d57610100808354040283529160200191610db8565b820191906000526020600020905b815481529060010190602001808311610d9b57829003601f168201915b5050505050905090565b6000610dcf3384846127f6565b50600192915050565b6000546001600160a01b03163314610e325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60005b81518160ff161015610ea0576001601d6000848460ff1681518110610e5c57610e5c6140e1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610e988161413f565b915050610e35565b5050565b6000610eb1848484612929565b6001600160a01b038416600090815260196020908152604080832033845290915290205482811015610f4b5760405162461bcd60e51b815260206004820152602660248201527f4a50473a207472616e7366657220616d6f756e74206578636565647320616c6c60448201527f6f77616e636500000000000000000000000000000000000000000000000000006064820152608401610ca2565b610f5f8533610f5a868561415f565b6127f6565b506001949350505050565b601f546040517f27ce01470000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906327ce0147906024015b602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190614176565b92915050565b6000546001600160a01b031633146110535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156110b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dd919061418f565b505050565b6000546001600160a01b0316331461113c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60108054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517fd8312d65623ca26ce756d494c8051a378981cbf07efa5d9522a191508dfa4f8d906111a290831515815260200190565b60405180910390a150565b3360008181526019602090815260408083206001600160a01b03871684529091528120549091610dcf918590610f5a9086906141ac565b6000546001600160a01b0316331461123e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0381166000908152601d602052604090205460ff16156112a75760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610ca2565b6001600160a01b03166000908152601d60205260409020805460ff19166001179055565b601f546001600160a01b031663807ab4f7335b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061418f565b50565b6000546001600160a01b031633146113bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0381166000908152601d602052604090205460ff166114255760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610ca2565b6001600160a01b03166000908152601d60205260409020805460ff19169055565b6000546001600160a01b031633146114a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60068390556008829055600a819055806114ba83856141ac565b6114c491906141ac565b600c55505050565b6000546001600160a01b031633146115265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b602355565b6000546001600160a01b031633146115855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60108054600e9390935590151560ff1993151561010002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090921691909117919091179055565b600080546001600160a01b0316331461162b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b506014805460ff19169055600190565b6000546001600160a01b031633146116955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6020546001600160a01b03828116911614156117195760405162461bcd60e51b815260206004820152603160248201527f4a50473a2074686520726f7574657220697320616c726561647920736574207460448201527f6f20746865206e657720616464726573730000000000000000000000000000006064820152608401610ca2565b6020546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3602080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905160009363c45a015592600480820193918290030181865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff91906141c4565b6001600160a01b031663c9c6539630602060009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188591906141c4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156118ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190e91906141c4565b602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555050565b6000546001600160a01b031633146119a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60c8825110611a1b5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c6574732070657260448201527f2074786e2064756520746f20676173206c696d697473000000000000000000006064820152608401610ca2565b60005b82518110156110dd576000838281518110611a3b57611a3b6140e1565b602002602001015190506000838381518110611a5957611a596140e1565b60200260200101519050611a6e338383612929565b50508080611a7b906141e1565b915050611a1e565b601f546040517f7b510fe80000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b14919061421a565b939a9299509097509550909350915050565b6000546001600160a01b03163314611b805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b601f546040517f8e126944000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03838116602483015290911690638e12694490604401610cfa565b606060058054610d3f9061408d565b6000546001600160a01b03163314611c3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6021546001600160a01b0383811691161415611c995760405162461bcd60e51b815260206004820181905260248201527f4a50473a2044455820706169722063616e206e6f742062652072656d6f7665646044820152606401610ca2565b610ea08282613307565b6000546001600160a01b03163314611cfd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b604051339082156108fc029083906000818181858888f19350505050158015610ea0573d6000803e3d6000fd5b3360009081526019602090815260408083206001600160a01b038616845290915281205482811015611dc45760405162461bcd60e51b815260206004820152602360248201527f4a50473a2064656372656173656420616c6c6f77616e63652062656c6f77207a60448201527f65726f00000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b611dd33385610f5a868561415f565b5060019392505050565b601f546040517fa680e0bc0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a680e0bc90602401610fb2565b601f546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d24090602401610fb2565b6000610dcf338484612929565b601f546040517faafd847a0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063aafd847a90602401610fb2565b6000546001600160a01b03163314611f285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60018110611f785760405162461bcd60e51b815260206004820152601260248201527f646f6e27742063617463682068756d616e7300000000000000000000000000006044820152606401610ca2565b6024805460ff19166001908117909155601054640100000000900460ff16151514611fe75760405162461bcd60e51b8152600401610ca29060208082526004908201527f646f6e6500000000000000000000000000000000000000000000000000000000604082015260600190565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff16905561201c8143601255601355565b60105460405164010000000090910460ff16151581527fbd657b4e94b205761f2ca5be9988d7b243c828f625c0746c6581ec528e507c47906020016111a2565b6000546001600160a01b031633146120b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b602255565b6000546001600160a01b031633146121155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0382166000908152601a602052604090205460ff16151581151514156121aa5760405162461bcd60e51b815260206004820152602e60248201527f4a50473a206163636f756e7420697320616c72656164792073657420746f207260448201527f65717565737465642073746174650000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146122635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6010805482151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff9091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe133906111a290831515815260200190565b601f546040517fc705c5690000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff3919061418f565b6000546001600160a01b031633146123ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146124315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146124b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b601080548215156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d43906111a290831515815260200190565b6000546001600160a01b031633146125785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b601680547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0394851602179055601780547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b6000546001600160a01b031633146126395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0381166126b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ca2565b61136081613485565b6000546001600160a01b031633146127185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60005b81518160ff161015610ea0576000601d6000848460ff1681518110612742576127426140e1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061277e8161413f565b91505061271b565b6010546301000000900460ff166127df5760405162461bcd60e51b815260206004820152601f60248201527f4a50473a20636f6d706f756e64696e67206973206e6f7420656e61626c6564006044820152606401610ca2565b601f546001600160a01b0316636de1a5a9336112de565b6001600160a01b0383166128725760405162461bcd60e51b815260206004820152602260248201527f4a50473a20617070726f76652066726f6d20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0382166128c85760405162461bcd60e51b815260206004820181905260248201527f4a50473a20617070726f766520746f20746865207a65726f20616464726573736044820152606401610ca2565b6001600160a01b0383811660008181526019602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60245460ff168061294757506000546001600160a01b038481169116145b8061295f57506000546001600160a01b038381169116145b8061298257506001600160a01b0383166000908152601c602052604090205460ff165b806129a557506001600160a01b0382166000908152601c602052604090205460ff165b6129f15760405162461bcd60e51b815260206004820152600860248201527f4e6f74204f70656e0000000000000000000000000000000000000000000000006044820152606401610ca2565b6001600160a01b0383166000908152601d602052604090205460ff1615612a5a5760405162461bcd60e51b815260206004820152601a60248201527f4a50473a2053656e64657220697320626c61636b6c69737465640000000000006044820152606401610ca2565b6001600160a01b0382166000908152601d602052604090205460ff1615612ac35760405162461bcd60e51b815260206004820152601d60248201527f4a50473a20526563697069656e7420697320626c61636b6c69737465640000006044820152606401610ca2565b6001600160a01b038316612b3f5760405162461bcd60e51b815260206004820152602360248201527f4a50473a207472616e736665722066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b038216612bbb5760405162461bcd60e51b815260206004820152602160248201527f4a50473a207472616e7366657220746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6022546023548183111580612be857506001600160a01b03851660009081526025602052604090205460ff165b612c345760405162461bcd60e51b815260206004820152601160248201527f5458204c696d69742045786365656465640000000000000000000000000000006044820152606401610ca2565b6000546001600160a01b03868116911614801590612c6057506000546001600160a01b03858116911614155b8015612c7457506001600160a01b03841615155b8015612c8b57506001600160a01b03841661dead14155b8015612c9a575060165460ff16155b15612dd0576021546001600160a01b038681169116148015612cca57506020546001600160a01b03868116911614155b15612d0957601354601254612cdf91906141ac565b4311612d09576001600160a01b0384166000908152601e60205260409020805460ff191660011790555b60145460ff1615612dd0576000546001600160a01b03858116911614801590612d4057506020546001600160a01b03858116911614155b8015612d5a57506021546001600160a01b03858116911614155b15612dd057326000908152601160205260409020544311612dbd5760405162461bcd60e51b815260206004820152601a60248201527f4f6e65206275792070657220626c6f636b20616c6c6f7765642e0000000000006044820152606401610ca2565b3260009081526011602052604090204390555b6000546001600160a01b03868116911614801590612df757506001600160a01b0384163014155b8015612e1157506002546001600160a01b03858116911614155b8015612e2b57506021546001600160a01b03858116911614155b15612e77576001600160a01b03841660009081526018602090815260408083205460269092529091205460ff1680612e6c575081612e6985836141ac565b11155b612e7557600080fd5b505b6001600160a01b03851660009081526018602052604090205483811015612f055760405162461bcd60e51b8152602060048201526024808201527f4a50473a207472616e7366657220616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b30600090815260186020526040902054600e54601054479183101590610100900460ff168015612f325750805b8015612f41575060165460ff16155b8015612f6657506001600160a01b0389166000908152601b602052604090205460ff16155b8015612f8057506020546001600160a01b038a8116911614155b8015612f9a57506000546001600160a01b038a8116911614155b8015612fb457506000546001600160a01b03898116911614155b15612fef576016805460ff1916600117905560105460ff16612fd657600e5492505b612fe083836134ed565b42600f556016805460ff191690555b6021546000906001600160a01b038b81169116141561300c575060015b6021546001600160a01b038a811691161415613026575060015b6001600160a01b038a166000908152601a602052604090205460ff168061306557506001600160a01b0389166000908152601a602052604090205460ff165b1561306e575060005b60165460ff1680613088575060105462010000900460ff16155b15613091575060005b60008180156130b857506001600160a01b038a166000908152601e602052604090205460ff165b15613123576130ef6006805460075560088054600955600a8054600b55600c8054600d556123289384905560009283905591905555565b612710600c548a6131009190614263565b61310a91906142a0565b9050613116818a61415f565b98506131238b30836137c7565b81801561314957506001600160a01b038a166000908152601e602052604090205460ff16155b1561318257612710600c548a61315f9190614263565b61316991906142a0565b9050613175818a61415f565b98506131828b30836137c7565b61318d8b8b8b6137c7565b601f546001600160a01b031663e30443bc8c6131be816001600160a01b031660009081526018602052604090205490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561321c57600080fd5b505af1158015613230573d6000803e3d6000fd5b5050601f546001600160a01b0316915063e30443bc90508b613267816001600160a01b031660009081526018602052604090205490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156132c557600080fd5b505af11580156132d9573d6000803e3d6000fd5b505050506132fa600754600655600954600855600b54600a55600d54600c55565b5050505050505050505050565b6001600160a01b0382166000908152601b602052604090205460ff161515811515141561339c5760405162461bcd60e51b815260206004820152603d60248201527f4a50473a206175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610ca2565b6001600160a01b0382166000908152601b60205260409020805460ff1916821580159190911790915561344957601f546040517f0483f7a00000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801561343057600080fd5b505af1158015613444573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082116134f9575050565b60165460009061010090046001600160a01b03161561352f57600c546006546135229085614263565b61352c91906142a0565b90505b600080601f60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614176565b11156135cc57600c54600a546135bf9086614263565b6135c991906142a0565b90505b6000816135d9848761415f565b6135e3919061415f565b905060006135f26002836142a0565b90506000613600828461415f565b905060008261360f86886141ac565b61361991906141ac565b90504761362582613a04565b600088613632834761415f565b61363c91906141ac565b905060008361364b8a84614263565b61365591906142a0565b90506000846136648a85614263565b61366e91906142a0565b905060008161367d848661415f565b613687919061415f565b905082156136cf576016546040516101009091046001600160a01b0316906108fc8515029085906000818181858888f193505050501580156136cd573d6000803e3d6000fd5b505b6136d98782613b5b565b60408051898152602081018390529081018890527fb63dc6f50047533abe2d6adf180d38d524c8d98e55ad199aac8d6b9801bbe24a9060600160405180910390a181156137b857601f546040516000916001600160a01b03169084908381818185875af1925050503d806000811461376d576040519150601f19603f3d011682016040523d82523d6000602084013e613772565b606091505b5050905080156137b657604080518c8152602081018590527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b50505050505050505050505050565b6001600160a01b0383166138435760405162461bcd60e51b815260206004820152602360248201527f4a50473a207472616e736665722066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0382166138bf5760405162461bcd60e51b815260206004820152602160248201527f4a50473a207472616e7366657220746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0383166000908152601860205260409020548181101561394d5760405162461bcd60e51b8152602060048201526024808201527f4a50473a207472616e7366657220616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b613957828261415f565b6001600160a01b03808616600090815260186020526040808220939093559085168152908120805484929061398d9084906141ac565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139d991815260200190565b60405180910390a36139fe600754600655600954600855600b54600a55600d54600c55565b50505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a3957613a396140e1565b6001600160a01b039283166020918202929092018101919091528054604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015613aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ace91906141c4565b81600181518110613ae157613ae16140e1565b6001600160a01b0392831660209182029290920181019190915254613b0991309116846127f6565b6020546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790610cfa9085906000908690309042906004016142db565b602054613b739030906001600160a01b0316846127f6565b6020546017546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613bfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c21919061434c565b5050505050565b6001600160a01b038116811461136057600080fd5b801515811461136057600080fd5b60008060408385031215613c5e57600080fd5b8235613c6981613c28565b91506020830135613c7981613c3d565b809150509250929050565b600060208083528351808285015260005b81811015613cb157858101830151858201604001528201613c95565b81811115613cc3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060408385031215613d0a57600080fd5b8235613d1581613c28565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d9957613d99613d23565b604052919050565b600067ffffffffffffffff821115613dbb57613dbb613d23565b5060051b60200190565b600082601f830112613dd657600080fd5b81356020613deb613de683613da1565b613d52565b82815260059290921b84018101918181019086841115613e0a57600080fd5b8286015b84811015613e2e578035613e2181613c28565b8352918301918301613e0e565b509695505050505050565b600060208284031215613e4b57600080fd5b813567ffffffffffffffff811115613e6257600080fd5b613e6e84828501613dc5565b949350505050565b600080600060608486031215613e8b57600080fd5b8335613e9681613c28565b92506020840135613ea681613c28565b929592945050506040919091013590565b600060208284031215613ec957600080fd5b8135613ed481613c28565b9392505050565b600060208284031215613eed57600080fd5b8135613ed481613c3d565b600080600060608486031215613f0d57600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f3657600080fd5b5035919050565b600080600060608486031215613f5257600080fd5b8335613f5d81613c3d565b9250602084013591506040840135613f7481613c3d565b809150509250925092565b60008060408385031215613f9257600080fd5b823567ffffffffffffffff80821115613faa57600080fd5b613fb686838701613dc5565b9350602091508185013581811115613fcd57600080fd5b85019050601f81018613613fe057600080fd5b8035613fee613de682613da1565b81815260059190911b8201830190838101908883111561400d57600080fd5b928401925b8284101561402b57833582529284019290840190614012565b80955050505050509250929050565b6000806040838503121561404d57600080fd5b823591506020830135613c7981613c28565b6000806040838503121561407257600080fd5b823561407d81613c28565b91506020830135613c7981613c28565b600181811c908216806140a157607f821691505b602082108114156140db577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff81141561415657614156614110565b60010192915050565b60008282101561417157614171614110565b500390565b60006020828403121561418857600080fd5b5051919050565b6000602082840312156141a157600080fd5b8151613ed481613c3d565b600082198211156141bf576141bf614110565b500190565b6000602082840312156141d657600080fd5b8151613ed481613c28565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421357614213614110565b5060010190565b600080600080600060a0868803121561423257600080fd5b855161423d81613c28565b602087015160408801516060890151608090990151929a91995097965090945092505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561429b5761429b614110565b500290565b6000826142d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561432b5784516001600160a01b031683529383019391830191600101614306565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561436157600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220118aa36d8ee3a08096dcc6d0d0ec0d47304113955560ab3df959879b2d67516a64736f6c634300080a003360e0604052601360a08190527f4a50475f4469766964656e64547261636b65720000000000000000000000000060c09081526200004091600291906200013b565b5060408051808201909152600680825265129411d7d11560d21b602090920191825262000070916003916200013b565b503480156200007e57600080fd5b50604051620020cd380380620020cd833981016040819052620000a191620001fe565b620000ac33620000eb565b68056bc75e2d63100000608052600a80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905562000273565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001499062000236565b90600052602060002090601f0160209004810192826200016d5760008555620001b8565b82601f106200018857805160ff1916838001178555620001b8565b82800160010185558215620001b8579182015b82811115620001b85782518255916020019190600101906200019b565b50620001c6929150620001ca565b5090565b5b80821115620001c65760008155600101620001cb565b80516001600160a01b0381168114620001f957600080fd5b919050565b600080604083850312156200021257600080fd5b6200021d83620001e1565b91506200022d60208401620001e1565b90509250929050565b600181811c908216806200024b57607f821691505b602082108114156200026d57634e487b7160e01b600052602260045260246000fd5b50919050565b608051611e306200029d600039600081816105320152818161085f0152610e1a0152611e306000f3fe6080604052600436106101c65760003560e01c806385a6b3ae116100f7578063a8b9d24011610095578063c705c56911610064578063c705c56914610554578063dd62ed3e1461058d578063e30443bc146105a8578063f2fde38b146105c857600080fd5b8063a8b9d240146104ca578063a9059cbb1461022d578063aafd847a146104ea578063c49af5f01461052057600080fd5b806395d89b41116100d157806395d89b41146104495780639d76ea581461045e5780639e1e06611461047e578063a680e0bc1461049457600080fd5b806385a6b3ae146103e15780638da5cb5b146103f75780638e1269441461042957600080fd5b80633009a609116101645780636de1a5a91161013e5780636de1a5a91461031957806370a08231146103395780637b510fe81461036f578063807ab4f7146103c157600080fd5b80633009a609146102b7578063313ce567146102cd5780634e7b827f146102e957600080fd5b8063095ea7b3116101a0578063095ea7b31461022d57806318160ddd1461025d57806323b872dd1461027c57806327ce01471461029757600080fd5b806303c83302146101da5780630483f7a0146101e257806306fdde031461020257600080fd5b366101d5576101d36105e8565b005b600080fd5b6101d36105e8565b3480156101ee57600080fd5b506101d36101fd36600461184e565b610684565b34801561020e57600080fd5b506102176108e9565b604051610224919061188c565b60405180910390f35b34801561023957600080fd5b5061024d6102483660046118ff565b61097b565b6040519015158152602001610224565b34801561026957600080fd5b506005545b604051908152602001610224565b34801561028857600080fd5b5061024d61024836600461192b565b3480156102a357600080fd5b5061026e6102b236600461196c565b6109ec565b3480156102c357600080fd5b5061026e60045481565b3480156102d957600080fd5b5060405160128152602001610224565b3480156102f557600080fd5b5061024d61030436600461196c565b600b6020526000908152604090205460ff1681565b34801561032557600080fd5b5061024d61033436600461196c565b610a5d565b34801561034557600080fd5b5061026e61035436600461196c565b6001600160a01b031660009081526006602052604090205490565b34801561037b57600080fd5b5061038f61038a36600461196c565b610b38565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610224565b3480156103cd57600080fd5b5061024d6103dc36600461196c565b610be0565b3480156103ed57600080fd5b5061026e60085481565b34801561040357600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610224565b34801561043557600080fd5b506101d3610444366004611990565b610cb5565b34801561045557600080fd5b50610217610d58565b34801561046a57600080fd5b50600a54610411906001600160a01b031681565b34801561048a57600080fd5b5061026e60095481565b3480156104a057600080fd5b5061026e6104af36600461196c565b6001600160a01b03166000908152600e602052604090205490565b3480156104d657600080fd5b5061026e6104e536600461196c565b610d67565b3480156104f657600080fd5b5061026e61050536600461196c565b6001600160a01b03166000908152600d602052604090205490565b34801561052c57600080fd5b5061026e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056057600080fd5b5061024d61056f36600461196c565b6001600160a01b03166000908152600b602052604090205460ff1690565b34801561059957600080fd5b5061026e6102483660046119b5565b3480156105b457600080fd5b506101d36105c33660046118ff565b610d99565b3480156105d457600080fd5b506101d36105e336600461196c565b610e58565b6000600554116105f757600080fd5b34156106825760055461061b70010000000000000000000000000000000034611a12565b6106259190611a4f565b6007546106329190611a8a565b60075560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2346008600082825461067c9190611a8a565b90915550505b565b6000546001600160a01b031633146106e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0382166000908152600b602052604090205460ff16151581151514156107785760405162461bcd60e51b815260206004820152603b60248201527f4a50475f4469766964656e64547261636b65723a206163636f756e7420616c7260448201527f656164792073657420746f20726571756573746564207374617465000000000060648201526084016106da565b6001600160a01b0382166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682158015919091179091556107d3576107ce826000610f3a565b6108a0565b600a546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009216906370a0823190602401602060405180830381865afa158015610837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085b9190611aa2565b90507f000000000000000000000000000000000000000000000000000000000000000081106108935761088e8382610f3a565b61089e565b61089e836000610f3a565b505b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be826040516108dd911515815260200190565b60405180910390a25050565b6060600280546108f890611abb565b80601f016020809104026020016040519081016040528092919081815260200182805461092490611abb565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b60405162461bcd60e51b815260206004820152602b60248201527f4a50475f4469766964656e64547261636b65723a206d6574686f64206e6f742060448201527f696d706c656d656e74656400000000000000000000000000000000000000000060648201526000906084016106da565b6001600160a01b0381166000908152600660205260408120546007548291610a1391611a12565b6001600160a01b0384166000908152600c6020526040902054909150700100000000000000000000000000000000610a4b8284611b0f565b610a559190611a4f565b949350505050565b600080546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106da565b600080610ac484610f98565b90925090508115610b2e576001600160a01b0384166000818152600e602090815260409182902042905581518581529081018490527f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873910160405180910390a25060019392505050565b5060009392505050565b6000806000806000610b74604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610b8987610d67565b6020820152610b97876109ec565b60408281019182526001600160a01b03989098166000908152600e6020908152989020546060830181905282519890920151905160095498999198909750919550909350915050565b600080546001600160a01b03163314610c3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106da565b6000610c4683611355565b90508015610cac576001600160a01b0383166000818152600e602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490610c9b9084815260200190565b60405180910390a250600192915050565b50600092915050565b6000546001600160a01b03163314610d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106da565b476001600160a01b0382166108fc84610d285782610d2a565b845b6040518115909202916000818181858888f19350505050158015610d52573d6000803e3d6000fd5b50505050565b6060600380546108f890611abb565b6001600160a01b0381166000908152600d6020526040812054610d89836109ec565b610d939190611b83565b92915050565b6000546001600160a01b03163314610df35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106da565b6001600160a01b0382166000908152600b602052604090205460ff1615610e18575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610e4d57610e498282610f3a565b5050565b610e49826000610f3a565b6000546001600160a01b03163314610eb25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106da565b6001600160a01b038116610f2e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106da565b610f37816114a4565b50565b6001600160a01b03821660009081526006602052604090205480821115610f73576000610f678284611b83565b9050610d52848261150c565b80821015610f93576000610f878383611b83565b9050610d52848261165e565b505050565b6000806000610fa684610d67565b90508015611349576001600160a01b0384166000908152600d602052604081208054839290610fd6908490611a8a565b925050819055508060096000828254610fef9190611a8a565b90915550506040518181526001600160a01b038516907fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9060200160405180910390a26001546040805160028082526060820183526001600160a01b0390931692600092602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190611b9a565b816000815181106110d7576110d7611bb7565b6001600160a01b039283166020918202929092010152600a5482519116908290600190811061110857611108611bb7565b6001600160a01b039283166020918202929092010152600a546040517f70a082310000000000000000000000000000000000000000000000000000000081528883166004820152600092839283929116906370a0823190602401602060405180830381865afa15801561117f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a39190611aa2565b9050846001600160a01b031663b6f9de95876000878d426040518663ffffffff1660e01b81526004016111d99493929190611be6565b6000604051808303818588803b1580156111f257600080fd5b505af193505050508015611204575060015b61124657611210611c50565b806308c379a0141561123a5750611225611cde565b80611230575061123c565b60009350506112de565b505b3d6000803e3d6000fd5b600a546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038b8116600483015260019550839216906370a0823190602401602060405180830381865afa1580156112ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d19190611aa2565b6112db9190611b83565b91505b8261133a576001600160a01b0389166000908152600d60205260408120805488929061130b908490611b83565b9250508190555085600960008282546113249190611b83565b9091555060009a8b9a5098505050505050505050565b50939793965092945050505050565b50600093849350915050565b60008061136183610d67565b90508015610cac576001600160a01b0383166000908152600d602052604081208054839290611391908490611a8a565b9250508190555080600960008282546113aa9190611a8a565b90915550506040518181526001600160a01b038416907fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9060200160405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d806000811461143f576040519150601f19603f3d011682016040523d82523d6000602084013e611444565b606091505b505090508061149d576001600160a01b0384166000908152600d602052604081208054849290611475908490611b83565b92505081905550816009600082825461148e9190611b83565b90915550600095945050505050565b5092915050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166115885760405162461bcd60e51b815260206004820152602d60248201527f4a50475f4469766964656e64547261636b65723a206d696e7420746f2074686560448201527f207a65726f20616464726573730000000000000000000000000000000000000060648201526084016106da565b806005600082825461159a9190611a8a565b90915550506001600160a01b038216600090815260066020526040812080548392906115c7908490611a8a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a38060075461161b9190611a12565b6001600160a01b0383166000908152600c602052604090205461163e9190611d86565b6001600160a01b039092166000908152600c602052604090209190915550565b6001600160a01b0382166116da5760405162461bcd60e51b815260206004820152602f60248201527f4a50475f4469766964656e64547261636b65723a206275726e2066726f6d207460448201527f6865207a65726f2061646472657373000000000000000000000000000000000060648201526084016106da565b6001600160a01b038216600090815260066020526040902054818110156117695760405162461bcd60e51b815260206004820152603060248201527f4a50475f4469766964656e64547261636b65723a206275726e20616d6f756e7460448201527f20657863656564732062616c616e63650000000000000000000000000000000060648201526084016106da565b6117738282611b83565b6001600160a01b038416600090815260066020526040812091909155600580548492906117a1908490611b83565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3816007546117f59190611a12565b6001600160a01b0384166000908152600c60205260409020546118189190611b0f565b6001600160a01b039093166000908152600c60205260409020929092555050565b6001600160a01b0381168114610f3757600080fd5b6000806040838503121561186157600080fd5b823561186c81611839565b91506020830135801515811461188157600080fd5b809150509250929050565b600060208083528351808285015260005b818110156118b95785810183015185820160400152820161189d565b818111156118cb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806040838503121561191257600080fd5b823561191d81611839565b946020939093013593505050565b60008060006060848603121561194057600080fd5b833561194b81611839565b9250602084013561195b81611839565b929592945050506040919091013590565b60006020828403121561197e57600080fd5b813561198981611839565b9392505050565b600080604083850312156119a357600080fd5b82359150602083013561188181611839565b600080604083850312156119c857600080fd5b82356119d381611839565b9150602083013561188181611839565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a4a57611a4a6119e3565b500290565b600082611a85577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115611a9d57611a9d6119e3565b500190565b600060208284031215611ab457600080fd5b5051919050565b600181811c90821680611acf57607f821691505b60208210811415611b09577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615611b4957611b496119e3565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615611b7d57611b7d6119e3565b50500190565b600082821015611b9557611b956119e3565b500390565b600060208284031215611bac57600080fd5b815161198981611839565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611c305784516001600160a01b031683529383019391830191600101611c0b565b50506001600160a01b039690961660408501525050506060015292915050565b600060033d1115611c695760046000803e5060005160e01c5b90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715611cd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040525050565b600060443d1015611cec5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715611d3a57505050505090565b8285019150815181811115611d525750505050505090565b843d8701016020828501011115611d6c5750505050505090565b611d7b60208286010187611c6c565b509095945050505050565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615611dc057611dc06119e3565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615611df457611df46119e3565b5050039056fea2646970667358221220422535b3226890afc091115ecc241b88d5e2e29a5edd48ded097b179c7703cbe64736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000000b9d6b075e2e8816545d8b24e4651f4c8643f234000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000430000000000000000000000003ae7263b9ca36f2da0b393a9b467cc33977e98450000000000000000000000003eece4dd5d965a1836ed264b21a0fc958a3f250c000000000000000000000000c12aa05b77efb47eef8bb6dd6cb453d7fcba6d82000000000000000000000000188b99a92cd32b1c2c68abb7819fdf567ba6075b00000000000000000000000043163cb67b970a0e09df45cacc2092f8da2896950000000000000000000000001a3b19aacc482ca24b0a2eae0689519e8b314d6b0000000000000000000000002d1bdc590cb736097bc5577c8974e28dc48f5ecc000000000000000000000000cf934fe35e63d2c4b0aef93d9c79e831230b7da0000000000000000000000000f0b18e615c6efae670c798d31f90eb1baa4fbbf2000000000000000000000000121d0d7ce5b22a489dac5ec37827c324a251baa40000000000000000000000002b8ab5548b604b1b705449f89169cb44c24a9bac000000000000000000000000a005402cd9f05653af1d717dc56b6155970b2669000000000000000000000000d6d289a73c0804878086f9eb38b7ceaf64c06718000000000000000000000000991ca5c0bb3e4c28ad661798894942a04c659542000000000000000000000000cf0c4401f61902bfff4e91e13fff8384d7cbf0d300000000000000000000000049dd2aef2d93ab30b674e9f380ad781f820872a4000000000000000000000000d1288dede59a193a6d4ad25644adbb4607b0359700000000000000000000000000b4a07c96393ec9b6498d02806aad5729e46dfb0000000000000000000000007291047f830022c5bad74dde960b6f0684752bae000000000000000000000000a2869eae6120c8f6093324cad2b57c2a642420760000000000000000000000005a79be7df93c876860f94c1ae541b12ef3db706f00000000000000000000000070ef6bbaebb7f8d1959cb32d3fbd552ef8866e05000000000000000000000000f8b20b54faa9c9fc6902b00f56085481709264420000000000000000000000003049b83edc77ddae90c709f7677bd6d2dbb821ed0000000000000000000000009e4b9fe607ebd34e1b204649dcd048df8ba8c8f00000000000000000000000007045a0282f1e2a5c6b05bb3e4f2dcb5fe20aa0be0000000000000000000000003d70f058e1d0d367e23de7958cf80d39671e0f900000000000000000000000009773981ec823008d5b213f9ed8cde21d313aab01000000000000000000000000766ac3100341cc2d0a9d3d37457d4b79774c7cca0000000000000000000000004d94ec225f98426ff485c0d9b7863b56f065e7c0000000000000000000000000dc3d84ec0440c505e6487093bcfc18e7f325740d00000000000000000000000085c4b658ae01b9e445cc941a618389475859866800000000000000000000000079ba8f077928db9a56b22fdaad2a68e07697d69c0000000000000000000000000c7d85ca164248eb75e0a762bc7795b18ffa4b44000000000000000000000000916040ad2265e6ba217023d90137a8ff5c74967c00000000000000000000000000c49e922825266a51912bf4dde5dd9798b26f4b0000000000000000000000004f4e622b8c48a1f36c5130b1b401fc595f92a9f8000000000000000000000000880a3769d82d63ee014195b758854d5750bb30ca0000000000000000000000007ec62a083b1391002b91e90dd1e3e9f8881d3d3f000000000000000000000000515ace4ede711e03c90ad145bf67752b0f19a2140000000000000000000000002eb16c0ff5cf5595b82111341642c502d1a169b5000000000000000000000000ec40fac848b199900870a77804a7b50082ffc411000000000000000000000000210670598e5dc384e582c2244c92e3a5748202e9000000000000000000000000fe8b1168fa27a2a7b0228bd30cdf2dd3a991e118000000000000000000000000aec661a58928e60f52976f1886cd27845789d90f000000000000000000000000fbd9123f3ca030632c5fc5948dfebb38b0b115f20000000000000000000000005734fc1f7b8b43d23d8d737dccb4a1ede91915e200000000000000000000000058d5db759585542f5fc3305c20915e9cd06b37ef000000000000000000000000c13068ef06024bbf669b5394d30cc1c511d974990000000000000000000000001ed0a6469382da8af133a5726f3778720fddb996000000000000000000000000024accc7a293adc682ddebab1600402d677badc300000000000000000000000092c8e2011b08d268d80302cd18209f69c0dfa0e600000000000000000000000059c1a1293aac8a343070d6f6368b55215c40abd50000000000000000000000005f6835a4bfbf03f6416f119a97769a737e319fbc0000000000000000000000003672823b30c3d3f86ae3fff253d24475ee4fe4d500000000000000000000000069cc2480f25d69bc28a4ece7729ad9b38b4dbe040000000000000000000000001b89e6d37bd2730db5a6e9c119dbca264f5c3eb3000000000000000000000000f3c5975f4072e3a0e46884a2c6ae7dcfcc0732fb000000000000000000000000bcb5dc467d09d518a0eba0bd968a3ecfb37768c8000000000000000000000000ec91c0ef336a065f7e8b47f34c5fb76942b52de400000000000000000000000005ae0683d8b39d13950c053e70538f5810737bc50000000000000000000000001cb27369c538c47591b19ab1e5ec2fab408724b700000000000000000000000001f9d72f6f3963828c45328f4e09fd4bab9492db00000000000000000000000001f9d72f6f3963828c45328f4e09fd4bab9492db000000000000000000000000ce8f8e677509d5309b16363998c4a945c84a7b280000000000000000000000004abc5b72483590face3940ecfe91ebdda1ad696b000000000000000000000000a053dbafba05e307a7bddede09c7feb235dc34b1

Deployed Bytecode

0x6080604052600436106103c75760003560e01c80637437681e116101f2578063bbc5453c1161010d578063e2f45605116100a0578063f4571c491161006f578063f4571c4914610beb578063f69e204614610c0b578063f8b45b0514610c20578063fe33b10814610c3657600080fd5b8063e2f4560514610b75578063e4956ce214610b8b578063f1b234ad14610bab578063f2fde38b14610bcb57600080fd5b8063c705c569116100dc578063c705c56914610acf578063d2fcc00114610aef578063d4c989d314610b0f578063dd62ed3e14610b2f57600080fd5b8063bbc5453c14610a4f578063bc33718214610a6f578063c024666814610a8f578063c6af580b14610aaf57600080fd5b80639a7a23d611610185578063a8b9d24011610154578063a8b9d240146109bf578063a9059cbb146109df578063aafd847a146109ff578063b62496f514610a1f57600080fd5b80639a7a23d61461093f5780639e252f001461095f578063a457c2d71461097f578063a680e0bc1461099f57600080fd5b80638da5cb5b116101c15780638da5cb5b146108d65780638e126944146108f457806395d89b411461091457806398118cb41461092957600080fd5b80637437681e146108345780637845008f1461084a5780637b510fe814610864578063870bd30b146108b657600080fd5b80633b7c8056116102e25780635e843ad21161027557806365b8dbc01161024457806365b8dbc01461078557806367243482146107a55780636dd3d39f146107c557806370a08231146107fe57600080fd5b80635e843ad2146106f8578063609aab0a14610718578063657c0d8014610737578063658c27a91461074c57600080fd5b80634fbee193116102b15780634fbee1931461065f578063537df3b6146106985780635b65b9ab146106b85780635d0044ca146106d857600080fd5b80633b7c8056146105f45780634838d1651461060a57806349bd5a5e1461062a5780634e71d92d1461064a57600080fd5b806323b872dd1161035a578063313ce56711610329578063313ce5671461057857806333f3d628146105945780633546f6c1146105b457806339509351146105d457600080fd5b806323b872dd146104f757806327ce0147146105175780632c1f5216146105375780632f4504ae1461055757600080fd5b806312d0ecb51161039657806312d0ecb5146104745780631694505e1461049457806318160ddd146104cc5780631df4ccfc146104e157600080fd5b80630483f7a0146103d357806306fdde03146103f5578063095ea7b3146104205780630dd871571461045057600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103f36103ee366004613c4b565b610c4c565b005b34801561040157600080fd5b5061040a610d30565b6040516104179190613c84565b60405180910390f35b34801561042c57600080fd5b5061044061043b366004613cf7565b610dc2565b6040519015158152602001610417565b34801561045c57600080fd5b50610466600f5481565b604051908152602001610417565b34801561048057600080fd5b506103f361048f366004613e39565b610dd8565b3480156104a057600080fd5b506020546104b4906001600160a01b031681565b6040516001600160a01b039091168152602001610417565b3480156104d857600080fd5b50601554610466565b3480156104ed57600080fd5b50610466600c5481565b34801561050357600080fd5b50610440610512366004613e76565b610ea4565b34801561052357600080fd5b50610466610532366004613eb7565b610f6a565b34801561054357600080fd5b50601f546104b4906001600160a01b031681565b34801561056357600080fd5b50601054610440906301000000900460ff1681565b34801561058457600080fd5b5060405160128152602001610417565b3480156105a057600080fd5b506103f36105af366004613cf7565b610ff9565b3480156105c057600080fd5b506103f36105cf366004613edb565b6110e2565b3480156105e057600080fd5b506104406105ef366004613cf7565b6111ad565b34801561060057600080fd5b5061046660065481565b34801561061657600080fd5b506103f3610625366004613eb7565b6111e4565b34801561063657600080fd5b506021546104b4906001600160a01b031681565b34801561065657600080fd5b506103f36112cb565b34801561066b57600080fd5b5061044061067a366004613eb7565b6001600160a01b03166000908152601a602052604090205460ff1690565b3480156106a457600080fd5b506103f36106b3366004613eb7565b611363565b3480156106c457600080fd5b506103f36106d3366004613ef8565b611446565b3480156106e457600080fd5b506103f36106f3366004613f24565b6114cc565b34801561070457600080fd5b506103f3610713366004613f3d565b61152b565b34801561072457600080fd5b5060105461044090610100900460ff1681565b34801561074357600080fd5b506104406115d0565b34801561075857600080fd5b50610440610767366004613eb7565b6001600160a01b031660009081526025602052604090205460ff1690565b34801561079157600080fd5b506103f36107a0366004613eb7565b61163b565b3480156107b157600080fd5b506103f36107c0366004613f7f565b61194a565b3480156107d157600080fd5b506104406107e0366004613eb7565b6001600160a01b031660009081526026602052604090205460ff1690565b34801561080a57600080fd5b50610466610819366004613eb7565b6001600160a01b031660009081526018602052604090205490565b34801561084057600080fd5b5061046660225481565b34801561085657600080fd5b506014546104409060ff1681565b34801561087057600080fd5b5061088461087f366004613eb7565b611a83565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610417565b3480156108c257600080fd5b506010546104409062010000900460ff1681565b3480156108e257600080fd5b506000546001600160a01b03166104b4565b34801561090057600080fd5b506103f361090f36600461403a565b611b26565b34801561092057600080fd5b5061040a611bd2565b34801561093557600080fd5b5061046660085481565b34801561094b57600080fd5b506103f361095a366004613c4b565b611be1565b34801561096b57600080fd5b506103f361097a366004613f24565b611ca3565b34801561098b57600080fd5b5061044061099a366004613cf7565b611d2a565b3480156109ab57600080fd5b506104666109ba366004613eb7565b611ddd565b3480156109cb57600080fd5b506104666109da366004613eb7565b611e29565b3480156109eb57600080fd5b506104406109fa366004613cf7565b611e75565b348015610a0b57600080fd5b50610466610a1a366004613eb7565b611e82565b348015610a2b57600080fd5b50610440610a3a366004613eb7565b601b6020526000908152604090205460ff1681565b348015610a5b57600080fd5b506103f3610a6a366004613f24565b611ece565b348015610a7b57600080fd5b506103f3610a8a366004613f24565b61205c565b348015610a9b57600080fd5b506103f3610aaa366004613c4b565b6120bb565b348015610abb57600080fd5b506103f3610aca366004613edb565b612209565b348015610adb57600080fd5b50610440610aea366004613eb7565b6122ca565b348015610afb57600080fd5b506103f3610b0a366004613c4b565b612352565b348015610b1b57600080fd5b506103f3610b2a366004613c4b565b6123d7565b348015610b3b57600080fd5b50610466610b4a36600461405f565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b348015610b8157600080fd5b50610466600e5481565b348015610b9757600080fd5b506103f3610ba6366004613edb565b61245c565b348015610bb757600080fd5b506103f3610bc636600461405f565b61251e565b348015610bd757600080fd5b506103f3610be6366004613eb7565b6125df565b348015610bf757600080fd5b506103f3610c06366004613e39565b6126be565b348015610c1757600080fd5b506103f3612786565b348015610c2c57600080fd5b5061046660235481565b348015610c4257600080fd5b50610466600a5481565b6000546001600160a01b03163314610cab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601f546040517f0483f7a00000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610d1457600080fd5b505af1158015610d28573d6000803e3d6000fd5b505050505050565b606060048054610d3f9061408d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6b9061408d565b8015610db85780601f10610d8d57610100808354040283529160200191610db8565b820191906000526020600020905b815481529060010190602001808311610d9b57829003601f168201915b5050505050905090565b6000610dcf3384846127f6565b50600192915050565b6000546001600160a01b03163314610e325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60005b81518160ff161015610ea0576001601d6000848460ff1681518110610e5c57610e5c6140e1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610e988161413f565b915050610e35565b5050565b6000610eb1848484612929565b6001600160a01b038416600090815260196020908152604080832033845290915290205482811015610f4b5760405162461bcd60e51b815260206004820152602660248201527f4a50473a207472616e7366657220616d6f756e74206578636565647320616c6c60448201527f6f77616e636500000000000000000000000000000000000000000000000000006064820152608401610ca2565b610f5f8533610f5a868561415f565b6127f6565b506001949350505050565b601f546040517f27ce01470000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906327ce0147906024015b602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190614176565b92915050565b6000546001600160a01b031633146110535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156110b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dd919061418f565b505050565b6000546001600160a01b0316331461113c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60108054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517fd8312d65623ca26ce756d494c8051a378981cbf07efa5d9522a191508dfa4f8d906111a290831515815260200190565b60405180910390a150565b3360008181526019602090815260408083206001600160a01b03871684529091528120549091610dcf918590610f5a9086906141ac565b6000546001600160a01b0316331461123e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0381166000908152601d602052604090205460ff16156112a75760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610ca2565b6001600160a01b03166000908152601d60205260409020805460ff19166001179055565b601f546001600160a01b031663807ab4f7335b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061418f565b50565b6000546001600160a01b031633146113bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0381166000908152601d602052604090205460ff166114255760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610ca2565b6001600160a01b03166000908152601d60205260409020805460ff19169055565b6000546001600160a01b031633146114a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60068390556008829055600a819055806114ba83856141ac565b6114c491906141ac565b600c55505050565b6000546001600160a01b031633146115265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b602355565b6000546001600160a01b031633146115855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60108054600e9390935590151560ff1993151561010002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090921691909117919091179055565b600080546001600160a01b0316331461162b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b506014805460ff19169055600190565b6000546001600160a01b031633146116955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6020546001600160a01b03828116911614156117195760405162461bcd60e51b815260206004820152603160248201527f4a50473a2074686520726f7574657220697320616c726561647920736574207460448201527f6f20746865206e657720616464726573730000000000000000000000000000006064820152608401610ca2565b6020546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3602080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905160009363c45a015592600480820193918290030181865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff91906141c4565b6001600160a01b031663c9c6539630602060009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188591906141c4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156118ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190e91906141c4565b602180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555050565b6000546001600160a01b031633146119a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60c8825110611a1b5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c6574732070657260448201527f2074786e2064756520746f20676173206c696d697473000000000000000000006064820152608401610ca2565b60005b82518110156110dd576000838281518110611a3b57611a3b6140e1565b602002602001015190506000838381518110611a5957611a596140e1565b60200260200101519050611a6e338383612929565b50508080611a7b906141e1565b915050611a1e565b601f546040517f7b510fe80000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b14919061421a565b939a9299509097509550909350915050565b6000546001600160a01b03163314611b805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b601f546040517f8e126944000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03838116602483015290911690638e12694490604401610cfa565b606060058054610d3f9061408d565b6000546001600160a01b03163314611c3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6021546001600160a01b0383811691161415611c995760405162461bcd60e51b815260206004820181905260248201527f4a50473a2044455820706169722063616e206e6f742062652072656d6f7665646044820152606401610ca2565b610ea08282613307565b6000546001600160a01b03163314611cfd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b604051339082156108fc029083906000818181858888f19350505050158015610ea0573d6000803e3d6000fd5b3360009081526019602090815260408083206001600160a01b038616845290915281205482811015611dc45760405162461bcd60e51b815260206004820152602360248201527f4a50473a2064656372656173656420616c6c6f77616e63652062656c6f77207a60448201527f65726f00000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b611dd33385610f5a868561415f565b5060019392505050565b601f546040517fa680e0bc0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a680e0bc90602401610fb2565b601f546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d24090602401610fb2565b6000610dcf338484612929565b601f546040517faafd847a0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063aafd847a90602401610fb2565b6000546001600160a01b03163314611f285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60018110611f785760405162461bcd60e51b815260206004820152601260248201527f646f6e27742063617463682068756d616e7300000000000000000000000000006044820152606401610ca2565b6024805460ff19166001908117909155601054640100000000900460ff16151514611fe75760405162461bcd60e51b8152600401610ca29060208082526004908201527f646f6e6500000000000000000000000000000000000000000000000000000000604082015260600190565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff16905561201c8143601255601355565b60105460405164010000000090910460ff16151581527fbd657b4e94b205761f2ca5be9988d7b243c828f625c0746c6581ec528e507c47906020016111a2565b6000546001600160a01b031633146120b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b602255565b6000546001600160a01b031633146121155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0382166000908152601a602052604090205460ff16151581151514156121aa5760405162461bcd60e51b815260206004820152602e60248201527f4a50473a206163636f756e7420697320616c72656164792073657420746f207260448201527f65717565737465642073746174650000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146122635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6010805482151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff9091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe133906111a290831515815260200190565b601f546040517fc705c5690000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff3919061418f565b6000546001600160a01b031633146123ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146124315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146124b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b601080548215156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d43906111a290831515815260200190565b6000546001600160a01b031633146125785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b601680547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0394851602179055601780547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b6000546001600160a01b031633146126395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b6001600160a01b0381166126b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ca2565b61136081613485565b6000546001600160a01b031633146127185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b60005b81518160ff161015610ea0576000601d6000848460ff1681518110612742576127426140e1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061277e8161413f565b91505061271b565b6010546301000000900460ff166127df5760405162461bcd60e51b815260206004820152601f60248201527f4a50473a20636f6d706f756e64696e67206973206e6f7420656e61626c6564006044820152606401610ca2565b601f546001600160a01b0316636de1a5a9336112de565b6001600160a01b0383166128725760405162461bcd60e51b815260206004820152602260248201527f4a50473a20617070726f76652066726f6d20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0382166128c85760405162461bcd60e51b815260206004820181905260248201527f4a50473a20617070726f766520746f20746865207a65726f20616464726573736044820152606401610ca2565b6001600160a01b0383811660008181526019602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60245460ff168061294757506000546001600160a01b038481169116145b8061295f57506000546001600160a01b038381169116145b8061298257506001600160a01b0383166000908152601c602052604090205460ff165b806129a557506001600160a01b0382166000908152601c602052604090205460ff165b6129f15760405162461bcd60e51b815260206004820152600860248201527f4e6f74204f70656e0000000000000000000000000000000000000000000000006044820152606401610ca2565b6001600160a01b0383166000908152601d602052604090205460ff1615612a5a5760405162461bcd60e51b815260206004820152601a60248201527f4a50473a2053656e64657220697320626c61636b6c69737465640000000000006044820152606401610ca2565b6001600160a01b0382166000908152601d602052604090205460ff1615612ac35760405162461bcd60e51b815260206004820152601d60248201527f4a50473a20526563697069656e7420697320626c61636b6c69737465640000006044820152606401610ca2565b6001600160a01b038316612b3f5760405162461bcd60e51b815260206004820152602360248201527f4a50473a207472616e736665722066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b038216612bbb5760405162461bcd60e51b815260206004820152602160248201527f4a50473a207472616e7366657220746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6022546023548183111580612be857506001600160a01b03851660009081526025602052604090205460ff165b612c345760405162461bcd60e51b815260206004820152601160248201527f5458204c696d69742045786365656465640000000000000000000000000000006044820152606401610ca2565b6000546001600160a01b03868116911614801590612c6057506000546001600160a01b03858116911614155b8015612c7457506001600160a01b03841615155b8015612c8b57506001600160a01b03841661dead14155b8015612c9a575060165460ff16155b15612dd0576021546001600160a01b038681169116148015612cca57506020546001600160a01b03868116911614155b15612d0957601354601254612cdf91906141ac565b4311612d09576001600160a01b0384166000908152601e60205260409020805460ff191660011790555b60145460ff1615612dd0576000546001600160a01b03858116911614801590612d4057506020546001600160a01b03858116911614155b8015612d5a57506021546001600160a01b03858116911614155b15612dd057326000908152601160205260409020544311612dbd5760405162461bcd60e51b815260206004820152601a60248201527f4f6e65206275792070657220626c6f636b20616c6c6f7765642e0000000000006044820152606401610ca2565b3260009081526011602052604090204390555b6000546001600160a01b03868116911614801590612df757506001600160a01b0384163014155b8015612e1157506002546001600160a01b03858116911614155b8015612e2b57506021546001600160a01b03858116911614155b15612e77576001600160a01b03841660009081526018602090815260408083205460269092529091205460ff1680612e6c575081612e6985836141ac565b11155b612e7557600080fd5b505b6001600160a01b03851660009081526018602052604090205483811015612f055760405162461bcd60e51b8152602060048201526024808201527f4a50473a207472616e7366657220616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b30600090815260186020526040902054600e54601054479183101590610100900460ff168015612f325750805b8015612f41575060165460ff16155b8015612f6657506001600160a01b0389166000908152601b602052604090205460ff16155b8015612f8057506020546001600160a01b038a8116911614155b8015612f9a57506000546001600160a01b038a8116911614155b8015612fb457506000546001600160a01b03898116911614155b15612fef576016805460ff1916600117905560105460ff16612fd657600e5492505b612fe083836134ed565b42600f556016805460ff191690555b6021546000906001600160a01b038b81169116141561300c575060015b6021546001600160a01b038a811691161415613026575060015b6001600160a01b038a166000908152601a602052604090205460ff168061306557506001600160a01b0389166000908152601a602052604090205460ff165b1561306e575060005b60165460ff1680613088575060105462010000900460ff16155b15613091575060005b60008180156130b857506001600160a01b038a166000908152601e602052604090205460ff165b15613123576130ef6006805460075560088054600955600a8054600b55600c8054600d556123289384905560009283905591905555565b612710600c548a6131009190614263565b61310a91906142a0565b9050613116818a61415f565b98506131238b30836137c7565b81801561314957506001600160a01b038a166000908152601e602052604090205460ff16155b1561318257612710600c548a61315f9190614263565b61316991906142a0565b9050613175818a61415f565b98506131828b30836137c7565b61318d8b8b8b6137c7565b601f546001600160a01b031663e30443bc8c6131be816001600160a01b031660009081526018602052604090205490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561321c57600080fd5b505af1158015613230573d6000803e3d6000fd5b5050601f546001600160a01b0316915063e30443bc90508b613267816001600160a01b031660009081526018602052604090205490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156132c557600080fd5b505af11580156132d9573d6000803e3d6000fd5b505050506132fa600754600655600954600855600b54600a55600d54600c55565b5050505050505050505050565b6001600160a01b0382166000908152601b602052604090205460ff161515811515141561339c5760405162461bcd60e51b815260206004820152603d60248201527f4a50473a206175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610ca2565b6001600160a01b0382166000908152601b60205260409020805460ff1916821580159190911790915561344957601f546040517f0483f7a00000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801561343057600080fd5b505af1158015613444573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082116134f9575050565b60165460009061010090046001600160a01b03161561352f57600c546006546135229085614263565b61352c91906142a0565b90505b600080601f60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614176565b11156135cc57600c54600a546135bf9086614263565b6135c991906142a0565b90505b6000816135d9848761415f565b6135e3919061415f565b905060006135f26002836142a0565b90506000613600828461415f565b905060008261360f86886141ac565b61361991906141ac565b90504761362582613a04565b600088613632834761415f565b61363c91906141ac565b905060008361364b8a84614263565b61365591906142a0565b90506000846136648a85614263565b61366e91906142a0565b905060008161367d848661415f565b613687919061415f565b905082156136cf576016546040516101009091046001600160a01b0316906108fc8515029085906000818181858888f193505050501580156136cd573d6000803e3d6000fd5b505b6136d98782613b5b565b60408051898152602081018390529081018890527fb63dc6f50047533abe2d6adf180d38d524c8d98e55ad199aac8d6b9801bbe24a9060600160405180910390a181156137b857601f546040516000916001600160a01b03169084908381818185875af1925050503d806000811461376d576040519150601f19603f3d011682016040523d82523d6000602084013e613772565b606091505b5050905080156137b657604080518c8152602081018590527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b50505050505050505050505050565b6001600160a01b0383166138435760405162461bcd60e51b815260206004820152602360248201527f4a50473a207472616e736665722066726f6d20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0382166138bf5760405162461bcd60e51b815260206004820152602160248201527f4a50473a207472616e7366657220746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b6001600160a01b0383166000908152601860205260409020548181101561394d5760405162461bcd60e51b8152602060048201526024808201527f4a50473a207472616e7366657220616d6f756e7420657863656564732062616c60448201527f616e6365000000000000000000000000000000000000000000000000000000006064820152608401610ca2565b613957828261415f565b6001600160a01b03808616600090815260186020526040808220939093559085168152908120805484929061398d9084906141ac565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139d991815260200190565b60405180910390a36139fe600754600655600954600855600b54600a55600d54600c55565b50505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a3957613a396140e1565b6001600160a01b039283166020918202929092018101919091528054604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015613aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ace91906141c4565b81600181518110613ae157613ae16140e1565b6001600160a01b0392831660209182029290920181019190915254613b0991309116846127f6565b6020546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790610cfa9085906000908690309042906004016142db565b602054613b739030906001600160a01b0316846127f6565b6020546017546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613bfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c21919061434c565b5050505050565b6001600160a01b038116811461136057600080fd5b801515811461136057600080fd5b60008060408385031215613c5e57600080fd5b8235613c6981613c28565b91506020830135613c7981613c3d565b809150509250929050565b600060208083528351808285015260005b81811015613cb157858101830151858201604001528201613c95565b81811115613cc3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060408385031215613d0a57600080fd5b8235613d1581613c28565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d9957613d99613d23565b604052919050565b600067ffffffffffffffff821115613dbb57613dbb613d23565b5060051b60200190565b600082601f830112613dd657600080fd5b81356020613deb613de683613da1565b613d52565b82815260059290921b84018101918181019086841115613e0a57600080fd5b8286015b84811015613e2e578035613e2181613c28565b8352918301918301613e0e565b509695505050505050565b600060208284031215613e4b57600080fd5b813567ffffffffffffffff811115613e6257600080fd5b613e6e84828501613dc5565b949350505050565b600080600060608486031215613e8b57600080fd5b8335613e9681613c28565b92506020840135613ea681613c28565b929592945050506040919091013590565b600060208284031215613ec957600080fd5b8135613ed481613c28565b9392505050565b600060208284031215613eed57600080fd5b8135613ed481613c3d565b600080600060608486031215613f0d57600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f3657600080fd5b5035919050565b600080600060608486031215613f5257600080fd5b8335613f5d81613c3d565b9250602084013591506040840135613f7481613c3d565b809150509250925092565b60008060408385031215613f9257600080fd5b823567ffffffffffffffff80821115613faa57600080fd5b613fb686838701613dc5565b9350602091508185013581811115613fcd57600080fd5b85019050601f81018613613fe057600080fd5b8035613fee613de682613da1565b81815260059190911b8201830190838101908883111561400d57600080fd5b928401925b8284101561402b57833582529284019290840190614012565b80955050505050509250929050565b6000806040838503121561404d57600080fd5b823591506020830135613c7981613c28565b6000806040838503121561407257600080fd5b823561407d81613c28565b91506020830135613c7981613c28565b600181811c908216806140a157607f821691505b602082108114156140db577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff81141561415657614156614110565b60010192915050565b60008282101561417157614171614110565b500390565b60006020828403121561418857600080fd5b5051919050565b6000602082840312156141a157600080fd5b8151613ed481613c3d565b600082198211156141bf576141bf614110565b500190565b6000602082840312156141d657600080fd5b8151613ed481613c28565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561421357614213614110565b5060010190565b600080600080600060a0868803121561423257600080fd5b855161423d81613c28565b602087015160408801516060890151608090990151929a91995097965090945092505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561429b5761429b614110565b500290565b6000826142d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561432b5784516001600160a01b031683529383019391830191600101614306565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561436157600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220118aa36d8ee3a08096dcc6d0d0ec0d47304113955560ab3df959879b2d67516a64736f6c634300080a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000b9d6b075e2e8816545d8b24e4651f4c8643f234000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000430000000000000000000000003ae7263b9ca36f2da0b393a9b467cc33977e98450000000000000000000000003eece4dd5d965a1836ed264b21a0fc958a3f250c000000000000000000000000c12aa05b77efb47eef8bb6dd6cb453d7fcba6d82000000000000000000000000188b99a92cd32b1c2c68abb7819fdf567ba6075b00000000000000000000000043163cb67b970a0e09df45cacc2092f8da2896950000000000000000000000001a3b19aacc482ca24b0a2eae0689519e8b314d6b0000000000000000000000002d1bdc590cb736097bc5577c8974e28dc48f5ecc000000000000000000000000cf934fe35e63d2c4b0aef93d9c79e831230b7da0000000000000000000000000f0b18e615c6efae670c798d31f90eb1baa4fbbf2000000000000000000000000121d0d7ce5b22a489dac5ec37827c324a251baa40000000000000000000000002b8ab5548b604b1b705449f89169cb44c24a9bac000000000000000000000000a005402cd9f05653af1d717dc56b6155970b2669000000000000000000000000d6d289a73c0804878086f9eb38b7ceaf64c06718000000000000000000000000991ca5c0bb3e4c28ad661798894942a04c659542000000000000000000000000cf0c4401f61902bfff4e91e13fff8384d7cbf0d300000000000000000000000049dd2aef2d93ab30b674e9f380ad781f820872a4000000000000000000000000d1288dede59a193a6d4ad25644adbb4607b0359700000000000000000000000000b4a07c96393ec9b6498d02806aad5729e46dfb0000000000000000000000007291047f830022c5bad74dde960b6f0684752bae000000000000000000000000a2869eae6120c8f6093324cad2b57c2a642420760000000000000000000000005a79be7df93c876860f94c1ae541b12ef3db706f00000000000000000000000070ef6bbaebb7f8d1959cb32d3fbd552ef8866e05000000000000000000000000f8b20b54faa9c9fc6902b00f56085481709264420000000000000000000000003049b83edc77ddae90c709f7677bd6d2dbb821ed0000000000000000000000009e4b9fe607ebd34e1b204649dcd048df8ba8c8f00000000000000000000000007045a0282f1e2a5c6b05bb3e4f2dcb5fe20aa0be0000000000000000000000003d70f058e1d0d367e23de7958cf80d39671e0f900000000000000000000000009773981ec823008d5b213f9ed8cde21d313aab01000000000000000000000000766ac3100341cc2d0a9d3d37457d4b79774c7cca0000000000000000000000004d94ec225f98426ff485c0d9b7863b56f065e7c0000000000000000000000000dc3d84ec0440c505e6487093bcfc18e7f325740d00000000000000000000000085c4b658ae01b9e445cc941a618389475859866800000000000000000000000079ba8f077928db9a56b22fdaad2a68e07697d69c0000000000000000000000000c7d85ca164248eb75e0a762bc7795b18ffa4b44000000000000000000000000916040ad2265e6ba217023d90137a8ff5c74967c00000000000000000000000000c49e922825266a51912bf4dde5dd9798b26f4b0000000000000000000000004f4e622b8c48a1f36c5130b1b401fc595f92a9f8000000000000000000000000880a3769d82d63ee014195b758854d5750bb30ca0000000000000000000000007ec62a083b1391002b91e90dd1e3e9f8881d3d3f000000000000000000000000515ace4ede711e03c90ad145bf67752b0f19a2140000000000000000000000002eb16c0ff5cf5595b82111341642c502d1a169b5000000000000000000000000ec40fac848b199900870a77804a7b50082ffc411000000000000000000000000210670598e5dc384e582c2244c92e3a5748202e9000000000000000000000000fe8b1168fa27a2a7b0228bd30cdf2dd3a991e118000000000000000000000000aec661a58928e60f52976f1886cd27845789d90f000000000000000000000000fbd9123f3ca030632c5fc5948dfebb38b0b115f20000000000000000000000005734fc1f7b8b43d23d8d737dccb4a1ede91915e200000000000000000000000058d5db759585542f5fc3305c20915e9cd06b37ef000000000000000000000000c13068ef06024bbf669b5394d30cc1c511d974990000000000000000000000001ed0a6469382da8af133a5726f3778720fddb996000000000000000000000000024accc7a293adc682ddebab1600402d677badc300000000000000000000000092c8e2011b08d268d80302cd18209f69c0dfa0e600000000000000000000000059c1a1293aac8a343070d6f6368b55215c40abd50000000000000000000000005f6835a4bfbf03f6416f119a97769a737e319fbc0000000000000000000000003672823b30c3d3f86ae3fff253d24475ee4fe4d500000000000000000000000069cc2480f25d69bc28a4ece7729ad9b38b4dbe040000000000000000000000001b89e6d37bd2730db5a6e9c119dbca264f5c3eb3000000000000000000000000f3c5975f4072e3a0e46884a2c6ae7dcfcc0732fb000000000000000000000000bcb5dc467d09d518a0eba0bd968a3ecfb37768c8000000000000000000000000ec91c0ef336a065f7e8b47f34c5fb76942b52de400000000000000000000000005ae0683d8b39d13950c053e70538f5810737bc50000000000000000000000001cb27369c538c47591b19ab1e5ec2fab408724b700000000000000000000000001f9d72f6f3963828c45328f4e09fd4bab9492db00000000000000000000000001f9d72f6f3963828c45328f4e09fd4bab9492db000000000000000000000000ce8f8e677509d5309b16363998c4a945c84a7b280000000000000000000000004abc5b72483590face3940ecfe91ebdda1ad696b000000000000000000000000a053dbafba05e307a7bddede09c7feb235dc34b1

-----Decoded View---------------
Arg [0] : _jpgBankWallet (address): 0x0B9d6b075e2e8816545d8b24e4651F4C8643f234
Arg [1] : whitelistAddress (address[]): 0x3AE7263b9ca36F2Da0b393A9b467CC33977E9845,0x3eeCE4Dd5D965A1836ed264b21A0FC958a3F250C,0xC12Aa05b77efb47EEF8bb6DD6cB453d7FCBa6D82,0x188B99A92CD32B1C2c68Abb7819fdf567Ba6075b,0x43163CB67b970a0e09DF45cACc2092f8dA289695,0x1A3B19aACC482cA24B0a2eae0689519E8B314D6b,0x2d1bdC590Cb736097Bc5577c8974e28dc48F5ECc,0xCf934Fe35e63D2C4b0aEf93D9c79e831230B7Da0,0xF0B18E615C6EFae670c798D31f90eB1BaA4fbbF2,0x121D0D7CE5b22A489Dac5EC37827c324A251bAa4,0x2b8aB5548B604B1B705449F89169Cb44C24a9bac,0xa005402Cd9f05653af1D717Dc56b6155970b2669,0xd6d289a73C0804878086f9eb38B7ceAf64c06718,0x991ca5c0bb3E4c28Ad661798894942a04C659542,0xCF0C4401F61902bfFF4E91e13FfF8384D7cBf0D3,0x49Dd2aEf2d93aB30b674E9F380AD781F820872A4,0xD1288DeDE59A193A6D4aD25644aDBb4607b03597,0x00B4a07C96393ec9b6498D02806aad5729e46Dfb,0x7291047f830022c5Bad74DdE960B6F0684752BAE,0xa2869Eae6120c8F6093324cAd2b57C2A64242076,0x5A79be7dF93C876860F94C1Ae541b12Ef3DB706F,0x70ef6BbaEBb7F8D1959Cb32d3FBd552eF8866E05,0xf8B20B54FaA9C9FC6902B00F5608548170926442,0x3049B83eDc77dDae90c709F7677bd6D2dBb821ED,0x9E4b9fE607EBD34E1b204649dCd048df8BA8c8F0,0x7045a0282F1E2A5C6B05BB3e4f2dCb5FE20aa0be,0x3d70F058e1d0D367e23de7958cF80d39671e0f90,0x9773981Ec823008d5B213F9Ed8cdE21d313AAb01,0x766Ac3100341CC2d0a9d3d37457d4b79774C7Cca,0x4D94eC225F98426FF485c0d9b7863B56F065E7C0,0xDc3D84Ec0440C505E6487093bCFc18E7f325740D,0x85C4B658AE01b9E445Cc941A6183894758598668,0x79ba8f077928dB9A56B22FDaAD2A68e07697D69c,0x0c7d85ca164248Eb75e0a762bC7795B18FFa4b44,0x916040Ad2265e6bA217023d90137A8FF5C74967c,0x00c49E922825266a51912bF4dDE5dD9798b26F4b,0x4F4e622b8c48a1f36c5130b1B401fC595F92a9f8,0x880a3769D82d63ee014195B758854D5750bb30Ca,0x7Ec62A083b1391002b91e90Dd1e3e9F8881D3D3F,0x515Ace4eDE711e03C90ad145BF67752b0F19A214,0x2Eb16C0fF5CF5595b82111341642C502D1A169b5,0xec40fac848b199900870A77804A7B50082fFc411,0x210670598e5dC384E582c2244c92E3A5748202e9,0xFE8B1168FA27a2a7b0228BD30cDf2dd3A991e118,0xaEc661a58928e60f52976F1886cD27845789D90f,0xFBD9123f3CA030632C5fC5948dfebb38B0b115f2,0x5734FC1F7b8B43D23d8d737DCcb4a1Ede91915E2,0x58d5DB759585542F5Fc3305c20915e9cd06B37EF,0xc13068EF06024bbf669b5394D30cC1C511d97499,0x1ed0a6469382dA8aF133A5726F3778720FdDB996,0x024aCCC7A293ADc682DdEBAb1600402D677baDC3,0x92c8E2011B08d268d80302Cd18209f69C0dFa0e6,0x59c1A1293aAC8a343070D6f6368B55215C40ABD5,0x5f6835A4BfbF03F6416F119A97769A737E319FBC,0x3672823B30c3d3f86aE3FFf253d24475EE4FE4D5,0x69cc2480f25D69bC28a4eCE7729Ad9b38b4DbE04,0x1b89E6D37Bd2730dB5A6e9c119dBCa264f5c3eb3,0xf3c5975F4072e3a0E46884A2c6Ae7DCFcc0732fb,0xbCb5DC467D09d518a0EBa0bd968A3ecfB37768C8,0xEc91c0Ef336a065F7e8b47F34c5Fb76942b52De4,0x05AE0683d8B39D13950c053E70538f5810737bC5,0x1Cb27369c538C47591B19aB1E5ec2fab408724B7,0x01f9D72f6F3963828c45328f4E09fD4baB9492DB,0x01f9D72f6F3963828c45328f4E09fD4baB9492DB,0xCE8F8e677509D5309b16363998C4A945c84a7b28,0x4aBc5B72483590Face3940eCfE91ebDdA1AD696B,0xA053DbaFbA05E307a7BdDedE09C7FEB235dC34b1

-----Encoded View---------------
70 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b9d6b075e2e8816545d8b24e4651f4c8643f234
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 0000000000000000000000003ae7263b9ca36f2da0b393a9b467cc33977e9845
Arg [4] : 0000000000000000000000003eece4dd5d965a1836ed264b21a0fc958a3f250c
Arg [5] : 000000000000000000000000c12aa05b77efb47eef8bb6dd6cb453d7fcba6d82
Arg [6] : 000000000000000000000000188b99a92cd32b1c2c68abb7819fdf567ba6075b
Arg [7] : 00000000000000000000000043163cb67b970a0e09df45cacc2092f8da289695
Arg [8] : 0000000000000000000000001a3b19aacc482ca24b0a2eae0689519e8b314d6b
Arg [9] : 0000000000000000000000002d1bdc590cb736097bc5577c8974e28dc48f5ecc
Arg [10] : 000000000000000000000000cf934fe35e63d2c4b0aef93d9c79e831230b7da0
Arg [11] : 000000000000000000000000f0b18e615c6efae670c798d31f90eb1baa4fbbf2
Arg [12] : 000000000000000000000000121d0d7ce5b22a489dac5ec37827c324a251baa4
Arg [13] : 0000000000000000000000002b8ab5548b604b1b705449f89169cb44c24a9bac
Arg [14] : 000000000000000000000000a005402cd9f05653af1d717dc56b6155970b2669
Arg [15] : 000000000000000000000000d6d289a73c0804878086f9eb38b7ceaf64c06718
Arg [16] : 000000000000000000000000991ca5c0bb3e4c28ad661798894942a04c659542
Arg [17] : 000000000000000000000000cf0c4401f61902bfff4e91e13fff8384d7cbf0d3
Arg [18] : 00000000000000000000000049dd2aef2d93ab30b674e9f380ad781f820872a4
Arg [19] : 000000000000000000000000d1288dede59a193a6d4ad25644adbb4607b03597
Arg [20] : 00000000000000000000000000b4a07c96393ec9b6498d02806aad5729e46dfb
Arg [21] : 0000000000000000000000007291047f830022c5bad74dde960b6f0684752bae
Arg [22] : 000000000000000000000000a2869eae6120c8f6093324cad2b57c2a64242076
Arg [23] : 0000000000000000000000005a79be7df93c876860f94c1ae541b12ef3db706f
Arg [24] : 00000000000000000000000070ef6bbaebb7f8d1959cb32d3fbd552ef8866e05
Arg [25] : 000000000000000000000000f8b20b54faa9c9fc6902b00f5608548170926442
Arg [26] : 0000000000000000000000003049b83edc77ddae90c709f7677bd6d2dbb821ed
Arg [27] : 0000000000000000000000009e4b9fe607ebd34e1b204649dcd048df8ba8c8f0
Arg [28] : 0000000000000000000000007045a0282f1e2a5c6b05bb3e4f2dcb5fe20aa0be
Arg [29] : 0000000000000000000000003d70f058e1d0d367e23de7958cf80d39671e0f90
Arg [30] : 0000000000000000000000009773981ec823008d5b213f9ed8cde21d313aab01
Arg [31] : 000000000000000000000000766ac3100341cc2d0a9d3d37457d4b79774c7cca
Arg [32] : 0000000000000000000000004d94ec225f98426ff485c0d9b7863b56f065e7c0
Arg [33] : 000000000000000000000000dc3d84ec0440c505e6487093bcfc18e7f325740d
Arg [34] : 00000000000000000000000085c4b658ae01b9e445cc941a6183894758598668
Arg [35] : 00000000000000000000000079ba8f077928db9a56b22fdaad2a68e07697d69c
Arg [36] : 0000000000000000000000000c7d85ca164248eb75e0a762bc7795b18ffa4b44
Arg [37] : 000000000000000000000000916040ad2265e6ba217023d90137a8ff5c74967c
Arg [38] : 00000000000000000000000000c49e922825266a51912bf4dde5dd9798b26f4b
Arg [39] : 0000000000000000000000004f4e622b8c48a1f36c5130b1b401fc595f92a9f8
Arg [40] : 000000000000000000000000880a3769d82d63ee014195b758854d5750bb30ca
Arg [41] : 0000000000000000000000007ec62a083b1391002b91e90dd1e3e9f8881d3d3f
Arg [42] : 000000000000000000000000515ace4ede711e03c90ad145bf67752b0f19a214
Arg [43] : 0000000000000000000000002eb16c0ff5cf5595b82111341642c502d1a169b5
Arg [44] : 000000000000000000000000ec40fac848b199900870a77804a7b50082ffc411
Arg [45] : 000000000000000000000000210670598e5dc384e582c2244c92e3a5748202e9
Arg [46] : 000000000000000000000000fe8b1168fa27a2a7b0228bd30cdf2dd3a991e118
Arg [47] : 000000000000000000000000aec661a58928e60f52976f1886cd27845789d90f
Arg [48] : 000000000000000000000000fbd9123f3ca030632c5fc5948dfebb38b0b115f2
Arg [49] : 0000000000000000000000005734fc1f7b8b43d23d8d737dccb4a1ede91915e2
Arg [50] : 00000000000000000000000058d5db759585542f5fc3305c20915e9cd06b37ef
Arg [51] : 000000000000000000000000c13068ef06024bbf669b5394d30cc1c511d97499
Arg [52] : 0000000000000000000000001ed0a6469382da8af133a5726f3778720fddb996
Arg [53] : 000000000000000000000000024accc7a293adc682ddebab1600402d677badc3
Arg [54] : 00000000000000000000000092c8e2011b08d268d80302cd18209f69c0dfa0e6
Arg [55] : 00000000000000000000000059c1a1293aac8a343070d6f6368b55215c40abd5
Arg [56] : 0000000000000000000000005f6835a4bfbf03f6416f119a97769a737e319fbc
Arg [57] : 0000000000000000000000003672823b30c3d3f86ae3fff253d24475ee4fe4d5
Arg [58] : 00000000000000000000000069cc2480f25d69bc28a4ece7729ad9b38b4dbe04
Arg [59] : 0000000000000000000000001b89e6d37bd2730db5a6e9c119dbca264f5c3eb3
Arg [60] : 000000000000000000000000f3c5975f4072e3a0e46884a2c6ae7dcfcc0732fb
Arg [61] : 000000000000000000000000bcb5dc467d09d518a0eba0bd968a3ecfb37768c8
Arg [62] : 000000000000000000000000ec91c0ef336a065f7e8b47f34c5fb76942b52de4
Arg [63] : 00000000000000000000000005ae0683d8b39d13950c053e70538f5810737bc5
Arg [64] : 0000000000000000000000001cb27369c538c47591b19ab1e5ec2fab408724b7
Arg [65] : 00000000000000000000000001f9d72f6f3963828c45328f4e09fd4bab9492db
Arg [66] : 00000000000000000000000001f9d72f6f3963828c45328f4e09fd4bab9492db
Arg [67] : 000000000000000000000000ce8f8e677509d5309b16363998c4a945c84a7b28
Arg [68] : 0000000000000000000000004abc5b72483590face3940ecfe91ebdda1ad696b
Arg [69] : 000000000000000000000000a053dbafba05e307a7bddede09c7feb235dc34b1


Deployed Bytecode Sourcemap

32335:25094:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50926:176;;;;;;;;;;-1:-1:-1;50926:176:0;;;;;:::i;:::-;;:::i;:::-;;37012:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37792:210;;;;;;;;;;-1:-1:-1;37792:210:0;;;;;:::i;:::-;;:::i;:::-;;;1829:14:1;;1822:22;1804:41;;1792:2;1777:18;37792:210:0;1664:187:1;33109:27:0;;;;;;;;;;;;;;;;;;;2002:25:1;;;1990:2;1975:18;33109:27:0;1856:177:1;56590:181:0;;;;;;;;;;-1:-1:-1;56590:181:0;;;;;:::i;:::-;;:::i;34782:41::-;;;;;;;;;;-1:-1:-1;34782:41:0;;;;-1:-1:-1;;;;;34782:41:0;;;;;;-1:-1:-1;;;;;4040:55:1;;;4022:74;;4010:2;3995:18;34782:41:0;3849:253:1;37282:108:0;;;;;;;;;;-1:-1:-1;37370:12:0;;37282:108;;32966:30;;;;;;;;;;;;;;;;38955:487;;;;;;;;;;-1:-1:-1;38955:487:0;;;;;:::i;:::-;;:::i;53775:184::-;;;;;;;;;;-1:-1:-1;53775:184:0;;;;;:::i;:::-;;:::i;34737:38::-;;;;;;;;;;-1:-1:-1;34737:38:0;;;;-1:-1:-1;;;;;34737:38:0;;;33250;;;;;;;;;;-1:-1:-1;33250:38:0;;;;;;;;;;;37198:76;;;;;;;;;;-1:-1:-1;37198:76:0;;37264:2;5225:36:1;;5213:2;5198:18;37198:76:0;5083:184:1;55930:136:0;;;;;;;;;;-1:-1:-1;55930:136:0;;;;;:::i;:::-;;:::i;54403:115::-;;;;;;;;;;-1:-1:-1;54403:115:0;;;;;:::i;:::-;;:::i;38010:280::-;;;;;;;;;;-1:-1:-1;38010:280:0;;;;;:::i;:::-;;:::i;32675:31::-;;;;;;;;;;;;;;;;56193:186;;;;;;;;;;-1:-1:-1;56193:186:0;;;;;:::i;:::-;;:::i;34832:28::-;;;;;;;;;;-1:-1:-1;34832:28:0;;;;-1:-1:-1;;;;;34832:28:0;;;53112:96;;;;;;;;;;;;;:::i;50613:126::-;;;;;;;;;;-1:-1:-1;50613:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;50703:28:0;50679:4;50703:28;;;:19;:28;;;;;;;;;50613:126;56387:195;;;;;;;;;;-1:-1:-1;56387:195:0;;;;;:::i;:::-;;:::i;51780:321::-;;;;;;;;;;-1:-1:-1;51780:321:0;;;;;:::i;:::-;;:::i;55479:94::-;;;;;;;;;;-1:-1:-1;55479:94:0;;;;;:::i;:::-;;:::i;54832:267::-;;;;;;;;;;-1:-1:-1;54832:267:0;;;;;:::i;:::-;;:::i;33176:23::-;;;;;;;;;;-1:-1:-1;33176:23:0;;;;;;;;;;;40946:122;;;;;;;;;;;;;:::i;55343:128::-;;;;;;;;;;-1:-1:-1;55343:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;55434:29:0;55410:4;55434:29;;;:20;:29;;;;;;;;;55343:128;52561:543;;;;;;;;;;-1:-1:-1;52561:543:0;;;;;:::i;:::-;;:::i;56973:445::-;;;;;;;;;;-1:-1:-1;56973:445:0;;;;;:::i;:::-;;:::i;55754:168::-;;;;;;;;;;-1:-1:-1;55754:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;55881:33:0;55852:4;55881:33;;;:24;:33;;;;;;;;;55754:168;37398:177;;;;;;;;;;-1:-1:-1;37398:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;37549:18:0;37517:7;37549:18;;;:9;:18;;;;;;;37398:177;34869:34;;;;;;;;;;;;;;;;33463:33;;;;;;;;;;-1:-1:-1;33463:33:0;;;;;;;;53967:280;;;;;;;;;;-1:-1:-1;53967:280:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8124:55:1;;;8106:74;;8211:2;8196:18;;8189:34;;;;8239:18;;;8232:34;;;;8297:2;8282:18;;8275:34;8340:3;8325:19;;8318:35;8093:3;8078:19;53967:280:0;7847:512:1;33206:29:0;;;;;;;;;;-1:-1:-1;33206:29:0;;;;;;;;;;;790:87;;;;;;;;;;-1:-1:-1;836:7:0;863:6;-1:-1:-1;;;;;863:6:0;790:87;;50747:171;;;;;;;;;;-1:-1:-1;50747:171:0;;;;;:::i;:::-;;:::i;37103:87::-;;;;;;;;;;;;;:::i;32769:33::-;;;;;;;;;;;;;;;;51532:240;;;;;;;;;;-1:-1:-1;51532:240:0;;;;;:::i;:::-;;:::i;56074:111::-;;;;;;;;;;-1:-1:-1;56074:111:0;;;;;:::i;:::-;;:::i;38298:425::-;;;;;;;;;;-1:-1:-1;38298:425:0;;;;;:::i;:::-;;:::i;54255:140::-;;;;;;;;;;-1:-1:-1;54255:140:0;;;;;:::i;:::-;;:::i;53397:184::-;;;;;;;;;;-1:-1:-1;53397:184:0;;;;;:::i;:::-;;:::i;38731:216::-;;;;;;;;;;-1:-1:-1;38731:216:0;;;;;:::i;:::-;;:::i;53589:178::-;;;;;;;;;;-1:-1:-1;53589:178:0;;;;;:::i;:::-;;:::i;33831:57::-;;;;;;;;;;-1:-1:-1;33831:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39584:297;;;;;;;;;;-1:-1:-1;39584:297:0;;;;;:::i;:::-;;:::i;55107:86::-;;;;;;;;;;-1:-1:-1;55107:86:0;;;;;:::i;:::-;;:::i;50276:329::-;;;;;;;;;;-1:-1:-1;50276:329:0;;;;;:::i;:::-;;:::i;54526:133::-;;;;;;;;;;-1:-1:-1;54526:133:0;;;;;:::i;:::-;;:::i;51110:183::-;;;;;;;;;;-1:-1:-1;51110:183:0;;;;;:::i;:::-;;:::i;55581:165::-;;;;;;;;;;-1:-1:-1;55581:165:0;;;;;:::i;:::-;;:::i;55201:134::-;;;;;;;;;;-1:-1:-1;55201:134:0;;;;;:::i;:::-;;:::i;37583:201::-;;;;;;;;;;-1:-1:-1;37583:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;37749:18:0;;;37717:7;37749:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37583:201;33055:47;;;;;;;;;;;;;;;;54667:157;;;;;;;;;;-1:-1:-1;54667:157:0;;;;;:::i;:::-;;:::i;51301:223::-;;;;;;;;;;-1:-1:-1;51301:223:0;;;;;:::i;:::-;;:::i;1160:201::-;;;;;;;;;;-1:-1:-1;1160:201:0;;;;;:::i;:::-;;:::i;56779:186::-;;;;;;;;;;-1:-1:-1;56779:186:0;;;;;:::i;:::-;;:::i;53216:173::-;;;;;;;;;;;;;:::i;34910:39::-;;;;;;;;;;;;;;;;32869:32;;;;;;;;;;;;;;;;50926:176;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;;;;;;;;;51039:15:::1;::::0;:55:::1;::::0;;;;-1:-1:-1;;;;;10033:55:1;;;51039::0::1;::::0;::::1;10015:74:1::0;10132:14;;10125:22;10105:18;;;10098:50;51039:15:0;;::::1;::::0;:36:::1;::::0;9988:18:1;;51039:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50926:176:::0;;:::o;37012:83::-;37049:13;37082:5;37075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37012:83;:::o;37792:210::-;37911:4;37933:39;416:10;37956:7;37965:6;37933:8;:39::i;:::-;-1:-1:-1;37990:4:0;37792:210;;;;:::o;56590:181::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;56669:7:::1;56664:100;56686:6;:13;56682:1;:17;;;56664:100;;;56748:4;56721:13;:24;56735:6;56742:1;56735:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;56721:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;56721:24:0;:31;;-1:-1:-1;;56721:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56701:3;::::1;::::0;::::1;:::i;:::-;;;;56664:100;;;;56590:181:::0;:::o;38955:487::-;39095:4;39112:36;39122:6;39130:9;39141:6;39112:9;:36::i;:::-;-1:-1:-1;;;;;39186:19:0;;39159:24;39186:19;;;:11;:19;;;;;;;;416:10;39186:33;;;;;;;;39252:26;;;;39230:114;;;;-1:-1:-1;;;39230:114:0;;11361:2:1;39230:114:0;;;11343:21:1;11400:2;11380:18;;;11373:30;11439:34;11419:18;;;11412:62;11510:8;11490:18;;;11483:36;11536:19;;39230:114:0;11159:402:1;39230:114:0;39355:57;39364:6;416:10;39386:25;39405:6;39386:16;:25;:::i;:::-;39355:8;:57::i;:::-;-1:-1:-1;39430:4:0;;38955:487;-1:-1:-1;;;;38955:487:0:o;53775:184::-;53904:15;;:47;;;;;-1:-1:-1;;;;;4040:55:1;;;53904:47:0;;;4022:74:1;53872:7:0;;53904:15;;:38;;3995:18:1;;53904:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53897:54;53775:184;-1:-1:-1;;53775:184:0:o;55930:136::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;56014:44:::1;::::0;;;;56038:10:::1;56014:44;::::0;::::1;12059:74:1::0;12149:18;;;12142:34;;;-1:-1:-1;;;;;56014:23:0;::::1;::::0;::::1;::::0;12032:18:1;;56014:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55930:136:::0;;:::o;54403:115::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;54465:4:::1;:15:::0;;;::::1;;;;::::0;;;::::1;;::::0;;54496:14:::1;::::0;::::1;::::0;::::1;::::0;54472:8;1829:14:1;1822:22;1804:41;;1792:2;1777:18;;1664:187;54496:14:0::1;;;;;;;;54403:115:::0;:::o;38010:280::-;416:10;38108:4;38202:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38202:34:0;;;;;;;;;;38108:4;;38130:130;;38180:7;;38202:47;;38239:10;;38202:47;:::i;56193:186::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;;;;;56264:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;56263:21;56255:58;;;::::0;-1:-1:-1;;;56255:58:0;;12772:2:1;56255:58:0::1;::::0;::::1;12754:21:1::0;12811:2;12791:18;;;12784:30;12850:26;12830:18;;;12823:54;12894:18;;56255:58:0::1;12570:348:1::0;56255:58:0::1;-1:-1:-1::0;;;;;56324:20:0::1;;::::0;;;:13:::1;:20;::::0;;;;:27;;-1:-1:-1;;56324:27:0::1;56347:4;56324:27;::::0;;56193:186::o;53112:96::-;53147:15;;-1:-1:-1;;;;;53147:15:0;:30;416:10;53186:12;53147:53;;;;;;;;;;-1:-1:-1;;;;;4040:55:1;;;53147:53:0;;;4022:74:1;3995:18;;53147:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53112:96::o;56387:195::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;;;;;56467:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;56459:57;;;::::0;-1:-1:-1;;;56459:57:0;;13372:2:1;56459:57:0::1;::::0;::::1;13354:21:1::0;13411:2;13391:18;;;13384:30;13450:26;13430:18;;;13423:54;13494:18;;56459:57:0::1;13170:348:1::0;56459:57:0::1;-1:-1:-1::0;;;;;56527:20:0::1;56550:5;56527:20:::0;;;:13:::1;:20;::::0;;;;:28;;-1:-1:-1;;56527:28:0::1;::::0;;56387:195::o;51780:321::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;51927:10:::1;:25:::0;;;51963:12:::1;:28:::0;;;52002:11:::1;:26:::0;;;52016:12;52050:28:::1;51978:13:::0;51940:12;52050:28:::1;:::i;:::-;:43;;;;:::i;:::-;52039:8;:54:::0;-1:-1:-1;;;51780:321:0:o;55479:94::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;55547:9:::1;:18:::0;55479:94::o;54832:267::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;54989:4:::1;:12:::0;;55012:18:::1;:40:::0;;;;55063:28;::::1;;-1:-1:-1::0;;54989:12:0;::::1;;;;55063:28:::0;;;;;;;;;;;;;;;::::1;::::0;;54832:267::o;40946:122::-;41000:4;863:6;;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;41016:14:0::1;:22:::0;;-1:-1:-1;;41016:22:0::1;::::0;;;40946:122;:::o;52561:543::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;52684:15:::1;::::0;-1:-1:-1;;;;;52662:38:0;;::::1;52684:15:::0;::::1;52662:38;;52640:137;;;::::0;-1:-1:-1;;;52640:137:0;;13725:2:1;52640:137:0::1;::::0;::::1;13707:21:1::0;13764:2;13744:18;;;13737:30;13803:34;13783:18;;;13776:62;13874:19;13854:18;;;13847:47;13911:19;;52640:137:0::1;13523:413:1::0;52640:137:0::1;52835:15;::::0;52793:59:::1;::::0;-1:-1:-1;;;;;52835:15:0;;::::1;::::0;52793:59;::::1;::::0;::::1;::::0;52835:15:::1;::::0;52793:59:::1;52863:15;:48:::0;;;::::1;-1:-1:-1::0;;;;;52863:48:0;::::1;::::0;;::::1;::::0;;52965:25:::1;::::0;;;;;;;-1:-1:-1;;52965:23:0::1;::::0;:25:::1;::::0;;::::1;::::0;;;;;;;52863:48;52965:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52947:69:0::1;;53025:4;53032:15;;;;;;;;;-1:-1:-1::0;;;;;53032:15:0::1;-1:-1:-1::0;;;;;53032:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52947:108;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;14450:15:1;;;52947:108:0::1;::::0;::::1;14432:34:1::0;14502:15;;14482:18;;;14475:43;14344:18;;52947:108:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53066:13;:30:::0;;;::::1;-1:-1:-1::0;;;;;53066:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;52561:543:0:o;56973:445::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;57111:3:::1;57087:14;:21;:27;57079:94;;;::::0;-1:-1:-1;;;57079:94:0;;14731:2:1;57079:94:0::1;::::0;::::1;14713:21:1::0;14770:2;14750:18;;;14743:30;14809:34;14789:18;;;14782:62;14880:24;14860:18;;;14853:52;14922:19;;57079:94:0::1;14529:418:1::0;57079:94:0::1;57210:9;57206:205;57229:14;:21;57225:1;:25;57206:205;;;57271:14;57288;57303:1;57288:17;;;;;;;;:::i;:::-;;;;;;;57271:34;;57320:14;57337:7;57345:1;57337:10;;;;;;;;:::i;:::-;;;;;;;57320:27;;57362:37;57372:10;57384:6;57392;57362:9;:37::i;:::-;57256:155;;57252:3;;;;;:::i;:::-;;;;57206:205;;53967:280:::0;54200:15;;:39;;;;;-1:-1:-1;;;;;4040:55:1;;;54200:39:0;;;4022:74:1;54070:7:0;;;;;;;;;;54200:15;;;:30;;3995:18:1;;54200:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54193:46;;;;-1:-1:-1;54193:46:0;;-1:-1:-1;54193:46:0;-1:-1:-1;54193:46:0;;-1:-1:-1;53967:280:0;-1:-1:-1;;53967:280:0:o;50747:171::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;50860:15:::1;::::0;:50:::1;::::0;;;;::::1;::::0;::::1;15828:25:1::0;;;-1:-1:-1;;;;;15889:55:1;;;15869:18;;;15862:83;50860:15:0;;::::1;::::0;:34:::1;::::0;15801:18:1;;50860:50:0::1;15654:297:1::0;37103:87:0;37142:13;37175:7;37168:14;;;;;:::i;51532:240::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;51662:13:::1;::::0;-1:-1:-1;;;;;51654:21:0;;::::1;51662:13:::0;::::1;51654:21;;51646:66;;;::::0;-1:-1:-1;;;51646:66:0;;16158:2:1;51646:66:0::1;::::0;::::1;16140:21:1::0;;;16177:18;;;16170:30;16236:34;16216:18;;;16209:62;16288:18;;51646:66:0::1;15956:356:1::0;51646:66:0::1;51723:41;51752:4;51758:5;51723:28;:41::i;56074:111::-:0;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;56140:37:::1;::::0;56148:10:::1;::::0;56140:37;::::1;;;::::0;56169:7;;56140:37:::1;::::0;;;56169:7;56148:10;56140:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;38298:425:::0;416:10;38401:4;38450:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38450:34:0;;;;;;;;;;38517:35;;;;38495:120;;;;-1:-1:-1;;;38495:120:0;;16519:2:1;38495:120:0;;;16501:21:1;16558:2;16538:18;;;16531:30;16597:34;16577:18;;;16570:62;16668:5;16648:18;;;16641:33;16691:19;;38495:120:0;16317:399:1;38495:120:0;38626:67;416:10;38649:7;38658:34;38677:15;38658:16;:34;:::i;38626:67::-;-1:-1:-1;38711:4:0;;38298:425;-1:-1:-1;;;38298:425:0:o;54255:140::-;54346:15;;:41;;;;;-1:-1:-1;;;;;4040:55:1;;;54346:41:0;;;4022:74:1;54319:7:0;;54346:15;;:32;;3995:18:1;;54346:41:0;3849:253:1;53397:184:0;53526:15;;:47;;;;;-1:-1:-1;;;;;4040:55:1;;;53526:47:0;;;4022:74:1;53494:7:0;;53526:15;;:38;;3995:18:1;;53526:47:0;3849:253:1;38731:216:0;38853:4;38875:42;416:10;38899:9;38910:6;38875:9;:42::i;53589:178::-;53715:15;;:44;;;;;-1:-1:-1;;;;;4040:55:1;;;53715:44:0;;;4022:74:1;53683:7:0;;53715:15;;:35;;3995:18:1;;53715:44:0;3849:253:1;39584:297:0;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;39670:1:::1;39658:9;:13;39650:44;;;::::0;-1:-1:-1;;;39650:44:0;;16923:2:1;39650:44:0::1;::::0;::::1;16905:21:1::0;16962:2;16942:18;;;16935:30;17001:20;16981:18;;;16974:48;17039:18;;39650:44:0::1;16721:342:1::0;39650:44:0::1;39705:6;:13:::0;;-1:-1:-1;;39705:13:0::1;39714:4;39705:13:::0;;::::1;::::0;;;39737:11:::1;::::0;;;::::1;39705:13;39737:11;:19;;;39729:36;;;;-1:-1:-1::0;;;39729:36:0::1;;;;;;17270:2:1::0;17252:21;;;17309:1;17289:18;;;17282:29;17347:6;17342:2;17327:18;;17320:34;17386:2;17371:18;;17068:327;39729:36:0::1;39776:11;:19:::0;;;::::1;::::0;;39806:22:::1;39818:9:::0;39523:12;39509:11;:26;39546:10;:22;39450:126;39806:22:::1;39861:11;::::0;39844:29:::1;::::0;39861:11;;;::::1;;;1829:14:1::0;1822:22;1804:41;;39844:29:0::1;::::0;1792:2:1;1777:18;39844:29:0::1;1664:187:1::0;55107:86:0;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;55171:5:::1;:14:::0;55107:86::o;50276:329::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;;;;;50383:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;50361:136;;;::::0;-1:-1:-1;;;50361:136:0;;17602:2:1;50361:136:0::1;::::0;::::1;17584:21:1::0;17641:2;17621:18;;;17614:30;17680:34;17660:18;;;17653:62;17751:16;17731:18;;;17724:44;17785:19;;50361:136:0::1;17400:410:1::0;50361:136:0::1;-1:-1:-1::0;;;;;50508:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50508:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50563:34;;1804:41:1;;;50563:34:0::1;::::0;1777:18:1;50563:34:0::1;;;;;;;50276:329:::0;;:::o;54526:133::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;54594:10:::1;:21:::0;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;54631:20:::1;::::0;::::1;::::0;::::1;::::0;54607:8;1829:14:1;1822:22;1804:41;;1792:2;1777:18;;1664:187;51110:183:0;51237:15;;:48;;;;;-1:-1:-1;;;;;4040:55:1;;;51237:48:0;;;4022:74:1;51208:4:0;;51237:15;;:39;;3995:18:1;;51237:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55581:165::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;;;;;55694:33:0;;;::::1;;::::0;;;:24:::1;:33;::::0;;;;:44;;-1:-1:-1;;55694:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55581:165::o;55201:134::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;;;;;55287:29:0;;;::::1;;::::0;;;:20:::1;:29;::::0;;;;:40;;-1:-1:-1;;55287:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55201:134::o;54667:157::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;54743:18:::1;:29:::0;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;54788:28:::1;::::0;::::1;::::0;::::1;::::0;54764:8;1829:14:1;1822:22;1804:41;;1792:2;1777:18;;1664:187;51301:223:0;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;51441:13:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;;;51441:30:0;;::::1;;;::::0;;51482:15:::1;:34:::0;;;::::1;::::0;;;::::1;;::::0;;51301:223::o;1160:201::-;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;-1:-1:-1;;;;;1249:22:0;::::1;1241:73;;;::::0;-1:-1:-1;;;1241:73:0;;18017:2:1;1241:73:0::1;::::0;::::1;17999:21:1::0;18056:2;18036:18;;;18029:30;18095:34;18075:18;;;18068:62;18166:8;18146:18;;;18139:36;18192:19;;1241:73:0::1;17815:402:1::0;1241:73:0::1;1325:28;1344:8;1325:18;:28::i;56779:186::-:0;836:7;863:6;-1:-1:-1;;;;;863:6:0;416:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;9688:2:1;917:68:0;;;9670:21:1;;;9707:18;;;9700:30;9766:34;9746:18;;;9739:62;9818:18;;917:68:0;9486:356:1;917:68:0;56862:7:::1;56857:101;56879:6;:13;56875:1;:17;;;56857:101;;;56941:5;56914:13;:24;56928:6;56935:1;56928:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;56914:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;56914:24:0;:32;;-1:-1:-1;;56914:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56894:3;::::1;::::0;::::1;:::i;:::-;;;;56857:101;;53216:173:::0;53262:18;;;;;;;53254:62;;;;-1:-1:-1;;;53254:62:0;;18424:2:1;53254:62:0;;;18406:21:1;18463:2;18443:18;;;18436:30;18502:33;18482:18;;;18475:61;18553:18;;53254:62:0;18222:355:1;53254:62:0;53327:15;;-1:-1:-1;;;;;53327:15:0;:31;416:10;53367:12;336:98;46123:365;-1:-1:-1;;;;;46250:19:0;;46242:66;;;;-1:-1:-1;;;46242:66:0;;18784:2:1;46242:66:0;;;18766:21:1;18823:2;18803:18;;;18796:30;18862:34;18842:18;;;18835:62;18933:4;18913:18;;;18906:32;18955:19;;46242:66:0;18582:398:1;46242:66:0;-1:-1:-1;;;;;46327:21:0;;46319:66;;;;-1:-1:-1;;;46319:66:0;;19187:2:1;46319:66:0;;;19169:21:1;;;19206:18;;;19199:30;19265:34;19245:18;;;19238:62;19317:18;;46319:66:0;18985:356:1;46319:66:0;-1:-1:-1;;;;;46396:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;46448:32;;2002:25:1;;;46448:32:0;;1975:18:1;46448:32:0;;;;;;;46123:365;;;:::o;41076:4402::-;41222:6;;;;;:44;;-1:-1:-1;836:7:0;863:6;-1:-1:-1;;;;;41249:17:0;;;863:6;;41249:17;41222:44;:85;;;-1:-1:-1;836:7:0;863:6;-1:-1:-1;;;;;41287:20:0;;;863:6;;41287:20;41222:85;:124;;;-1:-1:-1;;;;;;41328:18:0;;;;;;:10;:18;;;;;;;;41222:124;:166;;;-1:-1:-1;;;;;;41367:21:0;;;;;;:10;:21;;;;;;;;41222:166;41200:224;;;;-1:-1:-1;;;41200:224:0;;19548:2:1;41200:224:0;;;19530:21:1;19587:1;19567:18;;;19560:29;19625:10;19605:18;;;19598:38;19653:18;;41200:224:0;19346:331:1;41200:224:0;-1:-1:-1;;;;;41446:21:0;;;;;;:13;:21;;;;;;;;41445:22;41437:61;;;;-1:-1:-1;;;41437:61:0;;19884:2:1;41437:61:0;;;19866:21:1;19923:2;19903:18;;;19896:30;19962:28;19942:18;;;19935:56;20008:18;;41437:61:0;19682:350:1;41437:61:0;-1:-1:-1;;;;;41518:24:0;;;;;;:13;:24;;;;;;;;41517:25;41509:67;;;;-1:-1:-1;;;41509:67:0;;20239:2:1;41509:67:0;;;20221:21:1;20278:2;20258:18;;;20251:30;20317:31;20297:18;;;20290:59;20366:18;;41509:67:0;20037:353:1;41509:67:0;-1:-1:-1;;;;;41597:20:0;;41589:68;;;;-1:-1:-1;;;41589:68:0;;20597:2:1;41589:68:0;;;20579:21:1;20636:2;20616:18;;;20609:30;20675:34;20655:18;;;20648:62;20746:5;20726:18;;;20719:33;20769:19;;41589:68:0;20395:399:1;41589:68:0;-1:-1:-1;;;;;41676:23:0;;41668:69;;;;-1:-1:-1;;;41668:69:0;;21001:2:1;41668:69:0;;;20983:21:1;21040:2;21020:18;;;21013:30;21079:34;21059:18;;;21052:62;21150:3;21130:18;;;21123:31;21171:19;;41668:69:0;20799:397:1;41668:69:0;41773:5;;41810:9;;41852:22;;;;;:54;;-1:-1:-1;;;;;;41878:28:0;;;;;;:20;:28;;;;;;;;41852:54;41830:121;;;;-1:-1:-1;;;41830:121:0;;21403:2:1;41830:121:0;;;21385:21:1;21442:2;21422:18;;;21415:30;21481:19;21461:18;;;21454:47;21518:18;;41830:121:0;21201:341:1;41830:121:0;836:7;863:6;-1:-1:-1;;;;;41986:17:0;;;863:6;;41986:17;;;;:58;;-1:-1:-1;836:7:0;863:6;-1:-1:-1;;;;;42024:20:0;;;863:6;;42024:20;;41986:58;:102;;;;-1:-1:-1;;;;;;42065:23:0;;;;41986:102;:151;;;;-1:-1:-1;;;;;;42109:28:0;;42130:6;42109:28;;41986:151;:181;;;;-1:-1:-1;42159:8:0;;;;42158:9;41986:181;41964:898;;;42215:13;;-1:-1:-1;;;;;42205:23:0;;;42215:13;;42205:23;:61;;;;-1:-1:-1;42250:15:0;;-1:-1:-1;;;;;42232:34:0;;;42250:15;;42232:34;;42205:61;42201:275;;;42344:10;;42329:11;;:26;;;;:::i;:::-;42313:12;:42;42309:122;;-1:-1:-1;;;;;42384:16:0;;;;;;:5;:16;;;;;:23;;-1:-1:-1;;42384:23:0;42403:4;42384:23;;;42309:122;42500:14;;;;42496:355;;;836:7;863:6;-1:-1:-1;;;;;42542:20:0;;;863:6;;42542:20;;;;:61;;-1:-1:-1;42587:15:0;;-1:-1:-1;;;;;42566:37:0;;;42587:15;;42566:37;;42542:61;:100;;;;-1:-1:-1;42628:13:0;;-1:-1:-1;;;;;42607:35:0;;;42628:13;;42607:35;;42542:100;42538:294;;;42689:9;42678:21;;;;:10;:21;;;;;;42702:12;-1:-1:-1;42670:75:0;;;;-1:-1:-1;;;42670:75:0;;21749:2:1;42670:75:0;;;21731:21:1;21788:2;21768:18;;;21761:30;21827:28;21807:18;;;21800:56;21873:18;;42670:75:0;21547:350:1;42670:75:0;42783:9;42772:21;;;;:10;:21;;;;;42796:12;42772:36;;42538:294;836:7;863:6;-1:-1:-1;;;;;42892:17:0;;;863:6;;42892:17;;;;:60;;-1:-1:-1;;;;;;42926:26:0;;42947:4;42926:26;;42892:60;:103;;;;-1:-1:-1;42990:4:0;;-1:-1:-1;;;;;42969:26:0;;;42990:4;;42969:26;;42892:103;:146;;;;-1:-1:-1;43025:13:0;;-1:-1:-1;;;;;43012:26:0;;;43025:13;;43012:26;;42892:146;42874:404;;;-1:-1:-1;;;;;37549:18:0;;43066:22;37549:18;;;:9;:18;;;;;;;;;43152:24;:35;;;;;;;;;;:99;;-1:-1:-1;43240:10:0;43213:23;43230:6;43213:14;:23;:::i;:::-;:37;;43152:99;43126:140;;;;;;43051:227;42874:404;-1:-1:-1;;;;;43314:17:0;;43290:21;43314:17;;;:9;:17;;;;;;43364:23;;;;43342:109;;;;-1:-1:-1;;;43342:109:0;;22104:2:1;43342:109:0;;;22086:21:1;22143:2;22123:18;;;22116:30;22182:34;22162:18;;;22155:62;22253:6;22233:18;;;22226:34;22277:19;;43342:109:0;21902:400:1;43342:109:0;43513:4;43464:28;37549:18;;;:9;:18;;;;;;43635;;43684:4;;43562:21;;43611:42;;;;43684:4;;;;;:36;;;;;43713:7;43684:36;:70;;;;-1:-1:-1;43746:8:0;;;;43745:9;43684:70;:151;;;;-1:-1:-1;;;;;;43802:33:0;;;;;;:25;:33;;;;;;;;43801:34;43684:151;:251;;;;-1:-1:-1;43919:15:0;;-1:-1:-1;;;;;43901:34:0;;;43919:15;;43901:34;;43684:251;:323;;;;-1:-1:-1;836:7:0;863:6;-1:-1:-1;;;;;43990:17:0;;;863:6;;43990:17;;43684:323;:360;;;;-1:-1:-1;836:7:0;863:6;-1:-1:-1;;;;;44024:20:0;;;863:6;;44024:20;;43684:360;43666:694;;;44072:8;:15;;-1:-1:-1;;44072:15:0;44083:4;44072:15;;;44109:12;;44072:15;44109:12;44104:95;;44165:18;;44142:41;;44104:95;44213:57;44226:20;44248:21;44213:12;:57::i;:::-;44302:15;44287:12;:30;44332:8;:16;;-1:-1:-1;;44332:16:0;;;43666:694;44419:13;;44372:12;;-1:-1:-1;;;;;44401:32:0;;;44419:13;;44401:32;44397:85;;;-1:-1:-1;44466:4:0;44397:85;44519:13;;-1:-1:-1;;;;;44498:35:0;;;44519:13;;44498:35;44494:89;;;-1:-1:-1;44567:4:0;44494:89;-1:-1:-1;;;;;44599:27:0;;;;;;:19;:27;;;;;;;;;:61;;-1:-1:-1;;;;;;44630:30:0;;;;;;:19;:30;;;;;;;;44599:61;44595:109;;;-1:-1:-1;44687:5:0;44595:109;44720:8;;;;;:23;;-1:-1:-1;44733:10:0;;;;;;;44732:11;44720:23;44716:71;;;-1:-1:-1;44770:5:0;44716:71;44799:12;44832:7;:27;;;;-1:-1:-1;;;;;;44843:16:0;;;;;;:5;:16;;;;;;;;44832:27;44828:211;;;44876:13;39952:10;;;39931:18;:31;39996:12;;;39973:20;:35;40041:11;;;40019:19;:33;40082:8;;;40063:16;:27;40124:4;40111:17;;;;-1:-1:-1;40150:16:0;;;;40197:15;;;40223;39889:376;44876:13;44933:5;44921:8;;44912:6;:17;;;;:::i;:::-;44911:27;;;;:::i;:::-;44904:34;-1:-1:-1;44953:14:0;44904:34;44953:14;;:::i;:::-;;;44982:45;44999:6;45015:4;45022;44982:16;:45::i;:::-;45054:7;:28;;;;-1:-1:-1;;;;;;45066:16:0;;;;;;:5;:16;;;;;;;;45065:17;45054:28;45051:182;;;45127:5;45115:8;;45106:6;:17;;;;:::i;:::-;45105:27;;;;:::i;:::-;45098:34;-1:-1:-1;45147:14:0;45098:34;45147:14;;:::i;:::-;;;45176:45;45193:6;45209:4;45216;45176:16;:45::i;:::-;45245:43;45262:6;45270:9;45281:6;45245:16;:43::i;:::-;45301:15;;-1:-1:-1;;;;;45301:15:0;:26;45336:6;45345:17;45336:6;-1:-1:-1;;;;;37549:18:0;37517:7;37549:18;;;:9;:18;;;;;;;37398:177;45345:17;45301:62;;;;;;;;;;-1:-1:-1;;;;;12077:55:1;;;45301:62:0;;;12059:74:1;12149:18;;;12142:34;12032:18;;45301:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45374:15:0;;-1:-1:-1;;;;;45374:15:0;;-1:-1:-1;45374:26:0;;-1:-1:-1;45409:9:0;45421:20;45409:9;-1:-1:-1;;;;;37549:18:0;37517:7;37549:18;;;:9;:18;;;;;;;37398:177;45421:20;45374:68;;;;;;;;;;-1:-1:-1;;;;;12077:55:1;;;45374:68:0;;;12059:74:1;12149:18;;;12142:34;12032:18;;45374:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45455:15;40731:18;;40718:10;:31;40775:20;;40760:12;:35;40820:19;;40806:11;:33;40861:16;;40850:8;:27;40674:211;45455:15;41189:4289;;;;;;;;41076:4402;;;:::o;52109:444::-;-1:-1:-1;;;;;52214:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;52192:151;;;;-1:-1:-1;;;52192:151:0;;23339:2:1;52192:151:0;;;23321:21:1;23378:2;23358:18;;;23351:30;23417:34;23397:18;;;23390:62;23488:31;23468:18;;;23461:59;23537:19;;52192:151:0;23137:425:1;52192:151:0;-1:-1:-1;;;;;52354:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;52354:39:0;;;;;;;;;;;;52404:86;;52430:15;;:48;;;;;-1:-1:-1;;;;;10033:55:1;;;52430:48:0;;;10015:74:1;52430:15:0;10105:18:1;;;10098:50;52430:15:0;;;;:36;;9988:18:1;;52430:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52404:86;52505:40;;;;;;-1:-1:-1;;;;;52505:40:0;;;;;;;;52109:444;;:::o;1521:191::-;1595:16;1614:6;;-1:-1:-1;;;;;1631:17:0;;;;;;;;;;1664:40;;1614:6;;;;;;;1664:40;;1595:16;1664:40;1584:128;1521:191;:::o;48275:1993::-;48362:1;48352:6;:11;48348:50;;48275:1993;;:::o;48348:50::-;48460:13;;48410:27;;48460:13;;;-1:-1:-1;;;;;48460:13:0;48452:36;48448:123;;48551:8;;48537:10;;48528:19;;:6;:19;:::i;:::-;48527:32;;;;:::i;:::-;48505:54;;48448:123;48583:27;48657:1;48625:15;;;;;;;;;-1:-1:-1;;;;;48625:15:0;-1:-1:-1;;;;;48625:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;48621:121;;;48722:8;;48707:11;;48698:20;;:6;:20;:::i;:::-;48697:33;;;;:::i;:::-;48675:55;;48621:121;48754:26;48840:19;48783:41;48805:19;48783:6;:41;:::i;:::-;:76;;;;:::i;:::-;48754:105;-1:-1:-1;48870:27:0;48900:22;48921:1;48754:105;48900:22;:::i;:::-;48870:52;-1:-1:-1;48933:26:0;48962:40;48870:52;48962:18;:40;:::i;:::-;48933:69;-1:-1:-1;49013:23:0;49109:19;49039:54;49074:19;49039;:54;:::i;:::-;:89;;;;:::i;:::-;49013:115;-1:-1:-1;49165:21:0;49197:36;49013:115;49197:19;:36::i;:::-;49244:21;49323:6;49269:37;49293:13;49269:21;:37;:::i;:::-;49268:61;;;;:::i;:::-;49244:85;-1:-1:-1;49342:23:0;49421:15;49369:35;49385:19;49244:85;49369:35;:::i;:::-;49368:68;;;;:::i;:::-;49342:94;-1:-1:-1;49447:23:0;49526:15;49474:35;49490:19;49474:13;:35;:::i;:::-;49473:68;;;;:::i;:::-;49447:94;-1:-1:-1;49552:23:0;49447:94;49578:44;49607:15;49578:13;:44;:::i;:::-;:75;;;;:::i;:::-;49552:101;-1:-1:-1;49670:19:0;;49666:100;;49714:13;;49706:48;;49714:13;;;;-1:-1:-1;;;;;49714:13:0;;49706:48;;;;;;;;;;;;49714:13;49706:48;;;;;;;;;;;;;;;;;;;;;49666:100;49778:49;49791:18;49811:15;49778:12;:49::i;:::-;49843:127;;;23769:25:1;;;23825:2;23810:18;;23803:34;;;23853:18;;;23846:34;;;49843:127:0;;23757:2:1;23742:18;49843:127:0;;;;;;;49987:19;;49983:278;;50050:15;;50042:89;;50024:12;;-1:-1:-1;;;;;50050:15:0;;50097;;50024:12;50042:89;50024:12;50042:89;50097:15;50050;50042:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50023:108;;;50150:7;50146:104;;;50183:51;;;24275:25:1;;;24331:2;24316:18;;24309:34;;;50183:51:0;;24248:18:1;50183:51:0;;;;;;;50146:104;50008:253;49983:278;48337:1931;;;;;;;;;;;48275:1993;;:::o;45486:629::-;-1:-1:-1;;;;;45624:20:0;;45616:68;;;;-1:-1:-1;;;45616:68:0;;20597:2:1;45616:68:0;;;20579:21:1;20636:2;20616:18;;;20609:30;20675:34;20655:18;;;20648:62;20746:5;20726:18;;;20719:33;20769:19;;45616:68:0;20395:399:1;45616:68:0;-1:-1:-1;;;;;45703:23:0;;45695:69;;;;-1:-1:-1;;;45695:69:0;;21001:2:1;45695:69:0;;;20983:21:1;21040:2;21020:18;;;21013:30;21079:34;21059:18;;;21052:62;21150:3;21130:18;;;21123:31;21171:19;;45695:69:0;20799:397:1;45695:69:0;-1:-1:-1;;;;;45799:17:0;;45775:21;45799:17;;;:9;:17;;;;;;45849:23;;;;45827:109;;;;-1:-1:-1;;;45827:109:0;;22104:2:1;45827:109:0;;;22086:21:1;22143:2;22123:18;;;22116:30;22182:34;22162:18;;;22155:62;22253:6;22233:18;;;22226:34;22277:19;;45827:109:0;21902:400:1;45827:109:0;45967:22;45983:6;45967:13;:22;:::i;:::-;-1:-1:-1;;;;;45947:17:0;;;;;;;:9;:17;;;;;;:42;;;;46000:20;;;;;;;;:30;;46024:6;;45947:17;46000:30;;46024:6;;46000:30;:::i;:::-;;;;;;;;46063:9;-1:-1:-1;;;;;46046:35:0;46055:6;-1:-1:-1;;;;;46046:35:0;;46074:6;46046:35;;;;2002:25:1;;1990:2;1975:18;;1856:177;46046:35:0;;;;;;;;46092:15;40731:18;;40718:10;:31;40775:20;;40760:12;:35;40820:19;;40806:11;:33;40861:16;;40850:8;:27;40674:211;46092:15;45605:510;45486:629;;;:::o;47190:490::-;47278:16;;;47292:1;47278:16;;;;;;;;47254:21;;47278:16;;;;;;;;;;-1:-1:-1;47278:16:0;47254:40;;47323:4;47305;47310:1;47305:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47305:23:0;;;:7;;;;;;;;;;:23;;;;47349:15;;:22;;;;;;;;:15;;;;;:20;;:22;;;;;47305:7;;47349:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47339:4;47344:1;47339:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47339:32:0;;;:7;;;;;;;;;;:32;;;;47414:15;47382:57;;47399:4;;47414:15;47432:6;47382:8;:57::i;:::-;47450:15;;:222;;;;;-1:-1:-1;;;;;47450:15:0;;;;:66;;:222;;47531:6;;47450:15;;47599:4;;47626;;47646:15;;47450:222;;;:::i;47688:395::-;47793:15;;47761:57;;47778:4;;-1:-1:-1;;;;;47793:15:0;47811:6;47761:8;:57::i;:::-;47829:15;;48019;;47829:246;;;;;47898:4;47829:246;;;25757:34:1;25807:18;;;25800:34;;;47829:15:0;25850:18:1;;;25843:34;;;25893:18;;;25886:34;-1:-1:-1;;;;;48019:15:0;;;25936:19:1;;;25929:44;48049:15:0;25989:19:1;;;25982:35;47829:15:0;;;:31;;47868:6;;25668:19:1;;47829:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;47688:395;;:::o;14:154:1:-;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:118;259:5;252:13;245:21;238:5;235:32;225:60;;281:1;278;271:12;296:382;361:6;369;422:2;410:9;401:7;397:23;393:32;390:52;;;438:1;435;428:12;390:52;477:9;464:23;496:31;521:5;496:31;:::i;:::-;546:5;-1:-1:-1;603:2:1;588:18;;575:32;616:30;575:32;616:30;:::i;:::-;665:7;655:17;;;296:382;;;;;:::o;683:656::-;795:4;824:2;853;842:9;835:21;885:6;879:13;928:6;923:2;912:9;908:18;901:34;953:1;963:140;977:6;974:1;971:13;963:140;;;1072:14;;;1068:23;;1062:30;1038:17;;;1057:2;1034:26;1027:66;992:10;;963:140;;;1121:6;1118:1;1115:13;1112:91;;;1191:1;1186:2;1177:6;1166:9;1162:22;1158:31;1151:42;1112:91;-1:-1:-1;1255:2:1;1243:15;1260:66;1239:88;1224:104;;;;1330:2;1220:113;;683:656;-1:-1:-1;;;683:656:1:o;1344:315::-;1412:6;1420;1473:2;1461:9;1452:7;1448:23;1444:32;1441:52;;;1489:1;1486;1479:12;1441:52;1528:9;1515:23;1547:31;1572:5;1547:31;:::i;:::-;1597:5;1649:2;1634:18;;;;1621:32;;-1:-1:-1;;;1344:315:1:o;2038:184::-;2090:77;2087:1;2080:88;2187:4;2184:1;2177:15;2211:4;2208:1;2201:15;2227:334;2298:2;2292:9;2354:2;2344:13;;2359:66;2340:86;2328:99;;2457:18;2442:34;;2478:22;;;2439:62;2436:88;;;2504:18;;:::i;:::-;2540:2;2533:22;2227:334;;-1:-1:-1;2227:334:1:o;2566:183::-;2626:4;2659:18;2651:6;2648:30;2645:56;;;2681:18;;:::i;:::-;-1:-1:-1;2726:1:1;2722:14;2738:4;2718:25;;2566:183::o;2754:737::-;2808:5;2861:3;2854:4;2846:6;2842:17;2838:27;2828:55;;2879:1;2876;2869:12;2828:55;2915:6;2902:20;2941:4;2965:60;2981:43;3021:2;2981:43;:::i;:::-;2965:60;:::i;:::-;3059:15;;;3145:1;3141:10;;;;3129:23;;3125:32;;;3090:12;;;;3169:15;;;3166:35;;;3197:1;3194;3187:12;3166:35;3233:2;3225:6;3221:15;3245:217;3261:6;3256:3;3253:15;3245:217;;;3341:3;3328:17;3358:31;3383:5;3358:31;:::i;:::-;3402:18;;3440:12;;;;3278;;3245:217;;;-1:-1:-1;3480:5:1;2754:737;-1:-1:-1;;;;;;2754:737:1:o;3496:348::-;3580:6;3633:2;3621:9;3612:7;3608:23;3604:32;3601:52;;;3649:1;3646;3639:12;3601:52;3689:9;3676:23;3722:18;3714:6;3711:30;3708:50;;;3754:1;3751;3744:12;3708:50;3777:61;3830:7;3821:6;3810:9;3806:22;3777:61;:::i;:::-;3767:71;3496:348;-1:-1:-1;;;;3496:348:1:o;4107:456::-;4184:6;4192;4200;4253:2;4241:9;4232:7;4228:23;4224:32;4221:52;;;4269:1;4266;4259:12;4221:52;4308:9;4295:23;4327:31;4352:5;4327:31;:::i;:::-;4377:5;-1:-1:-1;4434:2:1;4419:18;;4406:32;4447:33;4406:32;4447:33;:::i;:::-;4107:456;;4499:7;;-1:-1:-1;;;4553:2:1;4538:18;;;;4525:32;;4107:456::o;4568:247::-;4627:6;4680:2;4668:9;4659:7;4655:23;4651:32;4648:52;;;4696:1;4693;4686:12;4648:52;4735:9;4722:23;4754:31;4779:5;4754:31;:::i;:::-;4804:5;4568:247;-1:-1:-1;;;4568:247:1:o;5272:241::-;5328:6;5381:2;5369:9;5360:7;5356:23;5352:32;5349:52;;;5397:1;5394;5387:12;5349:52;5436:9;5423:23;5455:28;5477:5;5455:28;:::i;5749:316::-;5826:6;5834;5842;5895:2;5883:9;5874:7;5870:23;5866:32;5863:52;;;5911:1;5908;5901:12;5863:52;-1:-1:-1;;5934:23:1;;;6004:2;5989:18;;5976:32;;-1:-1:-1;6055:2:1;6040:18;;;6027:32;;5749:316;-1:-1:-1;5749:316:1:o;6070:180::-;6129:6;6182:2;6170:9;6161:7;6157:23;6153:32;6150:52;;;6198:1;6195;6188:12;6150:52;-1:-1:-1;6221:23:1;;6070:180;-1:-1:-1;6070:180:1:o;6255:444::-;6326:6;6334;6342;6395:2;6383:9;6374:7;6370:23;6366:32;6363:52;;;6411:1;6408;6401:12;6363:52;6450:9;6437:23;6469:28;6491:5;6469:28;:::i;:::-;6516:5;-1:-1:-1;6568:2:1;6553:18;;6540:32;;-1:-1:-1;6624:2:1;6609:18;;6596:32;6637:30;6596:32;6637:30;:::i;:::-;6686:7;6676:17;;;6255:444;;;;;:::o;6704:1138::-;6822:6;6830;6883:2;6871:9;6862:7;6858:23;6854:32;6851:52;;;6899:1;6896;6889:12;6851:52;6939:9;6926:23;6968:18;7009:2;7001:6;6998:14;6995:34;;;7025:1;7022;7015:12;6995:34;7048:61;7101:7;7092:6;7081:9;7077:22;7048:61;:::i;:::-;7038:71;;7128:2;7118:12;;7183:2;7172:9;7168:18;7155:32;7212:2;7202:8;7199:16;7196:36;;;7228:1;7225;7218:12;7196:36;7251:24;;;-1:-1:-1;7306:4:1;7298:13;;7294:27;-1:-1:-1;7284:55:1;;7335:1;7332;7325:12;7284:55;7371:2;7358:16;7394:60;7410:43;7450:2;7410:43;:::i;7394:60::-;7488:15;;;7570:1;7566:10;;;;7558:19;;7554:28;;;7519:12;;;;7594:19;;;7591:39;;;7626:1;7623;7616:12;7591:39;7650:11;;;;7670:142;7686:6;7681:3;7678:15;7670:142;;;7752:17;;7740:30;;7703:12;;;;7790;;;;7670:142;;;7831:5;7821:15;;;;;;;6704:1138;;;;;:::o;8364:315::-;8432:6;8440;8493:2;8481:9;8472:7;8468:23;8464:32;8461:52;;;8509:1;8506;8499:12;8461:52;8545:9;8532:23;8522:33;;8605:2;8594:9;8590:18;8577:32;8618:31;8643:5;8618:31;:::i;8684:388::-;8752:6;8760;8813:2;8801:9;8792:7;8788:23;8784:32;8781:52;;;8829:1;8826;8819:12;8781:52;8868:9;8855:23;8887:31;8912:5;8887:31;:::i;:::-;8937:5;-1:-1:-1;8994:2:1;8979:18;;8966:32;9007:33;8966:32;9007:33;:::i;10159:437::-;10238:1;10234:12;;;;10281;;;10302:61;;10356:4;10348:6;10344:17;10334:27;;10302:61;10409:2;10401:6;10398:14;10378:18;10375:38;10372:218;;;10446:77;10443:1;10436:88;10547:4;10544:1;10537:15;10575:4;10572:1;10565:15;10372:218;;10159:437;;;:::o;10601:184::-;10653:77;10650:1;10643:88;10750:4;10747:1;10740:15;10774:4;10771:1;10764:15;10790:184;10842:77;10839:1;10832:88;10939:4;10936:1;10929:15;10963:4;10960:1;10953:15;10979:175;11016:3;11060:4;11053:5;11049:16;11089:4;11080:7;11077:17;11074:43;;;11097:18;;:::i;:::-;11146:1;11133:15;;10979:175;-1:-1:-1;;10979:175:1:o;11566:125::-;11606:4;11634:1;11631;11628:8;11625:34;;;11639:18;;:::i;:::-;-1:-1:-1;11676:9:1;;11566:125::o;11696:184::-;11766:6;11819:2;11807:9;11798:7;11794:23;11790:32;11787:52;;;11835:1;11832;11825:12;11787:52;-1:-1:-1;11858:16:1;;11696:184;-1:-1:-1;11696:184:1:o;12187:245::-;12254:6;12307:2;12295:9;12286:7;12282:23;12278:32;12275:52;;;12323:1;12320;12313:12;12275:52;12355:9;12349:16;12374:28;12396:5;12374:28;:::i;12437:128::-;12477:3;12508:1;12504:6;12501:1;12498:13;12495:39;;;12514:18;;:::i;:::-;-1:-1:-1;12550:9:1;;12437:128::o;13941:251::-;14011:6;14064:2;14052:9;14043:7;14039:23;14035:32;14032:52;;;14080:1;14077;14070:12;14032:52;14112:9;14106:16;14131:31;14156:5;14131:31;:::i;14952:195::-;14991:3;15022:66;15015:5;15012:77;15009:103;;;15092:18;;:::i;:::-;-1:-1:-1;15139:1:1;15128:13;;14952:195::o;15152:497::-;15258:6;15266;15274;15282;15290;15343:3;15331:9;15322:7;15318:23;15314:33;15311:53;;;15360:1;15357;15350:12;15311:53;15392:9;15386:16;15411:31;15436:5;15411:31;:::i;:::-;15506:2;15491:18;;15485:25;15550:2;15535:18;;15529:25;15594:2;15579:18;;15573:25;15638:3;15623:19;;;15617:26;15461:5;;15485:25;;-1:-1:-1;15529:25:1;15573;-1:-1:-1;15617:26:1;;-1:-1:-1;15152:497:1;-1:-1:-1;;;15152:497:1:o;22307:228::-;22347:7;22473:1;22405:66;22401:74;22398:1;22395:81;22390:1;22383:9;22376:17;22372:105;22369:131;;;22480:18;;:::i;:::-;-1:-1:-1;22520:9:1;;22307:228::o;22540:274::-;22580:1;22606;22596:189;;22641:77;22638:1;22631:88;22742:4;22739:1;22732:15;22770:4;22767:1;22760:15;22596:189;-1:-1:-1;22799:9:1;;22540:274::o;24354:1026::-;24616:4;24664:3;24653:9;24649:19;24695:6;24684:9;24677:25;24721:2;24759:6;24754:2;24743:9;24739:18;24732:34;24802:3;24797:2;24786:9;24782:18;24775:31;24826:6;24861;24855:13;24892:6;24884;24877:22;24930:3;24919:9;24915:19;24908:26;;24969:2;24961:6;24957:15;24943:29;;24990:1;25000:218;25014:6;25011:1;25008:13;25000:218;;;25079:13;;-1:-1:-1;;;;;25075:62:1;25063:75;;25193:15;;;;25158:12;;;;25036:1;25029:9;25000:218;;;-1:-1:-1;;;;;;;25274:55:1;;;;25269:2;25254:18;;25247:83;-1:-1:-1;;;25361:3:1;25346:19;25339:35;25235:3;24354:1026;-1:-1:-1;;;24354:1026:1:o;26028:306::-;26116:6;26124;26132;26185:2;26173:9;26164:7;26160:23;26156:32;26153:52;;;26201:1;26198;26191:12;26153:52;26230:9;26224:16;26214:26;;26280:2;26269:9;26265:18;26259:25;26249:35;;26324:2;26313:9;26309:18;26303:25;26293:35;;26028:306;;;;;:::o

Swarm Source

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