ETH Price: $2,406.65 (+2.88%)

Token

BabyJesus (BABYJESUS)
 

Overview

Max Total Supply

1,000,000,000 BABYJESUS

Holders

51

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
12,754,502.542690775109278847 BABYJESUS

Value
$0.00
0xAC734ccfa77729DF306a41C298335bfeCe4CB74a
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabyJesus

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-28
*/

/*

BabyJesus - Dividend Paying Token in ETH

Tokenless Dividend Tracker to reduce gas fees significantly
    
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

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

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

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

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

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

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

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

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



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

    function set(Map storage map, address key, uint 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];

        uint index = map.indexOf[key];
        uint 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();
    }
}

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

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

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

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

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

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

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

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

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

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {
    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 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 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 Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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



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


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

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  // 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 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
  
  IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
  
  // 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;
  
  mapping (address => uint256) public holderBalance;
  uint256 public totalBalance;
    
  uint256 public totalDividendsDistributed;


  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
    
  function distributeDividends() public override payable {
    require(totalBalance > 0);

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

      totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }

  /// @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,) = user.call{value: _withdrawableDividend, gas: 3000}("");

      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(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that increases 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 _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that reduces 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 _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmount = newBalance.sub(currentBalance);
      _increase(account, increaseAmount);
      totalBalance += increaseAmount;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmount = currentBalance.sub(newBalance);
      _reduce(account, reduceAmount);
      totalBalance -= reduceAmount;
    }
  }
}


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

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;

    DividendTracker public dividendTracker;

    address public operationsWallet;

    address public presaleAddress;
    address public presaleRouterAddress;
    
    uint256 public maxSell;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
    uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet
    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    mapping(address => bool) public boughtEarly; // mapping to track addresses that buy within the first 2 blocks pay a 3x tax for 24 hours to sell
    uint256 public earlyBuyPenaltyEnd; // determines when snipers/bots can sell without extra penalty
    
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    
    uint256 public totalFees;
    uint256 public rewardsFee;
    uint256 public operationsFee;
    uint256 public buybackFee;
    uint256 public liquidityFee;
    

    // use by default 200,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 200000;

    /******************/

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

    mapping (address => bool) public _isExcludedMaxSellTransactionAmount;

    // 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 ExcludedMaxSellTransactionAmount(address indexed account, bool isExcluded);

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

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

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

    event BuybackMultiplierActive(uint256 duration);

    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() ERC20("BabyJesus", "BABYJESUS") {
        uint256 _rewardsFee = 8;
        uint256 _operationsFee = 1;
        uint256 _buyBackFee = 3;
        uint256 _liquidityFee = 2;
        
        uint256 totalSupply = 1000000000 * 1e18; // 1 Billion total supply
        
        maxSell = totalSupply * 5 / 1000; // 0.5% maxSellTxn
        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap tokens amount
        maxWallet = totalSupply * 15 / 1000; // 1.5% maxWallet
        maxSell = maxWallet; // no max sell for this project so set it to max wallet

        rewardsFee = _rewardsFee;
        operationsFee = _operationsFee;
        buybackFee = _buyBackFee;
        liquidityFee = _liquidityFee;
        totalFees = rewardsFee + buybackFee + operationsFee + liquidityFee;
        
    	dividendTracker = new DividendTracker();
    	
    	operationsWallet = address(msg.sender);
    	
    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    	
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = address(0);

        _setAutomatedMarketMakerPair(address(0), true);

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

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(dividendTracker), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        excludeFromMaxTransaction(address(0xdead), true);
        excludeFromMaxTransaction(address(_uniswapV2Pair), true);

        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        
        _mint(owner(), totalSupply); // 1 Billion total supply
    }

    receive() external payable {

  	}

    // only use if conducting a presale.
    function addPresaleAddressForExclusions(address _presaleAddress, address _presaleRouterAddress) external onlyOwner {
        presaleAddress = _presaleAddress;
        excludeFromFees(presaleAddress, true);
        dividendTracker.excludeFromDividends(presaleAddress);
        excludeFromMaxTransaction(presaleAddress, true);
        presaleRouterAddress = _presaleRouterAddress;
        excludeFromFees(presaleRouterAddress, true);
        dividendTracker.excludeFromDividends(presaleRouterAddress);
        excludeFromMaxTransaction(presaleRouterAddress, true);
    }

    // never ever do this without professional assistance.
    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker), "The dividend tracker already has that address");

        DividendTracker newDividendTracker = DividendTracker(payable(newAddress));

        require(newDividendTracker.owner() == address(this), "The new dividend tracker must be owned by the token contract");

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }
    
    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }
    
    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        tradingActiveBlock = block.number;
        earlyBuyPenaltyEnd = block.timestamp + 24 hours;
    }

    function updateMaxAmount(uint256 newNum) public onlyOwner {
        require(maxSell!= newNum);
        maxSell = newNum * (10**18);
    }
    
    function updateFees(uint256 _operationsFee, uint256 _buybackFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
        operationsFee = _operationsFee;
        buybackFee = _buybackFee;
        rewardsFee = _rewardsFee;
        liquidityFee = _liquidityFee;
        totalFees = operationsFee + buybackFee + rewardsFee + liquidityFee;
        require(totalFees >= 1 && totalFees <= 20, "Must keep fees between 1-20");
    }

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

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxSellTransactionAmount[updAds] = isEx;
        emit ExcludedMaxSellTransactionAmount(updAds, isEx);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _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 setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function updateOperationsWallet(address newOperationsWallet) public onlyOwner {
        excludeFromFees(newOperationsWallet, true);
        emit OperationsWalletUpdated(newOperationsWallet, operationsWallet);
        operationsWallet = newOperationsWallet;
    }

    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.holderBalance(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 emergencyRemoveEarlyBuyPenalty() external onlyOwner {
        // this is here in case the early buy penalty causes issues with the contract
        earlyBuyPenaltyEnd = 0;
    }
    
    // cannot blacklist, can only remove
    function removeFromEarlyBuyList(address wallet) external onlyOwner {
        boughtEarly[wallet] = false;
    }

	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 getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
    
    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(!tradingActive && block.number == liquidityActiveBlock && from != owner() && from != presaleAddress && from != presaleRouterAddress){
            super._transfer(from, to, 1); // give bots 1 wei of tokens if they snipe in the same block that liquidity is added.
            super._transfer(from, address(0xdead), amount-1); // Burn the remaining tokens
            return;
        }
        
        if(!tradingActive){
            require(from == owner() || from == presaleAddress || from == presaleRouterAddress, "Trading is not active.");
            if(liquidityActiveBlock == 0 && to == uniswapV2Pair){
                liquidityActiveBlock = block.number;
            }
        }
        
        if(from != owner() && from != presaleAddress && !automatedMarketMakerPairs[to] && from != presaleRouterAddress && block.number == tradingActiveBlock && !_isExcludedMaxSellTransactionAmount[to]){
                boughtEarly[to] = true;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                from != presaleAddress &&
                to != presaleAddress &&
                from != presaleRouterAddress &&
                to != presaleRouterAddress &&
                !swapping
            ){
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxSellTransactionAmount[to]) {
                        require(amount + balanceOf(to) <= maxWallet, "Can't exceed maxWallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxSellTransactionAmount[from]) {
                        require(amount <= maxSell, "Sell transfer amount exceeds the MaxSell.");
                }
                //normal transfer
                else if (!_isExcludedMaxSellTransactionAmount[to]){
                        require(amount + balanceOf(to) <= maxWallet, "Can't exceed maxWallet");
                }
            }
        }
        
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
    
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            if(liquidityFee > 0){
                uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees);
                swapAndLiquify(swapTokens);
            }

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);

            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 = amount.mul(totalFees).div(100);
            
            // snipers / bots pay 5x fees to exit for 24 hours
        	if(boughtEarly[from] && earlyBuyPenaltyEnd > block.timestamp){
        	    super._transfer(from, address(0xdead), fees * 4); // burn 4/5 of the tokens to prevent price dump.
        	    super._transfer(from, address(this), fees); // take standard fees
        	    fees = fees * 5;
        	} else {
                super._transfer(from, address(this), fees);
        	}
        	amount = amount.sub(fees);
        }

        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 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 swapAndLiquify(uint256 tokens) private {
       // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        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);

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

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

    }
    
    function swapAndSendDividends(uint256 tokens) private {
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(tokens);
        
        bool success;
        

        if(rewardsFee > 0){
            uint256 dividends = (address(this).balance.sub(initialBalance)).mul(rewardsFee).div(totalFees - liquidityFee);
            (success,) = address(dividendTracker).call{value: dividends}("");

            if (success) {
                emit SendDividends(tokens, dividends);
            }
        }
        
        if(operationsFee > 0){
            // dev fee takes 1/20 of operations Amt
            uint256 devAmt = (address(this).balance.sub(initialBalance)).mul(operationsFee).div(totalFees - rewardsFee - liquidityFee) / 20;
            (success,) = address(0xb017c481575318017DC2122b59759B25d21f6721).call{value: devAmt}("");
            
            uint256 operationsAmt = (address(this).balance.sub(initialBalance)).mul(operationsFee).div(totalFees - rewardsFee - liquidityFee);
            (success,) = address(operationsWallet).call{value: operationsAmt}("");
        }
        // leave remaining ETH on contract for buyBacks
    }
    
    function buyBackAndBurnTokens(uint256 ethAmount) external onlyOwner {
        require(ethAmount <= address(this).balance, "There is not enough ETH for this buyback");
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        
        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
  }
}

contract DividendTracker is 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 immutable minimumTokenBalanceForDividends;

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

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

    constructor() DividendPayingToken() {
    	claimWait = 1200;
        minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10,000+ tokens
    }

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

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

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

    	emit ExcludeFromDividends(account);
    }
    
    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;

    	emit IncludeInDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1200 && 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 getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

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

    // Check to see if I really made this contract or if it is a clone!
    // @Sir_Tris on TG, @SirTrisCrypto on Twitter

    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 (0x0000000000000000000000000000000000000000, -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 Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"BuybackMultiplierActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxSellTransactionAmount","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":"OperationsWalletUpdated","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":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxSellTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleAddress","type":"address"},{"internalType":"address","name":"_presaleRouterAddress","type":"address"}],"name":"addPresaleAddressForExclusions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"buyBackAndBurnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyRemoveEarlyBuyPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"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":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","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":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleRouterAddress","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":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeFromEarlyBuyList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","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"}]

60a06040526000600e819055600f556012805461ffff1916600117905562030d406018553480156200003057600080fd5b5060405180604001604052806009815260200168426162794a6573757360b81b81525060405180604001604052806009815260200168424142594a4553555360b81b81525081600390805190602001906200008d92919062000a4a565b508051620000a390600490602084019062000a4a565b5050506000620000b8620006a960201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060086001600360026b033b2e3c9fd0803ce80000006103e86200012b82600562000b67565b62000137919062000b44565b600b556127106200014a82600562000b67565b62000156919062000b44565b600c556103e86200016982600f62000b67565b62000175919062000b44565b600d819055600b55601485905560158490556016839055601782905581846200019f858862000b29565b620001ab919062000b29565b620001b7919062000b29565b601355604051620001c89062000ad9565b604051809103906000f080158015620001e5573d6000803e3d6000fd5b50600780546001600160a01b03929092166001600160a01b031992831617905560088054909116331790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a0155916004808301926020929190829003018186803b1580156200026157600080fd5b505afa15801562000276573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029c919062000afe565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002e557600080fd5b505afa158015620002fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000320919062000afe565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200036957600080fd5b505af11580156200037e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a4919062000afe565b600680546001600160a01b0319166001600160a01b03851617905560006080819052909150620003d6906001620006ad565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200041d57600080fd5b505af115801562000432573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200047c57600080fd5b505af115801562000491573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620004bb6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620004fd57600080fd5b505af115801562000512573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200055e57600080fd5b505af115801562000573573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005bf57600080fd5b505af1158015620005d4573d6000803e3d6000fd5b50505050620005f4620005ec6200078260201b60201c565b600162000791565b6200060130600162000791565b6200061061dead600162000791565b6200062f620006276005546001600160a01b031690565b600162000840565b6200063c30600162000840565b60075462000655906001600160a01b0316600162000840565b6200066282600162000840565b6200067161dead600162000840565b6200067e81600162000840565b6200069c620006956005546001600160a01b031690565b84620008e4565b5050505050505062000bdc565b3390565b6001600160a01b0382166000908152601b60205260409020805460ff1916821515179055620006dd828262000840565b8015620007465760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200072c57600080fd5b505af115801562000741573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620007e05760405162461bcd60e51b81526020600482018190526024820152600080516020620063d883398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b031633146200088b5760405162461bcd60e51b81526020600482018190526024820152600080516020620063d88339815191526044820152606401620007d7565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fa745b79c9942f47d553e54242165de0cc7bed53246fad779598eff0f8b756e6f910162000834565b6001600160a01b0382166200093c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620007d7565b6200095881600254620009e060201b620024351790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200098b91839062002435620009e0821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600080620009ef838562000b29565b90508381101562000a435760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620007d7565b9392505050565b82805462000a589062000b89565b90600052602060002090601f01602090048101928262000a7c576000855562000ac7565b82601f1062000a9757805160ff191683800117855562000ac7565b8280016001018555821562000ac7579182015b8281111562000ac757825182559160200191906001019062000aaa565b5062000ad592915062000ae7565b5090565b611a77806200496183390190565b5b8082111562000ad5576000815560010162000ae8565b60006020828403121562000b1157600080fd5b81516001600160a01b038116811462000a4357600080fd5b6000821982111562000b3f5762000b3f62000bc6565b500190565b60008262000b6257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000b845762000b8462000bc6565b500290565b600181811c9082168062000b9e57607f821691505b6020821081141562000bc057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160601c613d5862000c09600039600081816106ce01528181611c0701526127420152613d586000f3fe6080604052600436106103f35760003560e01c80637571336a11610208578063b62496f511610118578063e2f45605116100ab578063f27fd2541161007a578063f27fd25414610bf6578063f2fde38b14610c16578063f4eea5b314610c36578063f8b45b0514610c4b578063fd72e22a14610c6157600080fd5b8063e2f4560514610b95578063e7841ec014610bab578063e98030c714610bc0578063ee40166e14610be057600080fd5b8063c0f306ef116100e7578063c0f306ef14610aef578063c492f04614610b0f578063c6616ba114610b2f578063dd62ed3e14610b4f57600080fd5b8063b62496f514610a6a578063b8eb354614610a9a578063bbc0c74214610ab0578063c024666814610acf57600080fd5b806398118cb41161019b578063a457c2d71161016a578063a457c2d714610985578063a8b9d240146109a5578063a9059cbb146109c5578063ad56c13c146109e5578063b1a8361014610a4a57600080fd5b806398118cb4146109245780639a7a23d61461093a5780639c1b8af51461095a578063a26579ad1461097057600080fd5b806388bdd9be116101d757806388bdd9be146108bc5780638a8c523c146108dc5780638da5cb5b146108f157806395d89b411461090f57600080fd5b80637571336a1461082c578063826f3a651461084c57806385ecfd281461086c578063871c128d1461089c57600080fd5b8063313ce567116103035780634fbee19311610296578063700bb19111610265578063700bb191146107ad57806370a08231146107cd578063715018a6146107ed57806371778e7d14610802578063751039fc1461081757600080fd5b80634fbee1931461071f57806364b0f6531461075857806365b8dbc01461076d5780636843cd841461078d57600080fd5b806348479175116102d2578063484791751461069c57806349bd5a5e146106bc5780634a62bb65146106f05780634e71d92d1461070a57600080fd5b8063313ce5671461062a57806331e79db01461064657806339509351146106665780633b2d081c1461068657600080fd5b80631694505e1161038657806323b872dd1161035557806323b872dd1461059f5780632bb14e1d146105bf5780632c1f5216146105d557806330bb4cff146105f557806330d5d18d1461060a57600080fd5b80631694505e1461053457806318160ddd146105545780631943323e146105695780631fc851bd1461058957600080fd5b80630f4432e3116103c25780630f4432e3146104ae578063106b5da1146104c4578063122fe685146104e657806313114a9d1461051e57600080fd5b806306fdde03146103ff5780630855f25d1461042a578063090896be1461046a578063095ea7b31461048e57600080fd5b366103fa57005b600080fd5b34801561040b57600080fd5b50610414610c81565b6040516104219190613a4c565b60405180910390f35b34801561043657600080fd5b5061045a6104453660046136cd565b601a6020526000908152604090205460ff1681565b6040519015158152602001610421565b34801561047657600080fd5b5061048060155481565b604051908152602001610421565b34801561049a57600080fd5b5061045a6104a9366004613819565b610d13565b3480156104ba57600080fd5b50610480600e5481565b3480156104d057600080fd5b506104e46104df3660046138e8565b610d2a565b005b3480156104f257600080fd5b50600954610506906001600160a01b031681565b6040516001600160a01b039091168152602001610421565b34801561052a57600080fd5b5061048060135481565b34801561054057600080fd5b50600654610506906001600160a01b031681565b34801561056057600080fd5b50600254610480565b34801561057557600080fd5b506104e46105843660046138e8565b610d84565b34801561059557600080fd5b5061048060115481565b3480156105ab57600080fd5b5061045a6105ba366004613740565b610f71565b3480156105cb57600080fd5b5061048060145481565b3480156105e157600080fd5b50600754610506906001600160a01b031681565b34801561060157600080fd5b50610480610fda565b34801561061657600080fd5b506104e46106253660046136cd565b61105c565b34801561063657600080fd5b5060405160128152602001610421565b34801561065257600080fd5b506104e46106613660046136cd565b6110ee565b34801561067257600080fd5b5061045a610681366004613819565b61117b565b34801561069257600080fd5b5061048060165481565b3480156106a857600080fd5b50600a54610506906001600160a01b031681565b3480156106c857600080fd5b506105067f000000000000000000000000000000000000000000000000000000000000000081565b3480156106fc57600080fd5b5060125461045a9060ff1681565b34801561071657600080fd5b506104e46111b1565b34801561072b57600080fd5b5061045a61073a3660046136cd565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561076457600080fd5b50610480611238565b34801561077957600080fd5b506104e46107883660046136cd565b61127d565b34801561079957600080fd5b506104806107a83660046136cd565b61136e565b3480156107b957600080fd5b506104e46107c83660046138e8565b6113ed565b3480156107d957600080fd5b506104806107e83660046136cd565b6114ce565b3480156107f957600080fd5b506104e46114e9565b34801561080e57600080fd5b5061048061155d565b34801561082357600080fd5b5061045a6115a2565b34801561083857600080fd5b506104e4610847366004613781565b6115df565b34801561085857600080fd5b506104e46108673660046136cd565b611669565b34801561087857600080fd5b5061045a6108873660046136cd565b60106020526000908152604090205460ff1681565b3480156108a857600080fd5b506104e46108b73660046138e8565b6116b4565b3480156108c857600080fd5b506104e46108d73660046136cd565b6117f8565b3480156108e857600080fd5b506104e4611b7d565b3480156108fd57600080fd5b506005546001600160a01b0316610506565b34801561091b57600080fd5b50610414611bcc565b34801561093057600080fd5b5061048060175481565b34801561094657600080fd5b506104e4610955366004613781565b611bdb565b34801561096657600080fd5b5061048060185481565b34801561097c57600080fd5b50610480611cc9565b34801561099157600080fd5b5061045a6109a0366004613819565b611d0e565b3480156109b157600080fd5b506104806109c03660046136cd565b611d5d565b3480156109d157600080fd5b5061045a6109e0366004613819565b611d90565b3480156109f157600080fd5b50610a05610a003660046136cd565b611d9d565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610421565b348015610a5657600080fd5b506104e4610a65366004613707565b611e47565b348015610a7657600080fd5b5061045a610a853660046136cd565b601b6020526000908152604090205460ff1681565b348015610aa657600080fd5b50610480600b5481565b348015610abc57600080fd5b5060125461045a90610100900460ff1681565b348015610adb57600080fd5b506104e4610aea366004613781565b611fb5565b348015610afb57600080fd5b506104e4610b0a3660046136cd565b612037565b348015610b1b57600080fd5b506104e4610b2a366004613845565b612093565b348015610b3b57600080fd5b506104e4610b4a366004613948565b61216f565b348015610b5b57600080fd5b50610480610b6a366004613707565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ba157600080fd5b50610480600c5481565b348015610bb757600080fd5b50610480612237565b348015610bcc57600080fd5b506104e4610bdb3660046138e8565b61227c565b348015610bec57600080fd5b50610480600f5481565b348015610c0257600080fd5b50610a05610c113660046138e8565b6122d7565b348015610c2257600080fd5b506104e4610c313660046136cd565b612319565b348015610c4257600080fd5b506104e4612404565b348015610c5757600080fd5b50610480600d5481565b348015610c6d57600080fd5b50600854610506906001600160a01b031681565b606060038054610c9090613c0a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbc90613c0a565b8015610d095780601f10610cde57610100808354040283529160200191610d09565b820191906000526020600020905b815481529060010190602001808311610cec57829003601f168201915b5050505050905090565b6000610d2033848461249b565b5060015b92915050565b6005546001600160a01b03163314610d5d5760405162461bcd60e51b8152600401610d5490613ae4565b60405180910390fd5b80600b541415610d6c57600080fd5b610d7e81670de0b6b3a7640000613bd4565b600b5550565b6005546001600160a01b03163314610dae5760405162461bcd60e51b8152600401610d5490613ae4565b47811115610e0f5760405162461bcd60e51b815260206004820152602860248201527f5468657265206973206e6f7420656e6f7567682045544820666f722074686973604482015267206275796261636b60c01b6064820152608401610d54565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eac91906136ea565b81600081518110610ebf57610ebf613c76565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610ef357610ef3613c76565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de95908490610f3b90600090869061dead904290600401613a17565b6000604051808303818588803b158015610f5457600080fd5b505af1158015610f68573d6000803e3d6000fd5b50505050505050565b6000610f7e8484846125c0565b610fd08433610fcb85604051806060016040528060288152602001613cd6602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612eee565b61249b565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561101f57600080fd5b505afa158015611033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110579190613901565b905090565b6005546001600160a01b031633146110865760405162461bcd60e51b8152600401610d5490613ae4565b611091816001611fb5565b6008546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111185760405162461bcd60e51b8152600401610d5490613ae4565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561116057600080fd5b505af1158015611174573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d20918590610fcb9086612435565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156111fd57600080fd5b505af1158015611211573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123591906138cb565b50565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561101f57600080fd5b6005546001600160a01b031633146112a75760405162461bcd60e51b8152600401610d5490613ae4565b6006546001600160a01b03828116911614156113115760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610d54565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b1580156113b557600080fd5b505afa1580156113c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d249190613901565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561143b57600080fd5b505af115801561144f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611473919061391a565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146115135760405162461bcd60e51b8152600401610d5490613ae4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b15801561101f57600080fd5b6005546000906001600160a01b031633146115cf5760405162461bcd60e51b8152600401610d5490613ae4565b506012805460ff19169055600190565b6005546001600160a01b031633146116095760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fa745b79c9942f47d553e54242165de0cc7bed53246fad779598eff0f8b756e6f91015b60405180910390a25050565b6005546001600160a01b031633146116935760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6005546001600160a01b031633146116de5760405162461bcd60e51b8152600401610d5490613ae4565b62030d4081101580156116f457506207a1208111155b61175e5760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610d54565b6018548114156117c55760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d54565b60185460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601855565b6005546001600160a01b031633146118225760405162461bcd60e51b8152600401610d5490613ae4565b6007546001600160a01b03828116911614156118965760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610d54565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118de57600080fd5b505afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191691906136ea565b6001600160a01b0316146119925760405162461bcd60e51b815260206004820152603c60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e65642062792074686520746f6b656e20636f6e7472616374000000006064820152608401610d54565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b1580156119d457600080fd5b505af11580156119e8573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611a2d57600080fd5b505af1158015611a41573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611a666005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611aa757600080fd5b505af1158015611abb573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b0657600080fd5b505af1158015611b1a573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611ba75760405162461bcd60e51b8152600401610d5490613ae4565b6012805461ff00191661010017905543600f55611bc74262015180613b9a565b601155565b606060048054610c9090613c0a565b6005546001600160a01b03163314611c055760405162461bcd60e51b8152600401610d5490613ae4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611cbb5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610d54565b611cc58282612f28565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561101f57600080fd5b6000610d203384610fcb85604051806060016040528060258152602001613cfe602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612eee565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161139d565b6000610d203384846125c0565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611df457600080fd5b505afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c91906137af565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611e715760405162461bcd60e51b8152600401610d5490613ae4565b600980546001600160a01b0319166001600160a01b038416908117909155611e9a906001611fb5565b60075460095460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b158015611ee357600080fd5b505af1158015611ef7573d6000803e3d6000fd5b5050600954611f1392506001600160a01b0316905060016115df565b600a80546001600160a01b0319166001600160a01b038316908117909155611f3c906001611fb5565b600754600a5460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b5050600a54611cc592506001600160a01b0316905060016115df565b6005546001600160a01b03163314611fdf5760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910161165d565b6005546001600160a01b031633146120615760405162461bcd60e51b8152600401610d5490613ae4565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611146565b6005546001600160a01b031633146120bd5760405162461bcd60e51b8152600401610d5490613ae4565b60005b8281101561212e5781601960008686858181106120df576120df613c76565b90506020020160208101906120f491906136cd565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061212681613c45565b9150506120c0565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612162939291906139be565b60405180910390a1505050565b6005546001600160a01b031633146121995760405162461bcd60e51b8152600401610d5490613ae4565b601584905560168390556014829055601781905580826121b98587613b9a565b6121c39190613b9a565b6121cd9190613b9a565b60138190556001118015906121e55750601460135411155b6122315760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b6565702066656573206265747765656e20312d323000000000006044820152606401610d54565b50505050565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561101f57600080fd5b6005546001600160a01b031633146122a65760405162461bcd60e51b8152600401610d5490613ae4565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611146565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611ddb565b6005546001600160a01b031633146123435760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b0381166123a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d54565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461242e5760405162461bcd60e51b8152600401610d5490613ae4565b6000601155565b6000806124428385613b9a565b9050838110156124945760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d54565b9392505050565b6001600160a01b0383166124fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d54565b6001600160a01b03821661255e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d54565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166125e65760405162461bcd60e51b8152600401610d5490613b19565b6001600160a01b03821661260c5760405162461bcd60e51b8152600401610d5490613aa1565b601254610100900460ff161580156126255750600e5443145b801561263f57506005546001600160a01b03848116911614155b801561265957506009546001600160a01b03848116911614155b80156126735750600a546001600160a01b03848116911614155b156126a05761268483836001612ff8565b61269b8361dead612696600185613bf3565b612ff8565b505050565b601254610100900460ff16612780576005546001600160a01b03848116911614806126d857506009546001600160a01b038481169116145b806126f05750600a546001600160a01b038481169116145b6127355760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d54565b600e5415801561277657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156127805743600e555b6005546001600160a01b038481169116148015906127ac57506009546001600160a01b03848116911614155b80156127d157506001600160a01b0382166000908152601b602052604090205460ff16155b80156127eb5750600a546001600160a01b03848116911614155b80156127f85750600f5443145b801561281d57506001600160a01b0382166000908152601a602052604090205460ff16155b15612846576001600160a01b0382166000908152601060205260409020805460ff191660011790555b60125460ff1615612afa576005546001600160a01b0384811691161480159061287d57506005546001600160a01b03838116911614155b801561289157506001600160a01b03821615155b80156128a857506001600160a01b03821661dead14155b80156128c257506009546001600160a01b03848116911614155b80156128dc57506009546001600160a01b03838116911614155b80156128f65750600a546001600160a01b03848116911614155b80156129105750600a546001600160a01b03838116911614155b80156129265750600654600160a01b900460ff16155b15612afa576001600160a01b0383166000908152601b602052604090205460ff16801561296c57506001600160a01b0382166000908152601a602052604090205460ff16155b156129d357600d5461297d836114ce565b6129879083613b9a565b11156129ce5760405162461bcd60e51b815260206004820152601660248201527510d85b89dd08195e18d95959081b585e15d85b1b195d60521b6044820152606401610d54565b612afa565b6001600160a01b0382166000908152601b602052604090205460ff168015612a1457506001600160a01b0383166000908152601a602052604090205460ff16155b15612a7d57600b548111156129ce5760405162461bcd60e51b815260206004820152602960248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152681026b0bc29b2b6361760b91b6064820152608401610d54565b6001600160a01b0382166000908152601a602052604090205460ff16612afa57600d54612aa9836114ce565b612ab39083613b9a565b1115612afa5760405162461bcd60e51b815260206004820152601660248201527510d85b89dd08195e18d95959081b585e15d85b1b195d60521b6044820152606401610d54565b80612b0b5761269b83836000612ff8565b6000612b16306114ce565b600c5490915081108015908190612b375750600654600160a01b900460ff16155b8015612b5c57506001600160a01b0385166000908152601b602052604090205460ff16155b8015612b8157506001600160a01b03851660009081526019602052604090205460ff16155b8015612ba657506001600160a01b03841660009081526019602052604090205460ff16155b15612c1b576006805460ff60a01b1916600160a01b17905560175415612bf6576000612be9601354612be36017548661310190919063ffffffff16565b90613180565b9050612bf4816131c2565b505b6000612c01306114ce565b9050612c0c81613249565b506006805460ff60a01b191690555b6006546001600160a01b03861660009081526019602052604090205460ff600160a01b909204821615911680612c6957506001600160a01b03851660009081526019602052604090205460ff165b15612c72575060005b8015612d0d576000612c946064612be36013548861310190919063ffffffff16565b6001600160a01b03881660009081526010602052604090205490915060ff168015612cc0575042601154115b15612cf457612cd78761dead612696846004613bd4565b612ce2873083612ff8565b612ced816005613bd4565b9050612cff565b612cff873083612ff8565b612d098582613442565b9450505b612d18868686612ff8565b6007546001600160a01b031663e30443bc87612d33816114ce565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612d7957600080fd5b505af1925050508015612d8a575060015b506007546001600160a01b031663e30443bc86612da6816114ce565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612dec57600080fd5b505af1925050508015612dfd575060015b50600654600160a01b900460ff16612ee6576018546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015612e5b57600080fd5b505af1925050508015612e8b575060408051601f3d908101601f19168201909252612e889181019061391a565b60015b612e9457610f68565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b505050505050565b60008184841115612f125760405162461bcd60e51b8152600401610d549190613a4c565b506000612f1f8486613bf3565b95945050505050565b6001600160a01b0382166000908152601b60205260409020805460ff1916821515179055612f5682826115df565b8015612fbc5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612fa357600080fd5b505af1158015612fb7573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831661301e5760405162461bcd60e51b8152600401610d5490613b19565b6001600160a01b0382166130445760405162461bcd60e51b8152600401610d5490613aa1565b61308181604051806060016040528060268152602001613cb0602691396001600160a01b0386166000908152602081905260409020549190612eee565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546130b09082612435565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016125b3565b60008261311057506000610d24565b600061311c8385613bd4565b9050826131298583613bb2565b146124945760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d54565b600061249483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613484565b60006131cf826002613180565b905060006131dd8383613442565b9050476131e9836134b2565b60006131f54783613442565b90506132018382613613565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b47613253826134b2565b6014546000901561332457600061328a6017546013546132739190613bf3565b601454612be3906132844788613442565b90613101565b6007546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146132d8576040519150601f19603f3d011682016040523d82523d6000602084013e6132dd565b606091505b509092505081156133225760408051858152602081018390527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b6015541561269b57600060146133616017546014546013546133469190613bf3565b6133509190613bf3565b601554612be3906132844789613442565b61336b9190613bb2565b60405190915073b017c481575318017dc2122b59759b25d21f6721908290600081818185875af1925050503d80600081146133c2576040519150601f19603f3d011682016040523d82523d6000602084013e6133c7565b606091505b50508092505060006133e56017546014546013546133469190613bf3565b6008546040519192506001600160a01b0316908290600081818185875af1925050503d8060008114613433576040519150601f19603f3d011682016040523d82523d6000602084013e613438565b606091505b5050505050505050565b600061249483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612eee565b600081836134a55760405162461bcd60e51b8152600401610d549190613a4c565b506000612f1f8486613bb2565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106134e7576134e7613c76565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561353b57600080fd5b505afa15801561354f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357391906136ea565b8160018151811061358657613586613c76565b6001600160a01b0392831660209182029290920101526006546135ac913091168461249b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906135e5908590600090869030904290600401613b5e565b600060405180830381600087803b1580156135ff57600080fd5b505af1158015612ee6573d6000803e3d6000fd5b60065461362b9030906001600160a01b03168461249b565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561369457600080fd5b505af11580156136a8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611174919061391a565b6000602082840312156136df57600080fd5b813561249481613c8c565b6000602082840312156136fc57600080fd5b815161249481613c8c565b6000806040838503121561371a57600080fd5b823561372581613c8c565b9150602083013561373581613c8c565b809150509250929050565b60008060006060848603121561375557600080fd5b833561376081613c8c565b9250602084013561377081613c8c565b929592945050506040919091013590565b6000806040838503121561379457600080fd5b823561379f81613c8c565b9150602083013561373581613ca1565b600080600080600080600080610100898b0312156137cc57600080fd5b88516137d781613c8c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000806040838503121561382c57600080fd5b823561383781613c8c565b946020939093013593505050565b60008060006040848603121561385a57600080fd5b833567ffffffffffffffff8082111561387257600080fd5b818601915086601f83011261388657600080fd5b81358181111561389557600080fd5b8760208260051b85010111156138aa57600080fd5b602092830195509350508401356138c081613ca1565b809150509250925092565b6000602082840312156138dd57600080fd5b815161249481613ca1565b6000602082840312156138fa57600080fd5b5035919050565b60006020828403121561391357600080fd5b5051919050565b60008060006060848603121561392f57600080fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561395e57600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b838110156139b35781516001600160a01b03168752958201959082019060010161398e565b509495945050505050565b6040808252810183905260008460608301825b86811015613a015782356139e481613c8c565b6001600160a01b03168252602092830192909101906001016139d1565b5080925050508215156020830152949350505050565b848152608060208201526000613a30608083018661397a565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015613a7957858101830151858201604001528201613a5d565b81811115613a8b576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a060408201526000613b7d60a083018661397a565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613bad57613bad613c60565b500190565b600082613bcf57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613bee57613bee613c60565b500290565b600082821015613c0557613c05613c60565b500390565b600181811c90821680613c1e57607f821691505b60208210811415613c3f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c5957613c59613c60565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461123557600080fd5b801515811461123557600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac709bfeae27eb3f3d2ebde38e1cd7f6827eeacb198b53686ac38f921bda549264736f6c6343000807003360a0604052600280546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905534801561003657600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506104b0600f5569021e19e0c9bab24000006080526080516119c96100ae600039600081816104ba0152610c2901526119c96000f3fe6080604052600436106101bb5760003560e01c806391b89fba116100ec578063c0f306ef1161008a578063e98030c711610064578063e98030c714610531578063f2fde38b14610551578063fbcbc0f114610571578063ffb2c4791461059157600080fd5b8063c0f306ef146104dc578063e30443bc146104fc578063e7841ec01461051c57600080fd5b8063ab6ddfa8116100c6578063ab6ddfa814610445578063ad7a672f14610472578063bc4c4b3714610488578063be10b614146104a857600080fd5b806391b89fba146103cf578063a8b9d240146103ef578063aafd847a1461040f57600080fd5b80634e7b827f116101595780636f2789ec116101335780636f2789ec14610370578063715018a61461038657806385a6b3ae1461039b5780638da5cb5b146103b157600080fd5b80634e7b827f146102b65780635183d6fd146102f65780636a4740021461035b57600080fd5b8063226cfa3d11610195578063226cfa3d1461023357806327ce0147146102605780633009a6091461028057806331e79db01461029657600080fd5b806303c83302146101cf57806309bbedde146101d75780631694505e146101fb57600080fd5b366101ca576101c86105cc565b005b600080fd5b6101c86105cc565b3480156101e357600080fd5b506008545b6040519081526020015b60405180910390f35b34801561020757600080fd5b5060025461021b906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b34801561023f57600080fd5b506101e861024e3660046116e4565b600e6020526000908152604090205481565b34801561026c57600080fd5b506101e861027b3660046116e4565b610654565b34801561028c57600080fd5b506101e8600c5481565b3480156102a257600080fd5b506101c86102b13660046116e4565b6106b7565b3480156102c257600080fd5b506102e66102d13660046116e4565b600d6020526000908152604090205460ff1681565b60405190151581526020016101f2565b34801561030257600080fd5b506103166103113660046117a1565b6107e7565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101f2565b34801561036757600080fd5b506101c8610959565b34801561037c57600080fd5b506101e8600f5481565b34801561039257600080fd5b506101c86109ed565b3480156103a757600080fd5b506101e860075481565b3480156103bd57600080fd5b506000546001600160a01b031661021b565b3480156103db57600080fd5b506101e86103ea3660046116e4565b610a61565b3480156103fb57600080fd5b506101e861040a3660046116e4565b610a68565b34801561041b57600080fd5b506101e861042a3660046116e4565b6001600160a01b031660009081526004602052604090205490565b34801561045157600080fd5b506101e86104603660046116e4565b60056020526000908152604090205481565b34801561047e57600080fd5b506101e860065481565b34801561049457600080fd5b506102e66104a336600461171e565b610a94565b3480156104b457600080fd5b506101e87f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e857600080fd5b506101c86104f73660046116e4565b610b40565b34801561050857600080fd5b506101c861051736600461175c565b610bd8565b34801561052857600080fd5b50600c546101e8565b34801561053d57600080fd5b506101c861054c3660046117a1565b610d64565b34801561055d57600080fd5b506101c861056c3660046116e4565b610ece565b34801561057d57600080fd5b5061031661058c3660046116e4565b610fb8565b34801561059d57600080fd5b506105b16105ac3660046117a1565b611130565b604080519384526020840192909252908201526060016101f2565b6000600654116105db57600080fd5b341561065257600654610609906105f634600160801b61124b565b610600919061189d565b600154906112d1565b60015560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a260075461064e90346112d1565b6007555b565b6001600160a01b0381166000908152600360209081526040808320546005909252822054600154600160801b926106a7926106a29261069c91610697919061124b565b611330565b90611340565b61137e565b6106b1919061189d565b92915050565b6000546001600160a01b031633146106ea5760405162461bcd60e51b81526004016106e19061180f565b60405180910390fd5b6001600160a01b0381166000908152600d602052604090205460ff161561071057600080fd5b6001600160a01b0381166000908152600d60205260408120805460ff1916600117905561073e908290611391565b60405163131836e760e21b8152600860048201526001600160a01b03821660248201527304167057ab756d5f87c6f4d21fbef4cff0b3b00a90634c60db9c9060440160006040518083038186803b15801561079857600080fd5b505af41580156107ac573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b60008060008060008060008060087304167057ab756d5f87c6f4d21fbef4cff0b3b00a63deb3d89690916040518263ffffffff1660e01b815260040161082f91815260200190565b60206040518083038186803b15801561084757600080fd5b505af415801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611788565b89106108a457506000965060001995508594508693508392508291508190508061094e565b6040516368d54f3f60e11b815260086004820152602481018a90526000907304167057ab756d5f87c6f4d21fbef4cff0b3b00a9063d1aa9e7e9060440160206040518083038186803b1580156108f957600080fd5b505af415801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190611701565b905061093c81610fb8565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152605b60248201527f4469766964656e645f547261636b65723a20776974686472617744697669646560448201527f6e642064697361626c65642e20557365207468652027636c61696d272066756e60648201527f6374696f6e206f6e20746865206d61696e20636f6e74726163742e0000000000608482015260a4016106e1565b6000546001600160a01b03163314610a175760405162461bcd60e51b81526004016106e19061180f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006106b1825b6001600160a01b0381166000908152600460205260408120546106b190610a8e84610654565b9061142a565b600080546001600160a01b03163314610abf5760405162461bcd60e51b81526004016106e19061180f565b6000610aca8461146c565b90508015610b36576001600160a01b0384166000818152600e6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610b249085815260200190565b60405180910390a360019150506106b1565b5060009392505050565b6000546001600160a01b03163314610b6a5760405162461bcd60e51b81526004016106e19061180f565b6001600160a01b0381166000908152600d602052604090205460ff16610b8f57600080fd5b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b03163314610c025760405162461bcd60e51b81526004016106e19061180f565b6001600160a01b0382166000908152600d602052604090205460ff1615610c27575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610cd657610c588282611391565b604051632f0ad01760e21b8152600860048201526001600160a01b0383166024820152604481018290527304167057ab756d5f87c6f4d21fbef4cff0b3b00a9063bc2b405c9060640160006040518083038186803b158015610cb957600080fd5b505af4158015610ccd573d6000803e3d6000fd5b50505050610d54565b610ce1826000611391565b60405163131836e760e21b8152600860048201526001600160a01b03831660248201527304167057ab756d5f87c6f4d21fbef4cff0b3b00a90634c60db9c9060440160006040518083038186803b158015610d3b57600080fd5b505af4158015610d4f573d6000803e3d6000fd5b505050505b610d5f826001610a94565b505050565b6000546001600160a01b03163314610d8e5760405162461bcd60e51b81526004016106e19061180f565b6104b08110158015610da35750620151808111155b610e235760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a4016106e1565b600f54811415610e9b5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c756500000000000000000060648201526084016106e1565b600f5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600f55565b6000546001600160a01b03163314610ef85760405162461bcd60e51b81526004016106e19061180f565b6001600160a01b038116610f5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e1565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600860048201526001600160a01b038216602482015281906000908190819081908190819081907304167057ab756d5f87c6f4d21fbef4cff0b3b00a906317e142d19060440160206040518083038186803b15801561102357600080fd5b505af4158015611037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105b9190611788565b96506000199550600087126110bd57600c5487111561108957600c546110829088906115b2565b95506110bd565b600c546008546000911061109e5760006110ad565b600c546008546110ad9161142a565b90506110b98882611340565b9650505b6110c688610a68565b94506110d188610654565b6001600160a01b0389166000908152600e60205260409020549094509250826110fb576000611109565b600f546111099084906112d1565b9150428211611119576000611123565b611123824261142a565b9050919395975091939597565b6008546000908190819080611150575050600c5460009250829150611244565b600c546000805a90506000805b898410801561116b57508582105b15611233578461117a81611934565b6008549096508610905061118d57600094505b6000600860000186815481106111a5576111a5611965565b60009182526020808320909101546001600160a01b0316808352600e9091526040909120549091506111d6906115ef565b156111f9576111e6816001610a94565b156111f957816111f581611934565b9250505b8261120381611934565b93505060005a90508085111561122a57611227611220868361142a565b87906112d1565b95505b935061115d9050565b600c85905590975095509193505050505b9193909250565b60008261125a575060006106b1565b600061126683856118bf565b905082611273858361189d565b146112ca5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106e1565b9392505050565b6000806112de8385611885565b9050838110156112ca5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106e1565b600081818112156106b157600080fd5b60008061134d8385611844565b9050600083121580156113605750838112155b80611375575060008312801561137557508381125b6112ca57600080fd5b60008082121561138d57600080fd5b5090565b6001600160a01b0382166000908152600560205260409020805490829055808211156113ed5760006113c3838361142a565b90506113cf8482611616565b80600660008282546113e19190611885565b90915550610d5f915050565b80821015610d5f576000611401828461142a565b905061140d8482611670565b806006600082825461141f919061191d565b909155505050505050565b60006112ca83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506116aa565b60008061147883610a68565b905080156115a9576001600160a01b0383166000908152600460205260409020546114a390826112d1565b6001600160a01b038416600081815260046020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906114f29084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d806000811461154c576040519150601f19603f3d011682016040523d82523d6000602084013e611551565b606091505b50509050806115a2576001600160a01b03841660009081526004602052604090205461157d908361142a565b6001600160a01b03909416600090815260046020526040812094909455509192915050565b5092915050565b50600092915050565b6000806115bf83856118de565b9050600083121580156115d25750838113155b80611375575060008312801561137557508381136112ca57600080fd5b60004282111561160157506000919050565b600f5461160e428461142a565b101592915050565b6116506116316106978360015461124b90919063ffffffff16565b6001600160a01b038416600090815260036020526040902054906115b2565b6001600160a01b0390921660009081526003602052604090209190915550565b61165061168b6106978360015461124b90919063ffffffff16565b6001600160a01b03841660009081526003602052604090205490611340565b600081848411156116ce5760405162461bcd60e51b81526004016106e191906117ba565b5060006116db848661191d565b95945050505050565b6000602082840312156116f657600080fd5b81356112ca8161197b565b60006020828403121561171357600080fd5b81516112ca8161197b565b6000806040838503121561173157600080fd5b823561173c8161197b565b91506020830135801515811461175157600080fd5b809150509250929050565b6000806040838503121561176f57600080fd5b823561177a8161197b565b946020939093013593505050565b60006020828403121561179a57600080fd5b5051919050565b6000602082840312156117b357600080fd5b5035919050565b600060208083528351808285015260005b818110156117e7578581018301518582016040015282016117cb565b818111156117f9576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b03849003851316156118665761186661194f565b600160ff1b839003841281161561187f5761187f61194f565b50500190565b600082198211156118985761189861194f565b500190565b6000826118ba57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156118d9576118d961194f565b500290565b60008083128015600160ff1b8501841216156118fc576118fc61194f565b6001600160ff1b03840183138116156119175761191761194f565b50500390565b60008282101561192f5761192f61194f565b500390565b60006000198214156119485761194861194f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461199057600080fd5b5056fea2646970667358221220023adcf8bf756134d41235f3ef221a31931dbea1827deb973c7fb3c69109d32c64736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106103f35760003560e01c80637571336a11610208578063b62496f511610118578063e2f45605116100ab578063f27fd2541161007a578063f27fd25414610bf6578063f2fde38b14610c16578063f4eea5b314610c36578063f8b45b0514610c4b578063fd72e22a14610c6157600080fd5b8063e2f4560514610b95578063e7841ec014610bab578063e98030c714610bc0578063ee40166e14610be057600080fd5b8063c0f306ef116100e7578063c0f306ef14610aef578063c492f04614610b0f578063c6616ba114610b2f578063dd62ed3e14610b4f57600080fd5b8063b62496f514610a6a578063b8eb354614610a9a578063bbc0c74214610ab0578063c024666814610acf57600080fd5b806398118cb41161019b578063a457c2d71161016a578063a457c2d714610985578063a8b9d240146109a5578063a9059cbb146109c5578063ad56c13c146109e5578063b1a8361014610a4a57600080fd5b806398118cb4146109245780639a7a23d61461093a5780639c1b8af51461095a578063a26579ad1461097057600080fd5b806388bdd9be116101d757806388bdd9be146108bc5780638a8c523c146108dc5780638da5cb5b146108f157806395d89b411461090f57600080fd5b80637571336a1461082c578063826f3a651461084c57806385ecfd281461086c578063871c128d1461089c57600080fd5b8063313ce567116103035780634fbee19311610296578063700bb19111610265578063700bb191146107ad57806370a08231146107cd578063715018a6146107ed57806371778e7d14610802578063751039fc1461081757600080fd5b80634fbee1931461071f57806364b0f6531461075857806365b8dbc01461076d5780636843cd841461078d57600080fd5b806348479175116102d2578063484791751461069c57806349bd5a5e146106bc5780634a62bb65146106f05780634e71d92d1461070a57600080fd5b8063313ce5671461062a57806331e79db01461064657806339509351146106665780633b2d081c1461068657600080fd5b80631694505e1161038657806323b872dd1161035557806323b872dd1461059f5780632bb14e1d146105bf5780632c1f5216146105d557806330bb4cff146105f557806330d5d18d1461060a57600080fd5b80631694505e1461053457806318160ddd146105545780631943323e146105695780631fc851bd1461058957600080fd5b80630f4432e3116103c25780630f4432e3146104ae578063106b5da1146104c4578063122fe685146104e657806313114a9d1461051e57600080fd5b806306fdde03146103ff5780630855f25d1461042a578063090896be1461046a578063095ea7b31461048e57600080fd5b366103fa57005b600080fd5b34801561040b57600080fd5b50610414610c81565b6040516104219190613a4c565b60405180910390f35b34801561043657600080fd5b5061045a6104453660046136cd565b601a6020526000908152604090205460ff1681565b6040519015158152602001610421565b34801561047657600080fd5b5061048060155481565b604051908152602001610421565b34801561049a57600080fd5b5061045a6104a9366004613819565b610d13565b3480156104ba57600080fd5b50610480600e5481565b3480156104d057600080fd5b506104e46104df3660046138e8565b610d2a565b005b3480156104f257600080fd5b50600954610506906001600160a01b031681565b6040516001600160a01b039091168152602001610421565b34801561052a57600080fd5b5061048060135481565b34801561054057600080fd5b50600654610506906001600160a01b031681565b34801561056057600080fd5b50600254610480565b34801561057557600080fd5b506104e46105843660046138e8565b610d84565b34801561059557600080fd5b5061048060115481565b3480156105ab57600080fd5b5061045a6105ba366004613740565b610f71565b3480156105cb57600080fd5b5061048060145481565b3480156105e157600080fd5b50600754610506906001600160a01b031681565b34801561060157600080fd5b50610480610fda565b34801561061657600080fd5b506104e46106253660046136cd565b61105c565b34801561063657600080fd5b5060405160128152602001610421565b34801561065257600080fd5b506104e46106613660046136cd565b6110ee565b34801561067257600080fd5b5061045a610681366004613819565b61117b565b34801561069257600080fd5b5061048060165481565b3480156106a857600080fd5b50600a54610506906001600160a01b031681565b3480156106c857600080fd5b506105067f000000000000000000000000000000000000000000000000000000000000000081565b3480156106fc57600080fd5b5060125461045a9060ff1681565b34801561071657600080fd5b506104e46111b1565b34801561072b57600080fd5b5061045a61073a3660046136cd565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561076457600080fd5b50610480611238565b34801561077957600080fd5b506104e46107883660046136cd565b61127d565b34801561079957600080fd5b506104806107a83660046136cd565b61136e565b3480156107b957600080fd5b506104e46107c83660046138e8565b6113ed565b3480156107d957600080fd5b506104806107e83660046136cd565b6114ce565b3480156107f957600080fd5b506104e46114e9565b34801561080e57600080fd5b5061048061155d565b34801561082357600080fd5b5061045a6115a2565b34801561083857600080fd5b506104e4610847366004613781565b6115df565b34801561085857600080fd5b506104e46108673660046136cd565b611669565b34801561087857600080fd5b5061045a6108873660046136cd565b60106020526000908152604090205460ff1681565b3480156108a857600080fd5b506104e46108b73660046138e8565b6116b4565b3480156108c857600080fd5b506104e46108d73660046136cd565b6117f8565b3480156108e857600080fd5b506104e4611b7d565b3480156108fd57600080fd5b506005546001600160a01b0316610506565b34801561091b57600080fd5b50610414611bcc565b34801561093057600080fd5b5061048060175481565b34801561094657600080fd5b506104e4610955366004613781565b611bdb565b34801561096657600080fd5b5061048060185481565b34801561097c57600080fd5b50610480611cc9565b34801561099157600080fd5b5061045a6109a0366004613819565b611d0e565b3480156109b157600080fd5b506104806109c03660046136cd565b611d5d565b3480156109d157600080fd5b5061045a6109e0366004613819565b611d90565b3480156109f157600080fd5b50610a05610a003660046136cd565b611d9d565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610421565b348015610a5657600080fd5b506104e4610a65366004613707565b611e47565b348015610a7657600080fd5b5061045a610a853660046136cd565b601b6020526000908152604090205460ff1681565b348015610aa657600080fd5b50610480600b5481565b348015610abc57600080fd5b5060125461045a90610100900460ff1681565b348015610adb57600080fd5b506104e4610aea366004613781565b611fb5565b348015610afb57600080fd5b506104e4610b0a3660046136cd565b612037565b348015610b1b57600080fd5b506104e4610b2a366004613845565b612093565b348015610b3b57600080fd5b506104e4610b4a366004613948565b61216f565b348015610b5b57600080fd5b50610480610b6a366004613707565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ba157600080fd5b50610480600c5481565b348015610bb757600080fd5b50610480612237565b348015610bcc57600080fd5b506104e4610bdb3660046138e8565b61227c565b348015610bec57600080fd5b50610480600f5481565b348015610c0257600080fd5b50610a05610c113660046138e8565b6122d7565b348015610c2257600080fd5b506104e4610c313660046136cd565b612319565b348015610c4257600080fd5b506104e4612404565b348015610c5757600080fd5b50610480600d5481565b348015610c6d57600080fd5b50600854610506906001600160a01b031681565b606060038054610c9090613c0a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbc90613c0a565b8015610d095780601f10610cde57610100808354040283529160200191610d09565b820191906000526020600020905b815481529060010190602001808311610cec57829003601f168201915b5050505050905090565b6000610d2033848461249b565b5060015b92915050565b6005546001600160a01b03163314610d5d5760405162461bcd60e51b8152600401610d5490613ae4565b60405180910390fd5b80600b541415610d6c57600080fd5b610d7e81670de0b6b3a7640000613bd4565b600b5550565b6005546001600160a01b03163314610dae5760405162461bcd60e51b8152600401610d5490613ae4565b47811115610e0f5760405162461bcd60e51b815260206004820152602860248201527f5468657265206973206e6f7420656e6f7567682045544820666f722074686973604482015267206275796261636b60c01b6064820152608401610d54565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eac91906136ea565b81600081518110610ebf57610ebf613c76565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610ef357610ef3613c76565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de95908490610f3b90600090869061dead904290600401613a17565b6000604051808303818588803b158015610f5457600080fd5b505af1158015610f68573d6000803e3d6000fd5b50505050505050565b6000610f7e8484846125c0565b610fd08433610fcb85604051806060016040528060288152602001613cd6602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612eee565b61249b565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561101f57600080fd5b505afa158015611033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110579190613901565b905090565b6005546001600160a01b031633146110865760405162461bcd60e51b8152600401610d5490613ae4565b611091816001611fb5565b6008546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111185760405162461bcd60e51b8152600401610d5490613ae4565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561116057600080fd5b505af1158015611174573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d20918590610fcb9086612435565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b1580156111fd57600080fd5b505af1158015611211573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123591906138cb565b50565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561101f57600080fd5b6005546001600160a01b031633146112a75760405162461bcd60e51b8152600401610d5490613ae4565b6006546001600160a01b03828116911614156113115760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610d54565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b1580156113b557600080fd5b505afa1580156113c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d249190613901565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561143b57600080fd5b505af115801561144f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611473919061391a565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146115135760405162461bcd60e51b8152600401610d5490613ae4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b15801561101f57600080fd5b6005546000906001600160a01b031633146115cf5760405162461bcd60e51b8152600401610d5490613ae4565b506012805460ff19169055600190565b6005546001600160a01b031633146116095760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fa745b79c9942f47d553e54242165de0cc7bed53246fad779598eff0f8b756e6f91015b60405180910390a25050565b6005546001600160a01b031633146116935760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6005546001600160a01b031633146116de5760405162461bcd60e51b8152600401610d5490613ae4565b62030d4081101580156116f457506207a1208111155b61175e5760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610d54565b6018548114156117c55760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d54565b60185460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601855565b6005546001600160a01b031633146118225760405162461bcd60e51b8152600401610d5490613ae4565b6007546001600160a01b03828116911614156118965760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610d54565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118de57600080fd5b505afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191691906136ea565b6001600160a01b0316146119925760405162461bcd60e51b815260206004820152603c60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e65642062792074686520746f6b656e20636f6e7472616374000000006064820152608401610d54565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b1580156119d457600080fd5b505af11580156119e8573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611a2d57600080fd5b505af1158015611a41573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611a666005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611aa757600080fd5b505af1158015611abb573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b0657600080fd5b505af1158015611b1a573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611ba75760405162461bcd60e51b8152600401610d5490613ae4565b6012805461ff00191661010017905543600f55611bc74262015180613b9a565b601155565b606060048054610c9090613c0a565b6005546001600160a01b03163314611c055760405162461bcd60e51b8152600401610d5490613ae4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611cbb5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610d54565b611cc58282612f28565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561101f57600080fd5b6000610d203384610fcb85604051806060016040528060258152602001613cfe602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612eee565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161139d565b6000610d203384846125c0565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611df457600080fd5b505afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c91906137af565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611e715760405162461bcd60e51b8152600401610d5490613ae4565b600980546001600160a01b0319166001600160a01b038416908117909155611e9a906001611fb5565b60075460095460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b158015611ee357600080fd5b505af1158015611ef7573d6000803e3d6000fd5b5050600954611f1392506001600160a01b0316905060016115df565b600a80546001600160a01b0319166001600160a01b038316908117909155611f3c906001611fb5565b600754600a5460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b5050600a54611cc592506001600160a01b0316905060016115df565b6005546001600160a01b03163314611fdf5760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910161165d565b6005546001600160a01b031633146120615760405162461bcd60e51b8152600401610d5490613ae4565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611146565b6005546001600160a01b031633146120bd5760405162461bcd60e51b8152600401610d5490613ae4565b60005b8281101561212e5781601960008686858181106120df576120df613c76565b90506020020160208101906120f491906136cd565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061212681613c45565b9150506120c0565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612162939291906139be565b60405180910390a1505050565b6005546001600160a01b031633146121995760405162461bcd60e51b8152600401610d5490613ae4565b601584905560168390556014829055601781905580826121b98587613b9a565b6121c39190613b9a565b6121cd9190613b9a565b60138190556001118015906121e55750601460135411155b6122315760405162461bcd60e51b815260206004820152601b60248201527f4d757374206b6565702066656573206265747765656e20312d323000000000006044820152606401610d54565b50505050565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561101f57600080fd5b6005546001600160a01b031633146122a65760405162461bcd60e51b8152600401610d5490613ae4565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611146565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611ddb565b6005546001600160a01b031633146123435760405162461bcd60e51b8152600401610d5490613ae4565b6001600160a01b0381166123a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d54565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461242e5760405162461bcd60e51b8152600401610d5490613ae4565b6000601155565b6000806124428385613b9a565b9050838110156124945760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d54565b9392505050565b6001600160a01b0383166124fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d54565b6001600160a01b03821661255e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d54565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166125e65760405162461bcd60e51b8152600401610d5490613b19565b6001600160a01b03821661260c5760405162461bcd60e51b8152600401610d5490613aa1565b601254610100900460ff161580156126255750600e5443145b801561263f57506005546001600160a01b03848116911614155b801561265957506009546001600160a01b03848116911614155b80156126735750600a546001600160a01b03848116911614155b156126a05761268483836001612ff8565b61269b8361dead612696600185613bf3565b612ff8565b505050565b601254610100900460ff16612780576005546001600160a01b03848116911614806126d857506009546001600160a01b038481169116145b806126f05750600a546001600160a01b038481169116145b6127355760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d54565b600e5415801561277657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156127805743600e555b6005546001600160a01b038481169116148015906127ac57506009546001600160a01b03848116911614155b80156127d157506001600160a01b0382166000908152601b602052604090205460ff16155b80156127eb5750600a546001600160a01b03848116911614155b80156127f85750600f5443145b801561281d57506001600160a01b0382166000908152601a602052604090205460ff16155b15612846576001600160a01b0382166000908152601060205260409020805460ff191660011790555b60125460ff1615612afa576005546001600160a01b0384811691161480159061287d57506005546001600160a01b03838116911614155b801561289157506001600160a01b03821615155b80156128a857506001600160a01b03821661dead14155b80156128c257506009546001600160a01b03848116911614155b80156128dc57506009546001600160a01b03838116911614155b80156128f65750600a546001600160a01b03848116911614155b80156129105750600a546001600160a01b03838116911614155b80156129265750600654600160a01b900460ff16155b15612afa576001600160a01b0383166000908152601b602052604090205460ff16801561296c57506001600160a01b0382166000908152601a602052604090205460ff16155b156129d357600d5461297d836114ce565b6129879083613b9a565b11156129ce5760405162461bcd60e51b815260206004820152601660248201527510d85b89dd08195e18d95959081b585e15d85b1b195d60521b6044820152606401610d54565b612afa565b6001600160a01b0382166000908152601b602052604090205460ff168015612a1457506001600160a01b0383166000908152601a602052604090205460ff16155b15612a7d57600b548111156129ce5760405162461bcd60e51b815260206004820152602960248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152681026b0bc29b2b6361760b91b6064820152608401610d54565b6001600160a01b0382166000908152601a602052604090205460ff16612afa57600d54612aa9836114ce565b612ab39083613b9a565b1115612afa5760405162461bcd60e51b815260206004820152601660248201527510d85b89dd08195e18d95959081b585e15d85b1b195d60521b6044820152606401610d54565b80612b0b5761269b83836000612ff8565b6000612b16306114ce565b600c5490915081108015908190612b375750600654600160a01b900460ff16155b8015612b5c57506001600160a01b0385166000908152601b602052604090205460ff16155b8015612b8157506001600160a01b03851660009081526019602052604090205460ff16155b8015612ba657506001600160a01b03841660009081526019602052604090205460ff16155b15612c1b576006805460ff60a01b1916600160a01b17905560175415612bf6576000612be9601354612be36017548661310190919063ffffffff16565b90613180565b9050612bf4816131c2565b505b6000612c01306114ce565b9050612c0c81613249565b506006805460ff60a01b191690555b6006546001600160a01b03861660009081526019602052604090205460ff600160a01b909204821615911680612c6957506001600160a01b03851660009081526019602052604090205460ff165b15612c72575060005b8015612d0d576000612c946064612be36013548861310190919063ffffffff16565b6001600160a01b03881660009081526010602052604090205490915060ff168015612cc0575042601154115b15612cf457612cd78761dead612696846004613bd4565b612ce2873083612ff8565b612ced816005613bd4565b9050612cff565b612cff873083612ff8565b612d098582613442565b9450505b612d18868686612ff8565b6007546001600160a01b031663e30443bc87612d33816114ce565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612d7957600080fd5b505af1925050508015612d8a575060015b506007546001600160a01b031663e30443bc86612da6816114ce565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612dec57600080fd5b505af1925050508015612dfd575060015b50600654600160a01b900460ff16612ee6576018546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015612e5b57600080fd5b505af1925050508015612e8b575060408051601f3d908101601f19168201909252612e889181019061391a565b60015b612e9457610f68565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b505050505050565b60008184841115612f125760405162461bcd60e51b8152600401610d549190613a4c565b506000612f1f8486613bf3565b95945050505050565b6001600160a01b0382166000908152601b60205260409020805460ff1916821515179055612f5682826115df565b8015612fbc5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612fa357600080fd5b505af1158015612fb7573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831661301e5760405162461bcd60e51b8152600401610d5490613b19565b6001600160a01b0382166130445760405162461bcd60e51b8152600401610d5490613aa1565b61308181604051806060016040528060268152602001613cb0602691396001600160a01b0386166000908152602081905260409020549190612eee565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546130b09082612435565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016125b3565b60008261311057506000610d24565b600061311c8385613bd4565b9050826131298583613bb2565b146124945760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d54565b600061249483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613484565b60006131cf826002613180565b905060006131dd8383613442565b9050476131e9836134b2565b60006131f54783613442565b90506132018382613613565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b47613253826134b2565b6014546000901561332457600061328a6017546013546132739190613bf3565b601454612be3906132844788613442565b90613101565b6007546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146132d8576040519150601f19603f3d011682016040523d82523d6000602084013e6132dd565b606091505b509092505081156133225760408051858152602081018390527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b6015541561269b57600060146133616017546014546013546133469190613bf3565b6133509190613bf3565b601554612be3906132844789613442565b61336b9190613bb2565b60405190915073b017c481575318017dc2122b59759b25d21f6721908290600081818185875af1925050503d80600081146133c2576040519150601f19603f3d011682016040523d82523d6000602084013e6133c7565b606091505b50508092505060006133e56017546014546013546133469190613bf3565b6008546040519192506001600160a01b0316908290600081818185875af1925050503d8060008114613433576040519150601f19603f3d011682016040523d82523d6000602084013e613438565b606091505b5050505050505050565b600061249483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612eee565b600081836134a55760405162461bcd60e51b8152600401610d549190613a4c565b506000612f1f8486613bb2565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106134e7576134e7613c76565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561353b57600080fd5b505afa15801561354f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357391906136ea565b8160018151811061358657613586613c76565b6001600160a01b0392831660209182029290920101526006546135ac913091168461249b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906135e5908590600090869030904290600401613b5e565b600060405180830381600087803b1580156135ff57600080fd5b505af1158015612ee6573d6000803e3d6000fd5b60065461362b9030906001600160a01b03168461249b565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561369457600080fd5b505af11580156136a8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611174919061391a565b6000602082840312156136df57600080fd5b813561249481613c8c565b6000602082840312156136fc57600080fd5b815161249481613c8c565b6000806040838503121561371a57600080fd5b823561372581613c8c565b9150602083013561373581613c8c565b809150509250929050565b60008060006060848603121561375557600080fd5b833561376081613c8c565b9250602084013561377081613c8c565b929592945050506040919091013590565b6000806040838503121561379457600080fd5b823561379f81613c8c565b9150602083013561373581613ca1565b600080600080600080600080610100898b0312156137cc57600080fd5b88516137d781613c8c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000806040838503121561382c57600080fd5b823561383781613c8c565b946020939093013593505050565b60008060006040848603121561385a57600080fd5b833567ffffffffffffffff8082111561387257600080fd5b818601915086601f83011261388657600080fd5b81358181111561389557600080fd5b8760208260051b85010111156138aa57600080fd5b602092830195509350508401356138c081613ca1565b809150509250925092565b6000602082840312156138dd57600080fd5b815161249481613ca1565b6000602082840312156138fa57600080fd5b5035919050565b60006020828403121561391357600080fd5b5051919050565b60008060006060848603121561392f57600080fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561395e57600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b838110156139b35781516001600160a01b03168752958201959082019060010161398e565b509495945050505050565b6040808252810183905260008460608301825b86811015613a015782356139e481613c8c565b6001600160a01b03168252602092830192909101906001016139d1565b5080925050508215156020830152949350505050565b848152608060208201526000613a30608083018661397a565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015613a7957858101830151858201604001528201613a5d565b81811115613a8b576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a060408201526000613b7d60a083018661397a565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613bad57613bad613c60565b500190565b600082613bcf57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613bee57613bee613c60565b500290565b600082821015613c0557613c05613c60565b500390565b600181811c90821680613c1e57607f821691505b60208210811415613c3f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c5957613c59613c60565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461123557600080fd5b801515811461123557600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac709bfeae27eb3f3d2ebde38e1cd7f6827eeacb198b53686ac38f921bda549264736f6c63430008070033

Libraries Used


Deployed Bytecode Sourcemap

41335:22055:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9217:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42750:68;;;;;;;;;;-1:-1:-1;42750:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8615:14:1;;8608:22;8590:41;;8578:2;8563:18;42750:68:0;8450:187:1;42379:28:0;;;;;;;;;;;;;;;;;;;17961:25:1;;;17949:2;17934:18;42379:28:0;17815:177:1;11384:169:0;;;;;;;;;;-1:-1:-1;11384:169:0;;;;;:::i;:::-;;:::i;41810:39::-;;;;;;;;;;;;;;;;49087:140;;;;;;;;;;-1:-1:-1;49087:140:0;;;;;:::i;:::-;;:::i;:::-;;41626:29;;;;;;;;;;-1:-1:-1;41626:29:0;;;;-1:-1:-1;;;;;41626:29:0;;;;;;-1:-1:-1;;;;;5689:32:1;;;5671:51;;5659:2;5644:18;41626:29:0;5525:203:1;42316:24:0;;;;;;;;;;;;;;;;41414:41;;;;;;;;;;-1:-1:-1;41414:41:0;;;;-1:-1:-1;;;;;41414:41:0;;;10337:108;;;;;;;;;;-1:-1:-1;10425:12:0;;10337:108;;62759:628;;;;;;;;;;-1:-1:-1;62759:628:0;;;;;:::i;:::-;;:::i;42121:33::-;;;;;;;;;;;;;;;;12035:355;;;;;;;;;;-1:-1:-1;12035:355:0;;;;;:::i;:::-;;:::i;42347:25::-;;;;;;;;;;;;;;;;41539:38;;;;;;;;;;-1:-1:-1;41539:38:0;;;;-1:-1:-1;;;;;41539:38:0;;;52256:141;;;;;;;;;;;;;:::i;51333:266::-;;;;;;;;;;-1:-1:-1;51333:266:0;;;;;:::i;:::-;;:::i;10179:93::-;;;;;;;;;;-1:-1:-1;10179:93:0;;10262:2;19699:36:1;;19687:2;19672:18;10179:93:0;19557:184:1;48475:130:0;;;;;;;;;;-1:-1:-1;48475:130:0;;;;;:::i;:::-;;:::i;12799:218::-;;;;;;;;;;-1:-1:-1;12799:218:0;;;;;:::i;:::-;;:::i;42414:25::-;;;;;;;;;;;;;;;;41662:35;;;;;;;;;;-1:-1:-1;41662:35:0;;;;-1:-1:-1;;;;;41662:35:0;;;41462:38;;;;;;;;;;;;;;;42230:33;;;;;;;;;;-1:-1:-1;42230:33:0;;;;;;;;54120:97;;;;;;;;;;;;;:::i;52405:125::-;;;;;;;;;;-1:-1:-1;52405:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;52494:28:0;52470:4;52494:28;;;:19;:28;;;;;;;;;52405:125;54359:141;;;;;;;;;;;;;:::i;49694:307::-;;;;;;;;;;-1:-1:-1;49694:307:0;;;;;:::i;:::-;;:::i;52690:134::-;;;;;;;;;;-1:-1:-1;52690:134:0;;;;;:::i;:::-;;:::i;53853:259::-;;;;;;;;;;-1:-1:-1;53853:259:0;;;;;:::i;:::-;;:::i;10508:127::-;;;;;;;;;;-1:-1:-1;10508:127:0;;;;;:::i;:::-;;:::i;26349:148::-;;;;;;;;;;;;;:::i;54512:119::-;;;;;;;;;;;;;:::i;54687:120::-;;;;;;;;;;;;;:::i;50009:210::-;;;;;;;;;;-1:-1:-1;50009:210:0;;;;;:::i;:::-;;:::i;53735:113::-;;;;;;;;;;-1:-1:-1;53735:113:0;;;;;:::i;:::-;;:::i;41972:43::-;;;;;;;;;;-1:-1:-1;41972:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51607:393;;;;;;;;;;-1:-1:-1;51607:393:0;;;;;:::i;:::-;;:::i;47573:805::-;;;;;;;;;;-1:-1:-1;47573:805:0;;;;;:::i;:::-;;:::i;48894:185::-;;;;;;;;;;;;;:::i;25707:79::-;;;;;;;;;;-1:-1:-1;25772:6:0;;-1:-1:-1;;;;;25772:6:0;25707:79;;9436:104;;;;;;;;;;;;;:::i;42446:27::-;;;;;;;;;;;;;;;;50731:256;;;;;;;;;;-1:-1:-1;50731:256:0;;;;;:::i;:::-;;:::i;42558:40::-;;;;;;;;;;;;;;;;52140:108;;;;;;;;;;;;;:::i;13520:269::-;;;;;;;;;;-1:-1:-1;13520:269:0;;;;;:::i;:::-;;:::i;52538:147::-;;;;;;;;;;-1:-1:-1;52538:147:0;;;;;:::i;:::-;;:::i;10848:175::-;;;;;;;;;;-1:-1:-1;10848:175:0;;;;;:::i;:::-;;:::i;52832:318::-;;;;;;;;;;-1:-1:-1;52832:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6690:32:1;;;6672:51;;6754:2;6739:18;;6732:34;;;;6782:18;;;6775:34;;;;6840:2;6825:18;;6818:34;;;;6883:3;6868:19;;6861:35;6710:3;6912:19;;6905:35;6971:3;6956:19;;6949:35;7015:3;7000:19;;6993:35;6659:3;6644:19;52832:318:0;6333:701:1;46928:577:0;;;;;;;;;;-1:-1:-1;46928:577:0;;;;;:::i;:::-;;:::i;42976:58::-;;;;;;;;;;-1:-1:-1;42976:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41710:22;;;;;;;;;;;;;;;;42270:33;;;;;;;;;;-1:-1:-1;42270:33:0;;;;;;;;;;;50227:184;;;;;;;;;;-1:-1:-1;50227:184:0;;;;;:::i;:::-;;:::i;48710:126::-;;;;;;;;;;-1:-1:-1;48710:126:0;;;;;:::i;:::-;;:::i;50419:304::-;;;;;;;;;;-1:-1:-1;50419:304:0;;;;;:::i;:::-;;:::i;49239:447::-;;;;;;;;;;-1:-1:-1;49239:447:0;;;;;:::i;:::-;;:::i;11086:151::-;;;;;;;;;;-1:-1:-1;11086:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11202:18:0;;;11175:7;11202:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11086:151;41739:33;;;;;;;;;;;;;;;;54225:126;;;;;;;;;;;;;:::i;52008:124::-;;;;;;;;;;-1:-1:-1;52008:124:0;;;;;:::i;:::-;;:::i;41895:37::-;;;;;;;;;;;;;;;;53155:325;;;;;;;;;;-1:-1:-1;53155:325:0;;;;;:::i;:::-;;:::i;26652:244::-;;;;;;;;;;-1:-1:-1;26652:244:0;;;;;:::i;:::-;;:::i;53492:189::-;;;;;;;;;;;;;:::i;41779:24::-;;;;;;;;;;;;;;;;41586:31;;;;;;;;;;-1:-1:-1;41586:31:0;;;;-1:-1:-1;;;;;41586:31:0;;;9217:100;9271:13;9304:5;9297:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9217:100;:::o;11384:169::-;11467:4;11484:39;298:10;11507:7;11516:6;11484:8;:39::i;:::-;-1:-1:-1;11541:4:0;11384:169;;;;;:::o;49087:140::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;;;;;;;;;49174:6:::1;49164:7;;:16;;49156:25;;;::::0;::::1;;49202:17;:6:::0;49212::::1;49202:17;:::i;:::-;49192:7;:27:::0;-1:-1:-1;49087:140:0:o;62759:628::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;62859:21:::1;62846:9;:34;;62838:87;;;::::0;-1:-1:-1;;;62838:87:0;;14437:2:1;62838:87:0::1;::::0;::::1;14419:21:1::0;14476:2;14456:18;;;14449:30;14515:34;14495:18;;;14488:62;-1:-1:-1;;;14566:18:1;;;14559:38;14614:19;;62838:87:0::1;14235:404:1::0;62838:87:0::1;63018:16;::::0;;63032:1:::1;63018:16:::0;;;;;::::1;::::0;;62994:21:::1;::::0;63018:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;63055:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;63055:22:0;;;;62994:40;;-1:-1:-1;;;;;;63055:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;63055:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63045:4;63050:1;63045:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;63045:32:0::1;;;-1:-1:-1::0;;;;;63045:32:0::1;;;::::0;::::1;63106:4;63088;63093:1;63088:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63088:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;63158:15:::1;::::0;:223:::1;::::0;-1:-1:-1;;;63158:223:0;;:15;::::1;::::0;:66:::1;::::0;63232:9;;63158:223:::1;::::0;:15:::1;::::0;63306:4;;63333:6:::1;::::0;63355:15:::1;::::0;63158:223:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;62827:560;62759:628:::0;:::o;12035:355::-;12175:4;12192:36;12202:6;12210:9;12221:6;12192:9;:36::i;:::-;12239:121;12248:6;298:10;12270:89;12308:6;12270:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12270:19:0;;;;;;:11;:19;;;;;;;;298:10;12270:33;;;;;;;;;;:37;:89::i;:::-;12239:8;:121::i;:::-;-1:-1:-1;12378:4:0;12035:355;;;;;:::o;52256:141::-;52346:15;;:43;;;-1:-1:-1;;;52346:43:0;;;;52319:7;;-1:-1:-1;;;;;52346:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52339:50;;52256:141;:::o;51333:266::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;51422:42:::1;51438:19;51459:4;51422:15;:42::i;:::-;51525:16;::::0;51480:62:::1;::::0;-1:-1:-1;;;;;51525:16:0;;::::1;::::0;51480:62;::::1;::::0;::::1;::::0;51525:16:::1;::::0;51480:62:::1;51553:16;:38:::0;;-1:-1:-1;;;;;;51553:38:0::1;-1:-1:-1::0;;;;;51553:38:0;;;::::1;::::0;;;::::1;::::0;;51333:266::o;48475:130::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;48552:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;48552:45:0;;-1:-1:-1;;;;;5689:32:1;;;48552:45:0::1;::::0;::::1;5671:51:1::0;48552:15:0;;::::1;::::0;:36:::1;::::0;5644:18:1;;48552:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48475:130:::0;:::o;12799:218::-;298:10;12887:4;12936:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12936:34:0;;;;;;;;;;12887:4;;12904:83;;12927:7;;12936:50;;12975:10;12936:38;:50::i;54120:97::-;54151:15;;:58;;-1:-1:-1;;;54151:58:0;;54190:10;54151:58;;;5917:51:1;54151:15:0;5984:18:1;;;5977:50;-1:-1:-1;;;;;54151:15:0;;;;:30;;5890:18:1;;54151:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54120:97::o;54359:141::-;54451:15;;:41;;;-1:-1:-1;;;54451:41:0;;;;54424:7;;-1:-1:-1;;;;;54451:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;49694:307;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;49803:15:::1;::::0;-1:-1:-1;;;;;49781:38:0;;::::1;49803:15:::0;::::1;49781:38;;49773:86;;;::::0;-1:-1:-1;;;49773:86:0;;13604:2:1;49773:86:0::1;::::0;::::1;13586:21:1::0;13643:2;13623:18;;;13616:30;13682:34;13662:18;;;13655:62;-1:-1:-1;;;13733:18:1;;;13726:33;13776:19;;49773:86:0::1;13402:399:1::0;49773:86:0::1;49917:15;::::0;49875:59:::1;::::0;-1:-1:-1;;;;;49917:15:0;;::::1;::::0;49875:59;::::1;::::0;::::1;::::0;49917:15:::1;::::0;49875:59:::1;49945:15;:48:::0;;-1:-1:-1;;;;;;49945:48:0::1;-1:-1:-1::0;;;;;49945:48:0;;;::::1;::::0;;;::::1;::::0;;49694:307::o;52690:134::-;52781:15;;:38;;-1:-1:-1;;;52781:38:0;;-1:-1:-1;;;;;5689:32:1;;;52781:38:0;;;5671:51:1;52760:7:0;;52781:15;;:29;;5644:18:1;;52781:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53853:259::-;53979:15;;:28;;-1:-1:-1;;;;;;53979:28:0;;;;;17961:25:1;;;53913:18:0;;;;;;-1:-1:-1;;;;;53979:15:0;;:23;;17934:18:1;;53979:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54017:87;;;19392:25:1;;;19448:2;19433:18;;19426:34;;;19476:18;;;19469:34;;;19534:2;19519:18;;19512:34;;;53912:95:0;;-1:-1:-1;53912:95:0;;-1:-1:-1;53912:95:0;-1:-1:-1;54094:9:0;;54082:5;;54017:87;;19379:3:1;19364:19;54017:87:0;;;;;;;53907:205;;;53853:259;:::o;10508:127::-;-1:-1:-1;;;;;10609:18:0;10582:7;10609:18;;;;;;;;;;;;10508:127::o;26349:148::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;26440:6:::1;::::0;26419:40:::1;::::0;26456:1:::1;::::0;-1:-1:-1;;;;;26440:6:0::1;::::0;26419:40:::1;::::0;26456:1;;26419:40:::1;26470:6;:19:::0;;-1:-1:-1;;;;;;26470:19:0::1;::::0;;26349:148::o;54512:119::-;54593:15;;:30;;;-1:-1:-1;;;54593:30:0;;;;54566:7;;-1:-1:-1;;;;;54593:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;54687:120;25919:6;;54739:4;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;-1:-1:-1;54755:14:0::1;:22:::0;;-1:-1:-1;;54755:22:0::1;::::0;;;54687:120;:::o;50009:210::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50099:43:0;::::1;;::::0;;;:35:::1;:43;::::0;;;;;;;;:50;;-1:-1:-1;;50099:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50165:46;;8590:41:1;;;50165:46:0::1;::::0;8563:18:1;50165:46:0::1;;;;;;;;50009:210:::0;;:::o;53735:113::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53813:19:0::1;53835:5;53813:19:::0;;;:11:::1;:19;::::0;;;;:27;;-1:-1:-1;;53813:27:0::1;::::0;;53735:113::o;51607:393::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;51705:6:::1;51693:8;:18;;:40;;;;;51727:6;51715:8;:18;;51693:40;51685:106;;;::::0;-1:-1:-1;;;51685:106:0;;16771:2:1;51685:106:0::1;::::0;::::1;16753:21:1::0;16810:2;16790:18;;;16783:30;16849:34;16829:18;;;16822:62;-1:-1:-1;;;16900:18:1;;;16893:51;16961:19;;51685:106:0::1;16569:417:1::0;51685:106:0::1;51822:16;;51810:8;:28;;51802:85;;;::::0;-1:-1:-1;;;51802:85:0;;12479:2:1;51802:85:0::1;::::0;::::1;12461:21:1::0;12518:2;12498:18;;;12491:30;12557:34;12537:18;;;12530:62;-1:-1:-1;;;12608:18:1;;;12601:42;12660:19;;51802:85:0::1;12277:408:1::0;51802:85:0::1;51937:16;::::0;51903:51:::1;::::0;51927:8;;51903:51:::1;::::0;;;::::1;51965:16;:27:::0;51607:393::o;47573:805::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;47682:15:::1;::::0;-1:-1:-1;;;;;47660:38:0;;::::1;47682:15:::0;::::1;47660:38;;47652:96;;;::::0;-1:-1:-1;;;47652:96:0;;17603:2:1;47652:96:0::1;::::0;::::1;17585:21:1::0;17642:2;17622:18;;;17615:30;17681:34;17661:18;;;17654:62;-1:-1:-1;;;17732:18:1;;;17725:43;17785:19;;47652:96:0::1;17401:409:1::0;47652:96:0::1;47761:34;47822:10;47761:73;;47893:4;-1:-1:-1::0;;;;;47855:43:0::1;:18;-1:-1:-1::0;;;;;47855:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47855:43:0::1;;47847:116;;;::::0;-1:-1:-1;;;47847:116:0;;14008:2:1;47847:116:0::1;::::0;::::1;13990:21:1::0;14047:2;14027:18;;;14020:30;14086:34;14066:18;;;14059:62;14157:30;14137:18;;;14130:58;14205:19;;47847:116:0::1;13806:424:1::0;47847:116:0::1;47976:68;::::0;-1:-1:-1;;;47976:68:0;;-1:-1:-1;;;;;47976:39:0;::::1;:68;::::0;::::1;5671:51:1::0;;;47976:39:0;::::1;::::0;5644:18:1;;47976:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48055:54:0::1;::::0;-1:-1:-1;;;48055:54:0;;48103:4:::1;48055:54;::::0;::::1;5671:51:1::0;-1:-1:-1;;;;;48055:39:0;::::1;::::0;-1:-1:-1;48055:39:0::1;::::0;-1:-1:-1;5644:18:1;;48055:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48120:18;-1:-1:-1::0;;;;;48120:39:0::1;;48160:7;25772:6:::0;;-1:-1:-1;;;;;25772:6:0;;25707:79;48160:7:::1;48120:48;::::0;-1:-1:-1;;;;;;48120:48:0::1;::::0;;;;;;-1:-1:-1;;;;;5689:32:1;;;48120:48:0::1;::::0;::::1;5671:51:1::0;5644:18;;48120:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48227:15:0::1;::::0;48179:65:::1;::::0;-1:-1:-1;;;48179:65:0;;-1:-1:-1;;;;;48227:15:0;;::::1;48179:65;::::0;::::1;5671:51:1::0;48179:39:0;;::::1;::::0;-1:-1:-1;48179:39:0::1;::::0;-1:-1:-1;5644:18:1;;48179:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48304:15:0::1;::::0;48262:59:::1;::::0;-1:-1:-1;;;;;48304:15:0;;::::1;::::0;-1:-1:-1;48262:59:0;;::::1;::::0;-1:-1:-1;48262:59:0::1;::::0;48304:15:::1;::::0;48262:59:::1;48334:15;:36:::0;;-1:-1:-1;;;;;;48334:36:0::1;-1:-1:-1::0;;;;;48334:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;47573:805:0:o;48894:185::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;48949:13:::1;:20:::0;;-1:-1:-1;;48949:20:0::1;;;::::0;;49001:12:::1;48980:18;:33:::0;49045:26:::1;:15;49063:8;49045:26;:::i;:::-;49024:18;:47:::0;48894:185::o;9436:104::-;9492:13;9525:7;9518:14;;;;;:::i;50731:256::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;50838:13:::1;-1:-1:-1::0;;;;;50830:21:0::1;:4;-1:-1:-1::0;;;;;50830:21:0::1;;;50822:103;;;::::0;-1:-1:-1;;;50822:103:0;;10436:2:1;50822:103:0::1;::::0;::::1;10418:21:1::0;10475:2;10455:18;;;10448:30;10514:34;10494:18;;;10487:62;10585:34;10565:18;;;10558:62;-1:-1:-1;;;10636:19:1;;;10629:36;10682:19;;50822:103:0::1;10234:473:1::0;50822:103:0::1;50938:41;50967:4;50973:5;50938:28;:41::i;:::-;50731:256:::0;;:::o;52140:108::-;52213:15;;:27;;;-1:-1:-1;;;52213:27:0;;;;52186:7;;-1:-1:-1;;;;;52213:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;13520:269;13613:4;13630:129;298:10;13653:7;13662:96;13701:15;13662:96;;;;;;;;;;;;;;;;;298:10;13662:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13662:34:0;;;;;;;;;;;;:38;:96::i;52538:147::-;52631:15;;:47;;-1:-1:-1;;;52631:47:0;;-1:-1:-1;;;;;5689:32:1;;;52631:47:0;;;5671:51:1;52607:7:0;;52631:15;;:38;;5644:18:1;;52631:47:0;5525:203:1;10848:175:0;10934:4;10951:42;298:10;10975:9;10986:6;10951:9;:42::i;52832:318::-;53107:15;;:35;;-1:-1:-1;;;53107:35:0;;-1:-1:-1;;;;;5689:32:1;;;53107:35:0;;;5671:51:1;52928:7:0;;;;;;;;;;;;;;;;53107:15;;;:26;;5644:18:1;;53107:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53100:42;;;;;;;;;;;;;;;;52832:318;;;;;;;;;:::o;46928:577::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;47054:14:::1;:32:::0;;-1:-1:-1;;;;;;47054:32:0::1;-1:-1:-1::0;;;;;47054:32:0;::::1;::::0;;::::1;::::0;;;47097:37:::1;::::0;-1:-1:-1;47097:15:0::1;:37::i;:::-;47145:15;::::0;47182:14:::1;::::0;47145:52:::1;::::0;-1:-1:-1;;;47145:52:0;;-1:-1:-1;;;;;47182:14:0;;::::1;47145:52;::::0;::::1;5671:51:1::0;47145:15:0;::::1;::::0;:36:::1;::::0;5644:18:1;;47145:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47234:14:0::1;::::0;47208:47:::1;::::0;-1:-1:-1;;;;;;47234:14:0::1;::::0;-1:-1:-1;47234:14:0;47208:25:::1;:47::i;:::-;47266:20;:44:::0;;-1:-1:-1;;;;;;47266:44:0::1;-1:-1:-1::0;;;;;47266:44:0;::::1;::::0;;::::1;::::0;;;47321:43:::1;::::0;-1:-1:-1;47321:15:0::1;:43::i;:::-;47375:15;::::0;47412:20:::1;::::0;47375:58:::1;::::0;-1:-1:-1;;;47375:58:0;;-1:-1:-1;;;;;47412:20:0;;::::1;47375:58;::::0;::::1;5671:51:1::0;47375:15:0;::::1;::::0;:36:::1;::::0;5644:18:1;;47375:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47470:20:0::1;::::0;47444:53:::1;::::0;-1:-1:-1;;;;;;47470:20:0::1;::::0;-1:-1:-1;47470:20:0;47444:25:::1;:53::i;50227:184::-:0;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50312:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50312:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50369:34;;8590:41:1;;;50369:34:0::1;::::0;8563:18:1;50369:34:0::1;8450:187:1::0;48710:126:0;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;48785:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;48785:43:0;;-1:-1:-1;;;;;5689:32:1;;;48785:43:0::1;::::0;::::1;5671:51:1::0;48785:15:0;;::::1;::::0;:34:::1;::::0;5644:18:1;;48785:43:0::1;5525:203:1::0;50419:304:0;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;50536:9:::1;50532:115;50551:19:::0;;::::1;50532:115;;;50627:8;50592:19;:32;50612:8;;50621:1;50612:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50592:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50592:32:0;:43;;-1:-1:-1;;50592:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50572:3;::::1;::::0;::::1;:::i;:::-;;;;50532:115;;;;50664:51;50696:8;;50706;50664:51;;;;;;;;:::i;:::-;;;;;;;;50419:304:::0;;;:::o;49239:447::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;49378:13:::1;:30:::0;;;49419:10:::1;:24:::0;;;49454:10:::1;:24:::0;;;49489:12:::1;:28:::0;;;49504:13;49467:11;49540:26:::1;49432:11:::0;49394:14;49540:26:::1;:::i;:::-;:39;;;;:::i;:::-;:54;;;;:::i;:::-;49528:9;:66:::0;;;49626:1:::1;-1:-1:-1::0;49613:14:0;::::1;::::0;:33:::1;;;49644:2;49631:9;;:15;;49613:33;49605:73;;;::::0;-1:-1:-1;;;49605:73:0;;13248:2:1;49605:73:0::1;::::0;::::1;13230:21:1::0;13287:2;13267:18;;;13260:30;13326:29;13306:18;;;13299:57;13373:18;;49605:73:0::1;13046:351:1::0;49605:73:0::1;49239:447:::0;;;;:::o;54225:126::-;54304:15;;:39;;;-1:-1:-1;;;54304:39:0;;;;54280:7;;-1:-1:-1;;;;;54304:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;52008:124;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;52082:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;52082:42:0;;::::1;::::0;::::1;17961:25:1::0;;;-1:-1:-1;;;;;52082:15:0;;::::1;::::0;:31:::1;::::0;17934:18:1;;52082:42:0::1;17815:177:1::0;53155:325:0;53432:15;;:40;;-1:-1:-1;;;53432:40:0;;;;;17961:25:1;;;53256:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53432:15:0;;;;:33;;17934:18:1;;53432:40:0;17815:177:1;26652:244:0;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26741:22:0;::::1;26733:73;;;::::0;-1:-1:-1;;;26733:73:0;;11669:2:1;26733:73:0::1;::::0;::::1;11651:21:1::0;11708:2;11688:18;;;11681:30;11747:34;11727:18;;;11720:62;-1:-1:-1;;;11798:18:1;;;11791:36;11844:19;;26733:73:0::1;11467:402:1::0;26733:73:0::1;26843:6;::::0;26822:38:::1;::::0;-1:-1:-1;;;;;26822:38:0;;::::1;::::0;26843:6:::1;::::0;26822:38:::1;::::0;26843:6:::1;::::0;26822:38:::1;26871:6;:17:::0;;-1:-1:-1;;;;;;26871:17:0::1;-1:-1:-1::0;;;;;26871:17:0;;;::::1;::::0;;;::::1;::::0;;26652:244::o;53492:189::-;25919:6;;-1:-1:-1;;;;;25919:6:0;298:10;25919:22;25911:67;;;;-1:-1:-1;;;25911:67:0;;;;;;;:::i;:::-;53672:1:::1;53651:18;:22:::0;53492:189::o;20755:181::-;20813:7;;20845:5;20849:1;20845;:5;:::i;:::-;20833:17;;20874:1;20869;:6;;20861:46;;;;-1:-1:-1;;;20861:46:0;;12892:2:1;20861:46:0;;;12874:21:1;12931:2;12911:18;;;12904:30;12970:29;12950:18;;;12943:57;13017:18;;20861:46:0;12690:351:1;20861:46:0;20927:1;20755:181;-1:-1:-1;;;20755:181:0:o;16706:380::-;-1:-1:-1;;;;;16842:19:0;;16834:68;;;;-1:-1:-1;;;16834:68:0;;16366:2:1;16834:68:0;;;16348:21:1;16405:2;16385:18;;;16378:30;16444:34;16424:18;;;16417:62;-1:-1:-1;;;16495:18:1;;;16488:34;16539:19;;16834:68:0;16164:400:1;16834:68:0;-1:-1:-1;;;;;16921:21:0;;16913:68;;;;-1:-1:-1;;;16913:68:0;;12076:2:1;16913:68:0;;;12058:21:1;12115:2;12095:18;;;12088:30;12154:34;12134:18;;;12127:62;-1:-1:-1;;;12205:18:1;;;12198:32;12247:19;;16913:68:0;11874:398:1;16913:68:0;-1:-1:-1;;;;;16994:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17046:32;;17961:25:1;;;17046:32:0;;17934:18:1;17046:32:0;;;;;;;;16706:380;;;:::o;54819:4643::-;-1:-1:-1;;;;;54951:18:0;;54943:68;;;;-1:-1:-1;;;54943:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55030:16:0;;55022:64;;;;-1:-1:-1;;;55022:64:0;;;;;;;:::i;:::-;55111:13;;;;;;;55110:14;:54;;;;;55144:20;;55128:12;:36;55110:54;:73;;;;-1:-1:-1;25772:6:0;;-1:-1:-1;;;;;55168:15:0;;;25772:6;;55168:15;;55110:73;:99;;;;-1:-1:-1;55195:14:0;;-1:-1:-1;;;;;55187:22:0;;;55195:14;;55187:22;;55110:99;:131;;;;-1:-1:-1;55221:20:0;;-1:-1:-1;;;;;55213:28:0;;;55221:20;;55213:28;;55110:131;55107:389;;;55257:28;55273:4;55279:2;55283:1;55257:15;:28::i;:::-;55386:48;55402:4;55416:6;55425:8;55432:1;55425:6;:8;:::i;:::-;55386:15;:48::i;:::-;54819:4643;;;:::o;55107:389::-;55520:13;;;;;;;55516:289;;25772:6;;-1:-1:-1;;;;;55557:15:0;;;25772:6;;55557:15;;:41;;-1:-1:-1;55584:14:0;;-1:-1:-1;;;;;55576:22:0;;;55584:14;;55576:22;55557:41;:73;;;-1:-1:-1;55610:20:0;;-1:-1:-1;;;;;55602:28:0;;;55610:20;;55602:28;55557:73;55549:108;;;;-1:-1:-1;;;55549:108:0;;11318:2:1;55549:108:0;;;11300:21:1;11357:2;11337:18;;;11330:30;-1:-1:-1;;;11376:18:1;;;11369:52;11438:18;;55549:108:0;11116:346:1;55549:108:0;55675:20;;:25;:48;;;;;55710:13;-1:-1:-1;;;;;55704:19:0;:2;-1:-1:-1;;;;;55704:19:0;;55675:48;55672:122;;;55766:12;55743:20;:35;55672:122;25772:6;;-1:-1:-1;;;;;55828:15:0;;;25772:6;;55828:15;;;;:41;;-1:-1:-1;55855:14:0;;-1:-1:-1;;;;;55847:22:0;;;55855:14;;55847:22;;55828:41;:75;;;;-1:-1:-1;;;;;;55874:29:0;;;;;;:25;:29;;;;;;;;55873:30;55828:75;:107;;;;-1:-1:-1;55915:20:0;;-1:-1:-1;;;;;55907:28:0;;;55915:20;;55907:28;;55828:107;:145;;;;;55955:18;;55939:12;:34;55828:145;:189;;;;-1:-1:-1;;;;;;55978:39:0;;;;;;:35;:39;;;;;;;;55977:40;55828:189;55825:246;;;-1:-1:-1;;;;;56037:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;56037:22:0;56055:4;56037:22;;;55825:246;56094:14;;;;56091:1151;;;25772:6;;-1:-1:-1;;;;;56146:15:0;;;25772:6;;56146:15;;;;:49;;-1:-1:-1;25772:6:0;;-1:-1:-1;;;;;56182:13:0;;;25772:6;;56182:13;;56146:49;:86;;;;-1:-1:-1;;;;;;56216:16:0;;;;56146:86;:128;;;;-1:-1:-1;;;;;;56253:21:0;;56267:6;56253:21;;56146:128;:171;;;;-1:-1:-1;56303:14:0;;-1:-1:-1;;;;;56295:22:0;;;56303:14;;56295:22;;56146:171;:212;;;;-1:-1:-1;56344:14:0;;-1:-1:-1;;;;;56338:20:0;;;56344:14;;56338:20;;56146:212;:261;;;;-1:-1:-1;56387:20:0;;-1:-1:-1;;;;;56379:28:0;;;56387:20;;56379:28;;56146:261;:308;;;;-1:-1:-1;56434:20:0;;-1:-1:-1;;;;;56428:26:0;;;56434:20;;56428:26;;56146:308;:338;;;;-1:-1:-1;56476:8:0;;-1:-1:-1;;;56476:8:0;;;;56475:9;56146:338;56124:1107;;;-1:-1:-1;;;;;56550:31:0;;;;;;:25;:31;;;;;;;;:75;;;;-1:-1:-1;;;;;;56586:39:0;;;;;;:35;:39;;;;;;;;56585:40;56550:75;56546:670;;;56688:9;;56671:13;56681:2;56671:9;:13::i;:::-;56662:22;;:6;:22;:::i;:::-;:35;;56654:70;;;;-1:-1:-1;;;56654:70:0;;15609:2:1;56654:70:0;;;15591:21:1;15648:2;15628:18;;;15621:30;-1:-1:-1;;;15667:18:1;;;15660:52;15729:18;;56654:70:0;15407:346:1;56654:70:0;56546:670;;;-1:-1:-1;;;;;56801:29:0;;;;;;:25;:29;;;;;;;;:75;;;;-1:-1:-1;;;;;;56835:41:0;;;;;;:35;:41;;;;;;;;56834:42;56801:75;56797:419;;;56923:7;;56913:6;:17;;56905:71;;;;-1:-1:-1;;;56905:71:0;;17193:2:1;56905:71:0;;;17175:21:1;17232:2;17212:18;;;17205:30;17271:34;17251:18;;;17244:62;-1:-1:-1;;;17322:18:1;;;17315:39;17371:19;;56905:71:0;16991:405:1;56797:419:0;-1:-1:-1;;;;;57059:39:0;;;;;;:35;:39;;;;;;;;57054:162;;57160:9;;57143:13;57153:2;57143:9;:13::i;:::-;57134:22;;:6;:22;:::i;:::-;:35;;57126:70;;;;-1:-1:-1;;;57126:70:0;;15609:2:1;57126:70:0;;;15591:21:1;15648:2;15628:18;;;15621:30;-1:-1:-1;;;15667:18:1;;;15660:52;15729:18;;57126:70:0;15407:346:1;57126:70:0;57265:11;57262:92;;57293:28;57309:4;57315:2;57319:1;57293:15;:28::i;57262:92::-;57364:28;57395:24;57413:4;57395:9;:24::i;:::-;57479:18;;57364:55;;-1:-1:-1;57455:42:0;;;;;;;57528:33;;-1:-1:-1;57553:8:0;;-1:-1:-1;;;57553:8:0;;;;57552:9;57528:33;:82;;;;-1:-1:-1;;;;;;57579:31:0;;;;;;:25;:31;;;;;;;;57578:32;57528:82;:125;;;;-1:-1:-1;;;;;;57628:25:0;;;;;;:19;:25;;;;;;;;57627:26;57528:125;:166;;;;-1:-1:-1;;;;;;57671:23:0;;;;;;:19;:23;;;;;;;;57670:24;57528:166;57510:582;;;57721:8;:15;;-1:-1:-1;;;;57721:15:0;-1:-1:-1;;;57721:15:0;;;57768:12;;:16;57765:174;;57804:18;57825:53;57868:9;;57825:38;57850:12;;57825:20;:24;;:38;;;;:::i;:::-;:42;;:53::i;:::-;57804:74;;57897:26;57912:10;57897:14;:26::i;:::-;57785:154;57765:174;57955:18;57976:24;57994:4;57976:9;:24::i;:::-;57955:45;;58015:32;58036:10;58015:20;:32::i;:::-;-1:-1:-1;58064:8:0;:16;;-1:-1:-1;;;;58064:16:0;;;57510:582;58120:8;;-1:-1:-1;;;;;58229:25:0;;58104:12;58229:25;;;:19;:25;;;;;;58120:8;-1:-1:-1;;;58120:8:0;;;;;58119:9;;58229:25;;:52;;-1:-1:-1;;;;;;58258:23:0;;;;;;:19;:23;;;;;;;;58229:52;58226:99;;;-1:-1:-1;58308:5:0;58226:99;58340:7;58337:585;;;58361:12;58376:30;58402:3;58376:21;58387:9;;58376:6;:10;;:21;;;;:::i;:30::-;-1:-1:-1;;;;;58499:17:0;;;;;;:11;:17;;;;;;58361:45;;-1:-1:-1;58499:17:0;;:57;;;;;58541:15;58520:18;;:36;58499:57;58496:378;;;58573:48;58589:4;58603:6;58612:8;:4;58619:1;58612:8;:::i;58573:48::-;58686:42;58702:4;58716;58723;58686:15;:42::i;:::-;58773:8;:4;58780:1;58773:8;:::i;:::-;58766:15;;58496:378;;;58819:42;58835:4;58849;58856;58819:15;:42::i;:::-;58894:16;:6;58905:4;58894:10;:16::i;:::-;58885:25;;58349:573;58337:585;58934:33;58950:4;58956:2;58960:6;58934:15;:33::i;:::-;58984:15;;-1:-1:-1;;;;;58984:15:0;:26;59019:4;59026:15;59019:4;59026:9;:15::i;:::-;58984:58;;-1:-1:-1;;;;;;58984:58:0;;;;;;;-1:-1:-1;;;;;6246:32:1;;;58984:58:0;;;6228:51:1;6295:18;;;6288:34;6201:18;;58984:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58980:74;59068:15;;-1:-1:-1;;;;;59068:15:0;:26;59103:2;59108:13;59103:2;59108:9;:13::i;:::-;59068:54;;-1:-1:-1;;;;;;59068:54:0;;;;;;;-1:-1:-1;;;;;6246:32:1;;;59068:54:0;;;6228:51:1;6295:18;;;6288:34;6201:18;;59068:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59064:70;59150:8;;-1:-1:-1;;;59150:8:0;;;;59146:309;;59183:16;;59214:15;;:28;;-1:-1:-1;;;;;;59214:28:0;;;;;17961:25:1;;;-1:-1:-1;;;;;59214:15:0;;;;:23;;17934:18:1;;59214:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59214:28:0;;;;;;;;-1:-1:-1;;59214:28:0;;;;;;;;;;;;:::i;:::-;;;59210:234;;;;;59331:86;;;19392:25:1;;;19448:2;19433:18;;19426:34;;;19476:18;;;19469:34;;;19534:2;19519:18;;19512:34;;;59407:9:0;;59396:4;;59331:86;;19379:3:1;19364:19;59331:86:0;;;;;;;59243:184;;;59160:295;59146:309;54932:4530;;;54819:4643;;;:::o;21658:192::-;21744:7;21780:12;21772:6;;;;21764:29;;;;-1:-1:-1;;;21764:29:0;;;;;;;;:::i;:::-;-1:-1:-1;21804:9:0;21816:5;21820:1;21816;:5;:::i;:::-;21804:17;21658:192;-1:-1:-1;;;;;21658:192:0:o;50995:328::-;-1:-1:-1;;;;;51078:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;51078:39:0;;;;;;;51128:38;51078:31;:39;51128:25;:38::i;:::-;51182:5;51179:79;;;51204:15;;:42;;-1:-1:-1;;;51204:42:0;;-1:-1:-1;;;;;5689:32:1;;;51204:42:0;;;5671:51:1;51204:15:0;;;;:36;;5644:18:1;;51204:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51179:79;51275:40;;;;;;-1:-1:-1;;;;;51275:40:0;;;;;;;;50995:328;;:::o;14279:573::-;-1:-1:-1;;;;;14419:20:0;;14411:70;;;;-1:-1:-1;;;14411:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14500:23:0;;14492:71;;;;-1:-1:-1;;;14492:71:0;;;;;;;:::i;:::-;14656;14678:6;14656:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14656:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;14636:17:0;;;:9;:17;;;;;;;;;;;:91;;;;14761:20;;;;;;;:32;;14786:6;14761:24;:32::i;:::-;-1:-1:-1;;;;;14738:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;14809:35;17961:25:1;;;14738:20:0;;14809:35;;;;;;17934:18:1;14809:35:0;17815:177:1;22109:471:0;22167:7;22412:6;22408:47;;-1:-1:-1;22442:1:0;22435:8;;22408:47;22467:9;22479:5;22483:1;22479;:5;:::i;:::-;22467:17;-1:-1:-1;22512:1:0;22503:5;22507:1;22467:17;22503:5;:::i;:::-;:10;22495:56;;;;-1:-1:-1;;;22495:56:0;;14846:2:1;22495:56:0;;;14828:21:1;14885:2;14865:18;;;14858:30;14924:34;14904:18;;;14897:62;-1:-1:-1;;;14975:18:1;;;14968:31;15016:19;;22495:56:0;14644:397:1;23056:132:0;23114:7;23141:39;23145:1;23148;23141:39;;;;;;;;;;;;;;;;;:3;:39::i;60085:922::-;60194:12;60209:13;:6;60220:1;60209:10;:13::i;:::-;60194:28;-1:-1:-1;60233:17:0;60253:16;:6;60194:28;60253:10;:16::i;:::-;60233:36;-1:-1:-1;60572:21:0;60638:22;60655:4;60638:16;:22::i;:::-;60791:18;60812:41;:21;60838:14;60812:25;:41::i;:::-;60791:62;;60903:35;60916:9;60927:10;60903:12;:35::i;:::-;60956:43;;;19039:25:1;;;19095:2;19080:18;;19073:34;;;19123:18;;;19116:34;;;60956:43:0;;19027:2:1;19012:18;60956:43:0;;;;;;;60133:874;;;;60085:922;:::o;61554:1193::-;61644:21;61676:24;61693:6;61676:16;:24::i;:::-;61759:10;;61721:12;;61759:14;61756:334;;61789:17;61809:89;61885:12;;61873:9;;:24;;;;:::i;:::-;61857:10;;61809:59;;61810:41;:21;61836:14;61810:25;:41::i;:::-;61809:47;;:59::i;:89::-;61934:15;;61926:51;;61789:109;;-1:-1:-1;;;;;;61934:15:0;;61789:109;;61926:51;;;;61789:109;61934:15;61926:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61913:64:0;;-1:-1:-1;;61994:85:0;;;;62031:32;;;18758:25:1;;;18814:2;18799:18;;18792:34;;;62031:32:0;;18731:18:1;62031:32:0;;;;;;;61994:85;61774:316;61756:334;62113:13;;:17;62110:573;;62199:14;62324:2;62216:105;62308:12;;62295:10;;62283:9;;:22;;;;:::i;:::-;:37;;;;:::i;:::-;62264:13;;62216:62;;62217:41;:21;62243:14;62217:25;:41::i;62216:105::-;:110;;;;:::i;:::-;62354:75;;62199:127;;-1:-1:-1;62362:42:0;;62199:127;;62354:75;;;;62199:127;62362:42;62354:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62341:88;;;;;62458:21;62482:105;62574:12;;62561:10;;62549:9;;:22;;;;:::i;62482:105::-;62623:16;;62615:56;;62458:129;;-1:-1:-1;;;;;;62623:16:0;;62458:129;;62615:56;;;;62458:129;62623:16;62615:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;61554:1193:0:o;21219:136::-;21277:7;21304:43;21308:1;21311;21304:43;;;;;;;;;;;;;;;;;:3;:43::i;23684:278::-;23770:7;23805:12;23798:5;23790:28;;;;-1:-1:-1;;;23790:28:0;;;;;;;;:::i;:::-;-1:-1:-1;23829:9:0;23841:5;23845:1;23841;:5;:::i;59472:601::-;59624:16;;;59638:1;59624:16;;;;;;;;59600:21;;59624:16;;;;;;;;;;-1:-1:-1;59624:16:0;59600:40;;59669:4;59651;59656:1;59651:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59651:23:0;;;:7;;;;;;;;;;:23;;;;59695:15;;:22;;;-1:-1:-1;;;59695:22:0;;;;:15;;;;;:20;;:22;;;;;59651:7;;59695:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59685:4;59690:1;59685:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59685:32:0;;;:7;;;;;;;;;:32;59762:15;;59730:62;;59747:4;;59762:15;59780:11;59730:8;:62::i;:::-;59831:15;;:224;;-1:-1:-1;;;59831:224:0;;-1:-1:-1;;;;;59831:15:0;;;;:66;;:224;;59912:11;;59831:15;;59982:4;;60009;;60029:15;;59831:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61019:523;61199:15;;61167:62;;61184:4;;-1:-1:-1;;;;;61199:15:0;61217:11;61167:8;:62::i;:::-;61272:15;;:260;;-1:-1:-1;;;61272:260:0;;61344:4;61272:260;;;7380:34:1;7430:18;;;7423:34;;;61272:15:0;7473:18:1;;;7466:34;;;7516:18;;;7509:34;61484:6:0;7559:19:1;;;7552:44;61506:15:0;7612:19:1;;;7605:35;-1:-1:-1;;;;;61272:15:0;;;;:31;;61311:9;;7314:19:1;;61272:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:382::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:52;;;1518:1;1515;1508:12;1470:52;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:1;1668:18;;1655:32;1696:30;1655:32;1696:30;:::i;1763:681::-;1894:6;1902;1910;1918;1926;1934;1942;1950;2003:3;1991:9;1982:7;1978:23;1974:33;1971:53;;;2020:1;2017;2010:12;1971:53;2052:9;2046:16;2071:31;2096:5;2071:31;:::i;:::-;2121:5;2111:15;;;2166:2;2155:9;2151:18;2145:25;2135:35;;2210:2;2199:9;2195:18;2189:25;2179:35;;2254:2;2243:9;2239:18;2233:25;2223:35;;2298:3;2287:9;2283:19;2277:26;2267:36;;2343:3;2332:9;2328:19;2322:26;2312:36;;2388:3;2377:9;2373:19;2367:26;2357:36;;2433:3;2422:9;2418:19;2412:26;2402:36;;1763:681;;;;;;;;;;;:::o;2449:315::-;2517:6;2525;2578:2;2566:9;2557:7;2553:23;2549:32;2546:52;;;2594:1;2591;2584:12;2546:52;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;:::-;2702:5;2754:2;2739:18;;;;2726:32;;-1:-1:-1;;;2449:315:1:o;2769:750::-;2861:6;2869;2877;2930:2;2918:9;2909:7;2905:23;2901:32;2898:52;;;2946:1;2943;2936:12;2898:52;2986:9;2973:23;3015:18;3056:2;3048:6;3045:14;3042:34;;;3072:1;3069;3062:12;3042:34;3110:6;3099:9;3095:22;3085:32;;3155:7;3148:4;3144:2;3140:13;3136:27;3126:55;;3177:1;3174;3167:12;3126:55;3217:2;3204:16;3243:2;3235:6;3232:14;3229:34;;;3259:1;3256;3249:12;3229:34;3314:7;3307:4;3297:6;3294:1;3290:14;3286:2;3282:23;3278:34;3275:47;3272:67;;;3335:1;3332;3325:12;3272:67;3366:4;3358:13;;;;-1:-1:-1;3390:6:1;-1:-1:-1;;3431:20:1;;3418:34;3461:28;3418:34;3461:28;:::i;:::-;3508:5;3498:15;;;2769:750;;;;;:::o;3524:245::-;3591:6;3644:2;3632:9;3623:7;3619:23;3615:32;3612:52;;;3660:1;3657;3650:12;3612:52;3692:9;3686:16;3711:28;3733:5;3711:28;:::i;3774:180::-;3833:6;3886:2;3874:9;3865:7;3861:23;3857:32;3854:52;;;3902:1;3899;3892:12;3854:52;-1:-1:-1;3925:23:1;;3774:180;-1:-1:-1;3774:180:1:o;3959:184::-;4029:6;4082:2;4070:9;4061:7;4057:23;4053:32;4050:52;;;4098:1;4095;4088:12;4050:52;-1:-1:-1;4121:16:1;;3959:184;-1:-1:-1;3959:184:1:o;4148:306::-;4236:6;4244;4252;4305:2;4293:9;4284:7;4280:23;4276:32;4273:52;;;4321:1;4318;4311:12;4273:52;4350:9;4344:16;4334:26;;4400:2;4389:9;4385:18;4379:25;4369:35;;4444:2;4433:9;4429:18;4423:25;4413:35;;4148:306;;;;;:::o;4459:385::-;4545:6;4553;4561;4569;4622:3;4610:9;4601:7;4597:23;4593:33;4590:53;;;4639:1;4636;4629:12;4590:53;-1:-1:-1;;4662:23:1;;;4732:2;4717:18;;4704:32;;-1:-1:-1;4783:2:1;4768:18;;4755:32;;4834:2;4819:18;4806:32;;-1:-1:-1;4459:385:1;-1:-1:-1;4459:385:1:o;4849:461::-;4902:3;4940:5;4934:12;4967:6;4962:3;4955:19;4993:4;5022:2;5017:3;5013:12;5006:19;;5059:2;5052:5;5048:14;5080:1;5090:195;5104:6;5101:1;5098:13;5090:195;;;5169:13;;-1:-1:-1;;;;;5165:39:1;5153:52;;5225:12;;;;5260:15;;;;5201:1;5119:9;5090:195;;;-1:-1:-1;5301:3:1;;4849:461;-1:-1:-1;;;;;4849:461:1:o;7651:794::-;7873:2;7885:21;;;7858:18;;7941:22;;;7825:4;8020:6;7994:2;7979:18;;7825:4;8054:304;8068:6;8065:1;8062:13;8054:304;;;8143:6;8130:20;8163:31;8188:5;8163:31;:::i;:::-;-1:-1:-1;;;;;8219:31:1;8207:44;;8274:4;8333:15;;;;8298:12;;;;8247:1;8083:9;8054:304;;;8058:3;8375;8367:11;;;;8430:6;8423:14;8416:22;8409:4;8398:9;8394:20;8387:52;7651:794;;;;;;:::o;9117:510::-;9388:6;9377:9;9370:25;9431:3;9426:2;9415:9;9411:18;9404:31;9351:4;9452:57;9504:3;9493:9;9489:19;9481:6;9452:57;:::i;:::-;-1:-1:-1;;;;;9545:32:1;;;;9540:2;9525:18;;9518:60;-1:-1:-1;9609:2:1;9594:18;9587:34;9444:65;9117:510;-1:-1:-1;;9117:510:1:o;9632:597::-;9744:4;9773:2;9802;9791:9;9784:21;9834:6;9828:13;9877:6;9872:2;9861:9;9857:18;9850:34;9902:1;9912:140;9926:6;9923:1;9920:13;9912:140;;;10021:14;;;10017:23;;10011:30;9987:17;;;10006:2;9983:26;9976:66;9941:10;;9912:140;;;10070:6;10067:1;10064:13;10061:91;;;10140:1;10135:2;10126:6;10115:9;10111:22;10107:31;10100:42;10061:91;-1:-1:-1;10213:2:1;10192:15;-1:-1:-1;;10188:29:1;10173:45;;;;10220:2;10169:54;;9632:597;-1:-1:-1;;;9632:597:1:o;10712:399::-;10914:2;10896:21;;;10953:2;10933:18;;;10926:30;10992:34;10987:2;10972:18;;10965:62;-1:-1:-1;;;11058:2:1;11043:18;;11036:33;11101:3;11086:19;;10712:399::o;15046:356::-;15248:2;15230:21;;;15267:18;;;15260:30;15326:34;15321:2;15306:18;;15299:62;15393:2;15378:18;;15046:356::o;15758:401::-;15960:2;15942:21;;;15999:2;15979:18;;;15972:30;16038:34;16033:2;16018:18;;16011:62;-1:-1:-1;;;16104:2:1;16089:18;;16082:35;16149:3;16134:19;;15758:401::o;17997:582::-;18296:6;18285:9;18278:25;18339:6;18334:2;18323:9;18319:18;18312:34;18382:3;18377:2;18366:9;18362:18;18355:31;18259:4;18403:57;18455:3;18444:9;18440:19;18432:6;18403:57;:::i;:::-;-1:-1:-1;;;;;18496:32:1;;;;18491:2;18476:18;;18469:60;-1:-1:-1;18560:3:1;18545:19;18538:35;18395:65;17997:582;-1:-1:-1;;;17997:582:1:o;19746:128::-;19786:3;19817:1;19813:6;19810:1;19807:13;19804:39;;;19823:18;;:::i;:::-;-1:-1:-1;19859:9:1;;19746:128::o;19879:217::-;19919:1;19945;19935:132;;19989:10;19984:3;19980:20;19977:1;19970:31;20024:4;20021:1;20014:15;20052:4;20049:1;20042:15;19935:132;-1:-1:-1;20081:9:1;;19879:217::o;20101:168::-;20141:7;20207:1;20203;20199:6;20195:14;20192:1;20189:21;20184:1;20177:9;20170:17;20166:45;20163:71;;;20214:18;;:::i;:::-;-1:-1:-1;20254:9:1;;20101:168::o;20274:125::-;20314:4;20342:1;20339;20336:8;20333:34;;;20347:18;;:::i;:::-;-1:-1:-1;20384:9:1;;20274:125::o;20404:380::-;20483:1;20479:12;;;;20526;;;20547:61;;20601:4;20593:6;20589:17;20579:27;;20547:61;20654:2;20646:6;20643:14;20623:18;20620:38;20617:161;;;20700:10;20695:3;20691:20;20688:1;20681:31;20735:4;20732:1;20725:15;20763:4;20760:1;20753:15;20617:161;;20404:380;;;:::o;20789:135::-;20828:3;-1:-1:-1;;20849:17:1;;20846:43;;;20869:18;;:::i;:::-;-1:-1:-1;20916:1:1;20905:13;;20789:135::o;20929:127::-;20990:10;20985:3;20981:20;20978:1;20971:31;21021:4;21018:1;21011:15;21045:4;21042:1;21035:15;21061:127;21122:10;21117:3;21113:20;21110:1;21103:31;21153:4;21150:1;21143:15;21177:4;21174:1;21167:15;21325:131;-1:-1:-1;;;;;21400:31:1;;21390:42;;21380:70;;21446:1;21443;21436:12;21461:118;21547:5;21540:13;21533:21;21526:5;21523:32;21513:60;;21569:1;21566;21559:12

Swarm Source

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