ETH Price: $2,537.27 (+3.83%)

Token

PiPi (PiPi)
 

Overview

Max Total Supply

426,900,000,000,000 PiPi

Holders

3,159

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
276,322,389,275,342.26997173057518218 PiPi

Value
$0.00
0x6dab670a079a97ec517e4e376a9cd81c9b1c6462
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
BABYTOKEN

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-01
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
    uint256[49] private __gap;
}


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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {

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

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

    function decimals() external view returns (uint8);
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

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

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


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

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 to 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 {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}


library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
    public
    view
    returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
    public
    view
    returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.

interface DividendPayingTokenInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) external view returns (uint256);

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
    ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
    function withdrawDividend() external;

    /// @dev This event MUST emit when ether is distributed to token holders.
    /// @param from The address which sends ether to this contract.
    /// @param weiAmount The amount of distributed ether in wei.
    event DividendsDistributed(address indexed from, uint256 weiAmount);

    /// @dev This event MUST emit when an address withdraws their dividend.
    /// @param to The address which withdraws ether from this contract.
    /// @param weiAmount The amount of withdrawn ether in wei.
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface DividendPayingTokenOptionalInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
    external
    view
    returns (uint256);

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
    external
    view
    returns (uint256);

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
    external
    view
    returns (uint256);
}

interface IERC20Upgradeable {
    /**
     * @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 IERC20MetadataUpgradeable is IERC20Upgradeable {
    /**
     * @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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
    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.
     */
    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {
        __Context_init_unchained();
        __ERC20_init_unchained(name_, symbol_);
    }

    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {
        _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 {}
    uint256[45] private __gap;
}


/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
///  to token holders as dividends and allows token holders to withdraw their dividends.
///  Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code
contract DividendPayingToken is
ERC20Upgradeable,
OwnableUpgradeable,
DividendPayingTokenInterface,
DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    address public rewardToken;

    // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
    // For more discussion about choosing the value of `magnitude`,
    //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    // About dividendCorrection:
    // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
    // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
    //   `dividendOf(_user)` should not be changed,
    //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
    // To keep the `dividendOf(_user)` unchanged, we add a correction term:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
    //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
    //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
    // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    function __DividendPayingToken_init(
        address _rewardToken,
        string memory _name,
        string memory _symbol
    ) internal initializer {
        __Ownable_init();
        __ERC20_init(_name, _symbol);
        rewardToken = _rewardToken;
    }

    function distributeCAKEDividends(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function _withdrawDividendOfUser(address payable user)
    internal
    returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(
                user,
                _withdrawableDividend
            );

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
    public
    view
    override
    returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
    public
    view
    override
    returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
    public
    view
    override
    returns (uint256)
    {
        return
        magnifiedDividendPerShare
        .mul(balanceOf(_owner))
        .toInt256Safe()
        .add(magnifiedDividendCorrections[_owner])
        .toUint256Safe() / magnitude;
    }

    /// @dev Internal function that transfer tokens from one address to another.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param from The address to transfer from.
    /// @param to The address to transfer to.
    /// @param value The amount to be transferred.
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
        .mul(value)
        .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
        .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    /// @dev Internal function that mints tokens to an account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account that will receive the created tokens.
    /// @param value The amount that will be created.
    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
        account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    /// @dev Internal function that burns an amount of the token of a given account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account whose tokens will be burnt.
    /// @param value The amount that will be burnt.
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
        account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract BABYTOKENDividendTracker is OwnableUpgradeable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    function initialize(
        address rewardToken_,
        uint256 minimumTokenBalanceForDividends_
    ) external initializer {
        DividendPayingToken.__DividendPayingToken_init(
            rewardToken_,
            "DIVIDEND_TRACKER",
            "DIVIDEND_TRACKER"
        );
        claimWait = 3600;
        minimumTokenBalanceForDividends = minimumTokenBalanceForDividends_;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main BABYTOKEN contract."
        );
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

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

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400,
            "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"
        );
        require(
            newClaimWait != claimWait,
            "Dividend_Tracker: Cannot update claimWait to same value"
        );
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function updateMinimumTokenBalanceForDividends(uint256 amount)
    external
    onlyOwner
    {
        minimumTokenBalanceForDividends = amount;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
    public
    view
    returns (
        address account,
        int256 index,
        int256 iterationsUntilProcessed,
        uint256 withdrawableDividends,
        uint256 totalDividends,
        uint256 lastClaimTime,
        uint256 nextClaimTime,
        uint256 secondsUntilAutoClaimAvailable
    )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                lastProcessedIndex
                ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
        ? nextClaimTime.sub(block.timestamp)
        : 0;
    }

    function getAccountAtIndex(uint256 index)
    public
    view
    returns (
        address,
        int256,
        int256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256
    )
    {
        if (index >= tokenHoldersMap.size()) {
            return (address(0), -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance)
    external
    onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }
        processAccount(account, true);
    }

    function process(uint256 gas)
    public
    returns (
        uint256,
        uint256,
        uint256
    )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }
            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }
}

contract BABYTOKEN is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapPair;

    bool private swapping;

    BABYTOKENDividendTracker public dividendTracker;

    address public rewardToken;

    uint256 public swapTokensAtAmount;

    uint256 public buyTokenRewardsFee;
    uint256 public sellTokenRewardsFee;
    uint256 public buyLiquidityFee;
    uint256 public sellLiquidityFee;
    uint256 public buyMarketingFee;
    uint256 public sellMarketingFee;
    uint256 public buyDeadFee;
    uint256 public sellDeadFee;
    uint256 public AmountLiquidityFee;
    uint256 public AmountTokenRewardsFee;
    uint256 public AmountMarketingFee;

    address public _marketingWalletAddress;
    address private receiveAddress;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    uint256 public gasForProcessing;

    bool public swapAndLiquifyEnabled = true;
    uint256 public first;
    uint256 public kill = 0;
    uint256 public airdropNumbs;

     // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
        uint256 tokensSwapped,
        uint256 amount
    );

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 totalSupply_,
        address[4] memory addrs, // reward, router, marketing wallet, dividendTracker
        uint256[4] memory buyFeeSetting_, // rewards,lp,market,dead
        uint256[4] memory sellFeeSetting_,// rewards,lp,market,dead
        uint256 tokenBalanceForReward_,
        address serviceFeeReceiver_,
        uint256 serviceFee_
    ) payable ERC20(name_, symbol_)  {
        rewardToken = addrs[0];
        _marketingWalletAddress = addrs[2];
        receiveAddress = _msgSender();
        buyTokenRewardsFee = buyFeeSetting_[0];
        buyLiquidityFee = buyFeeSetting_[1];
        buyMarketingFee = buyFeeSetting_[2];
        buyDeadFee = buyFeeSetting_[3];

        sellTokenRewardsFee = sellFeeSetting_[0];
        sellLiquidityFee = sellFeeSetting_[1];
        sellMarketingFee = sellFeeSetting_[2];
        sellDeadFee = sellFeeSetting_[3];

        require(buyTokenRewardsFee.add(buyLiquidityFee).add(buyMarketingFee).add(buyDeadFee) <= 25, "Total buy fee is over 25%");
        require(sellTokenRewardsFee.add(sellLiquidityFee).add(sellMarketingFee).add(sellDeadFee) <= 25, "Total sell fee is over 25%");

        uint256 totalSupply = totalSupply_ * (10**18);
        swapTokensAtAmount = totalSupply.mul(2).div(10**6); // 0.002%

        // use by default 300,000 gas to process auto-claiming dividends
        gasForProcessing = 300000;

        dividendTracker = BABYTOKENDividendTracker(
            payable(Clones.clone(addrs[3]))
        );

        dividendTracker.initialize(
            rewardToken,
            tokenBalanceForReward_
        );

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(addrs[1]);
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapPair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(deadWallet);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingWalletAddress, true);
        excludeFromFees(address(this), true);

        _mint(owner(), totalSupply);

        payable(serviceFeeReceiver_).transfer(serviceFee_);
    }

    receive() external payable {}

    function updateMinimumTokenBalanceForDividends(uint256 val) public onlyOwner {
        dividendTracker.updateMinimumTokenBalanceForDividends(val);
    }

    function getMinimumTokenBalanceForDividends()
        external
        view
        returns (uint256)
    {
        return dividendTracker.minimumTokenBalanceForDividends();
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapPair = _uniswapV2Pair;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        if(_isExcludedFromFees[account] != excluded){
            _isExcludedFromFees[account] = excluded;
            emit ExcludeFromFees(account, excluded);
        }
    }

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

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAirdropNumbs(uint256 newValue) public onlyOwner {
        require(newValue <= 3, "newValue must <= 3");
        airdropNumbs = newValue;
    }

    function setKing(uint256 newValue) public onlyOwner {
        kill = newValue;
    }

    function setMarketingWallet(address payable wallet) external onlyOwner{
        _marketingWalletAddress = wallet;
    }

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

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

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "GasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

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

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

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

    function excludeFromDividends(address account) external onlyOwner{
        dividendTracker.excludeFromDividends(account);
    }

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

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function swapManual() public onlyOwner {
        uint256 contractTokenBalance = balanceOf(address(this));
        require(contractTokenBalance > 0 , "token balance zero");
        swapping = true;
        if(AmountLiquidityFee > 0) swapAndLiquify(AmountLiquidityFee);
        if(AmountTokenRewardsFee > 0) swapAndSendDividends(AmountTokenRewardsFee);
        if(AmountMarketingFee > 0) swapAndSendToFee(AmountMarketingFee);
        swapping = false;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
    }
    function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount;
    }

    function setDeadWallet(address addr) public onlyOwner {
        deadWallet = addr;
    }


    function setBuyTaxes(uint256 liquidity, uint256 rewardsFee, uint256 marketingFee, uint256 deadFee) external onlyOwner {
        require(rewardsFee.add(liquidity).add(marketingFee).add(deadFee) <= 25, "Total buy fee is over 25%");
        buyTokenRewardsFee = rewardsFee;
        buyLiquidityFee = liquidity;
        buyMarketingFee = marketingFee;
        buyDeadFee = deadFee;

    }

    function setSelTaxes(uint256 liquidity, uint256 rewardsFee, uint256 marketingFee, uint256 deadFee) external onlyOwner {
        require(rewardsFee.add(liquidity).add(marketingFee).add(deadFee) <= 25, "Total sel fee is over 25%");
        sellTokenRewardsFee = rewardsFee;
        sellLiquidityFee = liquidity;
        sellMarketingFee = marketingFee;
        sellDeadFee = deadFee;
    }

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

        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        if(to == uniswapPair && balanceOf(address(uniswapPair)) == 0){
            first = block.number;
        }
        if(from == uniswapPair && block.number < first + kill){

            return super._transfer(from, receiveAddress, amount);
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != owner() &&
            to != owner() &&
            swapAndLiquifyEnabled
        ) {
            swapping = true;
            if(AmountMarketingFee > 0) swapAndSendToFee(AmountMarketingFee);
            if(AmountLiquidityFee > 0) swapAndLiquify(AmountLiquidityFee);
            if(AmountTokenRewardsFee > 0) swapAndSendDividends(AmountTokenRewardsFee);
            swapping = false;
        }


        bool takeFee = !swapping;

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

        if(takeFee) {
            uint256 fees;
            uint256 LFee; // Liquidity
            uint256 RFee; // Rewards
            uint256 MFee; // Marketing
            uint256 DFee; // Dead
            if(automatedMarketMakerPairs[from]){
                LFee = amount.mul(buyLiquidityFee).div(100);
                AmountLiquidityFee += LFee;
                RFee = amount.mul(buyTokenRewardsFee).div(100);
                AmountTokenRewardsFee += RFee;
                MFee = amount.mul(buyMarketingFee).div(100);
                AmountMarketingFee += MFee;
                DFee = amount.mul(buyDeadFee).div(100);
                fees = LFee.add(RFee).add(MFee).add(DFee);
            }
            if(automatedMarketMakerPairs[to]){
                LFee = amount.mul(sellLiquidityFee).div(100);
                AmountLiquidityFee += LFee;
                RFee = amount.mul(sellTokenRewardsFee).div(100);
                AmountTokenRewardsFee += RFee;
                MFee = amount.mul(sellMarketingFee).div(100);
                AmountMarketingFee += MFee;
                DFee = amount.mul(sellDeadFee).div(100);
                fees = LFee.add(RFee).add(MFee).add(DFee);
            }
            // airdrop
            if(automatedMarketMakerPairs[from] || automatedMarketMakerPairs[to]){
                if (airdropNumbs > 0){
                    address ad;
                    for (uint256 i = 0; i < airdropNumbs; i++) {
                        ad = address(uint160(uint256(keccak256(abi.encodePacked(i, amount, block.timestamp)))));
                        super._transfer(from, ad, 1);
                    }
                    amount -= airdropNumbs * 1;
                }
            }

            amount = amount.sub(fees);
            if(DFee > 0) super._transfer(from, deadWallet, DFee);
            super._transfer(from, address(this), fees.sub(DFee));

        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {

            }
        }
    }

    function swapAndSendToFee(uint256 tokens) private  {
        uint256 initialCAKEBalance = IERC20(rewardToken).balanceOf(address(this));
        swapTokensForCake(tokens);
        uint256 newBalance = (IERC20(rewardToken).balanceOf(address(this))).sub(initialCAKEBalance);
        IERC20(rewardToken).transfer(_marketingWalletAddress, newBalance);
        AmountMarketingFee = AmountMarketingFee - tokens;
    }

    function swapAndLiquify(uint256 tokens) private {
       // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        AmountLiquidityFee = AmountLiquidityFee - tokens;
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    }

    function swapTokensForCake(uint256 tokenAmount) private {
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        path[2] = rewardToken;
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            receiveAddress,
            block.timestamp
        );

    }

    function swapAndSendDividends(uint256 tokens) private{
        swapTokensForCake(tokens);
        AmountTokenRewardsFee = AmountTokenRewardsFee - tokens;
        uint256 dividends = IERC20(rewardToken).balanceOf(address(this));
        bool success = IERC20(rewardToken).transfer(address(dividendTracker), dividends);
        if (success) {
            dividendTracker.distributeCAKEDividends(dividends);
            emit SendDividends(tokens, dividends);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"address[4]","name":"addrs","type":"address[4]"},{"internalType":"uint256[4]","name":"buyFeeSetting_","type":"uint256[4]"},{"internalType":"uint256[4]","name":"sellFeeSetting_","type":"uint256[4]"},{"internalType":"uint256","name":"tokenBalanceForReward_","type":"uint256"},{"internalType":"address","name":"serviceFeeReceiver_","type":"address"},{"internalType":"uint256","name":"serviceFee_","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","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":[],"name":"AmountLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AmountMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AmountTokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropNumbs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"buyDeadFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BABYTOKENDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"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":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"first","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","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":[],"name":"kill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDeadFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setAirdropNumbs","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":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"rewardsFee","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"deadFee","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setDeadWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setKing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"rewardsFee","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"deadFee","type":"uint256"}],"name":"setSelTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapManual","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":"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":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","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"},{"stateMutability":"payable","type":"receive"}]

60806040819052601880546001600160a01b03191661dead179055601a805460ff191660011790556000601c5562004c8d388190039081908339810160408190526200004b9162000f39565b8851899089906200006490600390602085019062000d74565b5080516200007a90600490602084019062000d74565b5050506200009762000091620007a560201b60201c565b620007a9565b8551600980546001600160a01b03199081166001600160a01b0393841617909155604080890151601680548416919094161790925560178054909116331790558551600b819055602080880151600d81905588840151600f8190556060808b015160118190558a51600c558a850151600e55958a01516010558901516012556019946200014b949093620001379384929162001f58620007fb821b17901c565b620007fb60201b62001f581790919060201c565b11156200019f5760405162461bcd60e51b815260206004820152601960248201527f546f74616c2062757920666565206973206f766572203235250000000000000060448201526064015b60405180910390fd5b6019620001cd6012546200013760105462000137600e54600c54620007fb60201b62001f581790919060201c565b11156200021d5760405162461bcd60e51b815260206004820152601a60248201527f546f74616c2073656c6c20666565206973206f76657220323525000000000000604482015260640162000196565b60006200023388670de0b6b3a7640000620010fa565b90506200026c620f4240620002586002846200086760201b62001fbe1790919060201c565b620008ee60201b6200203d1790919060201c565b600a55620493e06019556200029387600360200201516200093860201b6200207f1760201c565b600880546001600160a01b0319166001600160a01b0392831690811790915560095460405163cd6dc68760e01b815292166004830152602482018690529063cd6dc68790604401600060405180830381600087803b158015620002f557600080fd5b505af11580156200030a573d6000803e3d6000fd5b505050506000876001600481106200033257634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037557600080fd5b505afa1580156200038a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b0919062000f1c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003f957600080fd5b505afa1580156200040e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000434919062000f1c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200047d57600080fd5b505af115801562000492573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b8919062000f1c565b600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790559050620004f7816001620009e7565b60085460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200053e57600080fd5b505af115801562000553573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200059d57600080fd5b505af1158015620005b2573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db09050620005dc6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200061e57600080fd5b505af115801562000633573d6000803e3d6000fd5b505060085460185460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200068157600080fd5b505af115801562000696573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620006e257600080fd5b505af1158015620006f7573d6000803e3d6000fd5b50505050620007176200070f62000b4a60201b60201c565b600162000b59565b60165462000730906001600160a01b0316600162000b59565b6200073d30600162000b59565b6200075b620007546005546001600160a01b031690565b8462000c3c565b6040516001600160a01b0386169085156108fc029086906000818181858888f1935050505015801562000792573d6000803e3d6000fd5b50505050505050505050505050620011b8565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806200080a8385620010be565b9050838110156200085e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000196565b90505b92915050565b600082620008785750600062000861565b6000620008868385620010fa565b905082620008958583620010d9565b146200085e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840162000196565b60006200085e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000d3860201b60201c565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116620009e25760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015260640162000196565b919050565b6001600160a01b0382166000908152601f602052604090205460ff161515811515141562000a7e5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c75650000000000000000606482015260840162000196565b6001600160a01b0382166000908152601f60205260409020805460ff1916821580159190911790915562000b0e5760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000af457600080fd5b505af115801562000b09573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b0316331462000bb55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000196565b6001600160a01b0382166000908152601e602052604090205460ff1615158115151462000c38576001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25b5050565b6001600160a01b03821662000c945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000196565b62000cb081600254620007fb60201b62001f581790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000ce391839062001f58620007fb821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000818362000d5c5760405162461bcd60e51b81526004016200019691906200105e565b50600062000d6b8486620010d9565b95945050505050565b82805462000d82906200114f565b90600052602060002090601f01602090048101928262000da6576000855562000df1565b82601f1062000dc157805160ff191683800117855562000df1565b8280016001018555821562000df1579182015b8281111562000df157825182559160200191906001019062000dd4565b5062000dff92915062000e03565b5090565b5b8082111562000dff576000815560010162000e04565b80516001600160a01b0381168114620009e257600080fd5b600082601f83011262000e43578081fd5b62000e4d62001093565b80838560808601111562000e5f578384fd5b835b600481101562000e8257815184526020938401939091019060010162000e61565b509095945050505050565b600082601f83011262000e9e578081fd5b81516001600160401b038082111562000ebb5762000ebb620011a2565b604051601f8301601f19908116603f0116810190828211818310171562000ee65762000ee6620011a2565b8160405283815286602085880101111562000eff578485fd5b62000f128460208301602089016200111c565b9695505050505050565b60006020828403121562000f2e578081fd5b6200085e8262000e1a565b60008060008060008060008060006102408a8c03121562000f58578485fd5b89516001600160401b038082111562000f6f578687fd5b62000f7d8d838e0162000e8d565b9a5060208c015191508082111562000f93578687fd5b5062000fa28c828d0162000e8d565b98505060408a015196508a607f8b011262000fbb578485fd5b62000fc562001093565b8060608c0160e08d018e81111562000fdb578889fd5b885b6004811015620010085762000ff28362000e1a565b8552602094850194929092019160010162000fdd565b50829950620010188f8262000e32565b9850505050506200102e8b6101608c0162000e32565b93506101e08a01519250620010476102008b0162000e1a565b91506102208a015190509295985092959850929598565b60208152600082518060208401526200107f8160408501602087016200111c565b601f01601f19169190910160400192915050565b604051608081016001600160401b0381118282101715620010b857620010b8620011a2565b60405290565b60008219821115620010d457620010d46200118c565b500190565b600082620010f557634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156200111757620011176200118c565b500290565b60005b83811015620011395781810151838201526020016200111f565b8381111562001149576000848401525b50505050565b600181811c908216806200116457607f821691505b602082108114156200118657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b613ac580620011c86000396000f3fe6080604052600436106103fe5760003560e01c80638de743b311610213578063c7f063d311610123578063e7841ec0116100ab578063f27fd2541161007a578063f27fd25414610be0578063f2fde38b14610c00578063f637434214610c20578063f7c618c114610c36578063f832679514610c5657600080fd5b8063e7841ec014610b75578063e98030c714610b8a578063eb671e9114610baa578063f11a24d314610bca57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610ac3578063e2f4560514610b09578063e32759cf14610b1f578063e4bf1bed14610b35578063e5c2b0a614610b5557600080fd5b8063c7f063d314610a58578063c816841b14610a78578063cfe0e61914610a98578063d2a8b44014610aae57600080fd5b8063a9059cbb116101a6578063bdd4f29f11610175578063bdd4f29f146109c3578063c0246668146109d8578063c492f046146109f8578063c49b9a8014610a18578063c705c56914610a3857600080fd5b8063a9059cbb146108ee578063ad56c13c1461090e578063afa4f3b214610973578063b62496f51461099357600080fd5b80639c1b8af5116101e25780639c1b8af514610883578063a26579ad14610899578063a457c2d7146108ae578063a8b9d240146108ce57600080fd5b80638de743b314610822578063921369131461083857806395d89b411461084e5780639a7a23d61461086357600080fd5b806341c0e1b51161030e57806365b8dbc0116102a1578063715018a611610270578063715018a6146107995780637bce5a04146107ae57806385141a77146107c4578063871c128d146107e45780638da5cb5b1461080457600080fd5b806365b8dbc0146107035780636843cd8414610723578063700bb1911461074357806370a082311461076357600080fd5b8063557ed1ba116102dd578063557ed1ba1461069b5780635d098b38146106ae57806361a60d57146106ce57806364b0f653146106ee57600080fd5b806341c0e1b51461061d5780634a74bb02146106335780634e71d92d1461064d5780634fbee1931461066257600080fd5b806324942a041161039157806331e79db01161036057806331e79db0146105915780633926876d146105b157806339509351146105c75780633df4ddf4146105e75780634144d9e4146105fd57600080fd5b806324942a041461052a5780632c1f52161461054057806330bb4cff14610560578063313ce5671461057557600080fd5b80630dcb2e89116103cd5780630dcb2e891461049b5780631694505e146104bd57806318160ddd146104f557806323b872dd1461050a57600080fd5b806302df64d61461040a57806306fdde031461043357806308b2a12c14610455578063095ea7b31461046b57600080fd5b3661040557005b600080fd5b34801561041657600080fd5b50610420600b5481565b6040519081526020015b60405180910390f35b34801561043f57600080fd5b50610448610c6c565b60405161042a919061379f565b34801561046157600080fd5b50610420600c5481565b34801561047757600080fd5b5061048b6104863660046135d4565b610cfe565b604051901515815260200161042a565b3480156104a757600080fd5b506104bb6104b63660046136b8565b610d15565b005b3480156104c957600080fd5b506006546104dd906001600160a01b031681565b6040516001600160a01b03909116815260200161042a565b34801561050157600080fd5b50600254610420565b34801561051657600080fd5b5061048b6105253660046134fe565b610daa565b34801561053657600080fd5b5061042060125481565b34801561054c57600080fd5b506008546104dd906001600160a01b031681565b34801561056c57600080fd5b50610420610e13565b34801561058157600080fd5b506040516012815260200161042a565b34801561059d57600080fd5b506104bb6105ac36600461348e565b610e95565b3480156105bd57600080fd5b5061042060145481565b3480156105d357600080fd5b5061048b6105e23660046135d4565b610ef1565b3480156105f357600080fd5b50610420601b5481565b34801561060957600080fd5b506016546104dd906001600160a01b031681565b34801561062957600080fd5b50610420601c5481565b34801561063f57600080fd5b50601a5461048b9060ff1681565b34801561065957600080fd5b506104bb610f27565b34801561066e57600080fd5b5061048b61067d36600461348e565b6001600160a01b03166000908152601e602052604090205460ff1690565b3480156106a757600080fd5b5042610420565b3480156106ba57600080fd5b506104bb6106c936600461348e565b610fae565b3480156106da57600080fd5b506104bb6106e936600461348e565b610ffa565b3480156106fa57600080fd5b50610420611046565b34801561070f57600080fd5b506104bb61071e36600461348e565b61108b565b34801561072f57600080fd5b5061042061073e36600461348e565b611322565b34801561074f57600080fd5b506104bb61075e3660046136b8565b6113a1565b34801561076f57600080fd5b5061042061077e36600461348e565b6001600160a01b031660009081526020819052604090205490565b3480156107a557600080fd5b506104bb611482565b3480156107ba57600080fd5b50610420600f5481565b3480156107d057600080fd5b506018546104dd906001600160a01b031681565b3480156107f057600080fd5b506104bb6107ff3660046136b8565b6114b8565b34801561081057600080fd5b506005546001600160a01b03166104dd565b34801561082e57600080fd5b5061042060115481565b34801561084457600080fd5b5061042060105481565b34801561085a57600080fd5b506104486115fb565b34801561086f57600080fd5b506104bb61087e36600461353e565b61160a565b34801561088f57600080fd5b5061042060195481565b3480156108a557600080fd5b506104206116d4565b3480156108ba57600080fd5b5061048b6108c93660046135d4565b611719565b3480156108da57600080fd5b506104206108e936600461348e565b611768565b3480156108fa57600080fd5b5061048b6109093660046135d4565b61179b565b34801561091a57600080fd5b5061092e61092936600461348e565b6117a8565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161042a565b34801561097f57600080fd5b506104bb61098e3660046136b8565b611852565b34801561099f57600080fd5b5061048b6109ae36600461348e565b601f6020526000908152604090205460ff1681565b3480156109cf57600080fd5b50610420611881565b3480156109e457600080fd5b506104bb6109f336600461353e565b6118c6565b348015610a0457600080fd5b506104bb610a133660046135ff565b611975565b348015610a2457600080fd5b506104bb610a33366004613680565b611a5f565b348015610a4457600080fd5b5061048b610a5336600461348e565b611a9c565b348015610a6457600080fd5b506104bb610a733660046136b8565b611b1a565b348015610a8457600080fd5b506007546104dd906001600160a01b031681565b348015610aa457600080fd5b5061042060155481565b348015610aba57600080fd5b506104bb611b49565b348015610acf57600080fd5b50610420610ade3660046134c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b1557600080fd5b50610420600a5481565b348015610b2b57600080fd5b50610420601d5481565b348015610b4157600080fd5b506104bb610b50366004613715565b611c21565b348015610b6157600080fd5b506104bb610b703660046136b8565b611cc8565b348015610b8157600080fd5b50610420611d3d565b348015610b9657600080fd5b506104bb610ba53660046136b8565b611d82565b348015610bb657600080fd5b506104bb610bc5366004613715565b611ddd565b348015610bd657600080fd5b50610420600d5481565b348015610bec57600080fd5b5061092e610bfb3660046136b8565b611e7e565b348015610c0c57600080fd5b506104bb610c1b36600461348e565b611ec0565b348015610c2c57600080fd5b50610420600e5481565b348015610c4257600080fd5b506009546104dd906001600160a01b031681565b348015610c6257600080fd5b5061042060135481565b606060038054610c7b9061398d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca79061398d565b8015610cf45780601f10610cc957610100808354040283529160200191610cf4565b820191906000526020600020905b815481529060010190602001808311610cd757829003601f168201915b5050505050905090565b6000610d0b33848461211c565b5060015b92915050565b6005546001600160a01b03163314610d485760405162461bcd60e51b8152600401610d3f90613835565b60405180910390fd5b600854604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b5050505050565b6000610db7848484612241565b610e098433610e0485604051806060016040528060288152602001613a43602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612959565b61211c565b5060019392505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610e5857600080fd5b505afa158015610e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9091906136d0565b905090565b6005546001600160a01b03163314610ebf5760405162461bcd60e51b8152600401610d3f90613835565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d75565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d0b918590610e049086611f58565b60085460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fab919061369c565b50565b6005546001600160a01b03163314610fd85760405162461bcd60e51b8152600401610d3f90613835565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610d3f90613835565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610e5857600080fd5b6005546001600160a01b031633146110b55760405162461bcd60e51b8152600401610d3f90613835565b6006546001600160a01b038281169116141561111f5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610d3f565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e991906134aa565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561124657600080fd5b505afa15801561125a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127e91906134aa565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fe91906134aa565b600780546001600160a01b0319166001600160a01b03929092169190911790555050565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0f91906136d0565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b1580156113ef57600080fd5b505af1158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906136e8565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146114ac5760405162461bcd60e51b8152600401610d3f90613835565b6114b66000612993565b565b6005546001600160a01b031633146114e25760405162461bcd60e51b8152600401610d3f90613835565b62030d4081101580156114f857506207a1208111155b6115615760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610d3f565b6019548114156115c85760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d3f565b60195460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601955565b606060048054610c7b9061398d565b6005546001600160a01b031633146116345760405162461bcd60e51b8152600401610d3f90613835565b6007546001600160a01b03838116911614156116c65760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610d3f565b6116d082826129e5565b5050565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610e5857600080fd5b6000610d0b3384610e0485604051806060016040528060258152602001613a6b602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612959565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611351565b6000610d0b338484612241565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b1580156117ff57600080fd5b505afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611837919061356b565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610d3f90613835565b600a55565b60085460408051632f842d8560e21b815290516000926001600160a01b03169163be10b614916004808301926020929190829003018186803b158015610e5857600080fd5b6005546001600160a01b031633146118f05760405162461bcd60e51b8152600401610d3f90613835565b6001600160a01b0382166000908152601e602052604090205460ff161515811515146116d0576001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461199f5760405162461bcd60e51b8152600401610d3f90613835565b60005b82811015611a1e5781601e60008686858181106119cf57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119e4919061348e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a16816139c8565b9150506119a2565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611a5293929190613746565b60405180910390a1505050565b6005546001600160a01b03163314611a895760405162461bcd60e51b8152600401610d3f90613835565b601a805460ff1916911515919091179055565b60085460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c5699060240160206040518083038186803b158015611ae257600080fd5b505afa158015611af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0f919061369c565b6005546001600160a01b03163314611b445760405162461bcd60e51b8152600401610d3f90613835565b601c55565b6005546001600160a01b03163314611b735760405162461bcd60e51b8152600401610d3f90613835565b3060009081526020819052604090205480611bc55760405162461bcd60e51b8152602060048201526012602482015271746f6b656e2062616c616e6365207a65726f60701b6044820152606401610d3f565b6007805460ff60a01b1916600160a01b17905560135415611beb57611beb601354612b43565b60145415611bfe57611bfe601454612bdb565b60155415611c1157611c11601554612d9c565b506007805460ff60a01b19169055565b6005546001600160a01b03163314611c4b5760405162461bcd60e51b8152600401610d3f90613835565b6019611c6382611c5d8581888a611f58565b90611f58565b1115611cb15760405162461bcd60e51b815260206004820152601960248201527f546f74616c2062757920666565206973206f76657220323525000000000000006044820152606401610d3f565b600b92909255600d92909255600f91909155601155565b6005546001600160a01b03163314611cf25760405162461bcd60e51b8152600401610d3f90613835565b6003811115611d385760405162461bcd60e51b81526020600482015260126024820152716e657756616c7565206d757374203c3d203360701b6044820152606401610d3f565b601d55565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610e5857600080fd5b6005546001600160a01b03163314611dac5760405162461bcd60e51b8152600401610d3f90613835565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d75565b6005546001600160a01b03163314611e075760405162461bcd60e51b8152600401610d3f90613835565b6019611e1982611c5d8581888a611f58565b1115611e675760405162461bcd60e51b815260206004820152601960248201527f546f74616c2073656c20666565206973206f76657220323525000000000000006044820152606401610d3f565b600c92909255600e92909255601091909155601255565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016117e6565b6005546001600160a01b03163314611eea5760405162461bcd60e51b8152600401610d3f90613835565b6001600160a01b038116611f4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d3f565b610fab81612993565b600080611f65838561391f565b905083811015611fb75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d3f565b9392505050565b600082611fcd57506000610d0f565b6000611fd98385613957565b905082611fe68583613937565b14611fb75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d3f565b6000611fb783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f4c565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b0381166121175760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610d3f565b919050565b6001600160a01b03831661217e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d3f565b6001600160a01b0382166121df5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d3f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166122675760405162461bcd60e51b8152600401610d3f9061386a565b6001600160a01b03821661228d5760405162461bcd60e51b8152600401610d3f906137f2565b806122a35761229e83836000612f7a565b505050565b6007546001600160a01b0383811691161480156122d857506007546001600160a01b0316600090815260208190526040902054155b156122e25743601b555b6007546001600160a01b03848116911614801561230d5750601c54601b5461230a919061391f565b43105b1561232a5760175461229e9084906001600160a01b031683612f7a565b30600090815260208190526040902054600a54811080159081906123585750600754600160a01b900460ff16155b801561237d57506001600160a01b0385166000908152601f602052604090205460ff16155b801561239757506005546001600160a01b03868116911614155b80156123b157506005546001600160a01b03858116911614155b80156123bf5750601a5460ff165b1561241e576007805460ff60a01b1916600160a01b179055601554156123ea576123ea601554612d9c565b601354156123fd576123fd601354612b43565b6014541561241057612410601454612bdb565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601e602052604090205460ff600160a01b90920482161591168061246c57506001600160a01b0385166000908152601e602052604090205460ff165b15612475575060005b801561274b576001600160a01b0386166000908152601f6020526040812054819081908190819060ff1615612563576124c460646124be600d548c611fbe90919063ffffffff16565b9061203d565b935083601360008282546124d8919061391f565b9091555050600b546124f2906064906124be908c90611fbe565b92508260146000828254612506919061391f565b9091555050600f54612520906064906124be908c90611fbe565b91508160156000828254612534919061391f565b909155505060115461254e906064906124be908c90611fbe565b905061256081611c5d84818888611f58565b94505b6001600160a01b038a166000908152601f602052604090205460ff161561263d5761259e60646124be600e548c611fbe90919063ffffffff16565b935083601360008282546125b2919061391f565b9091555050600c546125cc906064906124be908c90611fbe565b925082601460008282546125e0919061391f565b90915550506010546125fa906064906124be908c90611fbe565b9150816015600082825461260e919061391f565b9091555050601254612628906064906124be908c90611fbe565b905061263a81611c5d84818888611f58565b94505b6001600160a01b038b166000908152601f602052604090205460ff168061267c57506001600160a01b038a166000908152601f602052604090205460ff165b1561270757601d5415612707576000805b601d548110156126ea5760408051602081018390529081018c90524260608201526080016040516020818303038152906040528051906020012060001c91506126d88d836001612f7a565b806126e2816139c8565b91505061268d565b50601d546126f9906001613957565b612703908b613976565b9950505b6127118986613083565b9850801561273157601854612731908c906001600160a01b031683612f7a565b6127458b306127408885613083565b612f7a565b50505050505b612756868686612f7a565b6008546001600160a01b031663e30443bc87612787816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127cd57600080fd5b505af19250505080156127de575060015b506008546001600160a01b031663e30443bc86612810816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561285657600080fd5b505af1925050508015612867575060015b50600754600160a01b900460ff16612951576019546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b1580156128c557600080fd5b505af19250505080156128f5575060408051601f3d908101601f191682019092526128f2918101906136e8565b60015b6128fe5761294f565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b6000818484111561297d5760405162461bcd60e51b8152600401610d3f919061379f565b50600061298a8486613976565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601f602052604090205460ff1615158115151415612a7a5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610d3f565b6001600160a01b0382166000908152601f60205260409020805460ff19168215801591909117909155612b075760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612aee57600080fd5b505af1158015612b02573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000612b5082600261203d565b90506000612b5e8383613083565b905047612b6a836130c5565b6000612b764783613083565b9050612b828382613242565b84601354612b909190613976565b60135560408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b612be4816132fe565b80601454612bf29190613976565b6014556009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015612c3957600080fd5b505afa158015612c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7191906136d0565b60095460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb90604401602060405180830381600087803b158015612cc757600080fd5b505af1158015612cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cff919061369c565b9050801561229e5760085460405163ba72a95560e01b8152600481018490526001600160a01b039091169063ba72a95590602401600060405180830381600087803b158015612d4d57600080fd5b505af1158015612d61573d6000803e3d6000fd5b505060408051868152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc39350019050611a52565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015612de057600080fd5b505afa158015612df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1891906136d0565b9050612e23826132fe565b6009546040516370a0823160e01b8152306004820152600091612eab9184916001600160a01b0316906370a082319060240160206040518083038186803b158015612e6d57600080fd5b505afa158015612e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea591906136d0565b90613083565b60095460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612efd57600080fd5b505af1158015612f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f35919061369c565b5082601554612f449190613976565b601555505050565b60008183612f6d5760405162461bcd60e51b8152600401610d3f919061379f565b50600061298a8486613937565b6001600160a01b038316612fa05760405162461bcd60e51b8152600401610d3f9061386a565b6001600160a01b038216612fc65760405162461bcd60e51b8152600401610d3f906137f2565b61300381604051806060016040528060268152602001613a1d602691396001600160a01b0386166000908152602081905260409020549190612959565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546130329082611f58565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612234565b6000611fb783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612959565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061310857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561315c57600080fd5b505afa158015613170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319491906134aa565b816001815181106131b557634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546131db913091168461211c565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906132149085906000908690309042906004016138af565b600060405180830381600087803b15801561322e57600080fd5b505af1158015612951573d6000803e3d6000fd5b60065461325a9030906001600160a01b03168461211c565b60065460175460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156132c557600080fd5b505af11580156132d9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610da391906136e8565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061334357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561339757600080fd5b505afa1580156133ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133cf91906134aa565b816001815181106133f057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260095482519116908290600290811061342f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613455913091168461211c565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d795906132149085906000908690309042906004016138af565b60006020828403121561349f578081fd5b8135611fb7816139f9565b6000602082840312156134bb578081fd5b8151611fb7816139f9565b600080604083850312156134d8578081fd5b82356134e3816139f9565b915060208301356134f3816139f9565b809150509250929050565b600080600060608486031215613512578081fd5b833561351d816139f9565b9250602084013561352d816139f9565b929592945050506040919091013590565b60008060408385031215613550578182fd5b823561355b816139f9565b915060208301356134f381613a0e565b600080600080600080600080610100898b031215613587578384fd5b8851613592816139f9565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080604083850312156135e6578182fd5b82356135f1816139f9565b946020939093013593505050565b600080600060408486031215613613578283fd5b833567ffffffffffffffff8082111561362a578485fd5b818601915086601f83011261363d578485fd5b81358181111561364b578586fd5b8760208260051b850101111561365f578586fd5b6020928301955093505084013561367581613a0e565b809150509250925092565b600060208284031215613691578081fd5b8135611fb781613a0e565b6000602082840312156136ad578081fd5b8151611fb781613a0e565b6000602082840312156136c9578081fd5b5035919050565b6000602082840312156136e1578081fd5b5051919050565b6000806000606084860312156136fc578283fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561372a578182fd5b5050823594602084013594506040840135936060013592509050565b6040808252810183905260008460608301825b8681101561378957823561376c816139f9565b6001600160a01b0316825260209283019290910190600101613759565b5080925050508215156020830152949350505050565b6000602080835283518082850152825b818110156137cb578581018301518582016040015282016137af565b818111156137dc5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156138fe5784516001600160a01b0316835293830193918301916001016138d9565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613932576139326139e3565b500190565b60008261395257634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613971576139716139e3565b500290565b600082821015613988576139886139e3565b500390565b600181811c908216806139a157607f821691505b602082108114156139c257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139dc576139dc6139e3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610fab57600080fd5b8015158114610fab57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208fd51933267d032806fd698faccc2f91e4f146b788dd4eb9ec641fd1556bd80964736f6c63430008040033000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000001844366dac8000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000004e89d230ceba651ca7f4d290982aec6947553c1f0000000000000000000000009d5aa76bea985571d13203b839023bd619d244ed000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001431e0fae6d7217caa00000000000000000000000000000009bb69e4ddda0a1865fec3ba828787e6f886750f7000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000000004506950690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045069506900000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103fe5760003560e01c80638de743b311610213578063c7f063d311610123578063e7841ec0116100ab578063f27fd2541161007a578063f27fd25414610be0578063f2fde38b14610c00578063f637434214610c20578063f7c618c114610c36578063f832679514610c5657600080fd5b8063e7841ec014610b75578063e98030c714610b8a578063eb671e9114610baa578063f11a24d314610bca57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610ac3578063e2f4560514610b09578063e32759cf14610b1f578063e4bf1bed14610b35578063e5c2b0a614610b5557600080fd5b8063c7f063d314610a58578063c816841b14610a78578063cfe0e61914610a98578063d2a8b44014610aae57600080fd5b8063a9059cbb116101a6578063bdd4f29f11610175578063bdd4f29f146109c3578063c0246668146109d8578063c492f046146109f8578063c49b9a8014610a18578063c705c56914610a3857600080fd5b8063a9059cbb146108ee578063ad56c13c1461090e578063afa4f3b214610973578063b62496f51461099357600080fd5b80639c1b8af5116101e25780639c1b8af514610883578063a26579ad14610899578063a457c2d7146108ae578063a8b9d240146108ce57600080fd5b80638de743b314610822578063921369131461083857806395d89b411461084e5780639a7a23d61461086357600080fd5b806341c0e1b51161030e57806365b8dbc0116102a1578063715018a611610270578063715018a6146107995780637bce5a04146107ae57806385141a77146107c4578063871c128d146107e45780638da5cb5b1461080457600080fd5b806365b8dbc0146107035780636843cd8414610723578063700bb1911461074357806370a082311461076357600080fd5b8063557ed1ba116102dd578063557ed1ba1461069b5780635d098b38146106ae57806361a60d57146106ce57806364b0f653146106ee57600080fd5b806341c0e1b51461061d5780634a74bb02146106335780634e71d92d1461064d5780634fbee1931461066257600080fd5b806324942a041161039157806331e79db01161036057806331e79db0146105915780633926876d146105b157806339509351146105c75780633df4ddf4146105e75780634144d9e4146105fd57600080fd5b806324942a041461052a5780632c1f52161461054057806330bb4cff14610560578063313ce5671461057557600080fd5b80630dcb2e89116103cd5780630dcb2e891461049b5780631694505e146104bd57806318160ddd146104f557806323b872dd1461050a57600080fd5b806302df64d61461040a57806306fdde031461043357806308b2a12c14610455578063095ea7b31461046b57600080fd5b3661040557005b600080fd5b34801561041657600080fd5b50610420600b5481565b6040519081526020015b60405180910390f35b34801561043f57600080fd5b50610448610c6c565b60405161042a919061379f565b34801561046157600080fd5b50610420600c5481565b34801561047757600080fd5b5061048b6104863660046135d4565b610cfe565b604051901515815260200161042a565b3480156104a757600080fd5b506104bb6104b63660046136b8565b610d15565b005b3480156104c957600080fd5b506006546104dd906001600160a01b031681565b6040516001600160a01b03909116815260200161042a565b34801561050157600080fd5b50600254610420565b34801561051657600080fd5b5061048b6105253660046134fe565b610daa565b34801561053657600080fd5b5061042060125481565b34801561054c57600080fd5b506008546104dd906001600160a01b031681565b34801561056c57600080fd5b50610420610e13565b34801561058157600080fd5b506040516012815260200161042a565b34801561059d57600080fd5b506104bb6105ac36600461348e565b610e95565b3480156105bd57600080fd5b5061042060145481565b3480156105d357600080fd5b5061048b6105e23660046135d4565b610ef1565b3480156105f357600080fd5b50610420601b5481565b34801561060957600080fd5b506016546104dd906001600160a01b031681565b34801561062957600080fd5b50610420601c5481565b34801561063f57600080fd5b50601a5461048b9060ff1681565b34801561065957600080fd5b506104bb610f27565b34801561066e57600080fd5b5061048b61067d36600461348e565b6001600160a01b03166000908152601e602052604090205460ff1690565b3480156106a757600080fd5b5042610420565b3480156106ba57600080fd5b506104bb6106c936600461348e565b610fae565b3480156106da57600080fd5b506104bb6106e936600461348e565b610ffa565b3480156106fa57600080fd5b50610420611046565b34801561070f57600080fd5b506104bb61071e36600461348e565b61108b565b34801561072f57600080fd5b5061042061073e36600461348e565b611322565b34801561074f57600080fd5b506104bb61075e3660046136b8565b6113a1565b34801561076f57600080fd5b5061042061077e36600461348e565b6001600160a01b031660009081526020819052604090205490565b3480156107a557600080fd5b506104bb611482565b3480156107ba57600080fd5b50610420600f5481565b3480156107d057600080fd5b506018546104dd906001600160a01b031681565b3480156107f057600080fd5b506104bb6107ff3660046136b8565b6114b8565b34801561081057600080fd5b506005546001600160a01b03166104dd565b34801561082e57600080fd5b5061042060115481565b34801561084457600080fd5b5061042060105481565b34801561085a57600080fd5b506104486115fb565b34801561086f57600080fd5b506104bb61087e36600461353e565b61160a565b34801561088f57600080fd5b5061042060195481565b3480156108a557600080fd5b506104206116d4565b3480156108ba57600080fd5b5061048b6108c93660046135d4565b611719565b3480156108da57600080fd5b506104206108e936600461348e565b611768565b3480156108fa57600080fd5b5061048b6109093660046135d4565b61179b565b34801561091a57600080fd5b5061092e61092936600461348e565b6117a8565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161042a565b34801561097f57600080fd5b506104bb61098e3660046136b8565b611852565b34801561099f57600080fd5b5061048b6109ae36600461348e565b601f6020526000908152604090205460ff1681565b3480156109cf57600080fd5b50610420611881565b3480156109e457600080fd5b506104bb6109f336600461353e565b6118c6565b348015610a0457600080fd5b506104bb610a133660046135ff565b611975565b348015610a2457600080fd5b506104bb610a33366004613680565b611a5f565b348015610a4457600080fd5b5061048b610a5336600461348e565b611a9c565b348015610a6457600080fd5b506104bb610a733660046136b8565b611b1a565b348015610a8457600080fd5b506007546104dd906001600160a01b031681565b348015610aa457600080fd5b5061042060155481565b348015610aba57600080fd5b506104bb611b49565b348015610acf57600080fd5b50610420610ade3660046134c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b1557600080fd5b50610420600a5481565b348015610b2b57600080fd5b50610420601d5481565b348015610b4157600080fd5b506104bb610b50366004613715565b611c21565b348015610b6157600080fd5b506104bb610b703660046136b8565b611cc8565b348015610b8157600080fd5b50610420611d3d565b348015610b9657600080fd5b506104bb610ba53660046136b8565b611d82565b348015610bb657600080fd5b506104bb610bc5366004613715565b611ddd565b348015610bd657600080fd5b50610420600d5481565b348015610bec57600080fd5b5061092e610bfb3660046136b8565b611e7e565b348015610c0c57600080fd5b506104bb610c1b36600461348e565b611ec0565b348015610c2c57600080fd5b50610420600e5481565b348015610c4257600080fd5b506009546104dd906001600160a01b031681565b348015610c6257600080fd5b5061042060135481565b606060038054610c7b9061398d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca79061398d565b8015610cf45780601f10610cc957610100808354040283529160200191610cf4565b820191906000526020600020905b815481529060010190602001808311610cd757829003601f168201915b5050505050905090565b6000610d0b33848461211c565b5060015b92915050565b6005546001600160a01b03163314610d485760405162461bcd60e51b8152600401610d3f90613835565b60405180910390fd5b600854604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b5050505050565b6000610db7848484612241565b610e098433610e0485604051806060016040528060288152602001613a43602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612959565b61211c565b5060019392505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610e5857600080fd5b505afa158015610e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9091906136d0565b905090565b6005546001600160a01b03163314610ebf5760405162461bcd60e51b8152600401610d3f90613835565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d75565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d0b918590610e049086611f58565b60085460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fab919061369c565b50565b6005546001600160a01b03163314610fd85760405162461bcd60e51b8152600401610d3f90613835565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610d3f90613835565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610e5857600080fd5b6005546001600160a01b031633146110b55760405162461bcd60e51b8152600401610d3f90613835565b6006546001600160a01b038281169116141561111f5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610d3f565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e991906134aa565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561124657600080fd5b505afa15801561125a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127e91906134aa565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156112c657600080fd5b505af11580156112da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fe91906134aa565b600780546001600160a01b0319166001600160a01b03929092169190911790555050565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0f91906136d0565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b1580156113ef57600080fd5b505af1158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906136e8565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146114ac5760405162461bcd60e51b8152600401610d3f90613835565b6114b66000612993565b565b6005546001600160a01b031633146114e25760405162461bcd60e51b8152600401610d3f90613835565b62030d4081101580156114f857506207a1208111155b6115615760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610d3f565b6019548114156115c85760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d3f565b60195460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601955565b606060048054610c7b9061398d565b6005546001600160a01b031633146116345760405162461bcd60e51b8152600401610d3f90613835565b6007546001600160a01b03838116911614156116c65760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610d3f565b6116d082826129e5565b5050565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610e5857600080fd5b6000610d0b3384610e0485604051806060016040528060258152602001613a6b602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612959565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611351565b6000610d0b338484612241565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b1580156117ff57600080fd5b505afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611837919061356b565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610d3f90613835565b600a55565b60085460408051632f842d8560e21b815290516000926001600160a01b03169163be10b614916004808301926020929190829003018186803b158015610e5857600080fd5b6005546001600160a01b031633146118f05760405162461bcd60e51b8152600401610d3f90613835565b6001600160a01b0382166000908152601e602052604090205460ff161515811515146116d0576001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461199f5760405162461bcd60e51b8152600401610d3f90613835565b60005b82811015611a1e5781601e60008686858181106119cf57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119e4919061348e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a16816139c8565b9150506119a2565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611a5293929190613746565b60405180910390a1505050565b6005546001600160a01b03163314611a895760405162461bcd60e51b8152600401610d3f90613835565b601a805460ff1916911515919091179055565b60085460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c5699060240160206040518083038186803b158015611ae257600080fd5b505afa158015611af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0f919061369c565b6005546001600160a01b03163314611b445760405162461bcd60e51b8152600401610d3f90613835565b601c55565b6005546001600160a01b03163314611b735760405162461bcd60e51b8152600401610d3f90613835565b3060009081526020819052604090205480611bc55760405162461bcd60e51b8152602060048201526012602482015271746f6b656e2062616c616e6365207a65726f60701b6044820152606401610d3f565b6007805460ff60a01b1916600160a01b17905560135415611beb57611beb601354612b43565b60145415611bfe57611bfe601454612bdb565b60155415611c1157611c11601554612d9c565b506007805460ff60a01b19169055565b6005546001600160a01b03163314611c4b5760405162461bcd60e51b8152600401610d3f90613835565b6019611c6382611c5d8581888a611f58565b90611f58565b1115611cb15760405162461bcd60e51b815260206004820152601960248201527f546f74616c2062757920666565206973206f76657220323525000000000000006044820152606401610d3f565b600b92909255600d92909255600f91909155601155565b6005546001600160a01b03163314611cf25760405162461bcd60e51b8152600401610d3f90613835565b6003811115611d385760405162461bcd60e51b81526020600482015260126024820152716e657756616c7565206d757374203c3d203360701b6044820152606401610d3f565b601d55565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610e5857600080fd5b6005546001600160a01b03163314611dac5760405162461bcd60e51b8152600401610d3f90613835565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d75565b6005546001600160a01b03163314611e075760405162461bcd60e51b8152600401610d3f90613835565b6019611e1982611c5d8581888a611f58565b1115611e675760405162461bcd60e51b815260206004820152601960248201527f546f74616c2073656c20666565206973206f76657220323525000000000000006044820152606401610d3f565b600c92909255600e92909255601091909155601255565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016117e6565b6005546001600160a01b03163314611eea5760405162461bcd60e51b8152600401610d3f90613835565b6001600160a01b038116611f4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d3f565b610fab81612993565b600080611f65838561391f565b905083811015611fb75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d3f565b9392505050565b600082611fcd57506000610d0f565b6000611fd98385613957565b905082611fe68583613937565b14611fb75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d3f565b6000611fb783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f4c565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b0381166121175760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610d3f565b919050565b6001600160a01b03831661217e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d3f565b6001600160a01b0382166121df5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d3f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166122675760405162461bcd60e51b8152600401610d3f9061386a565b6001600160a01b03821661228d5760405162461bcd60e51b8152600401610d3f906137f2565b806122a35761229e83836000612f7a565b505050565b6007546001600160a01b0383811691161480156122d857506007546001600160a01b0316600090815260208190526040902054155b156122e25743601b555b6007546001600160a01b03848116911614801561230d5750601c54601b5461230a919061391f565b43105b1561232a5760175461229e9084906001600160a01b031683612f7a565b30600090815260208190526040902054600a54811080159081906123585750600754600160a01b900460ff16155b801561237d57506001600160a01b0385166000908152601f602052604090205460ff16155b801561239757506005546001600160a01b03868116911614155b80156123b157506005546001600160a01b03858116911614155b80156123bf5750601a5460ff165b1561241e576007805460ff60a01b1916600160a01b179055601554156123ea576123ea601554612d9c565b601354156123fd576123fd601354612b43565b6014541561241057612410601454612bdb565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601e602052604090205460ff600160a01b90920482161591168061246c57506001600160a01b0385166000908152601e602052604090205460ff165b15612475575060005b801561274b576001600160a01b0386166000908152601f6020526040812054819081908190819060ff1615612563576124c460646124be600d548c611fbe90919063ffffffff16565b9061203d565b935083601360008282546124d8919061391f565b9091555050600b546124f2906064906124be908c90611fbe565b92508260146000828254612506919061391f565b9091555050600f54612520906064906124be908c90611fbe565b91508160156000828254612534919061391f565b909155505060115461254e906064906124be908c90611fbe565b905061256081611c5d84818888611f58565b94505b6001600160a01b038a166000908152601f602052604090205460ff161561263d5761259e60646124be600e548c611fbe90919063ffffffff16565b935083601360008282546125b2919061391f565b9091555050600c546125cc906064906124be908c90611fbe565b925082601460008282546125e0919061391f565b90915550506010546125fa906064906124be908c90611fbe565b9150816015600082825461260e919061391f565b9091555050601254612628906064906124be908c90611fbe565b905061263a81611c5d84818888611f58565b94505b6001600160a01b038b166000908152601f602052604090205460ff168061267c57506001600160a01b038a166000908152601f602052604090205460ff165b1561270757601d5415612707576000805b601d548110156126ea5760408051602081018390529081018c90524260608201526080016040516020818303038152906040528051906020012060001c91506126d88d836001612f7a565b806126e2816139c8565b91505061268d565b50601d546126f9906001613957565b612703908b613976565b9950505b6127118986613083565b9850801561273157601854612731908c906001600160a01b031683612f7a565b6127458b306127408885613083565b612f7a565b50505050505b612756868686612f7a565b6008546001600160a01b031663e30443bc87612787816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127cd57600080fd5b505af19250505080156127de575060015b506008546001600160a01b031663e30443bc86612810816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561285657600080fd5b505af1925050508015612867575060015b50600754600160a01b900460ff16612951576019546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b1580156128c557600080fd5b505af19250505080156128f5575060408051601f3d908101601f191682019092526128f2918101906136e8565b60015b6128fe5761294f565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b6000818484111561297d5760405162461bcd60e51b8152600401610d3f919061379f565b50600061298a8486613976565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601f602052604090205460ff1615158115151415612a7a5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610d3f565b6001600160a01b0382166000908152601f60205260409020805460ff19168215801591909117909155612b075760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612aee57600080fd5b505af1158015612b02573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000612b5082600261203d565b90506000612b5e8383613083565b905047612b6a836130c5565b6000612b764783613083565b9050612b828382613242565b84601354612b909190613976565b60135560408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b612be4816132fe565b80601454612bf29190613976565b6014556009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015612c3957600080fd5b505afa158015612c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7191906136d0565b60095460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb90604401602060405180830381600087803b158015612cc757600080fd5b505af1158015612cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cff919061369c565b9050801561229e5760085460405163ba72a95560e01b8152600481018490526001600160a01b039091169063ba72a95590602401600060405180830381600087803b158015612d4d57600080fd5b505af1158015612d61573d6000803e3d6000fd5b505060408051868152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc39350019050611a52565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015612de057600080fd5b505afa158015612df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1891906136d0565b9050612e23826132fe565b6009546040516370a0823160e01b8152306004820152600091612eab9184916001600160a01b0316906370a082319060240160206040518083038186803b158015612e6d57600080fd5b505afa158015612e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea591906136d0565b90613083565b60095460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612efd57600080fd5b505af1158015612f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f35919061369c565b5082601554612f449190613976565b601555505050565b60008183612f6d5760405162461bcd60e51b8152600401610d3f919061379f565b50600061298a8486613937565b6001600160a01b038316612fa05760405162461bcd60e51b8152600401610d3f9061386a565b6001600160a01b038216612fc65760405162461bcd60e51b8152600401610d3f906137f2565b61300381604051806060016040528060268152602001613a1d602691396001600160a01b0386166000908152602081905260409020549190612959565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546130329082611f58565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612234565b6000611fb783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612959565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061310857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561315c57600080fd5b505afa158015613170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319491906134aa565b816001815181106131b557634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546131db913091168461211c565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906132149085906000908690309042906004016138af565b600060405180830381600087803b15801561322e57600080fd5b505af1158015612951573d6000803e3d6000fd5b60065461325a9030906001600160a01b03168461211c565b60065460175460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156132c557600080fd5b505af11580156132d9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610da391906136e8565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061334357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561339757600080fd5b505afa1580156133ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133cf91906134aa565b816001815181106133f057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260095482519116908290600290811061342f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613455913091168461211c565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d795906132149085906000908690309042906004016138af565b60006020828403121561349f578081fd5b8135611fb7816139f9565b6000602082840312156134bb578081fd5b8151611fb7816139f9565b600080604083850312156134d8578081fd5b82356134e3816139f9565b915060208301356134f3816139f9565b809150509250929050565b600080600060608486031215613512578081fd5b833561351d816139f9565b9250602084013561352d816139f9565b929592945050506040919091013590565b60008060408385031215613550578182fd5b823561355b816139f9565b915060208301356134f381613a0e565b600080600080600080600080610100898b031215613587578384fd5b8851613592816139f9565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080604083850312156135e6578182fd5b82356135f1816139f9565b946020939093013593505050565b600080600060408486031215613613578283fd5b833567ffffffffffffffff8082111561362a578485fd5b818601915086601f83011261363d578485fd5b81358181111561364b578586fd5b8760208260051b850101111561365f578586fd5b6020928301955093505084013561367581613a0e565b809150509250925092565b600060208284031215613691578081fd5b8135611fb781613a0e565b6000602082840312156136ad578081fd5b8151611fb781613a0e565b6000602082840312156136c9578081fd5b5035919050565b6000602082840312156136e1578081fd5b5051919050565b6000806000606084860312156136fc578283fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561372a578182fd5b5050823594602084013594506040840135936060013592509050565b6040808252810183905260008460608301825b8681101561378957823561376c816139f9565b6001600160a01b0316825260209283019290910190600101613759565b5080925050508215156020830152949350505050565b6000602080835283518082850152825b818110156137cb578581018301518582016040015282016137af565b818111156137dc5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156138fe5784516001600160a01b0316835293830193918301916001016138d9565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613932576139326139e3565b500190565b60008261395257634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613971576139716139e3565b500290565b600082821015613988576139886139e3565b500390565b600181811c908216806139a157607f821691505b602082108114156139c257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139dc576139dc6139e3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610fab57600080fd5b8015158114610fab57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208fd51933267d032806fd698faccc2f91e4f146b788dd4eb9ec641fd1556bd80964736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000001844366dac8000000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000004e89d230ceba651ca7f4d290982aec6947553c1f0000000000000000000000009d5aa76bea985571d13203b839023bd619d244ed000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001431e0fae6d7217caa00000000000000000000000000000009bb69e4ddda0a1865fec3ba828787e6f886750f7000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000000004506950690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045069506900000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): PiPi
Arg [1] : symbol_ (string): PiPi
Arg [2] : totalSupply_ (uint256): 426900000000000
Arg [3] : addrs (address[4]): 0x6982508145454Ce325dDbE47a25d4ec3d2311933,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0x4E89D230CEbA651Ca7F4D290982aec6947553C1F,0x9d5Aa76beA985571D13203B839023BD619D244ED
Arg [4] : buyFeeSetting_ (uint256[4]): 3,1,2,0
Arg [5] : sellFeeSetting_ (uint256[4]): 3,1,2,0
Arg [6] : tokenBalanceForReward_ (uint256): 100000000000000000000000000000
Arg [7] : serviceFeeReceiver_ (address): 0x9bB69e4dDDA0a1865FEC3ba828787E6f886750F7
Arg [8] : serviceFee_ (uint256): 30000000000000000

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [2] : 0000000000000000000000000000000000000000000000000001844366dac800
Arg [3] : 0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933
Arg [4] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [5] : 0000000000000000000000004e89d230ceba651ca7f4d290982aec6947553c1f
Arg [6] : 0000000000000000000000009d5aa76bea985571d13203b839023bd619d244ed
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000001431e0fae6d7217caa0000000
Arg [16] : 0000000000000000000000009bb69e4ddda0a1865fec3ba828787e6f886750f7
Arg [17] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 5069506900000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [21] : 5069506900000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

64008:19644:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64334:33;;;;;;;;;;;;;;;;;;;17838:25:1;;;17826:2;17811:18;64334:33:0;;;;;;;;12963:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;64374:34::-;;;;;;;;;;;;;;;;15130:169;;;;;;;;;;-1:-1:-1;15130:169:0;;;;;:::i;:::-;;:::i;:::-;;;9543:14:1;;9536:22;9518:41;;9506:2;9491:18;15130:169:0;9473:92:1;69325:154:0;;;;;;;;;;-1:-1:-1;69325:154:0;;;;;:::i;:::-;;:::i;:::-;;64087:41;;;;;;;;;;-1:-1:-1;64087:41:0;;;;-1:-1:-1;;;;;64087:41:0;;;;;;-1:-1:-1;;;;;6026:32:1;;;6008:51;;5996:2;5981:18;64087:41:0;5963:102:1;14083:108:0;;;;;;;;;;-1:-1:-1;14171:12:0;;14083:108;;15781:355;;;;;;;;;;-1:-1:-1;15781:355:0;;;;;:::i;:::-;;:::i;64597:26::-;;;;;;;;;;;;;;;;64201:47;;;;;;;;;;-1:-1:-1;64201:47:0;;;;-1:-1:-1;;;;;64201:47:0;;;72457:141;;;;;;;;;;;;;:::i;13925:93::-;;;;;;;;;;-1:-1:-1;13925:93:0;;14008:2;19977:36:1;;19965:2;19950:18;13925:93:0;19932:87:1;73045:129:0;;;;;;;;;;-1:-1:-1;73045:129:0;;;;;:::i;:::-;;:::i;64670:36::-;;;;;;;;;;;;;;;;16545:218;;;;;;;;;;-1:-1:-1;16545:218:0;;;;;:::i;:::-;;:::i;65003:20::-;;;;;;;;;;;;;;;;64755:38;;;;;;;;;;-1:-1:-1;64755:38:0;;;;-1:-1:-1;;;;;64755:38:0;;;65030:23;;;;;;;;;;;;;;;;64956:40;;;;;;;;;;-1:-1:-1;64956:40:0;;;;;;;;74282:103;;;;;;;;;;;;;:::i;72606:125::-;;;;;;;;;;-1:-1:-1;72606:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;72695:28:0;72671:4;72695:28;;;:19;:28;;;;;;;;;72606:125;1090:90;;;;;;;;;;-1:-1:-1;1157:15:0;1090:90;;71013:121;;;;;;;;;;-1:-1:-1;71013:121:0;;;;;:::i;:::-;;:::i;75391:90::-;;;;;;;;;;-1:-1:-1;75391:90:0;;;;;:::i;:::-;;:::i;74530:141::-;;;;;;;;;;;;;:::i;69680:490::-;;;;;;;;;;-1:-1:-1;69680:490:0;;;;;:::i;:::-;;:::i;72898:139::-;;;;;;;;;;-1:-1:-1;72898:139:0;;;;;:::i;:::-;;:::i;74003:271::-;;;;;;;;;;-1:-1:-1;74003:271:0;;;;;:::i;:::-;;:::i;14254:127::-;;;;;;;;;;-1:-1:-1;14254:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;14355:18:0;14328:7;14355:18;;;;;;;;;;;;14254:127;770:103;;;;;;;;;;;;;:::i;64490:30::-;;;;;;;;;;;;;;;;64837:70;;;;;;;;;;-1:-1:-1;64837:70:0;;;;-1:-1:-1;;;;;64837:70:0;;;71809:392;;;;;;;;;;-1:-1:-1;71809:392:0;;;;;:::i;:::-;;:::i;547:87::-;;;;;;;;;;-1:-1:-1;620:6:0;;-1:-1:-1;;;;;620:6:0;547:87;;64565:25;;;;;;;;;;;;;;;;64527:31;;;;;;;;;;;;;;;;13182:104;;;;;;;;;;;;;:::i;71142:252::-;;;;;;;;;;-1:-1:-1;71142:252:0;;;;;:::i;:::-;;:::i;64916:31::-;;;;;;;;;;;;;;;;72341:108;;;;;;;;;;;;;:::i;17266:269::-;;;;;;;;;;-1:-1:-1;17266:269:0;;;;;:::i;:::-;;:::i;72739:151::-;;;;;;;;;;-1:-1:-1;72739:151:0;;;;;:::i;:::-;;:::i;14594:175::-;;;;;;;;;;-1:-1:-1;14594:175:0;;;;;:::i;:::-;;:::i;73341:318::-;;;;;;;;;;-1:-1:-1;73341:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7336:32:1;;;7318:51;;7400:2;7385:18;;7378:34;;;;7428:18;;;7421:34;;;;7486:2;7471:18;;7464:34;;;;7529:3;7514:19;;7507:35;7356:3;7558:19;;7551:35;7617:3;7602:19;;7595:35;7661:3;7646:19;;7639:35;7305:3;7290:19;73341:318:0;7272:408:1;75273:110:0;;;;;;;;;;-1:-1:-1;75273:110:0;;;;;:::i;:::-;;:::i;65361:58::-;;;;;;;;;;-1:-1:-1;65361:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;69487:185;;;;;;;;;;;;;:::i;70178:256::-;;;;;;;;;;-1:-1:-1;70178:256:0;;;;;:::i;:::-;;:::i;70442:304::-;;;;;;;;;;-1:-1:-1;70442:304:0;;;;;:::i;:::-;;:::i;75150:117::-;;;;;;;;;;-1:-1:-1;75150:117:0;;;;;:::i;:::-;;:::i;73182:151::-;;;;;;;;;;-1:-1:-1;73182:151:0;;;;;:::i;:::-;;:::i;70919:86::-;;;;;;;;;;-1:-1:-1;70919:86:0;;;;;:::i;:::-;;:::i;64135:27::-;;;;;;;;;;-1:-1:-1;64135:27:0;;;;-1:-1:-1;;;;;64135:27:0;;;64713:33;;;;;;;;;;;;;;;;74679:463;;;;;;;;;;;;;:::i;14832:151::-;;;;;;;;;;-1:-1:-1;14832:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;14948:18:0;;;14921:7;14948:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14832:151;64292:33;;;;;;;;;;;;;;;;65060:27;;;;;;;;;;;;;;;;75491:391;;;;;;;;;;-1:-1:-1;75491:391:0;;;;;:::i;:::-;;:::i;70754:157::-;;;;;;;;;;-1:-1:-1;70754:157:0;;;;;:::i;:::-;;:::i;74393:129::-;;;;;;;;;;;;;:::i;72209:124::-;;;;;;;;;;-1:-1:-1;72209:124:0;;;;;:::i;:::-;;:::i;75890:393::-;;;;;;;;;;-1:-1:-1;75890:393:0;;;;;:::i;:::-;;:::i;64415:30::-;;;;;;;;;;;;;;;;73667:328;;;;;;;;;;-1:-1:-1;73667:328:0;;;;;:::i;:::-;;:::i;881:201::-;;;;;;;;;;-1:-1:-1;881:201:0;;;;;:::i;:::-;;:::i;64452:31::-;;;;;;;;;;;;;;;;64257:26;;;;;;;;;;-1:-1:-1;64257:26:0;;;;-1:-1:-1;;;;;64257:26:0;;;64630:33;;;;;;;;;;;;;;;;12963:100;13017:13;13050:5;13043:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12963:100;:::o;15130:169::-;15213:4;15230:39;173:10;15253:7;15262:6;15230:8;:39::i;:::-;-1:-1:-1;15287:4:0;15130:169;;;;;:::o;69325:154::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;;;;;;;;;69413:15:::1;::::0;:58:::1;::::0;-1:-1:-1;;;69413:58:0;;::::1;::::0;::::1;17838:25:1::0;;;-1:-1:-1;;;;;69413:15:0;;::::1;::::0;:53:::1;::::0;17811:18:1;;69413:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69325:154:::0;:::o;15781:355::-;15921:4;15938:36;15948:6;15956:9;15967:6;15938:9;:36::i;:::-;15985:121;15994:6;173:10;16016:89;16054:6;16016:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16016:19:0;;;;;;:11;:19;;;;;;;;173:10;16016:33;;;;;;;;;;:37;:89::i;:::-;15985:8;:121::i;:::-;-1:-1:-1;16124:4:0;15781:355;;;;;:::o;72457:141::-;72547:15;;:43;;;-1:-1:-1;;;72547:43:0;;;;72520:7;;-1:-1:-1;;;;;72547:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72540:50;;72457:141;:::o;73045:129::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;73121:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;73121:45:0;;-1:-1:-1;;;;;6026:32:1;;;73121:45:0::1;::::0;::::1;6008:51:1::0;73121:15:0;;::::1;::::0;:36:::1;::::0;5981:18:1;;73121:45:0::1;5963:102:1::0;16545:218:0;173:10;16633:4;16682:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16682:34:0;;;;;;;;;;16633:4;;16650:83;;16673:7;;16682:50;;16721:10;16682:38;:50::i;74282:103::-;74319:15;;:58;;-1:-1:-1;;;74319:58:0;;74358:10;74319:58;;;6254:51:1;74319:15:0;6321:18:1;;;6314:50;-1:-1:-1;;;;;74319:15:0;;;;:30;;6227:18:1;;74319:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74282:103::o;71013:121::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;71094:23:::1;:32:::0;;-1:-1:-1;;;;;;71094:32:0::1;-1:-1:-1::0;;;;;71094:32:0;;;::::1;::::0;;;::::1;::::0;;71013:121::o;75391:90::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;75456:10:::1;:17:::0;;-1:-1:-1;;;;;;75456:17:0::1;-1:-1:-1::0;;;;;75456:17:0;;;::::1;::::0;;;::::1;::::0;;75391:90::o;74530:141::-;74622:15;;:41;;;-1:-1:-1;;;74622:41:0;;;;74595:7;;-1:-1:-1;;;;;74622:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;69680:490;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;69789:15:::1;::::0;-1:-1:-1;;;;;69767:38:0;;::::1;69789:15:::0;::::1;69767:38;;69759:86;;;::::0;-1:-1:-1;;;69759:86:0;;14517:2:1;69759:86:0::1;::::0;::::1;14499:21:1::0;14556:2;14536:18;;;14529:30;14595:34;14575:18;;;14568:62;-1:-1:-1;;;14646:18:1;;;14639:33;14689:19;;69759:86:0::1;14489:225:1::0;69759:86:0::1;69903:15;::::0;69861:59:::1;::::0;-1:-1:-1;;;;;69903:15:0;;::::1;::::0;69861:59;::::1;::::0;::::1;::::0;69903:15:::1;::::0;69861:59:::1;69931:15;:48:::0;;-1:-1:-1;;;;;;69931:48:0::1;-1:-1:-1::0;;;;;69931:48:0;::::1;::::0;;::::1;::::0;;;70033:25:::1;::::0;;-1:-1:-1;;;70033:25:0;;;;-1:-1:-1;;69931:48:0;70033:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;69931:48;70033:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;70015:69:0::1;;70093:4;70100:15;;;;;;;;;-1:-1:-1::0;;;;;70100:15:0::1;-1:-1:-1::0;;;;;70100:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70015:108;::::0;-1:-1:-1;;;;;;70015:108:0::1;::::0;;;;;;-1:-1:-1;;;;;6900:15:1;;;70015:108:0::1;::::0;::::1;6882:34:1::0;6952:15;;6932:18;;;6925:43;6817:18;;70015:108:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70134:11;:28:::0;;-1:-1:-1;;;;;;70134:28:0::1;-1:-1:-1::0;;;;;70134:28:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;69680:490:0:o;72898:139::-;72995:15;;:34;;-1:-1:-1;;;72995:34:0;;-1:-1:-1;;;;;6026:32:1;;;72995:34:0;;;6008:51:1;72968:7:0;;72995:15;;:25;;5981:18:1;;72995:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;74003:271::-;74135:15;;:28;;-1:-1:-1;;;;;;74135:28:0;;;;;17838:25:1;;;74069:18:0;;;;;;-1:-1:-1;;;;;74135:15:0;;:23;;17811:18:1;;74135:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74179:87;;;19670:25:1;;;19726:2;19711:18;;19704:34;;;19754:18;;;19747:34;;;19812:2;19797:18;;19790:34;;;74068:95:0;;-1:-1:-1;74068:95:0;;-1:-1:-1;74068:95:0;-1:-1:-1;74256:9:0;;74244:5;;74179:87;;19657:3:1;19642:19;74179:87:0;;;;;;;74003:271;;;;:::o;770:103::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;835:30:::1;862:1;835:18;:30::i;:::-;770:103::o:0;71809:392::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;71907:6:::1;71895:8;:18;;:40;;;;;71929:6;71917:8;:18;;71895:40;71887:105;;;::::0;-1:-1:-1;;;71887:105:0;;12092:2:1;71887:105:0::1;::::0;::::1;12074:21:1::0;12131:2;12111:18;;;12104:30;12170:34;12150:18;;;12143:62;-1:-1:-1;;;12221:18:1;;;12214:50;12281:19;;71887:105:0::1;12064:242:1::0;71887:105:0::1;72023:16;;72011:8;:28;;72003:85;;;::::0;-1:-1:-1;;;72003:85:0;;13748:2:1;72003:85:0::1;::::0;::::1;13730:21:1::0;13787:2;13767:18;;;13760:30;13826:34;13806:18;;;13799:62;-1:-1:-1;;;13877:18:1;;;13870:42;13929:19;;72003:85:0::1;13720:234:1::0;72003:85:0::1;72138:16;::::0;72104:51:::1;::::0;72128:8;;72104:51:::1;::::0;;;::::1;72166:16;:27:::0;71809:392::o;13182:104::-;13238:13;13271:7;13264:14;;;;;:::i;71142:252::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;71249:11:::1;::::0;-1:-1:-1;;;;;71241:19:0;;::::1;71249:11:::0;::::1;71241:19;;71233:101;;;::::0;-1:-1:-1;;;71233:101:0;;10856:2:1;71233:101:0::1;::::0;::::1;10838:21:1::0;10895:2;10875:18;;;10868:30;10934:34;10914:18;;;10907:62;11005:34;10985:18;;;10978:62;-1:-1:-1;;;11056:19:1;;;11049:36;11102:19;;71233:101:0::1;10828:299:1::0;71233:101:0::1;71345:41;71374:4;71380:5;71345:28;:41::i;:::-;71142:252:::0;;:::o;72341:108::-;72414:15;;:27;;;-1:-1:-1;;;72414:27:0;;;;72387:7;;-1:-1:-1;;;;;72414:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;17266:269;17359:4;17376:129;173:10;17399:7;17408:96;17447:15;17408:96;;;;;;;;;;;;;;;;;173:10;17408:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17408:34:0;;;;;;;;;;;;:38;:96::i;72739:151::-;72835:15;;:47;;-1:-1:-1;;;72835:47:0;;-1:-1:-1;;;;;6026:32:1;;;72835:47:0;;;6008:51:1;72808:7:0;;72835:15;;:38;;5981:18:1;;72835:47:0;5963:102:1;14594:175:0;14680:4;14697:42;173:10;14721:9;14732:6;14697:9;:42::i;73341:318::-;73616:15;;:35;;-1:-1:-1;;;73616:35:0;;-1:-1:-1;;;;;6026:32:1;;;73616:35:0;;;6008:51:1;73437:7:0;;;;;;;;;;;;;;;;73616:15;;;:26;;5981:18:1;;73616:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73609:42;;;;;;;;;;;;;;;;73341:318;;;;;;;;;:::o;75273:110::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;75348:18:::1;:27:::0;75273:110::o;69487:185::-;69615:15;;:49;;;-1:-1:-1;;;69615:49:0;;;;69583:7;;-1:-1:-1;;;;;69615:15:0;;:47;;:49;;;;;;;;;;;;;;:15;:49;;;;;;;;;;70178:256;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;70266:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;70263:164;;-1:-1:-1::0;;;;;70322:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;70322:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;70381:34;;9518:41:1;;;70381:34:0::1;::::0;9491:18:1;70381:34:0::1;;;;;;;70178:256:::0;;:::o;70442:304::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;70559:9:::1;70555:115;70574:19:::0;;::::1;70555:115;;;70650:8;70615:19;:32;70635:8;;70644:1;70635:11;;;;;-1:-1:-1::0;;;70635:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;70615:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;70615:32:0;:43;;-1:-1:-1;;70615:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;70595:3;::::1;::::0;::::1;:::i;:::-;;;;70555:115;;;;70687:51;70719:8;;70729;70687:51;;;;;;;;:::i;:::-;;;;;;;;70442:304:::0;;;:::o;75150:117::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;75227:21:::1;:32:::0;;-1:-1:-1;;75227:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;75150:117::o;73182:151::-;73277:15;;:48;;-1:-1:-1;;;73277:48:0;;-1:-1:-1;;;;;6026:32:1;;;73277:48:0;;;6008:51:1;73253:4:0;;73277:15;;:39;;5981:18:1;;73277:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70919:86::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;70982:4:::1;:15:::0;70919:86::o;74679:463::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;74778:4:::1;74729:28;14355:18:::0;;;;;;;;;;;74803:24;74795:56:::1;;;::::0;-1:-1:-1;;;74795:56:0;;15272:2:1;74795:56:0::1;::::0;::::1;15254:21:1::0;15311:2;15291:18;;;15284:30;-1:-1:-1;;;15330:18:1;;;15323:48;15388:18;;74795:56:0::1;15244:168:1::0;74795:56:0::1;74862:8;:15:::0;;-1:-1:-1;;;;74862:15:0::1;-1:-1:-1::0;;;74862:15:0::1;::::0;;74891:18:::1;::::0;:22;74888:61:::1;;74915:34;74930:18;;74915:14;:34::i;:::-;74963:21;::::0;:25;74960:73:::1;;74990:43;75011:21;;74990:20;:43::i;:::-;75047:18;::::0;:22;75044:63:::1;;75071:36;75088:18;;75071:16;:36::i;:::-;-1:-1:-1::0;75118:8:0::1;:16:::0;;-1:-1:-1;;;;75118:16:0::1;::::0;;74679:463::o;75491:391::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;75688:2:::1;75628:56;75676:7:::0;75628:43:::1;75658:12:::0;75628:43;:10;75643:9;75628:14:::1;:25::i;:::-;:29:::0;::::1;:43::i;:56::-;:62;;75620:100;;;::::0;-1:-1:-1;;;75620:100:0;;11738:2:1;75620:100:0::1;::::0;::::1;11720:21:1::0;11777:2;11757:18;;;11750:30;11816:27;11796:18;;;11789:55;11861:18;;75620:100:0::1;11710:175:1::0;75620:100:0::1;75731:18;:31:::0;;;;75773:15:::1;:27:::0;;;;75811:15:::1;:30:::0;;;;75852:10:::1;:20:::0;75491:391::o;70754:157::-;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;70845:1:::1;70833:8;:13;;70825:44;;;::::0;-1:-1:-1;;;70825:44:0;;16788:2:1;70825:44:0::1;::::0;::::1;16770:21:1::0;16827:2;16807:18;;;16800:30;-1:-1:-1;;;16846:18:1;;;16839:48;16904:18;;70825:44:0::1;16760:168:1::0;70825:44:0::1;70880:12;:23:::0;70754:157::o;74393:129::-;74475:15;;:39;;;-1:-1:-1;;;74475:39:0;;;;74448:7;;-1:-1:-1;;;;;74475:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;72209:124;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;72283:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;72283:42:0;;::::1;::::0;::::1;17838:25:1::0;;;-1:-1:-1;;;;;72283:15:0;;::::1;::::0;:31:::1;::::0;17811:18:1;;72283:42:0::1;17793:76:1::0;75890:393:0;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;76087:2:::1;76027:56;76075:7:::0;76027:43:::1;76057:12:::0;76027:43;:10;76042:9;76027:14:::1;:25::i;:56::-;:62;;76019:100;;;::::0;-1:-1:-1;;;76019:100:0;;17540:2:1;76019:100:0::1;::::0;::::1;17522:21:1::0;17579:2;17559:18;;;17552:30;17618:27;17598:18;;;17591:55;17663:18;;76019:100:0::1;17512:175:1::0;76019:100:0::1;76130:19;:32:::0;;;;76173:16:::1;:28:::0;;;;76212:16:::1;:31:::0;;;;76254:11:::1;:21:::0;75890:393::o;73667:328::-;73947:15;;:40;;-1:-1:-1;;;73947:40:0;;;;;17838:25:1;;;73768:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73947:15:0;;;;:33;;17811:18:1;;73947:40:0;17793:76:1;881:201:0;620:6;;-1:-1:-1;;;;;620:6:0;173:10;682:23;674:68;;;;-1:-1:-1;;;674:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;970:22:0;::::1;962:73;;;::::0;-1:-1:-1;;;962:73:0;;12513:2:1;962:73:0::1;::::0;::::1;12495:21:1::0;12552:2;12532:18;;;12525:30;12591:34;12571:18;;;12564:62;-1:-1:-1;;;12642:18:1;;;12635:36;12688:19;;962:73:0::1;12485:228:1::0;962:73:0::1;1046:28;1065:8;1046:18;:28::i;5555:181::-:0;5613:7;;5645:5;5649:1;5645;:5;:::i;:::-;5633:17;;5674:1;5669;:6;;5661:46;;;;-1:-1:-1;;;5661:46:0;;14161:2:1;5661:46:0;;;14143:21:1;14200:2;14180:18;;;14173:30;14239:29;14219:18;;;14212:57;14286:18;;5661:46:0;14133:177:1;5661:46:0;5727:1;5555:181;-1:-1:-1;;;5555:181:0:o;6088:471::-;6146:7;6391:6;6387:47;;-1:-1:-1;6421:1:0;6414:8;;6387:47;6446:9;6458:5;6462:1;6458;:5;:::i;:::-;6446:17;-1:-1:-1;6491:1:0;6482:5;6486:1;6446:17;6482:5;:::i;:::-;:10;6474:56;;;;-1:-1:-1;;;6474:56:0;;15619:2:1;6474:56:0;;;15601:21:1;15658:2;15638:18;;;15631:30;15697:34;15677:18;;;15670:62;-1:-1:-1;;;15748:18:1;;;15741:31;15789:19;;6474:56:0;15591:223:1;6567:132:0;6625:7;6652:39;6656:1;6659;6652:39;;;;;;;;;;;;;;;;;:3;:39::i;9486:524::-;9543:16;9613:4;9607:11;-1:-1:-1;;;9639:3:0;9632:79;9758:14;9752:4;9748:25;9741:4;9736:3;9732:14;9725:49;-1:-1:-1;;;9804:4:0;9799:3;9795:14;9788:90;9919:4;9914:3;9911:1;9904:20;9892:32;-1:-1:-1;;;;;;;9953:22:0;;9945:57;;;;-1:-1:-1;;;9945:57:0;;14921:2:1;9945:57:0;;;14903:21:1;14960:2;14940:18;;;14933:30;-1:-1:-1;;;14979:18:1;;;14972:52;15041:18;;9945:57:0;14893:172:1;9945:57:0;9486:524;;;:::o;20452:380::-;-1:-1:-1;;;;;20588:19:0;;20580:68;;;;-1:-1:-1;;;20580:68:0;;17135:2:1;20580:68:0;;;17117:21:1;17174:2;17154:18;;;17147:30;17213:34;17193:18;;;17186:62;-1:-1:-1;;;17264:18:1;;;17257:34;17308:19;;20580:68:0;17107:226:1;20580:68:0;-1:-1:-1;;;;;20667:21:0;;20659:68;;;;-1:-1:-1;;;20659:68:0;;12920:2:1;20659:68:0;;;12902:21:1;12959:2;12939:18;;;12932:30;12998:34;12978:18;;;12971:62;-1:-1:-1;;;13049:18:1;;;13042:32;13091:19;;20659:68:0;12892:224:1;20659:68:0;-1:-1:-1;;;;;20740:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20792:32;;17838:25:1;;;20792:32:0;;17811:18:1;20792:32:0;;;;;;;;20452:380;;;:::o;76291:4056::-;-1:-1:-1;;;;;76423:18:0;;76415:68;;;;-1:-1:-1;;;76415:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;76502:16:0;;76494:64;;;;-1:-1:-1;;;76494:64:0;;;;;;;:::i;:::-;76574:11;76571:92;;76602:28;76618:4;76624:2;76628:1;76602:15;:28::i;:::-;76291:4056;;;:::o;76571:92::-;76682:11;;-1:-1:-1;;;;;76676:17:0;;;76682:11;;76676:17;:57;;;;-1:-1:-1;76715:11:0;;-1:-1:-1;;;;;76715:11:0;14328:7;14355:18;;;;;;;;;;;76697:36;76676:57;76673:108;;;76757:12;76749:5;:20;76673:108;76802:11;;-1:-1:-1;;;;;76794:19:0;;;76802:11;;76794:19;:50;;;;;76840:4;;76832:5;;:12;;;;:::i;:::-;76817;:27;76794:50;76791:135;;;76891:14;;76869:45;;76885:4;;-1:-1:-1;;;;;76891:14:0;76907:6;76869:15;:45::i;76791:135::-;76987:4;76938:28;14355:18;;;;;;;;;;;77045;;77021:42;;;;;;;77080:33;;-1:-1:-1;77105:8:0;;-1:-1:-1;;;77105:8:0;;;;77104:9;77080:33;:82;;;;-1:-1:-1;;;;;;77131:31:0;;;;;;:25;:31;;;;;;;;77130:32;77080:82;:114;;;;-1:-1:-1;620:6:0;;-1:-1:-1;;;;;77179:15:0;;;620:6;;77179:15;;77080:114;:144;;;;-1:-1:-1;620:6:0;;-1:-1:-1;;;;;77211:13:0;;;620:6;;77211:13;;77080:144;:182;;;;-1:-1:-1;77241:21:0;;;;77080:182;77076:513;;;77289:8;:15;;-1:-1:-1;;;;77289:15:0;-1:-1:-1;;;77289:15:0;;;77322:18;;:22;77319:63;;77346:36;77363:18;;77346:16;:36::i;:::-;77400:18;;:22;77397:61;;77424:34;77439:18;;77424:14;:34::i;:::-;77476:21;;:25;77473:73;;77503:43;77524:21;;77503:20;:43::i;:::-;77561:8;:16;;-1:-1:-1;;;;77561:16:0;;;77076:513;77619:8;;-1:-1:-1;;;;;77728:25:0;;77603:12;77728:25;;;:19;:25;;;;;;77619:8;-1:-1:-1;;;77619:8:0;;;;;77618:9;;77728:25;;:52;;-1:-1:-1;;;;;;77757:23:0;;;;;;:19;:23;;;;;;;;77728:52;77725:99;;;-1:-1:-1;77807:5:0;77725:99;77839:7;77836:1923;;;-1:-1:-1;;;;;78046:31:0;;77863:12;78046:31;;;:25;:31;;;;;;77863:12;;;;;;;;78046:31;;78043:495;;;78104:36;78136:3;78104:27;78115:15;;78104:6;:10;;:27;;;;:::i;:::-;:31;;:36::i;:::-;78097:43;;78181:4;78159:18;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;78222:18:0;;78211:39;;78246:3;;78211:30;;:6;;:10;:30::i;:39::-;78204:46;;78294:4;78269:21;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;78335:15:0;;78324:36;;78356:3;;78324:27;;:6;;:10;:27::i;:36::-;78317:43;;78401:4;78379:18;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;78442:10:0;;78431:31;;78458:3;;78431:22;;:6;;:10;:22::i;:31::-;78424:38;-1:-1:-1;78488:34:0;78424:38;78488:24;78507:4;78488:24;:4;78497;78488:8;:14::i;:34::-;78481:41;;78043:495;-1:-1:-1;;;;;78555:29:0;;;;;;:25;:29;;;;;;;;78552:497;;;78611:37;78644:3;78611:28;78622:16;;78611:6;:10;;:28;;;;:::i;:37::-;78604:44;;78689:4;78667:18;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;78730:19:0;;78719:40;;78755:3;;78719:31;;:6;;:10;:31::i;:40::-;78712:47;;78803:4;78778:21;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;78844:16:0;;78833:37;;78866:3;;78833:28;;:6;;:10;:28::i;:37::-;78826:44;;78911:4;78889:18;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;78952:11:0;;78941:32;;78969:3;;78941:23;;:6;;:10;:23::i;:32::-;78934:39;-1:-1:-1;78999:34:0;78934:39;78999:24;79018:4;78999:24;:4;79008;78999:8;:14::i;:34::-;78992:41;;78552:497;-1:-1:-1;;;;;79090:31:0;;;;;;:25;:31;;;;;;;;;:64;;-1:-1:-1;;;;;;79125:29:0;;;;;;:25;:29;;;;;;;;79090:64;79087:483;;;79178:12;;:16;79174:381;;79218:10;;79251:236;79275:12;;79271:1;:16;79251:236;;;79360:44;;;;;;5730:19:1;;;5765:12;;;5758:28;;;79388:15:0;5802:12:1;;;5795:28;5839:12;;79360:44:0;;;;;;;;;;;;79350:55;;;;;;79342:64;;79321:87;;79435:28;79451:4;79457:2;79461:1;79435:15;:28::i;:::-;79289:3;;;;:::i;:::-;;;;79251:236;;;-1:-1:-1;79519:12:0;;:16;;79534:1;79519:16;:::i;:::-;79509:26;;;;:::i;:::-;;;79174:381;;79595:16;:6;79606:4;79595:10;:16::i;:::-;79586:25;-1:-1:-1;79629:8:0;;79626:52;;79661:10;;79639:39;;79655:4;;-1:-1:-1;;;;;79661:10:0;79673:4;79639:15;:39::i;:::-;79693:52;79709:4;79723;79730:14;:4;79739;79730:8;:14::i;:::-;79693:15;:52::i;:::-;77836:1923;;;;;;79771:33;79787:4;79793:2;79797:6;79771:15;:33::i;:::-;79821:15;;-1:-1:-1;;;;;79821:15:0;:26;79856:4;79863:15;79856:4;-1:-1:-1;;;;;14355:18:0;14328:7;14355:18;;;;;;;;;;;;14254:127;79863:15;79821:58;;-1:-1:-1;;;;;;79821:58:0;;;;;;;-1:-1:-1;;;;;6583:32:1;;;79821:58:0;;;6565:51:1;6632:18;;;6625:34;6538:18;;79821:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79817:74;79905:15;;-1:-1:-1;;;;;79905:15:0;:26;79940:2;79945:13;79940:2;-1:-1:-1;;;;;14355:18:0;14328:7;14355:18;;;;;;;;;;;;14254:127;79945:13;79905:54;;-1:-1:-1;;;;;;79905:54:0;;;;;;;-1:-1:-1;;;;;6583:32:1;;;79905:54:0;;;6565:51:1;6632:18;;;6625:34;6538:18;;79905:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79901:70;79987:8;;-1:-1:-1;;;79987:8:0;;;;79983:357;;80026:16;;80063:15;;:28;;-1:-1:-1;;;;;;80063:28:0;;;;;17838:25:1;;;-1:-1:-1;;;;;80063:15:0;;;;:23;;17811:18:1;;80063:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80063:28:0;;;;;;;;-1:-1:-1;;80063:28:0;;;;;;;;;;;;:::i;:::-;;;80059:270;;;;;80189:86;;;19670:25:1;;;19726:2;19711:18;;19704:34;;;19754:18;;;19747:34;;;19812:2;19797:18;;19790:34;;;80265:9:0;;80254:4;;80189:86;;19657:3:1;19642:19;80189:86:0;;;;;;;80092:199;;;80059:270;79983:357;;76291:4056;;;;;;:::o;5888:192::-;5974:7;6010:12;6002:6;;;;5994:29;;;;-1:-1:-1;;;5994:29:0;;;;;;;;:::i;:::-;-1:-1:-1;6034:9:0;6046:5;6050:1;6046;:5;:::i;:::-;6034:17;5888:192;-1:-1:-1;;;;;5888:192:0:o;1188:191::-;1281:6;;;-1:-1:-1;;;;;1298:17:0;;;-1:-1:-1;;;;;;1298:17:0;;;;;;;1331:40;;1281:6;;;1298:17;1281:6;;1331:40;;1262:16;;1331:40;1188:191;;:::o;71402:397::-;-1:-1:-1;;;;;71493:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;71485:109;;;;-1:-1:-1;;;71485:109:0;;13323:2:1;71485:109:0;;;13305:21:1;13362:2;13342:18;;;13335:30;13401:34;13381:18;;;13374:62;13472:26;13452:18;;;13445:54;13516:19;;71485:109:0;13295:246:1;71485:109:0;-1:-1:-1;;;;;71605:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;71605:39:0;;;;;;;;;;;;71657:79;;71682:15;;:42;;-1:-1:-1;;;71682:42:0;;-1:-1:-1;;;;;6026:32:1;;;71682:42:0;;;6008:51:1;71682:15:0;;;;:36;;5981:18:1;;71682:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71657:79;71751:40;;;;;;-1:-1:-1;;;;;71751:40:0;;;;;;;;71402:397;;:::o;80779:714::-;80888:12;80903:13;:6;80914:1;80903:10;:13::i;:::-;80888:28;-1:-1:-1;80927:17:0;80947:16;:6;80888:28;80947:10;:16::i;:::-;80927:36;-1:-1:-1;81001:21:0;81067:22;81084:4;81067:16;:22::i;:::-;81220:18;81241:41;:21;81267:14;81241:25;:41::i;:::-;81220:62;;81332:35;81345:9;81356:10;81332:12;:35::i;:::-;81420:6;81399:18;;:27;;;;:::i;:::-;81378:18;:48;81442:43;;;19317:25:1;;;19373:2;19358:18;;19351:34;;;19401:18;;;19394:34;;;81442:43:0;;19305:2:1;19290:18;81442:43:0;;;;;;;80779:714;;;;;:::o;83169:480::-;83233:25;83251:6;83233:17;:25::i;:::-;83317:6;83293:21;;:30;;;;:::i;:::-;83269:21;:54;83361:11;;83354:44;;-1:-1:-1;;;83354:44:0;;83392:4;83354:44;;;6008:51:1;83334:17:0;;-1:-1:-1;;;;;83361:11:0;;83354:29;;5981:18:1;;83354:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83431:11;;83461:15;;83424:65;;-1:-1:-1;;;83424:65:0;;-1:-1:-1;;;;;83461:15:0;;;83424:65;;;6565:51:1;6632:18;;;6625:34;;;83334:64:0;;-1:-1:-1;83409:12:0;;83431:11;;;83424:28;;6538:18:1;;83424:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83409:80;;83504:7;83500:142;;;83528:15;;:50;;-1:-1:-1;;;83528:50:0;;;;;17838:25:1;;;-1:-1:-1;;;;;83528:15:0;;;;:39;;17811:18:1;;83528:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;83598:32:0;;;19036:25:1;;;19092:2;19077:18;;19070:34;;;83598:32:0;;-1:-1:-1;19009:18:1;;-1:-1:-1;83598:32:0;18991:119:1;80355:416:0;80453:11;;80446:44;;-1:-1:-1;;;80446:44:0;;80484:4;80446:44;;;6008:51:1;80417:26:0;;-1:-1:-1;;;;;80453:11:0;;80446:29;;5981:18:1;;80446:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80417:73;;80501:25;80519:6;80501:17;:25::i;:::-;80566:11;;80559:44;;-1:-1:-1;;;80559:44:0;;80597:4;80559:44;;;6008:51:1;80537:18:0;;80558:70;;80609:18;;-1:-1:-1;;;;;80566:11:0;;80559:29;;5981:18:1;;80559:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80558:50;;:70::i;:::-;80646:11;;80668:23;;80639:65;;-1:-1:-1;;;80639:65:0;;-1:-1:-1;;;;;80668:23:0;;;80639:65;;;6565:51:1;6632:18;;;6625:34;;;80537:91:0;;-1:-1:-1;80646:11:0;;80639:28;;6538:18:1;;80639:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80757:6;80736:18;;:27;;;;:::i;:::-;80715:18;:48;-1:-1:-1;;;80355:416:0:o;6707:278::-;6793:7;6828:12;6821:5;6813:28;;;;-1:-1:-1;;;6813:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6852:9:0;6864:5;6868:1;6864;:5;:::i;18025:573::-;-1:-1:-1;;;;;18165:20:0;;18157:70;;;;-1:-1:-1;;;18157:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18246:23:0;;18238:71;;;;-1:-1:-1;;;18238:71:0;;;;;;;:::i;:::-;18402;18424:6;18402:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18402:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;18382:17:0;;;:9;:17;;;;;;;;;;;:91;;;;18507:20;;;;;;;:32;;18532:6;18507:24;:32::i;:::-;-1:-1:-1;;;;;18484:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;18555:35;17838:25:1;;;18484:20:0;;18555:35;;;;;;17811:18:1;18555:35:0;17793:76:1;5744:136:0;5802:7;5829:43;5833:1;5836;5829:43;;;;;;;;;;;;;;;;;:3;:43::i;81501:591::-;81651:16;;;81665:1;81651:16;;;;;;;;81627:21;;81651:16;;;;;;;;;;-1:-1:-1;81651:16:0;81627:40;;81696:4;81678;81683:1;81678:7;;;;;;-1:-1:-1;;;81678:7:0;;;;;;;;;-1:-1:-1;;;;;81678:23:0;;;:7;;;;;;;;;;:23;;;;81722:15;;:22;;;-1:-1:-1;;;81722:22:0;;;;:15;;;;;:20;;:22;;;;;81678:7;;81722:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81712:4;81717:1;81712:7;;;;;;-1:-1:-1;;;81712:7:0;;;;;;;;;-1:-1:-1;;;;;81712:32:0;;;:7;;;;;;;;;:32;81789:15;;81757:62;;81774:4;;81789:15;81807:11;81757:8;:62::i;:::-;81858:15;;:224;;-1:-1:-1;;;81858:224:0;;-1:-1:-1;;;;;81858:15:0;;;;:66;;:224;;81939:11;;81858:15;;82009:4;;82036;;82056:15;;81858:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82641:520;82821:15;;82789:62;;82806:4;;-1:-1:-1;;;;;82821:15:0;82839:11;82789:8;:62::i;:::-;82892:15;;83096:14;;82892:259;;-1:-1:-1;;;82892:259:0;;82964:4;82892:259;;;8305:34:1;8355:18;;;8348:34;;;82892:15:0;8398:18:1;;;8391:34;;;8441:18;;;8434:34;-1:-1:-1;;;;;83096:14:0;;;8484:19:1;;;8477:44;83125:15:0;8537:19:1;;;8530:35;82892:15:0;;;:31;;82931:9;;8239:19:1;;82892:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;82100:533::-;82191:16;;;82205:1;82191:16;;;;;;;;;82167:21;;82191:16;;;;;;;;;;-1:-1:-1;82191:16:0;82167:40;;82236:4;82218;82223:1;82218:7;;;;;;-1:-1:-1;;;82218:7:0;;;;;;;;;-1:-1:-1;;;;;82218:23:0;;;:7;;;;;;;;;;:23;;;;82262:15;;:22;;;-1:-1:-1;;;82262:22:0;;;;:15;;;;;:20;;:22;;;;;82218:7;;82262:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82252:4;82257:1;82252:7;;;;;;-1:-1:-1;;;82252:7:0;;;;;;;;;-1:-1:-1;;;;;82252:32:0;;;:7;;;;;;;;;:32;82305:11;;82295:7;;82305:11;;;82295:4;;82300:1;;82295:7;;;;-1:-1:-1;;;82295:7:0;;;;;;;;;-1:-1:-1;;;;;82295:21:0;;;:7;;;;;;;;;:21;82359:15;;82327:62;;82344:4;;82359:15;82377:11;82327:8;:62::i;:::-;82426:15;;:199;;-1:-1:-1;;;82426:199:0;;-1:-1:-1;;;;;82426:15:0;;;;:69;;:199;;82510:11;;82426:15;;82552:4;;82579;;82599:15;;82426:199;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;812:398::-;880:6;888;941:2;929:9;920:7;916:23;912:32;909:2;;;962:6;954;947:22;909:2;1006:9;993:23;1025:31;1050:5;1025:31;:::i;:::-;1075:5;-1:-1:-1;1132:2:1;1117:18;;1104:32;1145:33;1104:32;1145:33;:::i;:::-;1197:7;1187:17;;;899:311;;;;;:::o;1215:466::-;1292:6;1300;1308;1361:2;1349:9;1340:7;1336:23;1332:32;1329:2;;;1382:6;1374;1367:22;1329:2;1426:9;1413:23;1445:31;1470:5;1445:31;:::i;:::-;1495:5;-1:-1:-1;1552:2:1;1537:18;;1524:32;1565:33;1524:32;1565:33;:::i;:::-;1319:362;;1617:7;;-1:-1:-1;;;1671:2:1;1656:18;;;;1643:32;;1319:362::o;1686:392::-;1751:6;1759;1812:2;1800:9;1791:7;1787:23;1783:32;1780:2;;;1833:6;1825;1818:22;1780:2;1877:9;1864:23;1896:31;1921:5;1896:31;:::i;:::-;1946:5;-1:-1:-1;2003:2:1;1988:18;;1975:32;2016:30;1975:32;2016:30;:::i;2083:691::-;2214:6;2222;2230;2238;2246;2254;2262;2270;2323:3;2311:9;2302:7;2298:23;2294:33;2291:2;;;2345:6;2337;2330:22;2291:2;2382:9;2376:16;2401:31;2426:5;2401:31;:::i;:::-;2451:5;2441:15;;;2496:2;2485:9;2481:18;2475:25;2465:35;;2540:2;2529:9;2525:18;2519:25;2509:35;;2584:2;2573:9;2569:18;2563:25;2553:35;;2628:3;2617:9;2613:19;2607:26;2597:36;;2673:3;2662:9;2658:19;2652:26;2642:36;;2718:3;2707:9;2703:19;2697:26;2687:36;;2763:3;2752:9;2748:19;2742:26;2732:36;;2281:493;;;;;;;;;;;:::o;2779:325::-;2847:6;2855;2908:2;2896:9;2887:7;2883:23;2879:32;2876:2;;;2929:6;2921;2914:22;2876:2;2973:9;2960:23;2992:31;3017:5;2992:31;:::i;:::-;3042:5;3094:2;3079:18;;;;3066:32;;-1:-1:-1;;;2866:238:1:o;3109:800::-;3201:6;3209;3217;3270:2;3258:9;3249:7;3245:23;3241:32;3238:2;;;3291:6;3283;3276:22;3238:2;3336:9;3323:23;3365:18;3406:2;3398:6;3395:14;3392:2;;;3427:6;3419;3412:22;3392:2;3470:6;3459:9;3455:22;3445:32;;3515:7;3508:4;3504:2;3500:13;3496:27;3486:2;;3542:6;3534;3527:22;3486:2;3587;3574:16;3613:2;3605:6;3602:14;3599:2;;;3634:6;3626;3619:22;3599:2;3694:7;3687:4;3677:6;3674:1;3670:14;3666:2;3662:23;3658:34;3655:47;3652:2;;;3720:6;3712;3705:22;3652:2;3756:4;3748:13;;;;-1:-1:-1;3780:6:1;-1:-1:-1;;3821:20:1;;3808:34;3851:28;3808:34;3851:28;:::i;:::-;3898:5;3888:15;;;3228:681;;;;;:::o;3914:251::-;3970:6;4023:2;4011:9;4002:7;3998:23;3994:32;3991:2;;;4044:6;4036;4029:22;3991:2;4088:9;4075:23;4107:28;4129:5;4107:28;:::i;4170:255::-;4237:6;4290:2;4278:9;4269:7;4265:23;4261:32;4258:2;;;4311:6;4303;4296:22;4258:2;4348:9;4342:16;4367:28;4389:5;4367:28;:::i;4430:190::-;4489:6;4542:2;4530:9;4521:7;4517:23;4513:32;4510:2;;;4563:6;4555;4548:22;4510:2;-1:-1:-1;4591:23:1;;4500:120;-1:-1:-1;4500:120:1:o;4625:194::-;4695:6;4748:2;4736:9;4727:7;4723:23;4719:32;4716:2;;;4769:6;4761;4754:22;4716:2;-1:-1:-1;4797:16:1;;4706:113;-1:-1:-1;4706:113:1:o;4824:316::-;4912:6;4920;4928;4981:2;4969:9;4960:7;4956:23;4952:32;4949:2;;;5002:6;4994;4987:22;4949:2;5036:9;5030:16;5020:26;;5086:2;5075:9;5071:18;5065:25;5055:35;;5130:2;5119:9;5115:18;5109:25;5099:35;;4939:201;;;;;:::o;5145:395::-;5231:6;5239;5247;5255;5308:3;5296:9;5287:7;5283:23;5279:33;5276:2;;;5330:6;5322;5315:22;5276:2;-1:-1:-1;;5358:23:1;;;5428:2;5413:18;;5400:32;;-1:-1:-1;5479:2:1;5464:18;;5451:32;;5530:2;5515:18;5502:32;;-1:-1:-1;5266:274:1;-1:-1:-1;5266:274:1:o;8576:797::-;8798:2;8810:21;;;8783:18;;8866:22;;;8750:4;8945:6;8919:2;8904:18;;8750:4;8982:304;8996:6;8993:1;8990:13;8982:304;;;9071:6;9058:20;9091:31;9116:5;9091:31;:::i;:::-;-1:-1:-1;;;;;9147:31:1;9135:44;;9202:4;9261:15;;;;9226:12;;;;9175:1;9011:9;8982:304;;;8986:3;9303;9295:11;;;;9358:6;9351:14;9344:22;9337:4;9326:9;9322:20;9315:52;8759:614;;;;;;:::o;10046:603::-;10158:4;10187:2;10216;10205:9;10198:21;10248:6;10242:13;10291:6;10286:2;10275:9;10271:18;10264:34;10316:4;10329:140;10343:6;10340:1;10337:13;10329:140;;;10438:14;;;10434:23;;10428:30;10404:17;;;10423:2;10400:26;10393:66;10358:10;;10329:140;;;10487:6;10484:1;10481:13;10478:2;;;10557:4;10552:2;10543:6;10532:9;10528:22;10524:31;10517:45;10478:2;-1:-1:-1;10633:2:1;10612:15;-1:-1:-1;;10608:29:1;10593:45;;;;10640:2;10589:54;;10167:482;-1:-1:-1;;;10167:482:1:o;11132:399::-;11334:2;11316:21;;;11373:2;11353:18;;;11346:30;11412:34;11407:2;11392:18;;11385:62;-1:-1:-1;;;11478:2:1;11463:18;;11456:33;11521:3;11506:19;;11306:225::o;15819:356::-;16021:2;16003:21;;;16040:18;;;16033:30;16099:34;16094:2;16079:18;;16072:62;16166:2;16151:18;;15993:182::o;16180:401::-;16382:2;16364:21;;;16421:2;16401:18;;;16394:30;16460:34;16455:2;16440:18;;16433:62;-1:-1:-1;;;16526:2:1;16511:18;;16504:35;16571:3;16556:19;;16354:227::o;17874:983::-;18136:4;18184:3;18173:9;18169:19;18215:6;18204:9;18197:25;18241:2;18279:6;18274:2;18263:9;18259:18;18252:34;18322:3;18317:2;18306:9;18302:18;18295:31;18346:6;18381;18375:13;18412:6;18404;18397:22;18450:3;18439:9;18435:19;18428:26;;18489:2;18481:6;18477:15;18463:29;;18510:4;18523:195;18537:6;18534:1;18531:13;18523:195;;;18602:13;;-1:-1:-1;;;;;18598:39:1;18586:52;;18693:15;;;;18658:12;;;;18634:1;18552:9;18523:195;;;-1:-1:-1;;;;;;;18774:32:1;;;;18769:2;18754:18;;18747:60;-1:-1:-1;;;18838:3:1;18823:19;18816:35;18735:3;18145:712;-1:-1:-1;;;18145:712:1:o;20024:128::-;20064:3;20095:1;20091:6;20088:1;20085:13;20082:2;;;20101:18;;:::i;:::-;-1:-1:-1;20137:9:1;;20072:80::o;20157:217::-;20197:1;20223;20213:2;;-1:-1:-1;;;20248:31:1;;20302:4;20299:1;20292:15;20330:4;20255:1;20320:15;20213:2;-1:-1:-1;20359:9:1;;20203:171::o;20379:168::-;20419:7;20485:1;20481;20477:6;20473:14;20470:1;20467:21;20462:1;20455:9;20448:17;20444:45;20441:2;;;20492:18;;:::i;:::-;-1:-1:-1;20532:9:1;;20431:116::o;20552:125::-;20592:4;20620:1;20617;20614:8;20611:2;;;20625:18;;:::i;:::-;-1:-1:-1;20662:9:1;;20601:76::o;20682:380::-;20761:1;20757:12;;;;20804;;;20825:2;;20879:4;20871:6;20867:17;20857:27;;20825:2;20932;20924:6;20921:14;20901:18;20898:38;20895:2;;;20978:10;20973:3;20969:20;20966:1;20959:31;21013:4;21010:1;21003:15;21041:4;21038:1;21031:15;20895:2;;20737:325;;;:::o;21067:135::-;21106:3;-1:-1:-1;;21127:17:1;;21124:2;;;21147:18;;:::i;:::-;-1:-1:-1;21194:1:1;21183:13;;21114:88::o;21207:127::-;21268:10;21263:3;21259:20;21256:1;21249:31;21299:4;21296:1;21289:15;21323:4;21320:1;21313:15;21339:131;-1:-1:-1;;;;;21414:31:1;;21404:42;;21394:2;;21460:1;21457;21450:12;21475:118;21561:5;21554:13;21547:21;21540:5;21537:32;21527:2;;21583:1;21580;21573:12

Swarm Source

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